Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 求解两个耦合的二阶边值问题_Python_Numpy_Ode_Differential Equations - Fatal编程技术网

Python 求解两个耦合的二阶边值问题

Python 求解两个耦合的二阶边值问题,python,numpy,ode,differential-equations,Python,Numpy,Ode,Differential Equations,我使用模块solve_bvp求解了一个具有两个边界条件的二阶微分方程。然而,现在我正试图求解两个二阶微分方程组 U''+a*B'=0 B''+B*U'=0 边界条件U(+/-0.5)=+/-0.01和B(+/-0.5)=0。我已经把它分解成一个第一常微分方程组,我正试图用解bvp来数值求解它们。然而,对于我的解决方案,我只是得到满是零的数组。我认为我执行的边界条件是错误的。我不清楚如何处理文档中的两个以上方程式。我的尝试如下 import numpy as np from scipy.integ

我使用模块
solve_bvp
求解了一个具有两个边界条件的二阶微分方程。然而,现在我正试图求解两个二阶微分方程组

U''+a*B'=0

B''+B*U'=0

边界条件U(+/-0.5)=+/-0.01和B(+/-0.5)=0。我已经把它分解成一个第一常微分方程组,我正试图用
解bvp
来数值求解它们。然而,对于我的解决方案,我只是得到满是零的数组。我认为我执行的边界条件是错误的。我不清楚如何处理文档中的两个以上方程式。我的尝试如下

import numpy as np
from scipy.integrate import solve_bvp
import matplotlib.pyplot as plt
%matplotlib inline
from scipy.integrate import solve_bvp
alpha = 1E-8
zeta = 8E-3
C_k = 0.05
sigma = 0.01
def fun(x, y):

    return np.vstack((y[1],-((alpha)/(C_k*sigma))*y[2],y[2], -(1/(C_k*zeta))*y[1]))

def bc(ya, yb):

    return np.array([ya[0]+0.001, yb[0]-0.001,ya[0]-0, yb[0]-0])

x = np.linspace(-0.5, 0.5, 5000)
y = np.zeros((4, x.size))
print(y)


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

在我的问题中,我刚刚重新标记了a和b,但它们只是我输入的参数。我有这组方程的解析解,所以我知道存在一个非平凡的方程。任何帮助都将不胜感激。

如果您在注释中至少陈述一次,或者通过指定特定命名变量来说明您希望如何组成状态向量,那么大多数情况下都会非常有用

通过导数返回向量的形式,我想你是有意的

U, U',  B, B'
这意味着
U=y[0],U'=y[1]
B=y[2],B'=y[3]
,因此导数向量应该正确

return y[1], -((alpha)/(C_k*sigma))*y[3],  y[3], -(1/(C_k*zeta))*y[1]
以及边界条件

return ya[0]+0.001, yb[0]-0.001, ya[2]-0, yb[2]-0
特别是,由于存在奇异雅可比矩阵,边界条件应在第一步中抛出算法,请始终检查解决方案结构的
.success
字段和
.message
字段


请注意,默认情况下,实验
solve_bvp
的绝对和相对公差为
1e-3
,节点数量限制为
500

将初始节点数设置为50(5000太多了,解算器会在必要时进行细化),将公差设置为
1-6
,我会得到以下明显满足边界条件的解图


所以我把方程写成四个常微分方程,这样U'=V,V'=-((α/(C_ksigma))*H,B'=H,H'=-(1/(C_kzeta))*我希望这是清楚的。我刚刚尝试了你给出的代码,边界条件不满足于B的解,即边界处的0。我对你如何编写导数的返回向量有点困惑。如果你能进一步解释,我将非常感激,谢谢。好的,我可能已经修复了它并注意到了它同意你在评论中所做的编辑。但是,B的解仍然不满足零边界条件。你在代码中注意到了什么吗?它看起来像真实的解,但颠倒了,边界不满足。也许我的方程中遗漏了一个负数。据我所见,我的返回向量是与您的注释兼容。scipy解算器会自动将返回的列表转换为适当的numpy结构,因此您无需手动执行此操作。感谢您的详细回答,这非常有用。如何设置bvp函数中的公差?使用选项
tol=1e-7
。您可以增加如果需要,节点的
max_nodes=1500
或更高,但此处不需要,除非您使用
tol=1e-12
或更低。如果可以,请重新缩放问题,以便所有解决方案组件的典型比例都在
1
左右,我认为解算器中的启发式是围绕该假设构建的。