在MATLAB中实施显式Euler方法(用于ODES)



我到处都在搜索,我找不到任何东西。

首先,让我说我从未使用过Mat Lab,所以我不知道自己在做什么。

我尝试了几件事,但没有一个奏效。显然y(0)= 2尝试创建一个0个单元的列表,值为2?

无论如何,有人可以帮我吗?我需要在Mat Lab中编写灵活的Euler方法方程来求解这样的一些方程。

1)y'= 5-3sqrt(y);y(0)= 2

h = .1,.05,.025,.01&&t = .5、1、1.5、2、2.5、3

我不知道我在做什么。

让我们想以恒定的时间步长实现该方法,例如dt>0。如果我们想将方程式集成到时间T>0,则考虑时间离散

tt = 0:dt:T;

我们更好地将解决方案向量分配为速度目的,即

yy=zeros(1,length(tt));

yy将包含我们将要生产的解决方案的第一订单近似(即,在符合符号的情况下,

很少滥用。
yy(1)==y_r(t=0)

yy(end)==y_r(t=T) + global error,

函数 y_r=y_r(t)是我们的真正解决方案)。

据说,我们有一个正常形式的一阶颂歌,即

 dy_r / dt = f(y_r;t)

和初始数据

 y_r(t=0)=y_0

(即,我们有一个库奇问题)。因此,我们首先应该初始化解决方案向量

  yy(1) = y_0;

然后,我们可以找到未来时间的解决方案,即

  N = length(tt);
  for t = 2 : N        // we should look at future times, thus we start from 2
                       // NOTE: this is first order explicit Euler scheme.
       yy(t) = yy(t-1) + dt*f(yy(t-1),t);
  end

我们完成了。我们现在可以绘制解决方案。

  plot(tt,yy);

现在的重点是:您是否满意第一阶数字准确度

认为,如果您使用此方案来解决,例如 hamiltonian 问题(例如简单的谐波振荡器),它将对您的系统产生人为的激发(正确地,您可以从正确的Hamiltonian轨道上看到一个漂移)。几句话,很短的时间后,您的解决方案是完全人造

的确,当您解决真正的问题时,您必须仔细考虑您的问题和物理,然后选择适当的数值方案来解决方程。很快,可能会要求您实施更准确的方案,例如 runge kutta (您可以更好地信任,但至少以其原始形式)。

最新更新