微分方程的解析解
求微分方程(组)的解析解命令:
dsolve('方程1','方程2',...'方程n','初始条件','自变量')
注:字母D表示求微分,D2、D3等表示求高阶微分,D后所跟的字母为因变量,自变量可以指定或由系统规则选定为缺省,默认是以t为自变量。
如,微分方程d2y/dx2 =0 应表达为:D2y=0
例1:求 du/dt=1+u2的通解。
输入命令:dsolve(‘Du=1+u^2’,‘t’)
运行结果:u=tan(t-c)
输入命令y=dsolve('D2y+4*Dy+29*y=0','y(0)=0,Dy(0)=15','x')
运行结果为y =3sin(5x)exp(-2x)
输入命令:[x,y,z]=dsolve('Dx=2*x-3*y+3*z','Dy=4*x-5*y+3*z','Dz=4*x-4*y+2*z','t')
运行结果为:
x = C3exp(2t) + C4exp(-t)
y = C3exp(2t) + C4exp(-t) + C5exp(-2t)
z = C3exp(2t) + C5exp(-2t)
以上都是常微分方程的精确解法,也称为常微分方程的符号解。但是,我们知道,有大量的常微分方程虽然从理论上讲,其解是存在的,但我们却无法求出其解析解,此时,我们需要寻求方程的数值解。
用MATLAB求微分方程的数值解
在求解常微分方程数值解方面,MATLAB具有丰富的函数,我们统称为solver,其一般格式为:
参数说明:
t是时间点组成的列向量;
x是微分方程(组)的解矩阵,每一行对应相应t的该行上时间点的微分方程(组)的解;
ts有两种形式 [t0,tf] 和[t0,t1,…tf],两种都以 t0 为初始点,根据 tf 自动选择积分步长。前者返回实际求解过程中所有求解的时间点上的解,而后者只返回设定时间点上的解。后者对计算效率没有太大影响,但是求解大型问题时,可以减少内存存储。
solver为命令 ode45,ode23,ode113,ode15s,ode23s,ode23t,ode23tb之一,其中前3个适用于求解非刚性(Nonstiff)问题,后4个适用于刚性问题。这些命令各有特点,列表说明:
求解器 | ODE类型 | 特点 | 说明 |
---|---|---|---|
ode45 | 非刚性 | 一步算法,4,5阶Runge-Kutta方法累积截断误差(△x)3 | 大部分场合的首选算法 |
ode23 | 非刚性 | 一步算法,2,3阶Runge-Kutta方法累积截断误差(△x)3 | 使用于精度较低的情形 |
ode113 | 非刚性 | 多步算法,Adam算法,高低精度均可达到 10-3~10-6 | 计算时间比ode45短 |
ode23t | 适 |