2017-12-10 9 views
1

scipy.integrate.odeint 기능을 사용하고 있는데 예기치 않은 오류가 발생합니다.`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.을 얻을, 나는 전에 매우 유사한 코드를 사용했지만이 코드는 날 (동등 것 같았다 대신 벡터화의 내가 명시 적으로 모든 입력하지만 명확하지 않다 다음과 같이 내 코드는).

답변

1

문제는이 라인이다

스칼라 및 NumPy와 배열을 포함하는 길이 2의 y0 튜플하게
y0 = (1-λ, np.zeros(len(μ))) 

. odeint의 코드가 숫자가 많은 배열로 변환하려고하면 오류가 발생합니다. 내가 이렇게 내가 풀고`너무 많은 값을 얻을 때 예를 들어,

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 = [1-λ] + [0]*len(μ) 

또는

y0 = np.zeros(len(μ) + 1) 
y0[0] = 1-λ 
+0

같은 뭔가 y0를 만들 수에서'(2 예상) 'F, y = [0], H = y0 [1 :] '을 취하면 쉽게 풀 수 있습니다. 감사! – HolyMonk