[英]SciPy: solve_bvp Problem 2nd Order Diff. Eq
試圖解決二階差異。 等式有 2 個邊界條件,我嘗試什么都沒有,我找不到一個教程,其中包含我表達中的所有/相似術語,至少對我來說,scipy 文檔並沒有真正解釋如何使用solve_bvp 清楚。
我有等式:y'' + 2/r * y' = A * y + b * y^3 其中 y 是 r 的函數。
我把它改寫如下:
y1 = y(r)
y2 = y1'
y2' = -2/r * y2 + y1(A + b * y1^2)
y'(0) = 0, y(r=10) = 常數
A、b 和常數是已知的。
我有以下代碼,但它似乎不起作用,如上所述,我對文檔有些困惑,因此將不勝感激!
def fun(x, y):
return np.vstack((y[2], -2/x*y[1]+y[0]*(A+b*y[0]*y[0])))
def bc(ya, yb):
return np.array([ya[2], yb[1]-constant])
x = np.linspace(1, 10, 10)
ya = np.zeros((3, x.size))
yb = np.zeros((3, x.size))
sol_1 = solve_bvp(fun, bc, x, ya)
sol_2 = solve_bvp(fun, bc, x, yb)
謝謝!
==========編輯======================== 有一個解析解,我已經計算過,它是只是看看我是否也能在數值上找到相同的解決方案,我認為主要問題是解決方案有兩個獨立的區域,一個是 r < R (in),一個是 r > R (out)。 這導致兩種不同的解決方案(僅在各自的域中有效),條件是 y_in(R) == y_out(R) 和 y_in'(R) == y_out'(R)。 完整的 2 部分解決方案,其中半徑 = 1,a=99,b = 1 且常數 = 1,y(inf) = 常數
從 Lutz Lehmann 的解決方案中,它得到了正確的形狀(至少對於內部區域,雖然不是在正確的尺度上)。
我只是不確定您將如何編寫所有等價解決方案,我想甚至首先要獲得他們的解決方案,盡管 Lutz 的回答是正確方向上的一個驚人點。 謝謝
方程的階數為 2,因此狀態向量的維數為 2,值始終為y[0]
,導數y[1]
,沒有y[2]
,可能是 Matlab 翻譯的殘余.
同樣在邊界條件中,沒有ya[2]
,導數值為ya[1]
,第二個中的函數值為yb[0]
。
初始解猜測必須具有相同數量的 2 狀態分量。
為什么用相同的數據計算兩個解決方案?
備注:沒有必要將返回值轉換為 numpy 類型,求解器無論如何都會檢查和轉換。
ODE 在r=0
處是奇異的,因此必須以特殊方式處理第一段。 均值定理給出
(y'(r)-y'(0))/r->y''(0) for r->0,
所以在那個極限r->0
你得到
3*y''(0) = a*y(0) + b*y(0)^3`.
這允許將第一條弧定義為
y(r) = y0 + (a*y0 + b*y0^3)*r^2/6
y'(r) = (a*y0 + b*y0^3)*r/3
最多訂購r³
和r²
。 因此,如果您希望y(r)
精度為1e-9
,則第一段不應長於1e-3
。
不要試圖從y(h)
和y'(h)
的方程中消除y0
以獲得連接ya[0]
和ya[1]
,而是讓求解器也做這項工作並將y0
作為參數添加到系統中. 那么邊界條件有 3 個槽對應於為參數添加的虛擬維度,可以自然地用方程y(h)=ya[0]
和ya[1]=y'(h)
和右邊界條件填充.
總而言之,您可以將系統定義為
h = 1e-3;
def fun(r, y, p):
return y[1], -2/r*y[1]+y[0]*(a+b*y[0]*y[0])
def bc(ya, yb, p):
y0, = p
yh = y0 + y0*(a+b*y0*y0)*h*h/6;
dyh = y0*(a+b*y0*y0)*h/3
return ya[0]-yh, ya[1]-dyh, yb[0]-c
x = np.linspace(h, 10, 10)
ya = np.zeros((2, x.size))
sol = solve_bvp(fun, bc, x, ya, p=[1])
print(sol.message,f"y(0)={sol.p[0]}");
plt.plot(sol.x, sol.y[0]);
以便使用示例參數a, b, c = -1, 0.2, 3
你會得到一個收斂求解器調用y(0)=2.236081087849196
和結果圖
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.