1. ホーム
  2. matlab

[解決済み] MATLABのコードヘルプです。バックワードオイラー法

2022-02-17 20:29:25

質問内容

以下は MATLAB / フリーマット を解決するために得たコード オデ を使用して数値的に バックワードオイラー というメソッドがあります。しかし、その結果は私の教科書の結果と矛盾しており、時にはとんでもなく矛盾していることもあります。このコードのどこがおかしいのでしょうか?

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

解決方法は?

あなたのメソッドは、メソッド 新しい種類の . 後方オイラーでも前方オイラーでもない。)

フォワード・オイラー 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 をフォワードオイラー方式で行う。この方法の解析はしたくないのですが、forward Euler と比べても、確かに悪い挙動を示すと思います。 f を間違ったポイントで使っています。

この方法は、私が思いつく限りでは、あなたの方法に最も近い方法で、同様に明示的で、より良い結果が得られるはずです。それは ヘウン方式 :

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