我正在尝试使用线法以数值方式解决一维扩散问题:
其中右侧是离散的,左侧是使用标准 ode 求解器处理的。
我有两个边界条件。一个边界条件随着每个时间步长 ( dcdt[0]) 动态变化,而另一个边界条件始终固定为一个常数值 ( dcdt[-1])。在时间 0 处还有一个初始条件(浓度分布),即图中所示的深蓝色线。
不幸的是,会发生什么scipy.integrate.ode忽略了两个边界条件!

def diffusion(t,c, h):
dcdt = zeros(Nz)
dcdt[0] = funcA(h)
dcdt[-1] = B # a constant
for i in range(1,Nz-1):
dcdt[i] = D * (c[i+1] - 2*c[i] + c[i-1]) / (dz*dz)
return dcdt
我scipy.integrate.ode用来积分离散化方程。我已经定义了diffusion每次ode(diffusion)调用时设置边界条件的函数。
ode = integrate.ode(diffusion).set_integrator('vode')
ode.set_initial_value(c_initial, 0).set_f_params(h0)
k = 0
while ode.successful() and k < Nt:
dcdz = (y[1] - y[0]) / dz
h[k] = h[k-1] + Q*(h[k-1]**2) / func(h[k-1]) * dt * dcdz
c_out[:,k] = ode.y
t[k] = ode.t
ode.set_f_params(h[k]) # Change the b.c.
ode.integrate(ode.t + dt)
k += 1
我检查了以下内容:
通过插入我已检查已成功传递到求解器
print h的函数。diffusionset_f_paramsh不存在数值不稳定性。我还检查了其他求解器
dopri5、刚性/非刚性选项等。我已经在 while 循环中切换了函数的顺序。似乎问题是内部的,即
ode.integrate(ode.t + dt)求解方程并在将输出返回给我之前忽略我想要强加的边界条件。我很困惑为什么它会那样做。我想到的一件事是我可以
set_initial_value用来设置边界条件。但据我所知,我必须提供一个完整的解决方案向量在某个时间,并且ode.integrate已经在零时间忽略了我的边界条件。