私の問題は構文だと思うのでここに投稿してください:この数値メソッドの精度の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)
matlabには4桁しか表示されませんが、依然として精度は向上しています。出力形式を 'format'コマンドで変更することができます。値を出力する前に 'format long'という行を追加してみてください。 – obchardon
ありがとうございます。あなたはちょっと変わっているのは間違いありませんが、それはまだ予想よりもずっと遅いです。そして、m = 101の場合、それはans = 0.271778245788821となるが、m = 1001の場合、ans = 0.271782072082206が大きくなる。だから私は間違って何か間違いをした。 – xq1515426