gpt4 book ai didi

python - 使用 scipy 的 solve_bvp 求解 BVP

转载 作者:太空宇宙 更新时间:2023-11-03 11:20:03 34 4
gpt4 key购买 nike

我有一个具有 3 个边界条件的 3 个微分方程组(我相信从代码中可以看出)。我设法在 MATLAB 中用一个循环解决了这个问题,在程序即将返回错误时一点一点地改变初始猜测而不终止程序。然而,在 scipysolve_bvp 上,我总是得到 some 答案,尽管它是错误的。所以我一直在改变我的猜测(不断改变答案)并且给出了与我从实际解决方案中得到的非常接近的数字,但它仍然无法正常工作。代码是否可能存在其他问题,导致它无法正常工作?我刚刚编辑了他们文档的代码。

import numpy as np
def fun(x, y):
return np.vstack((3.769911184e12*np.exp(-19846/y[1])*(1-y[0]), 0.2056315191*(y[2]-y[1])+6.511664773e14*np.exp(-19846/y[1])*(1-y[0]), 1.696460033*(y[2]-y[1])))
def bc(ya, yb):
return np.array([ya[0], ya[1]-673, yb[2]-200])
x = np.linspace(0, 1, 5)
#y = np.ones((3, x.size))
y = np.array([[1, 1, 1, 1, 1], [670, 670, 670, 670, 670], [670, 670, 670, 670, 670] ])
from scipy.integrate import solve_bvp
sol = solve_bvp(fun, bc, x, y)

实际解决方案如下图所示。

BVP 的 MATLAB 解决方案

最佳答案

显然您需要更好的初始猜测,否则 solve_bvp 使用的迭代方法可以在 y[1] 中创建值,使表达式 exp(- 19846/y[1]) 溢出。当发生这种情况时,算法很可能会失败。该表达式中的溢出意味着 y[1] 中的某些值是负数;即求解器在杂草中太远了,它几乎没有机会收敛到正确的解决方案。您会看到警告,有时该函数仍会返回合理的解决方案,但通常会在发生溢出时返回垃圾。

您可以通过检查 sol.status 来确定 solve_bvp 是否收敛失败。如果它不为 0,则表示失败。 sol.message 包含描述状态的文本消息。

通过使用它创建初始猜测,我能够获得 Matlab 解决方案:

n = 25
x = np.linspace(0, 1, n)
y = np.array([x, np.full_like(x, 673), np.linspace(800, 200, n)])

较小的 n 值也可以,但是当 n 太小时,会出现溢出警告。

这是我修改后的脚本版本,后面是它生成的情节:

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


def fun(x, y):
t1 = np.exp(-19846/y[1])*(1 - y[0])
dy21 = y[2] - y[1]
return np.vstack((3.769911184e12*t1,
0.2056315191*dy21 + 6.511664773e14*t1,
1.696460033*dy21))

def bc(ya, yb):
return np.array([ya[0], ya[1] - 673, yb[2] - 200])


n = 25
x = np.linspace(0, 1, n)
y = np.array([x, np.full_like(x, 673), np.linspace(800, 200, n)])

sol = solve_bvp(fun, bc, x, y)

if sol.status != 0:
print("WARNING: sol.status is %d" % sol.status)
print(sol.message)

plt.subplot(2, 1, 1)
plt.plot(sol.x, sol.y[0], color='#801010', label='$y_0(x)$')
plt.grid(alpha=0.5)
plt.legend(framealpha=1, shadow=True)
plt.subplot(2, 1, 2)
plt.plot(sol.x, sol.y[1], '-', color='C0', label='$y_1(x)$')
plt.plot(sol.x, sol.y[2], '--', color='C0', label='$y_2(x)$')
plt.xlabel('$x$')
plt.grid(alpha=0.5)
plt.legend(framealpha=1, shadow=True)
plt.show()

plot

关于python - 使用 scipy 的 solve_bvp 求解 BVP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44867171/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com