我试图用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或其他科学图书馆处理这类问题的方法?
答案 0 :(得分:3)
在这种情况下,您需要一种拍摄方法。 odeint没有这样的方法,它解决了初始值问题(IVP),这是你的第一种情况。我认为在Numerical Recipies中解释了这个方法,你可以使用Boost.Odeint进行时间步进。
答案 1 :(得分:0)
解决此类问题的另一种更有效的方法是有限差分或有限元方法。对于有限差异,您可以检查数字配方。对于有限元,我推荐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,J E Hansen和FMartín
http://iopscience.iop.org/0034-4885/64/12/205/
我不知道任何库直接解决这个问题,但是有两个用于B样条的库(我建议GSL满足您的需求),这将允许您构建线性系统。请参阅此stackoverflow问题: Spline, B-Spline and NURBS C++ library