我想求解一个由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
的线性组合的函数。我们有dyi/dx
在x=a
处的一阶导数和yi
在x=b
处的函数的边界条件:
dyi/dx(a) = Ai,
yi(b) = Bi.
因此,我们可以将其改写为14个耦合的一阶常微分方程的系统:
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
的语法及其在这种情况下的应用的任何帮助都将非常感谢。
1条答案
按热度按时间rnmwe5a21#
对于边界条件,
bc
返回方程的残差。也就是说,转换方程,使右边为零,然后返回左边的向量。ya,yb
是点x=a,b
处的状态向量。对于初始状态,它可以是任何值。然而,在大多数情况下,“任何值”都会由于奇异雅可比行列式或过大的网格而导致收敛失败。求解器所做的是求解一个大型非线性方程组(参见配置法)。对于任何此类系统,如果您从足够接近实际解的位置开始,则最能保证收敛。因此,您可以尝试
yi
Bi
的常数函数Ai
且在x=b
处的值为Bi
的线性函数使用这些函数的导数来计算
zi
的值,这并不能保证一定有效,特别是在接近于零的时候,你的基解接近于常数解和对数,a
越接近于零,它就越奇异。