我正在尝试用 odeint 解决两点边界问题。我的方程有
y'' + a*y' + b*y + c = 0
当我的边界条件y(x_1) = y_1 , y'(x_2) = y_2
为 y(x_1) = y_1 , y(x_2) = y_2
有人知道用 odeint 或其他科学图书馆处理此类问题的方法吗?
我正在尝试用 odeint 解决两点边界问题。我的方程有
y'' + a*y' + b*y + c = 0
当我的边界条件y(x_1) = y_1 , y'(x_2) = y_2
为 y(x_1) = y_1 , y(x_2) = y_2
有人知道用 odeint 或其他科学图书馆处理此类问题的方法吗?
在这种情况下,您需要一种拍摄方法。odeint 没有这样的方法,它解决了您的第一个案例的初始值问题(IVP)。我认为在 Numerical Recipies 中解释了这种方法,您可以使用 Boost.Odeint 进行时间步进。
解决此类问题的另一种更有效的方法是有限差分法或有限元法。对于有限差分,您可以检查数值配方。对于有限元,我推荐 dealii 库。
另一种方法是使用 b 样条:假设您确实知道初始 x0 和最终 xfinal 积分点,那么您可以在 b 样条基础上扩展解 y(x),定义在 (x0,xfinal) 上,即
y(x)= \sum_{i=1}^n A_i*B_i(x),
其中 A_i 是待确定的常数系数,B_i(x) 是 b 样条基(定义明确的多项式函数,可以数值微分)。对于科学应用,您可以在 GSL 中找到 b 样条的实现。
通过这种替换,边界值问题被简化为线性问题,因为(我使用爱因斯坦求和重复索引):
A_i*[ B_i''(x) + a*B_i'(x) + b*B_i(x)] + c =0
您可以选择一组点 x 并从上述方程创建一个线性系统。您可以在以下评论论文“B样条在原子和分子物理学中的应用”中找到有关此类方法的信息 - H Bachau、E Cormier、P Decleva、JE Hansen 和 F Martín
http://iopscience.iop.org/0034-4885/64/12/205/
我不知道有什么库可以直接解决这个问题,但是有几个 B 样条库(我推荐 GSL 来满足你的需要),它们可以让你形成线性系统。请参阅这个 stackoverflow 问题: Spline, B-Spline and NURBS C++ library