我有一个简单的线性系统,具有二阶ODE。
系统的分析解决方案
Euler的方法是
现在我想解决系统并将近似值与真值进行比较。这是我在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
我的问题是为什么错误正在减少?
答案 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])。正是在这种均衡的瞬态方法中,离散化和真实价值之间存在差异。您可以更清楚地了解情况,如果您为这些解决方案绘制曲线(而不是仅查看数字),那么会发生什么。