使用fipy的Python pde解决方案给出了值错误

使用fipy的Python pde解决方案给出了值错误,python,valueerror,pde,fipy,Python,Valueerror,Pde,Fipy,我正在尝试使用python中的fipy包解决pde。我为同样的目的编写的代码已经附上 !pip install fipy from fipy import * mesh= Grid2D(nx=0.001,dx=100,ny=0.0005,dy=100) phil=CellVariable(name='Sol variable',mesh=mesh) phil.constrain(0,mesh.facesBottom) phil.constrain(1,mesh.facesTop) n=1.7*1

我正在尝试使用python中的fipy包解决pde。我为同样的目的编写的代码已经附上

!pip install fipy
from fipy import *
mesh= Grid2D(nx=0.001,dx=100,ny=0.0005,dy=100)
phil=CellVariable(name='Sol variable',mesh=mesh)
phil.constrain(0,mesh.facesBottom)
phil.constrain(1,mesh.facesTop)
n=1.7*10**(-6)*((0.026*numerix.exp(phil/0.026)+phil-0.026)+2.25*10**(-10)*(0.026*numerix.exp(phil/0.026)-phil-0.026))**(0.5)
eq=(PowerLawConvectionTerm(coeff=(0.,1.))+ImplicitSourceTerm(coeff=n))
eq.solve(var=phil)
当我试图运行代码时,最后一行出现错误:k超过了矩阵维数。
任何有关这方面的帮助都将不胜感激。

上述代码的明显问题是
dx
nx
混淆了
dx
是网格间距,因此是一个浮点,而
nx
是网格单元的数量,它是一个整数。因此,第三行应该是

mesh= Grid2D(dx=0.001,nx=100,dy=0.0005,ny=100)
这至少使问题运行时不会出错。但是这个解不是很有趣,因为源项和初始条件似乎处处为零,所以结果处处为零

以下几点也值得考虑

  • FiPy并不是真正为双曲问题设计的,因为双曲问题需要高阶离散化才能精确求解。它会解决问题,但可能不那么准确(在平衡状态下可能没问题)
  • 源项是非线性的,因此需要多次迭代才能获得解决方案
  • 在这类方程中有一个过渡项,然后迭代到平衡点,这是个好主意

谢谢您的建议。这确实是我弄错的语法错误。但我的源项不是0。源项的系数为已定义的“n”,源项还进一步依赖于变量“phil”。我得到零soln无处不在,这不应该是这样的。初始条件可以是0。我不明白你为什么说源项是0。我在方程中没有一个瞬态项,你能建议我如何在Fipy中加入这些变量相关的源项吗?
phil
最初为零。您的源为零,因为
隐式源项
表示
coeff*var
。你的方程是$\nabla\cdot(\phi\vec{v})+n\phi==0$,至少当我打印出变量“n”时,它只是显示了零的丢失,并且对它做了一个最大和最小值。因为它太小,所以在数值上可能已经四舍五入为零。变量相关源项需要线性化,这一点您已经用隐式源项完成了。但是,在线性化时,您有很多选择。一般来说,使用泰勒展开是最好的方法。