7.9 符号微分方程求解
从数值计算角度看,与初值问题求解相比,微分方程边值问题的求解显得复杂和困难。对于应用数学工具去求解实际问题的科研人员来说,此时不妨通过符号计算指令进行求解尝试。因为对于符号计算来说,不论是初值问题还是边值问题,其求解微分方程的指令形式都相同,且相当简单。
当然,符号计算可能花费较多的计算机资源,可能得不到简单的解析解或封闭形式的解,甚至无法求解。既然没有万能的微分方程一般解法,那么,求解微分方程的符号法和数值法就有很好的互补作用。
函数dsolve用来求常微分方程的符号解。在方程中,用大写字母D表示一次微分,D2、D3分别表示二次、三次微分运算。以此类推,符号D2y表示d2y/dt2。函数dsolve把d后面的字符当作因变量,并默认所有这些变量对符号t进行求导。函数dsolve的调用格式如下。
● r=dsolve('eq1,eq2,…','cond1,cond2,…','v'):求由eq1,eq2,…指定的常微分方程的符号解。常微分方程以变量v作为自变量,参数cond1,cond2,…用于指定方程的边界条件或者初始条件。如果v不指定,将默认t为自变量。
● r=dsolve('eq1','eq2',…,'cond1','cond2',…,'v'):求由eq1,eq2,…指定的常微分方程的符号解。这些常微分方程都以v作为自变量。这些单独输入的方程的最大允许个数为12。其他参数与上一种调用方式相同。微分方程的初始条件或边界条件都以变量v作为自变量,其形式为y(a)=b或Dy(a)=b,其中y是微分方程的因变量,a和b是常数。如果指定的初始条件和边界条件比方程中的因变量个数少,那么所得的解中将包含积分常数C1、C2等。
dsolve函数的输出结果同solve函数类似,既可以用和因变量个数相同数目的输出参数分别接收每个变量的解,也可以把方程的解写入一个结构数组中。
例7-34:符号微分方程求解示例。
在命令行窗口中输入:
syms a b x(t); f = sym(a * diff(x, t) + b * x == 0) dsolve(f)
输出结果:
f(t) = a*diff(x(t), t) + b*x(t) == 0 ans = C1*exp(-(b*t)/a)
在命令行窗口中输入:
dsolve(f, 'x(0) = 1')
输出结果:
ans = exp(-(b*t)/a)
在命令行窗口中输入:
dsolve(f, 'x(0) = 1', 'm')
输出结果:
ans = exp(-(b*m)/a)
在命令行窗口中输入:
clear syms x(t) y(t); f1 = sym(diff(x, t) - 3 * x + 2 * y == 0) f2 = sym(diff(y, t) - 2 * x + y == 0) [x, y] = dsolve(f1, f2)
输出结果:
f1(t) = 2*y(t) - 3*x(t) + diff(x(t), t) == 0 f2(t) = y(t) - 2*x(t) + diff(y(t), t) == 0 x = 2*C1*exp(t) + C2*(exp(t) + 2*t*exp(t)) y = 2*C1*exp(t) + 2*C2*t*exp(t)
在命令行窗口中输入:
[x, y] = dsolve(f1, f2, 'x(0) = -1', 'y(0) = 1')
输出结果:
x = - exp(t) - 4*t*exp(t) y = exp(t) - 4*t*exp(t)
提示:dsolve函数并不总能得到显式解,如果不能得到显式解,则dsolve函数会尝试求隐式解。如果也不能够得到隐式解,则应当采用ODE来求微分方程的数值解。