【问题标题】:Error in using `scipy.integrate.odeint`使用“scipy.integrate.odeint”时出错
【发布时间】:2018-05-24 09:35:44
【问题描述】:

我正在使用函数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.,我之前使用过非常相似的代码,但我没有进行矢量化,而是明确键入了所有内容,但这段代码似乎与我等价(但显然不是)。

【问题讨论】:

    标签: python scipy ode


    【解决方案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-λ
    

    【讨论】:

    • 当我这样做时,我会在F,H = y0 得到too many values to unpack (expected 2),但这当然可以通过使用F = y0[0], H = y0[1:] 轻松解决。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 2017-10-25
    • 2018-02-25
    • 2013-09-18
    • 2016-05-14
    • 2016-01-09
    • 2017-08-16
    相关资源
    最近更新 更多