scipy.integrate.ode 忽略边界条件

计算科学 pde Python 时间积分 scipy
2021-12-07 02:35:32

我正在尝试使用线法以数值方式解决一维扩散问题:

ct=D2cz2,

其中右侧是离散的,左侧是使用标准 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用来设置边界条件。但据我所知,我必须提供一个完整的解决方案向量c(z,t)在某个时间,并且ode.integrate已经在零时间忽略了我的边界条件。

0个回答
没有发现任何回复~