![](/img/trans.png)
[英]Performance issue with Scipy's solve_bvp and coupled differential equations
[英]Solve system of coupled differential equations using scipy's solve_bvp
我想解决一个由 7 个耦合的二阶微分方程组成的边值问题。 有 7 个函数y1(x),...y7(x)
,它们中的每一个都由以下形式的微分方程描述
d^2yi/dx^2 = -(1/x)*dyi/dx - Li(y1,...,y7) for 0 < a <= x <= b,
其中Li
是一个函数,它给出y1,...,y7
的线性组合。 我们对在x=a
处的一阶导数dyi/dx
和在x=b
处的函数yi
有边界条件:
dyi/dx(a) = Ai,
yi(b) = Bi.
所以我们可以将其重写为一个由 14 个耦合的一阶 ODE 组成的系统:
dyi/dx = zi,
dzi/dx = -(1/x)*zi - Li(y1,...,y7),
zi(a) = Ai,
yi(b) = Bi.
我想使用 Python 函数scipy.integrate.solve_bvp
求解这个方程组。 但是,我很难理解文档( https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_bvp.html )中描述的函数的输入参数到底应该是什么。
这个函数需要的第一个参数是一个可调用的fun(x,y)
。 据我了解,输入参数y
必须是由yi
和zi
的值组成的数组,并给出zi
和dzi/dx
的值作为输出。 所以我的函数看起来像这样(伪代码):
def fun(x,y):
y1, z1, y2, z2, ..., y7, z7 = y
return [z1, -(1/x)*z1 - L1(y1,...,y7),
...,
z7, -(1/x)*z7 - L7(y1,...,y7)]
那是对的吗?
然后, solve_bvp
的第二个参数是一个可调用的bc(ya,yb)
,它应该评估边界条件的残差。 在这里,我真的很难理解如何定义这样的功能。 我也不清楚数组ya
和yb
到底是什么以及它们应该具有什么形状?
第三个参数是x
,它是形状为(m,)
的“初始网格”。 x
是否应该仅由点a
和b
组成,这是我们知道边界条件的地方? 还是应该是别的东西?
最后第四个参数是y
,它是“网格节点处函数值的初始猜测”,形状(n,m)
。 它的第 i 列对应于x[i]
。 我猜第一行对应y1
,第二行对应z1
,第三行对应y2
,等等。对吗? 此外,应该把哪些值放在这里? 我们可以在x=a
和x=b
处加入已知的边界条件,但我们不知道函数在任何其他点的样子。 此外,这个y
与函数bc(ya,yb)
有什么关系? 输入参数ya,yb
是否以某种方式从这个y
派生而来?
任何有助于理解solve_bvp
的语法及其在这种情况下的应用的帮助将不胜感激。
对于边界条件, bc
返回方程的残差。 即对方程进行变换,使右边为零,然后返回左边的向量。 ya,yb
是点x=a,b
的状态向量。
对于初始状态,它可以是任何东西。 然而,“任何东西”在大多数情况下都会由于奇异的雅可比或太大的网格而导致无法收敛。 求解器所做的是求解大型非线性方程组(参见搭配方法)。 与任何此类系统一样,如果您开始与实际解决方案足够接近,则最能确保收敛。 所以你可以试试yi
Bi
的常数函数x=b
处具有斜率Ai
和值Bi
的线性函数使用这些函数的导数得到zi
的值。 不能保证这是有效的,特别是当接近零时,你有接近常数解和对数的基解, a
越接近零,它变得越奇异。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.