SciPy 的solve_bvp 正在求解错误的参数值

问题描述 投票:0回答:1

我正在用

scipy
solve_bvp
求解常微分方程,以获得一系列本征态
phi_n
和特征值
omega_n
。等式看起来像
y'' = -(omega_n - f(x)) ** 2 * y
, 我希望它遵守边界条件
y(0)=y(1)=0
f(x)
是取决于某些物理参数的给定函数。

问题是,对于某些“关键”

f(x)
,系统开始表现得非常奇怪,而且有点不稳定。在这些不稳定性附近,
solve_bvp
要么不收敛,要么
omega_n
会出现错误的特征值。例如,如果特征值为 pi、2pi、3pi...,并且我输入为
omega_n
pi-0.3,它可能会收敛到 2pi。这是非常相关的,因为两次重复的解决方案会影响我想从那里计算的一些物理量。

此外,解和特征值猜测也非常好。它们要么是手工计算的,要么是根据之前的

solve_bvp
解决方案计算出来的。

我的问题是:

  1. solve_bvp
    使用什么整合方法?有没有更有效的方法?

我在

solve_bvp
文档中找不到这个,我担心我无法更改它。

  1. 通常影响参数收敛的因素有哪些?增加
    max_nodes
    会将误差从“重复特征值”/“解未收敛”更改为
    MemoryError
    。 降低
    tol
    以获得更好的准确性似乎也没有多大帮助。

我很乐意发布 MWE,但我认为它没有必要/有用,因为:

  1. 大约有400-500行长,

  2. 我问的是

    solve_bvp

    的一般行为
python scipy numerical-methods numerical-integration
1个回答
0
投票

问题出在所使用的数值方法上。我想要找到根的函数基本上是 y(omega)(1),即找到 omega 以满足边界条件。

在研究这个函数时,它呈现出一个非常接近根的极值。当使用牛顿法解决这个问题时,即使用函数的导数将函数逼近为一条直线,如果猜测的欧米伽太接近极值,它就会远离实际的根。我使用二分法修复了它,因为我大约知道函数 y(omega)(1)

的形状
© www.soinside.com 2019 - 2024. All rights reserved.