为了账号安全,请及时绑定邮箱和手机立即绑定

在 FiPy 中使用 ConvectionTerm() 或 DiffusionTerm()

在 FiPy 中使用 ConvectionTerm() 或 DiffusionTerm()

慕森王 2023-02-12 19:12:57
我目前正在学习如何使用 FiPy,并最终想用它来解决一些生物学问题。我一直在尝试实施以下描述真菌菌丝生长的 PDE 系统:PDE系统我可以毫无问题地实现这个系统,只要我忽略了第四个方程 dsi/dt 中si 随时间的变化取决于p 在空间 abs(dp/dx) 上的绝对变化。这是我没有 abs() 的代码:现在,我试着简单地写eqsi = (TransientTerm(var=si)== DiffusionTerm(var=si,coeff=Di*m)- DiffusionTerm(var=p,coeff=Da*m*si) + ImplicitSourceTerm(var=si,coeff=c1*m*se) - ImplicitSourceTerm(var=si,coeff=c2*v*p) - abs(ConvectionTerm(var=p,coeff=[[c4*Da]]*(m*si))))这(预期)给出了一个错误:“abs()的错误操作数类型:'PowerLawConvectionTerm'”我试图通过添加另一个 CellVariable dpdx 来解决这个问题:dpdx= CellVariable(name="dpdx",mesh=mesh,hasOld=True,value=0.)eqdpdx= (dpdx == ConvectionTerm(var=p,coeff=[[1]]))eqsi = (TransientTerm(var=si)== DiffusionTerm(var=si,coeff=Di*m)- DiffusionTerm(var=p,coeff=Da*m*si) + ImplicitSourceTerm(var=si,coeff=c1*m*se) - ImplicitSourceTerm(var=si,coeff=c2*v*p) - abs(dpdx)*c4*Da*m*si)然后给出错误“ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()”,这可能是由于 eqdpdx 不是导函数这一事实造成的?我的问题是:是否可以使用 ConvectionTerm 执行数学运算?我能以某种方式表达 p 的绝对变化吗?而且,我如何表达像 eqdpdx (或任何动态参数)这样随空间变化的非导数函数?我查看了 FiPy 手册但找不到解决方案 - 如果我的问题微不足道或已在其他地方得到解答,我深表歉意。
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

了解 FiPyTerms是什么很重要。它们是可离散化为线性代数的 PDE 部分的人类可读表达式。如果您将一些潜在的非线性函数应用于该线性代数,那么它就不再是线性代数了。不支持这种用途,我不确定它是怎么回事。

幸运的是,您不需要它。dp/dx 不是ConvectionTerm,它是渐变。我会把这个词写成

- ImplicitSourceTerm(coeff=c4*Da*m*p.grad.mag, var=si)

作为旁注,一维方程是魔鬼的工作。他们每次都会让你误入歧途。您可以像我们在手册中那样使用 nabla 表示法,也可以使用 Einstein 表示法,但请始终牢记您的表达式是标量还是矢量(或张量或...)。


查看完整回答
反对 回复 2023-02-12
  • 1 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信