我正在用
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
解决方案计算出来的。
我的问题是:
solve_bvp
使用什么整合方法?有没有更有效的方法?我在
solve_bvp
文档中找不到这个,我担心我无法更改它。
max_nodes
会将误差从“重复特征值”/“解未收敛”更改为 MemoryError
。 降低 tol
以获得更好的准确性似乎也没有多大帮助。我很乐意发布 MWE,但我认为它没有必要/有用,因为:
大约有400-500行长,
我问的是
solve_bvp
的一般行为
问题出在所使用的数值方法上。我想要找到根的函数基本上是 y(omega)(1),即找到 omega 以满足边界条件。
在研究这个函数时,它呈现出一个非常接近根的极值。当使用牛顿法解决这个问题时,即使用函数的导数将函数逼近为一条直线,如果猜测的欧米伽太接近极值,它就会远离实际的根。我使用二分法修复了它,因为我大约知道函数 y(omega)(1)
的形状