【问题标题】:Numerical stability of ODE systemODE系统的数值稳定性
【发布时间】:2016-12-23 10:38:14
【问题描述】:

我必须对具有以下形式的 ODE 系统进行数值求解:

du_j/dt = f_1(u_j, v_j, t) + g_1(t)v_(j-1) + h_1(t)v_(j+1),

dv_j/dt = f_2(u_j, v_j, t) + g_2(t)u_(j-1) + h_2(t)u_(j+1),

其中u_j(t)v_j(t) 是时间的复值标量函数tf_ig_i 是给定的函数,而j = -N,..N。这是一个初值问题,任务是在某个时间找到解T

如果g_i(t) = h_i(t) = 0,则可以独立求解j 不同值的方程。在这种情况下,我借助四阶 Runge-Kutta 方法获得了稳定且准确的解。然而,一旦我打开耦合,结果在时间网格步长和函数g_ih_i的显式形式方面变得非常不稳定。

我想尝试使用隐式 Runge-Kutta 方案是合理的,在这种情况下它可能是稳定的,但如果我这样做,我将不得不评估大小为 4*N*c 的巨大矩阵的逆矩阵, 其中c 取决于每个步骤的方法顺序(例如,c = 3 用于 Gauss–Legendre 方法)。当然,矩阵大部分会包含零并具有块三对角形式,但它似乎仍然非常耗时。

所以我有两个问题:

  1. 是否有一种稳定的显式方法,即使在耦合函数 g_ih_i (非常)大时也能正常工作?

  2. 如果隐式方法确实是一个很好的解决方案,那么最快的块三对角矩阵求逆方法是什么?目前我只是执行一个简单的高斯方法,避免了由于矩阵的特定结构而出现的冗余操作。

可能对我们有所帮助的其他信息和详细信息:

  • 我使用 Fortran 95。

  • 我目前考虑g_1(t) = h_1(t) = g_2(t) = h_2(t) = -iAF(t)sin(omega*t),其中i 是虚数单位,Aomega 是常数,F(t) 是一个平滑的包络线,首先从0 到1然后从 1 到 0,所以F(0) = F(T) = 0

  • 最初是u_j = v_j = 0,除非j = 0。函数u_jv_j 的绝对值j 对于所有t 来说都非常小,因此初始峰值没有达到“边界”。

【问题讨论】:

    标签: numerical-methods ode runge-kutta numerical-stability


    【解决方案1】:

    To 1)如果你的函数非常大,就不会有稳定的显式方法。这是因为显式 (Runge-Kutta) 方法的稳定性区域很紧凑。

    To 2)如果您的矩阵大于 100x100,您可以使用此方法: Inverses of Block Tridiagonal Matrices and Rounding Errors.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 2020-07-07
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      相关资源
      最近更新 更多