我正在使用函数scipy.integrate.odeint
,但我收到了意外错误。我的代码如下:
import numpy as np
from scipy.integrate import odeint
def hyper_exp_ODE(y, s, λ, k, μ, p):
F, H = y
C_bar_s = 1 - (1 - F) **k
rhs = [-λ * np.sum(p * μ * H) + λ * C_bar_s]
rhs.extend([-μ[i] * H[i] + C_bar_s for i in range(len(μ))])
return rhs
def limit_hyper_exp(S, λ, k, N, μ, p):
S_range = np.linspace(0,S,N)
y0 = (1-λ, np.zeros(len(μ)))
sol = odeint(hyper_exp_ODE, y0, S_range, args = (λ, k, μ, p))
return sol, S_range
S = 10
λ = 0.8
k = 2
N = 100
μ, p = np.array([2.0, 1.2]), np.array([0.2, 0.8])
sol, S_range = limit_hyper_exp(S, λ, k, N, μ, p)
我出乎意料地得到了错误ValueError: setting an array element with a sequence.
,我之前使用过非常相似的代码,但我没有明确地输入所有内容,而是代码似乎与我相同(但显然不是)。
答案 0 :(得分:1)
问题在于这一行:
y0 = (1-λ, np.zeros(len(μ)))
这使得y0
一个长度为2的元组包含一个标量和一个numpy数组。当odeint
中的代码尝试将其转换为numpy数组时,会发生错误。例如,
In [7]: y0 = (1, np.zeros(4))
In [8]: np.array(y0)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-8-9a58cb72863b> in <module>()
----> 1 np.array(y0)
ValueError: setting an array element with a sequence.
您可以使用类似
的内容创建y0
y0 = [1-λ] + [0]*len(μ)
或
y0 = np.zeros(len(μ) + 1)
y0[0] = 1-λ