【问题标题】:Two point boundary with odeintodeint 的两点边界
【发布时间】:2013-07-19 11:29:55
【问题描述】:

我正在尝试用 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 或其他科学图书馆处理此类问题的方法吗?

【问题讨论】:

    标签: c++ math numerical-methods differential-equations odeint


    【解决方案1】:

    在这种情况下,您需要一种拍摄方法。 odeint 没有这样的方法,它解决了您的第一个案例的初始值问题(IVP)。我认为在 Numerical Recipies 中解释了这种方法,您可以使用 Boost.Odeint 进行时间步进。

    【讨论】:

    • 对我来说似乎也是如此,但我认为 odeint 可能有它——我找不到它只是我的问题。还是谢谢你!
    【解决方案2】:

    解决此类问题的另一种更有效的方法是有限差分法或有限元法。对于有限差分,您可以检查数值配方。对于有限元,我推荐 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 和 F Martín 中找到有关此类方法的信息

    http://iopscience.iop.org/0034-4885/64/12/205/

    我不知道有什么库可以直接解决这个问题,但是有几个用于 B 样条的库(我推荐 GSL 以满足您的需要),它们可以让您形成线性系统。看到这个stackoverflow问题: Spline, B-Spline and NURBS C++ library

    【讨论】:

      猜你喜欢
      • 2019-01-14
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 2021-02-22
      • 2013-03-26
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      相关资源
      最近更新 更多