0

我正在研究一个问题,涉及我使用欧拉方法来逼近微分方程 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,只是为了它。当我这样做时,两者重叠。我不明白。我做错了什么?

4

2 回答 2

1

为什么数值解应该给出与解析解相同的答案?查看屏幕上重叠的像素并不是识别任何东西的非常精确的方法。您应该检查两者之间的误差(绝对和/或相对)。您可能还想检查更改步长时会发生什么。您可能还想玩线性系统。到目前为止,您无需整合即可看到这些效果 - 只需设置tequal0.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)

您也没有预先分配任何数组,这使您的代码效率非常低。我的代码可以。在这里阅读。

对于这个专注于编程而不是数学的网站来说,除此之外的更多内容确实是题外话。如果您确实对通过阅读教科书(或Euler 方法的 Wikipedia 页面)无法回答的数字细节有疑问,那么您应该在Math.StackExchange上提问。

于 2014-02-02T17:02:06.867 回答
0

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

于 2014-02-02T19:51:43.643 回答