![](/img/trans.png)
[英]Performance issue with Scipy's solve_bvp and coupled differential equations
[英]Solve system of coupled differential equations using scipy's solve_bvp
我想解決一個由 7 個耦合的二階微分方程組成的邊值問題。 有 7 個函數y1(x),...y7(x)
,它們中的每一個都由以下形式的微分方程描述
d^2yi/dx^2 = -(1/x)*dyi/dx - Li(y1,...,y7) for 0 < a <= x <= b,
其中Li
是一個函數,它給出y1,...,y7
的線性組合。 我們對在x=a
處的一階導數dyi/dx
和在x=b
處的函數yi
有邊界條件:
dyi/dx(a) = Ai,
yi(b) = Bi.
所以我們可以將其重寫為一個由 14 個耦合的一階 ODE 組成的系統:
dyi/dx = zi,
dzi/dx = -(1/x)*zi - Li(y1,...,y7),
zi(a) = Ai,
yi(b) = Bi.
我想使用 Python 函數scipy.integrate.solve_bvp
求解這個方程組。 但是,我很難理解文檔( https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_bvp.html )中描述的函數的輸入參數到底應該是什么。
這個函數需要的第一個參數是一個可調用的fun(x,y)
。 據我了解,輸入參數y
必須是由yi
和zi
的值組成的數組,並給出zi
和dzi/dx
的值作為輸出。 所以我的函數看起來像這樣(偽代碼):
def fun(x,y):
y1, z1, y2, z2, ..., y7, z7 = y
return [z1, -(1/x)*z1 - L1(y1,...,y7),
...,
z7, -(1/x)*z7 - L7(y1,...,y7)]
那是對的嗎?
然后, solve_bvp
的第二個參數是一個可調用的bc(ya,yb)
,它應該評估邊界條件的殘差。 在這里,我真的很難理解如何定義這樣的功能。 我也不清楚數組ya
和yb
到底是什么以及它們應該具有什么形狀?
第三個參數是x
,它是形狀為(m,)
的“初始網格”。 x
是否應該僅由點a
和b
組成,這是我們知道邊界條件的地方? 還是應該是別的東西?
最后第四個參數是y
,它是“網格節點處函數值的初始猜測”,形狀(n,m)
。 它的第 i 列對應於x[i]
。 我猜第一行對應y1
,第二行對應z1
,第三行對應y2
,等等。對嗎? 此外,應該把哪些值放在這里? 我們可以在x=a
和x=b
處加入已知的邊界條件,但我們不知道函數在任何其他點的樣子。 此外,這個y
與函數bc(ya,yb)
有什么關系? 輸入參數ya,yb
是否以某種方式從這個y
派生而來?
任何有助於理解solve_bvp
的語法及其在這種情況下的應用的幫助將不勝感激。
對於邊界條件, bc
返回方程的殘差。 即對方程進行變換,使右邊為零,然后返回左邊的向量。 ya,yb
是點x=a,b
的狀態向量。
對於初始狀態,它可以是任何東西。 然而,“任何東西”在大多數情況下都會由於奇異的雅可比或太大的網格而導致無法收斂。 求解器所做的是求解大型非線性方程組(參見搭配方法)。 與任何此類系統一樣,如果您開始與實際解決方案足夠接近,則最能確保收斂。 所以你可以試試yi
Bi
的常數函數x=b
處具有斜率Ai
和值Bi
的線性函數使用這些函數的導數得到zi
的值。 不能保證這是有效的,特別是當接近零時,你有接近常數解和對數的基解, a
越接近零,它變得越奇異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.