在MATLAB中实现显式Euler方法(用于ODE)

时间:2012-10-25 06:45:38

标签: matlab math differential-equations

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

首先,我只想说我从未使用过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

我不知道我在做什么。

1 个答案:

答案 0 :(得分:5)

让我们假设用恒定时间步骤实现该方法,比如说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)是我们真正的解决方案。)

据说,我们有正常形式的第一顺序ODE ,即

 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);

现在重点是:满意 一阶时间准确性

如果您使用此方案来解决,例如哈密尔顿问题(比如简谐振子),它会给你的系统带来人工激励(正确地说,你可以看到正确的哈密顿轨道偏离)。简而言之,经过一段时间后,您的解决方案完全是人为的

的确,当你解决实际问题时,你必须仔细考虑你的问题和你的物理,然后选择一个合适的数值方案来解决你的等式。很快,可能会要求您实施更准确的方案,例如 Runge Kutta (您可以更好地信任,但只需要一点点,至少以其原始形式)。