matlab6——数值微分和方程求解(四) 常微分方程数值求解

常微分方程数值求解的一般概念

常微分方程数值求解的一般概念

  1. 求解微分方程概念
    求解常微分方程初值问题就是寻找函数y(t)使之满足如下方程:
    y’=f(t,y),t0≤t≤b ,y(t0)=y0
    所谓其数值解法,就是求y(t)在离散结点tn处的函数近似值yn的方法,yn≈y(xn)。 这些近似值称为常微分方程初值问题的数值解。相邻两个结点之间的距离称为步长。

  2. 两种方法:

  • 单步法:在计算yn+1时只用到前一步的yn,因此在有了初值之后就可以逐步往下计算, 其代表是龙格-库塔(Runge-Kutta)法。
  • 多步法:在计算yn+1时,除了用到前一步的值yn之外,还要用到yn-p(p=1,2,…,k, k>0)的值,即前面的k步。其代表就是亚当斯(Adams)法。

常微分方程数值求解函数

常微分方程数值求解函数

  • 调用格式
    [t,y]=solver(filename,tspan,y0,option)
  1. t和y分别给出时间向量和相应的数值解。
  2. solver为求常微分方程数值解 的函数(即下面表格中的函数)。
  3. filename是定义f(t,y)的函数名,该函数必须返回一个列向量。
  4. tspan形式为[t0,tf],表示求解区间。
  5. y0是初始状态向量。
  6. Option是可选参数, 用于设置求解属性,常用的属性包括相对误差值RelTol(默认值是10-3)和绝对误 差值AbsTol(默认值是10-6)。
  • 常微分方程数值求解函数的统一命名格式:
    odennxx
  1. ode是Ordinary Differential Equation的缩写,是常微分方程的意思。
  2. nn是数字,代表所用方法的阶数。
    例如,ode23采用2阶龙格-库塔(Runge-Kutta)算法,用3阶公式做误差估计来调节步长,具有低等精度。
    ode45采用4阶龙格-库塔算法,用5阶公式做误差估计来调节步长,具有中
    等精度。
  3. xx是字母,用于标注方法的专门特征。例如,ode15s、ode23s中的“s”
    代表(Stiff),表示函数适用于刚性方程。

求常微分方程数值解的函数

在这里插入图片描述

举几个个栗子

例一

在这里插入图片描述

f=@(t,y) (y^2-t-2)/4/(t+1);
[t,y]=ode23(f,[0,10],2);
y1=sqrt(t+1)+1;%精确计算
plot(t,y,'b:',t,y1,'r');%绘图比较一下精确计算与数值求解的结果,从图形可以看出拟合较好

在这里插入图片描述

例二

在这里插入图片描述

f=@(t,x) [-2,0;0,1]*[x(2);x(1)]; 
[t,x]=ode45(f,[0,20],[1,0]); %四个未知数
subplot(2,2,1);plot(t,x(:,2));
subplot(2,2,2);plot(x(:,2),x(:,1));

在这里插入图片描述

刚性问题

有一类常微分方程,其解的分量有的变化很快,有的变化很慢,且相差悬殊,这就是所谓的刚性问题(Stiff)。
对于刚性问题,数值解算法必须取很小步长才能获得满意的结果,导致计算
量会大大增加。解决刚性问题需要有专门方法。非刚性算法可以求解刚性问
题,只不过需要很长的计算时间。

举个例子

假如点燃一个火柴,火焰球迅速增大直至某个临界体积,然后,维持这一体积不变,原因是火焰球内部燃烧耗费的氧气和从球表面所获氧气达到平衡。其简化模型如下:
在这里插入图片描述
其中,y(t)代表火焰球半径,初始半径是λ,它很小。分析λ的大小对方程求解过程的影响。
这里列出两个方法,通过对比时间长短体会刚性问题的特殊解法。

lamada较大采用非刚性解法
lamda=0.01; %lamada较大
f=@(t,y) y^2-y^3;
tic;%记录开始时间
[t,y]=ode45(f,[0,2/lamda],lamda);%非刚性解法
toc ;%记录结束时间
disp(['ode45计算的点数' num2str(length(t))]);
结果:
时间已过 0.061455 秒。%时间较短,说明此时没有较明显的刚性
ode45计算的点数157
lamada较小,两种方法对比
非刚性解法:
lamda=1e-5; %lamda特别小
f=@(t,y) y^2-y^3; 
tic;
[t,y]=ode45(f,[0,2/lamda],lamda);
toc;
disp(['ode45计算的点数' num2str(length(t))]);
结果:
时间已过 0.230707 秒。
ode45计算的点数120565%时间长,点数多表明明显的钢性特征

刚性解法:
lamda=1e-5;
f=@(t,y) y^2-y^3; 
tic;
[t,y]=ode15s(f,[0,2/lamda],lamda);
toc 
disp(['ode15s计算的点数' num2str(length(t))])
结果:
时间已过 0.044472 秒。
ode15s计算的点数98
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章