ODE求解器使用Lobatto IIIA和系数表

时间:2018-06-04 19:23:47

标签: matlab ode runge-kutta

所以我试图弄清楚如何解决[0,10]中t的给定方程 y' = - y + 2te ^( - t + 2) ,步长为0.01,y(0)= 0。

我应该按照Butcher画面使用Lobatto IIIA方法解决它:

Coefficients table

到目前为止,这就是我所得到的:

function lob = Lobatto_solver()
     h = 0.01;
     t = 0:h:10;
     y = zeros(size(t));
     y(1) = 0;

     f = @(t,y) -y + (2*t*(exp(-t+2)));

     % Lobatto IIIA Method
     for i=1:numel(y)-1
         f1 = f(t(i), y(i));
         f2 = f(t(i)+(1/2)*h, y(i) + (5/24)*h*f1 + (1/3)*h*f2 + (-1/24)*h*f3);
         f3 = f(t(i)+h, y(i) + (1/6)*h*f1 + (2/3)*h*f2 + (1/6)*h*f3);
         y(x) = y(i) + h*((-1/2)*f1 + (2)*f2 + (-1/2)*f3);
     end
 end

当我将f2与自身相等时,当变量仍未定义时,显然没有任何意义。

非常感谢任何帮助:)

干杯

1 个答案:

答案 0 :(得分:0)

您需要一个预测校正器循环,在简单的情况下,校正器使用斜率方程作为定点迭代的基础。在下面的代码中,我还使用了显式Euler步骤的值,原则上您可以使用f1初始化所有斜率。

function lob = Lobatto_solver()
    h = 0.01;
    t = 0:h:10;
    y = zeros(size(t));
    y(1) = 0;

    f = @(t,y) -y + (2*t*(exp(-t+2)));

    % Lobatto IIIA Method
    for i=1:numel(y)-1
        f1 = f(t(i), y(i));
        f3 = f(t(i)+h, y(i)+h*f1)
        f2 = (f1+f3)/2;
        for k=1:3
          f2 = f(t(i)+(1/2)*h, y(i) + (5/24)*h*f1 + (1/3)*h*f2 + (-1/24)*h*f3);
          f3 = f(t(i)+h, y(i) + (1/6)*h*f1 + (2/3)*h*f2 + (1/6)*h*f3);
        end;
        y(i+1) = y(i) + h*((-1/2)*f1 + (2)*f2 + (-1/2)*f3);
    end
    plot(t,y,t,0.05+t.^2.*exp(-t+2))
end

图表显示结果(蓝色)定性正确,精确解曲线(绿色)移动,以便可以看到两条不同的曲线。 enter image description here