欧拉求解 ODE 的方法(为什么误差在减少)

Euler’s Method for solving ODE ( why the error is decreasing )

我有一个具有二阶 ODE 的简单线性系统。

系统的解析解为

欧拉法是

现在我想求解系统,比较近似值和真值。这是我在 Matlab 中的代码

clear all; clc;

 t = 0;
dt = 0.2;
tsim = 5.0;
n = round((tsim-t)/dt);
A = [ -3 0; 
      0 -5];
B = [2;3];
XE = [1; 2];
u = 1;

fprintf('Time \t     Euler Value \t True Value  Error \n');

for i = 1:n

    % Analytical Method
    XA = [ exp(-3*t)/3 + 2/3; 
          (7*exp(-5*t))/5 + 3/5];

    % Euler Method
    dx  = A*XE + B*u;
    XE  = XE + dx*dt;
    X1(i,:) = [t, XE'];
    fprintf('%f \t %f \t     %f \t %f\n', t, XE(1), XA(1), (XA(1)-XE(1))/XA(1)*100 );

    t = t + dt;
end

结果是

Time         Euler Value     True Value  Error 
0.000000     0.800000        1.000000    20.000000
0.200000     0.720000        0.849604    15.254624
0.400000     0.688000        0.767065    10.307440
0.600000     0.675200        0.721766    6.451714
0.800000     0.670080        0.696906    3.849297
1.000000     0.668032        0.683262    2.229064
1.200000     0.667213        0.675775    1.266957
1.400000     0.666885        0.671665    0.711675
1.600000     0.666754        0.669410    0.396748
1.800000     0.666702        0.668172    0.220089
2.000000     0.666681        0.667493    0.121690
2.200000     0.666672        0.667120    0.067134
2.400000     0.666669        0.666916    0.036980
2.600000     0.666668        0.666803    0.020348
2.800000     0.666667        0.666742    0.011188
3.000000     0.666667        0.666708    0.006149
3.200000     0.666667        0.666689    0.003378
3.400000     0.666667        0.666679    0.001855
3.600000     0.666667        0.666673    0.001019
3.800000     0.666667        0.666670    0.000559
4.000000     0.666667        0.666669    0.000307
4.200000     0.666667        0.666668    0.000169
4.400000     0.666667        0.666667    0.000092
4.600000     0.666667        0.666667    0.000051
4.800000     0.666667        0.666667    0.000028

我的问题是为什么错误在减少?

我已进行以下更正。如果您计算“XE = XE + dx*dt;”,那么时间也必须增加“t = t + dt;”:

clear all; clc;

 t = 0;
dt = 0.2;
tsim = 5.0;
n = round((tsim-t)/dt);
A = [ -3 0; 
      0 -5];
B = [2;3];
XE = [1; 2];
u = 1;
X1(1,:) = [t, XE'];

fprintf('Time \t     Euler Value \t True Value  Error \n');

for i = 2:n+2

    % Analytical Method
    XA = [ exp(-3*t)/3 + 2/3; 
          (7*exp(-5*t))/5 + 3/5];

    fprintf('%f \t %f \t     %f \t %f\n', t, XE(1), XA(1), (XA(1)-XE(1))/XA(1)*100 );

    % Euler Method
    dx  = A*XE + B*u;
    XE  = XE + dx*dt;
    X1(i,:) = [t, XE'];


    t = t + dt;
end

现在输出是:

Time         Euler Value     True Value  Error 
0.000000     1.000000        1.000000    0.000000
0.200000     0.800000        0.849604    5.838471
0.400000     0.720000        0.767065    6.135693
0.600000     0.688000        0.721766    4.678287
0.800000     0.675200        0.696906    3.114622
1.000000     0.670080        0.683262    1.929326
1.200000     0.668032        0.675775    1.145733
1.400000     0.667213        0.671665    0.662889
1.600000     0.666885        0.669410    0.377167
1.800000     0.666754        0.668172    0.212243
2.000000     0.666702        0.667493    0.118548
2.200000     0.666681        0.667120    0.065876
2.400000     0.666672        0.666916    0.036477
2.600000     0.666669        0.666803    0.020147
2.800000     0.666668        0.666742    0.011108
3.000000     0.666667        0.666708    0.006116
3.200000     0.666667        0.666689    0.003365
3.400000     0.666667        0.666679    0.001850
3.600000     0.666667        0.666673    0.001017
3.800000     0.666667        0.666670    0.000558
4.000000     0.666667        0.666669    0.000307
4.200000     0.666667        0.666668    0.000168
4.400000     0.666667        0.666667    0.000092
4.600000     0.666667        0.666667    0.000051
4.800000     0.666667        0.666667    0.000028
5.000000     0.666667        0.666667    0.000015

通过使用正确的时间戳,最大误差从 20% 减少到 6%。

对于 t -> inf,解收敛到稳态条件。该算法显然能够找到这个最终值(其中 dx -> [0 0])。只是在达到这种平衡的瞬态方法中,离散化和真值之间存在差异。如果您绘制这些解决方案的曲线(而不是只看数字),您可以获得更清晰的画面。