为什么这种数值方法精度的 MATLAB 输出没有变得更准确?
Why is the MATLAB output of this numerical method precision not getting more accurate?
在这里发帖 vs math.stackexchange 因为我认为我的问题是语法:
我正在尝试使用中点法的 MATLAB 代码分析二阶 ODE:y'' + 2y' + 2y = e^(-x) * sin(x)。我首先将 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];
第三个文件:
[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)
在我看来,您的 ODE 求解器应该可以工作 - 但是您正在比较的分析解决方案中存在错字。应该是
Ye = [(1./2).*exp(-t).*(sin(t)-t.*cos(t)) (1./2).*exp(-t).*((t-1).*sin(t)+ t.*cos(t))];
即在导数中的 t.*cos(t)
项之前带有 +
符号。
在这里发帖 vs math.stackexchange 因为我认为我的问题是语法:
我正在尝试使用中点法的 MATLAB 代码分析二阶 ODE:y'' + 2y' + 2y = e^(-x) * sin(x)。我首先将 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];
第三个文件:
[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)
在我看来,您的 ODE 求解器应该可以工作 - 但是您正在比较的分析解决方案中存在错字。应该是
Ye = [(1./2).*exp(-t).*(sin(t)-t.*cos(t)) (1./2).*exp(-t).*((t-1).*sin(t)+ t.*cos(t))];
即在导数中的 t.*cos(t)
项之前带有 +
符号。