我目前正在學習如何使用 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 表示法,但請始終牢記您的表達式是標量還是矢量(或張量或...)。
添加回答
舉報
0/150
提交
取消