2016-03-29 5 views
0

odeint со следующими настройками прекрасно работает;ТипError: model() принимает ровно 3 аргумента (5 данных)

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.integrate import odeint 

v0 = 10.0 
k1 = 0.5 
k2 = 0.35 

def model(x,t): 
    dx0 = v0 - k1*x[0] 
    dx1 = k1*x[0] - k2*x[1] 
    return [dx0, dx1] 
time = linspace(0.0,20.0,100) 
xinit = array([0.0,0.0]) 
x = odeint(model,xinit,time) 
plt.plot(time, x[:,0], time, x[:,1]) 

, но когда я хочу, чтобы определить параметризованную модель, а затем передать параметры модели() функцию, я наткнулся на этой ошибку, когда odeint называет: TypeError: модель() принимает ровно три аргумента (5) . Что здесь не так? Какова правильная настройка для передачи параметров?

import numpy as np 
from scipy.integrate import odeint 
import matplotlib.pyplot as plt 

def model (x,t,p): 
    dot_x = np.zeros(2) 
    v0 = p[0] 
    k1 = p[1] 
    k2 = p[2] 
    dot_x[0] = v0 - k1*x[0] 
    dot_x[1] = k1*x[0] - k2*x[1] 
    return dot_x 

p = (10,0.5,.35) 
xinit = [0.0,0.0] 
time = linspace(0.0,20.0,100) 

x = odeint(model,xinit,time,p) 

plt.plot(time, x[:,0], time, x[:,1]) 
+0

Пропустите параметр 'p' как арг т.е. определение функции модели (х, т, * арг):' – Thiru

+0

@Thiru Спасибо вы. Это прекрасно работает! – sci9

ответ

0

Благодаря комментарий Тиру, вот решение:

import numpy as np 
from scipy.integrate import odeint 
import matplotlib.pyplot as plt 

def model (x,t,*p): 
    dot_x = np.zeros(2) 
    v0 = p[0] 
    k1 = p[1] 
    k2 = p[2] 
    dot_x[0] = v0 - k1*x[0] 
    dot_x[1] = k1*x[0] - k2*x[1] 
    return dot_x 

p = (10,0.5,.35) 
xinit = [0.0,0.0] 
time = linspace(0.0,20.0,100) 

x = odeint(model,xinit,time,p) 

plt.plot(time, x[:,0], time, x[:,1])