2016-11-14 8 views
1

私の問題は構文だと思うのでここに投稿してください:この数値メソッドの精度のMATLAB出力は、なぜ正確ではありませんか?

私は2次ODEを分析しようとしています:y '' + 2y '+ 2y = e ^( - x)* sin(x )中点メソッドのMATLABコードを使用します。最初にODEを一次方程式の系に変換し、それを下に適用しようとしましたが、離散化[m]が増加すると、出力は.2718で停止します。例えば、M = 11件の収率:

ans = 

0.2724 

及びM = 101:

ans = 

0.2718 

およびm = 10001

ans = 

0.2718 

は、ここでは、コードは次のとおり

function [y,t] = ODEsolver_midpointND(F,y0,a,b,m) 

    if nargin < 5, m = 11; end 
    if nargin < 4, a = 0; b = 1; end 
    if nargin < 3, a = 0; b = 1; end 
    if nargin < 2, error('invalid number of inputs'); end 

    t = linspace(a,b,m)'; 
    h = t(2)-t(1); 

    n = length(y0); 

    y = zeros(m,n); 
    y(1,:) = y0; 
    for i=2:m 
    Fty = feval(F,t(i-1),y(i-1,:)); 
    th = t(i-1)+h/2; 

    y(i,:) = y(i-1,:) + ... 
     h*feval(F,th,y(i-1,:)+(h/2)*Fty); 
    end 

セパレートファイル:

function F = Fexample1(t,y) 

F1 = y(2); 
F2 = exp(-t).*sin(t)-2.*y(2)-2.*y(1); 
F = [F1,F2]; 

3番目のファイルは: - しかし、あなたが比較している解析解にタイプミスがあると、それが動作するはずのよう

[Y,t] = ODEsolver_midpointND('Fexample1',[0 0],0,1,11); 
Ye = [(1./2).*exp(-t).*(sin(t)-t.*cos(t)) (1./2).*exp(-t).*((t-1).*sin(t)- t.*cos(t))]; 
norm(Y-Ye,inf) 
+0

matlabには4桁しか表示されませんが、依然として精度は向上しています。出力形式を 'format'コマンドで変更することができます。値を出力する前に 'format long'という行を追加してみてください。 – obchardon

+0

ありがとうございます。あなたはちょっと変わっているのは間違いありませんが、それはまだ予想よりもずっと遅いです。そして、m = 101の場合、それはans = 0.271778245788821となるが、m = 1001の場合、ans = 0.271782072082206が大きくなる。だから私は間違って何か間違いをした。 – xq1515426

答えて

0

あなたのODEソルバーは、私には見えます。これは誘導体でt.*cos(t)用語前+記号

Ye = [(1./2).*exp(-t).*(sin(t)-t.*cos(t)) (1./2).*exp(-t).*((t-1).*sin(t)+ t.*cos(t))]; 

すなわちなければなりません。

+0

ありがとうございました。私はずっとそれを見ていて、まだそれを見ることができなかった。 – xq1515426

関連する問題