离散微分方程并在每个时间步长中找到参数的值

时间:2017-05-24 17:27:41

标签: matlab numerical-methods differential-equations

我想通过在f(t)上使用for循环找到t的值。管理f的等式是:

df/dt = cos(f) g(x,y,t)

xy是2D坐标。我写了下面的代码:

dt=1; a=2;
f(1,1)= a*rand(1,1);
for t = 2:100
    f(1,t)= cos(f(1,t-1)) g(x,y,t) dt;
end

但是我不确定这种方法是否正确,或者是否可以更好地编写它。谁能帮助我知道它是否正确?

1 个答案:

答案 0 :(得分:1)

您实际上是在尝试使用单位步长($h = 1$)来实现Euler方法。推进$f$ are $f_{n+1} = f_{n} + h cos(f_{n}) g(x,y,t_{n})$的公式。这里$t_n = t_0 + n h$。因此,循环中的代码需要更改为:

 f(1,t) = f(1,t-1) + cos(f(1,t-1)) g(x,y,t-1) dt

此方法适用于此系统吗?坦率地说,它不太可能。欧拉方法倾向于使用平滑函数,该函数相对于步长变化不大。鉴于$ cos $函数的快速变化,对于大步长,euler方法很可能会失败。

如何解决系统问题?你可以做一些事情。

  1. 使用较小的步长(它必须非常小)。
  2. 使用其他解决方法,例如Runge-Kutta。
  3. 解决分析解决方案。
  4. 如果我是你,我会做分析路线。祝你好运