使用反应扩散方程的有限差分生成图灵模式

Generating Turing Patterns Using Finite Difference on Reaction Diffusion Equations

提问人:cosmic_crafter 提问时间:11/6/2023 最后编辑:pjscosmic_crafter 更新时间:11/6/2023 访问量:89

问:

对于一个学校项目,我正在 Python 中实现一种有限差分方法,以数值求解以下反应扩散偏微分方程组:

PDE System

到目前为止,我已经实现了以下目标:

import numpy as np
import matplotlib.pyplot as plt

D_u = 1.0
D_v = .03
k1 = 5.0
k2 = 11.0
dx = .01
dy = .01
dt = .0001 

# Initialize domain
x = np.arange(0, 3, dx)
y = np.arange(0, 3, dy)

plate_length = len(x)
max_iter_time = 10000

# initialize solution matrix
u = np.zeros((max_iter_time, plate_length, plate_length)) #u(t,x,y) 
v = np.zeros((max_iter_time, plate_length, plate_length)) #v(t,x,y)

# Initial condition : (u,v) = (u_s, v_s) + r
random_perturbation_u = np.random.normal(loc = 0.01, size=(plate_length, plate_length))
random_perturbation_v = np.random.normal(loc = 0.01, size=(plate_length, plate_length))

u[0,:,:] = 1 + (k2**2)/25 + random_perturbation_u
v[0,:,:] = k2/5 + random_perturbation_v

def periodic_bc(matrix):
    matrix[:, 0, :] = matrix[:, -2, :] 
    matrix[:, -1, :] = matrix[:, 1, :]  
    matrix[:, :, 0] = matrix[:, :, -2]  
    matrix[:, :, -1] = matrix[:, :, 1]  

    return matrix

#implement finite difference
def calculate_u_and_v(u,v):
    for k in range(0, max_iter_time-1,1):
        for j in range(1, plate_length-1):
            for i in range(1, plate_length-1): 
                u[k + 1, i, j] = u[k][i][j] + dt * ((D_u * ((u[k][i+1][j] - 2*u[k][i][j]+ u[k][i-1][j])/dx**2 + (u[k][i][j+1] - 2*u[k][i][j] + u[k][i][j-1])/dy**2))
                + k1 * (v[k][i][j] - (u[k][i][j] * v[k][i][j])/(1 + v[k][i][j]**2)))

                v[k + 1, i, j] = v[k][i][j] + dt * ((D_v * ((v[k][i+1][j] - 2*v[k][i][j]+ v[k][i-1][j])/dx**2 + (v[k][i][j+1] - 2*v[k][i][j] + v[k][i][j-1])/dy**2))
                + k2 - v[k][i][j] - (4 * u[k][j][i] * v[k][j][i])/(1 + v[k][i][j]**2))

        u = periodic_bc(u)
        v = periodic_bc(v)
        
    return u,v

u,v = calculate_u_and_v(u,v)

# plot the final image
plt.figure()
plt.pcolormesh(x, y, v[max_iter_time-1], cmap=plt.cm.jet, vmin=np.min(v), vmax=np.max(v))
plt.title(f"t = {max_iter_time}")
plt.ylabel(f"$k_1=${k1}")
plt.xlabel(f"$D_v=${D_v}")
plt.colorbar(ticks = [])

plt.show()

从中得到这样的结果:我的结果

但我正在尝试复制/重现这样的模式:期望的结果

有谁知道我的实现哪里出了问题?我对这种事情还比较陌生。谢谢。

Python 模拟 数值方法 偏微分 差分

评论

1赞 lastchance 11/6/2023
你能写下你试图解决的方程吗——尤其是反应部分?您的扩散部分在形式上看起来是正确的;但是,您使用的是一阶前向欧拉,并且参数 D.dt/dx^2 大于 1/2,因此您可能会认为这是不稳定的。
0赞 cosmic_crafter 11/6/2023
@lastchance 谢谢你的意见。对不起,我现在已经添加了方程式,我不确定我是否可以在这里使用乳胶,所以我将其添加为屏幕截图
1赞 lastchance 11/6/2023
感谢您添加方程式。我建议你要么大幅减少时间步长,要么切换到像 Crank-Nicolson 这样的隐式方案。(请注意,反应项将耦合 x 和 y 方程。
0赞 cosmic_crafter 11/6/2023
@lastchance我会调查的,谢谢:)

答: 暂无答案