我必须对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)
是复数值标量函数的时间 t
, f_i
和 g_i
被赋予函数, j = -N,..N
. 这是一个初始值问题,任务是在某个时间找到解决方案 T
.
如果 g_i(t) = h_i(t) = 0
,那么 j
的不同值的等式可以独立求解 . 在这种情况下,我借助于四阶Runge-Kutta方法获得了稳定和精确的解 . 但是,一旦我打开耦合,结果就时间网格步骤和函数的显式形式变得非常不稳定 g_i
, h_i
.
我想尝试使用隐式Runge-Kutta方案是合理的,在这种情况下这可能是稳定的,但如果我这样做,我将不得不评估一个巨大的矩阵 4*N*c
的倒数,其中 c
依赖于每个步骤的方法顺序(例如,高斯 - 勒让德方法的 c = 3
) . 当然,矩阵将主要包含零并具有块三对角形式,但它似乎仍然非常耗时 .
所以我有两个问题:
-
是否有一个稳定的显式方法,即使耦合函数
g_i
和h_i
(非常)很大时也能正常工作? -
如果隐式方法确实是一个很好的解决方案,那么块三对角矩阵的反转最快的方法是什么?目前我只是执行一个简单的高斯方法,避免由于矩阵的特定结构而产生的冗余操作 .
可能对我们有帮助的其他信息和细节:
-
我使用Fortran 95 .
-
我目前正在考虑
g_1(t) = h_1(t) = g_2(t) = h_2(t) = -iAF(t)sin(omega*t)
,其中i
是虚数单位,A
和omega
是常数,而F(t)
是一个平缓的包络,首先是0到1,然后是1到0,所以F(0) = F(T) = 0
. -
最初
u_j = v_j = 0
除非j = 0
. 绝对值j
的函数u_j
和v_j
对于所有t
都非常小,因此初始峰值不会达到"boundaries" .
1 回答
要1)如果你的函数很大,就没有稳定的显式方法 . 这是因为显式(Runge-Kutta)方法的稳定性区域是紧凑的 .
要2)如果您的矩阵大于100x100,您可以使用此方法:Inverses of Block Tridiagonal Matrices and Rounding Errors .