Scipysolve_ivp 非常慢/冻结

问题描述 投票:0回答:1

我一直在研究一个涉及解决两对耦合颂的问题。建议我们使用 scipysolve_ivp 来执行此操作,但它似乎要么冻结要么运行速度非常慢(我已经运行了长达半小时但没有结果)。

我在数值求解 ode 方面的经验有限,之前从未使用过solve_ivp,所以这可能是一个简单的错误,但我一直无法找到它。

import numpy as np
from matplotlib import pyplot as plt
from scipy import integrate as sc

param_dict = {
    'r1': 0.36,
    'r2': 0.15,
    'k1': 4000000,
    'b12': 0.0000002,
    'b21': 0.69,
    'p1': 80,
    'p2': 275,
    'q1': 0.0002,
    'q2': 0.0004,
    'phi1': 0.00095,
    'phi2': 0.000075,
    'c1': 20000,
    'c2': 30000
}

# INITIAL VALUES
init_X = np.array([4000000,275000])
init_E = np.array([800,200])
y0 = np.concatenate((init_X, init_E))

def functions(t, X, r1, r2, k1, b12, b21, q1, q2, phi1, phi2, c1, c2, p1, p2):
    x1, x2, y1, y2 = X
    dx1dt = (r1 * x1) * (1 - (x1 / k1) - (b12 * x2)) - (q1 * y1 * x1)
    dx2dt = (r2 * x2) * (1 - (x2 / (b21 * x1))) - (q2 * y2 * x2)
    dy1dt = phi1 * y1 * (p1*q1 * x1 - c1)
    dy2dt = phi2 * y2 * (p2*q2 * x2 - c2)
    return [dx1dt, dx2dt, dy1dt, dy2dt]

t_span = [0,20]
t = np.linspace(0,100,1000)

res = sc.solve_ivp(functions, t_span, y0, args=tuple(param_dict.values()), dense_output=True)

zz = res.sol(t)
x1 = []
x2 = []
e1 = []
e2 = []
for ii in range(len(zz.T)):
    x1.append(zz.T[ii,0])
    x2.append(zz.T[ii,1])
    e1.append(zz.T[ii,2])
    e2.append(zz.T[ii,3])

plt.plot(x1)
plt.plot(x2)

如果我设置

init_E = [0,0]
,它看起来会按预期运行,但是这里的任何其他值似乎都会导致这个冻结/极其缓慢的问题。

这里的模型为感兴趣的人描述了渔业管理的捕食者/猎物模型。

python scipy numerical-methods ode
1个回答
0
投票

我认为问题可能是字典中的键与函数参数的顺序不同。

如果我执行以下操作,它会立即解决。

param_names = ['r1', 'r2', 'k1', 'b12', 'b21', 'q1', 'q2', 'phi1', 
               'phi2', 'c1', 'c2', 'p1', 'p2']
args = tuple(param_dict[p] for p in param_names)
res = sc.solve_ivp(functions, t_span, y0, args=args, dense_output=True)

(不确定这是否是正确的解决方案,但它不会挂起)。

© www.soinside.com 2019 - 2024. All rights reserved.