我正在尝试使用 FiPy 库在 Python 中求解 Poisson-Nernst-Planck 方程。它基本上是一组方程式,在我的示例中描述了具有电位梯度的溶液中两种离子浓度的分离。就像在水中混合盐然后在溶液的两端施加电压差一样。 方程式是:
和边界条件:
我设法得到一个收敛的解决方案,但这不是我想要的解决方案。具体来说,我得到 Cp 和 Cn 总是收敛为空间常数,并且 \phi 总是线性的。似乎 \phi 对初始条件无动于衷。即使设置内部固定点(基于this answer)将 \phi 变为线性与断点,这无济于事。
我寻找的解决方案应该是 \phi 更像一个 sigmoid,Cp 和 Cn 在边缘获得高值而在中心获得低值。
我真的很感激帮助!
from fipy import *
# Constants
Lx = 10
nx = 1000
dx = Lx / nx # mm
D = 1
epsilon = 1
# FiPy
mesh = Grid1D(dx=dx, Lx=Lx)
x = mesh.cellCenters[0]
Cp = CellVariable(name="$C_p$", mesh=mesh, hasOld=True)
Cn = CellVariable(name="$C_n$", mesh=mesh, hasOld=True)
phi = CellVariable(name="$\phi$", mesh=mesh, hasOld=True)
viewer = Viewer((Cp, Cn, phi), limits={"ymax":5, "ymin":-5})
# Initial
Cn.setValue(0.5)
Cp.setValue(0.5)
# phi.setValue(6/(1+numerix.exp(-(x-4)))-3) # Sigmoid
# Boundry
Cp.faceGrad.constrain(0, mesh.facesRight)
Cp.faceGrad.constrain(0, mesh.facesLeft)
Cn.faceGrad.constrain(0, mesh.facesRight)
Cn.faceGrad.constrain(0, mesh.facesLeft)
phi.constrain(3, mesh.facesRight)
phi.constrain(-3, mesh.facesLeft)
# Equations
Cp_diff_eq = TransientTerm(coeff=1, var=Cp) == DiffusionTerm(coeff=D, var=Cp) + DiffusionTerm(coeff=D*Cp, var=phi)
Cn_diff_eq = TransientTerm(coeff=1, var=Cn) == DiffusionTerm(coeff=D, var=Cn) - DiffusionTerm(coeff=D*Cn, var=phi)
poission_eq = DiffusionTerm(coeff=epsilon, var=phi) == (ImplicitSourceTerm(var=Cn) - ImplicitSourceTerm(var=Cp))
equations = poission_eq & Cp_diff_eq & Cn_diff_eq
# Simulation
timestep = 0.01
time_final = 20
desired_residual = 1e-2
time = 0
i = 0
while time < time_final:
phi.updateOld()
Cp.updateOld()
Cn.updateOld()
residual = 1e10
j=0
while residual > desired_residual:
print(f"{i}-{j}")
residual = equations.sweep(dt=timestep)
j+=1
if i % 10 == 0:
viewer.plot()
time_inc = timestep
time += time_inc
i += 1