2017-05-18 3 views
1

spicy.itegrate.odeint를 사용하여 미분 방정식 시스템을 통합하려고합니다.매개 변수 및 초기 값의 사전을 scipy.integrate.odeint에 전달합니다.

먼저 매개 변수와 초기 조건을 샘플링하여 두 사전 (x0p)으로 반환합니다. 그런 다음 모델이 만들어지고 (더미 식으로) 다음과 같이 대략 찾고, 파일에 함수로 기록됩니다

def model(x, t, p): 
    xdot = [ 
     x['rate1'], p["a"] 
     x['rate2'], p["b"] * x["state1"] - p["c"] * x["state2"] 
     x['rate3'], p["c"] * x["state2"] 
     x["state4"], x["rate1"] + x["rate2"] 
     x["state5"], - x["rate2"] + x["rate3"] 
     ] 
    return xdot 

이 내가 쉽게 간단한 입력과 다른 모델을 생성 할 수 있도록합니다. 따라서 일반적으로 하드 코드 된 변수는 사전에 해당 값이있는 키입니다. 변수를 동적으로 할당하는 것은 나쁜 습관으로 간주되기 때문에이 작업을 수행합니다.

sol = odeint(model, x0, t, args=(p,), 
       atol=1.0e-8, rtol=1.0e-6) 
따라서 x0 초기 조건들의 사전이다

p 파라미터 (및 t 플로트 목록)은 다음과 같이 I는 odeint를 사용하여 시스템을 통합 할 때.

TypeError: float() argument must be a string or a number, not 'dict' 

은 물론, scipy가 매개 변수화 내 모델을 초기화하는 사전을 전달하는 내 시도와 함께 행복하지 않다 : 나는 다음과 같은 오류가 발생합니다. 문제는 내가 이것을 해결할 수있는 방법이 있는지 또는 사전에있는 모든 값을 해당 키의 이름을 가진 변수에 할당해야하는지 여부입니다. 후자는 상태와 매개 변수가 모두 다르기 때문에 동일한 초기 조건과 매개 변수 집합을 모든 모델에 전달할 수 없습니다. 따라서 매개 변수가 모델에 있는지 여부에 관계없이 모든 모델에 동일한 매개 변수 집합을 전달하려고합니다.

+0

당신은 숫자의 1 차원 시퀀스로 초기 조건을 추가해야한다

이 예는 아이디어를 전달한다. 'model (x, t, p) '에 대한'x' 인자는 부동 소수점 값들의 1 차원 숫자 배열입니다. 'model (x, t, p)'는 숫자의 1 차원 시퀀스 (즉,리스트 또는 numpy 배열)를 반환해야합니다. 그것이 바로 당신이해야 할 일입니다. 사전을 사용하여 매개 변수를 보유하려면 추가 인수로 지정할 수 있습니다 (이미'p' 인수로 수행하고 있습니다). –

답변

2

성능상의 이유로 odeint과 같은 scipy 기능은 각 매개 변수가 고정 위치와 연결되어있는 배열에서 작동합니다.

이름으로 매개 변수에 액세스하는 해결책은 이름과 위치를 모두 제공하는 namedtuple으로 변환하는 것입니다. 그러나 odeintnumpy.array 매개 변수를 모델 함수에 전달하기 때문에 변환을 함수 내부에서 수행해야합니다.

from scipy.integrate import odeint 
from collections import namedtuple 

params = namedtuple('params', ['a', 'b', 'c', 'd']) 

def model(x, t0): 
    x = params(*x) 
    xdot = [1, 
      x.a + x.b, 
      x.c/x.a, 
      1/x.d**2] # whatever 
    return xdot 


x0 = params(a=1, b=0, c=2, d=0.5) 

t = [0, 0.5, 1] 

sol = odeint(model, x0, t) 
관련 문제