为什么这种数值方法精度的 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) 项之前带有 + 符号。