MATLAB代码帮助.后向欧拉方法

m0s*_*m0s 0 matlab numerical-methods freemat

这是我使用后向欧拉方法以数字方式求解ODEMATLAB/FreeMat代码.但是,结果与我的教科书结果不一致,有时甚至是荒谬的不一致.代码有什么问题?

function [x,y] = backEuler(f,xinit,yinit,xfinal,h)

    %f - this is your y prime
    %xinit - initial X
    %yinit - initial Y
    %xfinal - final X
    %h - step size

    n = (xfinal-xinit)/h; %Calculate steps

    %Inititialize arrays...
    %The first elements take xinit and yinit corespondigly, the rest fill with 0s.
    x = [xinit zeros(1,n)];
    y = [yinit zeros(1,n)];

    %Numeric routine
    for i = 1:n
        x(i+1) = x(i)+h;
        ynew = y(i)+h*(f(x(i),y(i)));
        y(i+1) = y(i)+h*f(x(i+1),ynew);
    end
end
Run Code Online (Sandbox Code Playgroud)

Oli*_*ier 5

你的方法是一种新方法.它既不向后也不向前欧拉.:-)

转发欧拉: y1 = y0 + h*f(x0,y0)

落后的欧拉 solve in y1: y1 - h*f(x1,y1) = y0

你的方法: y1 = y0 +h*f(x0,x0+h*f(x0,y0))

你的方法不是落后欧拉.

你没有解决y1,你只是y1用前向欧拉方法估计.我不想继续对你的方法进行分析,但我相信它会表现得很差,甚至与前向欧拉相比,因为你f在错误的点上评估函数.

这是我能想到的最接近你的方法的方法,也是明确的,它可以提供更好的结果.这是Heun的方法:

y1 = y0 + h/2*(f(x0,y0) + f(x1,x0+h*f(x0,y0)))