2016-11-01 11 views
1

私はscipy.solve_bvpを認識していますが、したくない変数を補間する必要があります。補間せずにPythonで固定された不均一なグリッド上でBVPを解く

私は次の形式の境界値問題があります。私は、不均一なグリッド上x=[0, 0.0001, 0.025, 0.3, ... 0.9999999, 1]の値とのすべての値を持っている

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の値のみで機能します。

どのようにこのBVPを解決できますか?

+0

ドキュメントを見ると、規則的なメッシュについては何も表示されませんが、厳密にはそれが増えています。これらの例はすべて 'linspace'を使っていますが、それはおそらく便宜のためです。 – hpaulj

+0

@hpaulj問題は、計算中にメッシュを変更したいので、すべての変数を新しいメッシュに補間する必要があるということです。それで 'x:最終メッシュのノード 'を返すのです。 – rhombidodecahedron

+0

その場合、そのコードを掘り下げて、どのように動作するのか、新しいメッシュが作られる理由を調べる必要があります。 – hpaulj

答えて

1

これは新しい機能で、scipyバージョン(0.17)にはありませんが、scipy/scipy/integrate/_bvp.py(github)のソースが見つかりました。

関連するプルリクエストは、昨年4月に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メッシュ取り扱いがあるように思われる:

modify_meshはに基づいて 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) 

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パラメータを使用してノードの追加を追跡することができ

  • ノードを追加しましたが、削除されません。アウトメッシュには入力ポイントがすべて含まれている必要があります。

  • Iは、ノードがこれはコードを読み取ることに基づいて、テストコードで検証されていない問題の特定のセグメント

の解像度を改善するために添加されていると仮定する。あなたはSO上でこの機能について尋ねる唯一の人であり、実際にそれを使用した少数の人の一人かもしれません。

関連する問題