我知道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?
答案 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上询问这个功能的人,也是为数不多的实际使用它的人之一。