与odeint的两点边界

时间:2013-07-19 11:29:55

标签: c++ math numerical-methods differential-equations 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或其他科学图书馆处理这类问题的方法?

2 个答案:

答案 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