改进的Euler法

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