欧拉在Matlab中的方法

时间:2014-02-02 13:38:17

标签: matlab plot approximation numerical-integration

我正在研究一个问题涉及我使用欧拉方法近似微分方程df / dt = af(t)-b [f(t)] ^ 2,当b = 0且b不为零时;我将b = 0时的解析解与近似解进行比较。

f(1) = 1000;
t(1)= 0;
a = 10;
b = 0 ;
dt = 0.01;
Nsteps = 10/dt;

for i = 2:Nsteps
    t(i) = dt + t(i-1);
    %f(i) = f(i-1)*(1 + dt*(a - b*f(i-1)));
    f(i) = f(i-1)*(1 + a*dt); 
end

plot(t,f,'r-')

hold on

fa= a*exp(a*t)

plot(t,fa,'bo')

当b = 0时,微分方程的解是f(t)= c * exp(at)。当我应用初始条件时,f(0)= 1000,则微分方程变为f(t)= 1000 * exp(at)。现在,我的教授说微分方程有一个解析解,无论你使用什么时间步,解析解的图和近似(欧拉方法)都会重合。所以,我希望这两个图重叠。我附上了我所得到的照片。

为什么会这样?为了使图形重叠,我将1000改为10,这是a = 10,只是为了它。当我这样做时,两者重叠。我不明白。我做错了什么?

2 个答案:

答案 0 :(得分:1)

为什么数值解决方案应该给出与分析解决方案相同的答案?查看屏幕上重叠的像素并不是识别任何内容的非常精确的方法。您应该检查两者之间的误差(绝对和/或相对)。您可能还想检查更改步长时会发生什么。而你也可能想要使用线性系统。到目前为止,您无需进行整合即可查看这些效果 - 只需设置t等于0.11就足够了。这是一些更好的格式化代码:

t0 = 0;
dt = 0.01;
tf = 0.1;
t = t0:dt:tf;    % No need to integrate t in for loop for fixed time step
lt = length(t);
f = zeros(1,lt); % Pre-allocate f
f0 = 1000;       % Initial condition
f(1) = f0;
a = 10;
for i = 1:lt-1
    f(i+1) = f(i) + a*f(i)*dt;
    %f(i+1) = f(i) + a*dt; % Alternative linear system to try
end

% Analytic solution
fa = f0*exp(a*t);
%fa = f0+a*t; % Alternative linear system to try

figure;
plot(t,f,'r-',t,fa,'bo')

% Plot absolute error
figure;
plot(t,abs(f-fa))

% Plot relative error
figure;
plot(t,abs(f-fa)./fa)

您也没有预先分配任何使您的代码效率非常低的数组。我的代码呢。阅读here

除此之外,对于这个网站来说真的是偏离主题,这个网站专注于编程而不是数学。如果您对通过阅读教科书(或Wikipedia page for the Euler method)无法解答的数字细节确实有疑问,那么您应该在Math.StackExchange询问他们。

答案 1 :(得分:0)

数值方法不精确,数值和解析解之间总是存在误差。由于Euler方法是一阶方法,因此全局截断误差与积分步骤的步长成正比。