我正在尝试为 Fitzhugh-Nagumo 模型提出一个 python 实现。
V_t = V_xx + V(V - a)(1 - V) - W + I
W_t = eps(beta*V - W)
使用 eps = 0.05, a = 0.2, beta = 5, I = .1
的基本代码,我可以对系统进行数值求解(无需 V_xx
),但我似乎不知道如何实现空间扩散。
def func_v(v, w):
return v * (1 - v) * (v - .2) - w + .1
def func_w(v, w):
return .05 * (5 * v - w)
def get_yn(t0, v, w, h, t):
while t0 < t:
w += h * func_w(v, w)
v += h * func_v(v, w)
t0 += h
return v, w
我知道二阶导数的中心差分公式是
V_xx(x_i, t) = (V(x_i+1, t) - 2*V(x_i, t) + V(x_i-1, t)) / dx^2
但是我如何实现 x_i
的不同值(比如说从 x=0
到 10
)以获得波形沿x轴传播?
结果应该给出一个像这样传播的波。
最佳答案
ODE 求解器(实际上是任何计算机程序)只能处理具有有限维状态的问题。该偏微分方程中的状态是x
的一对函数v,w
。从必要的普遍性来看,这些不能在计算机中表示。因此,您需要使用有限近似。在许多情况下被认为足够的第一个是简单函数表。然后使用有限差分公式计算 x
导数。
x = np.linspace(0,L,N+1);
dx = x[1]-x[0];
v0,w0 = initial_functions(x);
def func_v(v, w):
d2v = -2*v;
d2v[0] += v[-1]+v[1];
d2v[1:-1] += v[:-2] + v[2:]
d2v[-1] += v[-2]+v[0];
return d2v/dx**2 + v * (1 - v) * (v - .2) - w + .1
等等
对于概念验证,欧拉方法可能就足够了,但获得的值是有问题的。使用更高阶的方法来获得可用的结果,而无需使用小得离谱的时间步长。
关于python - 利用空间扩散因子实现 Fitzhugh-Nagumo 模型的数值求解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59364039/