欧拉解决ODE的方法(错误减少的原因)

时间:2015-04-03 06:51:34

标签: matlab numerical-methods ode differential-equations

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

enter image description here

系统的分析解决方案

enter image description here

Euler的方法是

enter image description here

现在我想解决系统并将近似值与真值进行比较。这是我在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

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

1 个答案:

答案 0 :(得分:2)

我做了以下修正。如果你计算'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])。正是在这种均衡的瞬态方法中,离散化和真实价值之间存在差异。您可以更清楚地了解情况,如果您为这些解决方案绘制曲线(而不是仅查看数字),那么会发生什么。