簡體   English   中英

SciPy:solve_bvp 問題二階差異。 等式

[英]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 類型,求解器無論如何都會檢查和轉換。

具有奇異性處理的 BVP 框架

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

最多訂購 因此,如果您希望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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM