簡體   English   中英

使用 scipy solve_bvp 解決邊界值問題(擴散反應方程)

[英]Solving a boundary value problem (diffusion-reaction equation) with scipy solve_bvp

我正在努力解決以下二階邊界值問題:

y'' + 2/x*y' + k**2.0*F(y) = 0

y(x=1)=1,  y'(x=0)=0

F(y) = -y or F(y) = -y*exp(AB*(1-y)/(1+B(1-y))

我以某種方式未能正確設置邊界條件。 我通過以下方式定義了F(y)=y和邊界條件的函數:

def fun(x, y, p):
 k = p[0]
 return np.vstack((y[1], -2.0/x*y[1] + k**2.0*y[0]))

def bc(ya, yb, p):
     return np.array([ya[0], yb[0],ya[1]])

y[0,:] = 1
y[1,0] = 0
sol = solve_bvp(fun, bc, x, y, p=[40])

我應該得到的結果肯定是錯誤的,改變初始條件不會讓事情變得更好。 我認為我的問題是與 x=0 處的零梯度邊界條件有什么關系。 有誰知道我做錯了什么?

編輯:這里是一個 MWE,對於 k=0.01,它應該給出一個常數值 1。 但是對於 ak=5,x=0 處的值應該是大約。 0.06:

def fun(x, y, p):
     k = p[0]
     return np.vstack((y[1], -2.0/x*y[1] + k**2.0*y[0]))

def bc(ya, yb, p):
     return np.array([ya[0], yb[0]-1.0,yb[1]])

x = np.linspace(1e-3, 1, 100)
y = np.zeros((2, x.size))
y[0,:] = 1

from scipy.integrate import solve_bvp
sol = solve_bvp(fun, bc, x, y, p=[1000])
x_plot = np.linspace(0, 1, 100)
y_plot = sol.sol(x_plot)[0]
plt.figure()
plt.plot(x_plot, y_plot)

考慮F(y)=y 那么很容易看出這個線性常微分方程的基解是sin(k*x)/xcos(kx/x) 類似地,對於F(y)=-y一個得到sinh(k*x)/xcosh(k*x)/x 這意味着大多數解決方案在x=0處具有奇點。 對於標准 ODE 求解器,這種奇點幾乎不可能開箱即用。 必須在奇點處幫助求解器,在距奇點一定距離處再次應用正常程序。

你能做的就是分析x=0的情況,稍微移開一點。 你通過差商極限得到

y''(0) + 2*y''(0) + k^2*F(y(0)) = 0

它允許您計算二次泰勒多項式。 因此[a, 1]使用 ODE 求解器使用奇點y(x)=y(0)-k**2/6*F(y(0))*x**2的延續解決[a, 1]上的問題[0,a]

y0=y(0)作為參數最容易建立x=a處的邊界條件。 ODE 和 BC 函數則是

def ode(x,y,y0): return [ y[1], -2*y[1]/x - k**2*F(y[0]) ]
def bc(ya,yb,y0): y2 = -k**2*F(y0)/6; return [ ya[0] - y0 - y2*a**2, ya[1] - 2*y2*a, yb[0]-1 ]

在問題中討論的情況下,這給出了

a = 1e-2
def F(y): return -y

for k in [0.01, 5]:
    res = solve_bvp(ode, bc, [a,1], [[1,1], [0,0]], p=[1], tol=1e-5)
    print(f'k={k}: {res.message}, y0={res.p[0]}, theory: {k/np.sinh(k)}')
    if res.success:
        y0 = res.p[0]
        x = np.linspace(a,1,61);
        plt.plot(x, res.sol(x)[0])
        plt.plot([0], [y0],'o', res.x, res.y[0],'+', ms=4)
        plt.title(f'k={k}'); plt.grid(); plt.show()

結果

k=0.01:算法收斂到想要的精度。,y0=0.9999833335277726,理論:0.9999833335277757

解決方案圖

k=5:算法收斂到想要的精度,y0=0.06738256929427147,理論:0.06738252915294544

解決方案圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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