簡體   English   中英

用solve_bvp檢查solve_ivp的結果——solve_bvp問題

[英]Checking the result of solve_ivp with solve_bvp - solve_bvp problems

我希望使用scipy.integrate.solve_bvp來求解一個二階微分方程:我正在用以前的方程檢查我的過程,所以我有信心轉向更復雜的方程。

我們從微分方程系統開始:

f''(x) + f(x) - f(x)^3 = 0

受限於邊界條件

f(x=0) = 0        f(x->infty) = gammaA

其中gammaA是介於 0 和 1 之間的某個常數。我正在為此找到數值解,並與已知的解析形式進行比較(至少,對於 gammaA =1,tanh 函數)。 對於任何給定gammaA ,我們可以將這個方程積分一次並利用無窮大的 BC。

import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import solve_ivp

gammaA = 0.9
xstart = 0.0
xend = 10
steps = 0.1
x = np.arange(xstart,xend,steps)

def dpsidx3(x,psi, gammaA):
    eq = ( gammaA**2 *(1 - (1/2)*gammaA**2) - psi**2 *(1 - (1/2)*psi**2) )**0.5
    return eq

psi0 = 0
x0 = xstart
x1 = xend

sol = solve_ivp(dpsidx3, [x0, x1], y0 = [psi0], args = (gammaA,), dense_output=True, rtol = 1e-9)

plotsol = sol.sol(x)
plt.plot(x, plotsol.T,marker = "", linestyle="--",label = r"Numerical solution - $solve\_ivp$")
plt.xlabel('x')
plt.ylabel('psi')
plt.legend()

plt.show()

如果gammaA不是 1,那么會有一些運行時警告,但形狀完全符合預期。 但是, solve_ivp代碼中的 ODE 已被處理為一階 ODE 的形式; 對於進一步的工作(在 ODE 中使用更復雜和可變的系數),這是不可能的。 因此,我正在嘗試使用solve_bvp解決邊界值問題。 我現在正在嘗試解決相同的 ODE,但我沒有得到與此解決方案相同的結果; 文檔不清楚如何對我有效地使用solve_bvp :這是我迄今為止的嘗試:

import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import solve_bvp

gammaA = 0.9
xstart = 0.0
xend = 10
steps = 0.1

def fun(x,u):
    du1 = u[1] #u[1] = u2, u[0] = u1
    du2 = u[0]**3 - u[0]
    return np.vstack( (du1, du2) ) 

def bc(ua, ub):
    return np.array( [ua[0], ub[0]-gammaA])

x = np.linspace(xstart, xend, 10)
print(x.size)
y_a = np.zeros((2, x.size))
y_a[0] = np.linspace(0, gammaA, 10)
y_a[0] = gammaA

res_a = solve_bvp(fun, bc, x, y_a, max_nodes=100000, tol=1e-9)
print(res_a)

x_plot = np.linspace(0, xend, 100)
y_plot_a = res_a.sol(x_plot)[0]

fig2,ax2= plt.subplots()
ax2.plot(x_plot, y_plot_a, label=r'BVP solve')
ax2.legend()
ax2.set_xlabel("x")
ax2.set_ylabel("psi")

我試圖將二階 ODE 編寫為一階 ODE 的系統,並在系統末尾(而不是無窮大)設置正確的邊界條件。 我期望有一個類似的 tanh 函數(我可以說在系統結束后,我的解決方案只是gammaA ,正如漸近線所預期的那樣),但很明顯,對於gammaA的任何值,我都沒有得到這個。 任何建議都將不勝感激; 如何在solve_ivp中重現solve_bvp的結果?

編輯:額外的想法。 我可以為我的問題添加一個額外的約束以確保解決方案在邊緣有一個固定點/是一個單調遞增的解決方案嗎? 這些圖對於gammaA =1看起來不錯,但對於任何其他值都沒有顯示正確的行為,如solve_ivp

EDIT2:比較數據,顯示與 gammaA 的一致性較差,例如 0.8,但 gammaA = 1 的一致性很好。 伽瑪0.8 伽馬1

你對這個方程的數學性質做出了毫無根據的假設。 存在能量泛函

E = u'^2 + u^2 - 0.5*u^4 - 0.5 = u'^2 - 0.5*(u^2-1)^2

您首先計算的解決方案位於能級 0。

對於任何較小的負能級,大致在單位圓內,你會得到周期性的振盪解,這些解在無窮大時沒有限制。 對於更大的正能量水平,解決方案是無界的,將迅速變大,可能在有限時間內發散。 同樣在這里,無窮大的極限要么不存在,因為沒有解決方案將初始點與大時間聯系起來,要么極限本身就是無窮大。

針對這種性質強制邊界條件可能會起作用,但不會給出穩定的解決方案。

暫無
暫無

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

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