繁体   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