MATLAB dsolve()求解微分方程(附带实例)
从数值计算角度看,与初值问题求解相比,微分方程边值问题的求解显得复杂和困难。对于应用数学工具求解实际问题的科研人员,此时不妨通过符号计算指令进行求解尝试。因为对于符号计算,无论是初值问题还是边值问题,其求解微分方程的指令形式都相同,且相当简单。
当然,符号计算可能消耗较多的计算机资源,可能得不到简单的解析解或封闭形式的解,甚至无法求解。既然没有万能的微分方程的一般解法,那么,求解微分方程的符号法和数值法就有很好的互补作用。
在 MATALB 中,函数 dsolve() 用来求常微分方程的符号解。在方程中,用大写字母 D 表示一次微分运算,D2、D3 分别表示二次、三次微分运算。依次类推,符号 D2y 表示 (d^2)y/d(t^2)。
函数 dsolve() 把 d 后面的字符当作因变量,并默认所有这些变量对符号 t 求导,其调用格式如下:
dsolve() 函数的输出结果与 solve() 函数的类似,既可以用与因变量个数相同的输出参数分别接收每个因变量的解,又可以把方程的解写入一个结构数组中。
【实例】符号微分方程求解示例。在命令行窗口中输入以下语句,并显示相应的输出结果。
继续在命令行窗口中输入以下语句,并显示相应的输出结果:
当然,符号计算可能消耗较多的计算机资源,可能得不到简单的解析解或封闭形式的解,甚至无法求解。既然没有万能的微分方程的一般解法,那么,求解微分方程的符号法和数值法就有很好的互补作用。
在 MATALB 中,函数 dsolve() 用来求常微分方程的符号解。在方程中,用大写字母 D 表示一次微分运算,D2、D3 分别表示二次、三次微分运算。依次类推,符号 D2y 表示 (d^2)y/d(t^2)。
函数 dsolve() 把 d 后面的字符当作因变量,并默认所有这些变量对符号 t 求导,其调用格式如下:
- 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 是常数。如果指定的初始条件和边界条件比方程中的因变量的个数少,那么所得的解中将包含积分常数。
dsolve() 函数的输出结果与 solve() 函数的类似,既可以用与因变量个数相同的输出参数分别接收每个因变量的解,又可以把方程的解写入一个结构数组中。
【实例】符号微分方程求解示例。在命令行窗口中输入以下语句,并显示相应的输出结果。
>> syms a b x(t); >> f=sym(a*diff(x,t) + b*x == 0) f = a*diff(x(t), t) + b*x(t) == 0 >> dsolve(f) 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) f1(t) = 2*y(t) - 3*x(t) + diff(x(t), t) == 0 >> f2=sym(diff(y,t)-2*x+y==0) f2(t) = y(t) - 2*x(t) + diff(y(t), t) == 0 >> [x,y]=dsolve(f1,f2) 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 求解器来求微分方程的数值解。