在python中在固定的非均匀网格上求解BVP而不进行插值

时间:2016-11-01 21:31:57

标签: python numpy math scipy differential-equations

我知道scipy.solve_bvp,但它要求您插入我不想做的变量。

我有以下形式的边界值问题:

y1'(x) = -c1*f1(x)*f2(x)*y2(x) - f3(x)

y2'(x) = f4(x)*y1 + f1(x)*y2(x)

y1(x=0)=0, y2(x=1)=0

我在非均匀网格上有x=[0, 0.0001, 0.025, 0.3, ... 0.9999999, 1]的值,所有变量/函数的值只有x的值。

我该如何解决这个BVP?

1 个答案:

答案 0 :(得分:1)

这是一个新功能,我的scipy版本(0.17)上没有它,但我在scipy/scipy/integrate/_bvp.py(github)找到了源代码。

相关的提款请求是https://github.com/scipy/scipy/pull/6025,去年四月。

它基于论文和MATLAB实现,

       J. Kierzenka, L. F. Shampine, "A BVP Solver Based on Residual
       Control and the Maltab PSE", ACM Trans. Math. Softw., Vol. 27,
       Number 3, pp. 299-316, 2001.

x网格处理似乎是:

while True:
    ....
    solve_newton
    ....
    insert_1, = np.nonzero((rms_res > tol) & (rms_res < 100 * tol))
    insert_2, = np.nonzero(rms_res >= 100 * tol)
    nodes_added = insert_1.shape[0] + 2 * insert_2.shape[0]

    if m + nodes_added > max_nodes:
        status = 1
        if verbose == 2:
            nodes_added = "({})".format(nodes_added)
            print_iteration_progress(iteration, max_rms_res, m,
                                     nodes_added)
    ...
    if nodes_added > 0:
        x = modify_mesh(x, insert_1, insert_2)
        h = np.diff(x)
        y = sol(x)

其中modify_mesh基于以下内容将节点添加到x

insert_1 : ndarray
    Intervals to each insert 1 new node in the middle.
insert_2 : ndarray
    Intervals to each insert 2 new nodes, such that divide an interval
    into 3 equal parts.

由此我推断出

  • 您可以使用verbose参数

  • 跟踪节点的添加
  • 添加了节点,但未删除。因此out网格应包含所有输入点。

  • 我假设添加了节点以提高问题某些部分的分辨率

这是基于阅读代码,而不是通过测试代码验证。你可能是唯一一个在SO上询问这个功能的人,也是为数不多的实际使用它的人之一。