错误的结果22阶段多步法是的n + 2-是的n= h [ ( 1 / 3 )Fn + 2+ ( 4 / 3 )Fn + 1+ ( 1 / 3 )Fn]yn+2−yn=h[(1/3)fn+2+(4/3)fn+1+(1/3)fn]

计算科学 matlab 迭代法 数字 微分方程
2021-12-19 20:54:41

我需要修复代码以利用2阶段多步法:

yn+2yn=h[(1/3)fn+2+(4/3)fn+1+(1/3)fn]

由于这是一种隐式方法,因此我使用 Newton-Raphson 方法来最终确定yn+2.

下面,是我尝试在第一个近似步骤中实现已经给定的 rk4 方法(runge-kutta 4)的代码:

function [tout, yout] = newcorrect(FunFcn,t0,tfinal,step,y0)
maxiter = 1000;
tolnr   = 1e-9;
diffdelta = 1e-6;
stages=2;
[tout,yout]=rk4(FunFcn,t0,t0+(stages-1)*step,step,y0);
tout=tout(1:stages);
yout=yout(1:stages);
t = tout(stages);
y = yout(stages).';
% The main loop
 while abs(t- tfinal)> 1e-6 
    if t + step > tfinal, step = tfinal - t; end
    t = t + step;
    yn0 = y;
    ynf = yn0;
    yn = inf;
    iter = 0;
    while (abs(yn - ynf)>= tolnr) && (iter < maxiter)
        df = 1/diffdelta * (feval(FunFcn,t, yn0+diffdelta) - feval(FunFcn, t, yn0));
        yn = yn0 - 1/(1/3*step*df - 1) * (4/3*step*feval(FunFcn,tout(end),yout(end)) + 1/3*step*feval(FunFcn,tout(end-1),yout(end-1)) + 1/3*step*feval(FunFcn, t, yn0) -yn0 + yout(end-1));
        ynf = yn0;
        yn0 = yn;
        iter = iter + 1;
    end
    y = yn;
    tout = [tout; t];
    yout = [yout; y.'];
 end
end

这用于通过实验证明,当您将步长除以 2 时,每个连续不同步长的最大绝对误差的分数h大约等于2p在哪里p是方法的顺序。该方法被证明是有序的4. 该练习希望最初的起点是k0=2因此我创建了以下脚本:

clear all;
t0 = 1;
tfinal = 3;
y1 = 2;
tout  =t0:0.01:tfinal;
k0 = 2;
kf = input('enter final k:')
for k = k0:kf
  h(k-1) = 2^(-k);
  [tout,yout] = newcorrect('f0', t0, tfinal, h(k-1), y1);
  outputs{k-1} = [tout,yout];
end
for i = 1:(kf-1)
   maxabserror(i) = max(abs(outputs{1,i}(:,2)-f0true(outputs{1,i}(:,1))));
end
 for i = 1:(kf-2)
   consmax(i) = maxabserror(i+1)/maxabserror(i);
end

函数 f0 和 f0true 是:

function yprime = f0(t,y)
yprime = (t.^2 + y.^2)/(2.*t.*y);
end

function y = f0true(t);
y = sqrt(t.*(t+3));
end

但是,当我运行该方法时,问题是尽管为解决方案值提供了非常好的近似值,但无法执行顺序的实验结论(分数变化并且不收敛到2p.

**运行脚本后kf=10,我得到连续的绝对最大误差分数向量:

consmax=[0.0704,0.0657,0.0639,0.0632,0.0628,0.0627,0.0656,0.2400]

很容易看出,它的每一项都趋向于这确实是我们想要的,因为是方法的顺序。但是最后一个值是怎么回事?1/16=244

我的错误在哪里?这是可以解释的吗?

1个回答

每个积分步骤中的局部误差由 3 部分组成:

  • 方法的离散化误差
  • 在精度受限的数据类型中实际执行该方法的浮点误差,以及
  • 专门针对隐式方法,求解隐式方程时的误差。

第一个错误是大小O(hp+1), 大小的第二个μ,μ数字类型的机器常数。最后一个错误取决于实现。

通常使用具有显式方法步骤的预测器-校正器方案作为预测器,通常具有相同的顺序p因此,随后对隐式方程的解的校正步骤仅影响主导功率的系数h的错误。这里一个简单的非平凡预测器是中点步骤yn+1[0]=yn1+2hf(tn,yn)有错误O(h3). .

每个类似牛顿的校正器实现(如简化的牛顿方法)都会将该误差减少一倍Ch2因此,通常在第一次校正器迭代之后达到方法的顺序。如果Ch21,校正器步骤的更新可以作为到精确解的剩余距离的代理,因此如果更新小于例如,也可以停止校正器循环而不是固定数量的 1 到 3 次校正器迭代0.1h4yn+1[0]yn(它是并且随着问题的缩放而缩放)。O(h5)

显然,将最后一个容差设置为独立于将为局部误差和全局误差引入一个下限。您使用之前的值作为预测变量这有错误始终执行一个牛顿步骤,因此真正比较的第一个误差具有大小则第二步到错误并因此不执行该方法的顺序,这与您观察到的有关。hyn+1[0]=ynO(h)tolnr = 1e-9;O(h3)O(h5)h3109h103210