Euler法是数值求解一阶常微分方程初值问题常用的方法之一,按照计算精度的不同,分为Euler折线法、梯形法、改进的Euler法等。下面重点介绍精度较高的Euler法。改进的Euler法实际上是根据Euler折线法和梯形法结合而来的。改进的Euler法的公式如下所示:
\[\begin{matrix} {y}_{i+1}^{*}={y}_{i}+h f({x}_{i},{y}_{i}) \\ {y}_{i+1}={y}_{i}+\frac{h}{2}[f({x}_{i},{y}_{i})+f({x}_{i+1},{y}_{i+1}^{*})] \end{matrix}\]
为便于编写程序,可将上式改写成下面的形式:
\[\begin{matrix} {y}_{p}={y}_{i}+h f({x}_{i},{y}_{i}) \\ {y}_{c}={y}_{i}+h f({x}_{i+1},{y}_{p}) \\ {y}_{i+1}=\frac{1}{2}({y}_{c}+{y}_{p}) \end{matrix}\]
根据上述公式,可以编写改进的Euler法的M文件Euler.m,如下所示:
code.matlab
function s=Euler(fun,x0,xn,y0,n)
% 用Euler法计算常微分方程初值问题
% x0为初值条件y(x0)=y0中的x0,y0为初值条件中的y0
% xn为x取值区间的最后一个节点的横坐标值
% n为把区间分成的等份数
if nargin<5
error
return
end
h=(xn-x0)/n;
for i=1:n
yp=y0+h*feval(fun,x0,y0);
x0=x0+h;
yc=y0+h*feval(fun,x0,yp);
y0=(yp+yc)/2;
end
s=y0;
return
【例28】求解下列初值问题:
\(\left\{ \begin{aligned} \&\frac{dy}{dx}=-2xy \\ \&y{|}_{x=0}=1 \end{aligned} \right.\), \(0\leq x\leq1.2\)
在MATLAB中实现时,按照下面的步骤进行。
首先,编写上述函数的M文件ff2.m:
code.matlab
function y=ff2(x,y)
y=-2*x*y;
然后,可以用改进的Euler法的M函数进行求解,如下所示:
code.matlab
>> Euler('ff2',0,1.2,1,100)
ans =
0.2370