【问题标题】:Euler's Method In MatlabMatlab中的欧拉方法
【发布时间】:2014-02-25 23:41:26
【问题描述】:

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

【问题讨论】:

  • 您可能希望使用semilogy 而不是plotb[f(t)]2 是什么意思?
  • 表示函数f(t)是平方的
  • 大多数人,尤其是 Matlab 用户,使用^ 来获取电源,而不是[]。后者通常表示参数的整数部分。
  • 哎呀,我什至没有意识到我遗漏了“^”符号。

标签: matlab plot approximation numerical-integration


【解决方案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 提问。

【讨论】:

  • 我深感抱歉。不过,谢谢你的帮助。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多