2017-06-19 41 views
0

いくつかのデータに2つのパラメータ(Km、kcat)と4つの入力と出力を持つ関数をフィットさせたいと思います。 関数である:Python.scipy:Curve_fit複数の入力と出力を持つ関数

def dxdt(x, t, Km, kcat): 
    y = np.zeros(4) 
    reaction1 = Km * x[2] * x[0] 
    reaction2 = kcat * x[3] 
    y[0] = - reaction1 
    y[1] = reaction2 
    y[2] = reaction2 - reaction1 
    y[3] = reaction1 - reaction2 
return y 

例えば、データがあってもよい:

x = [[7.2, 6.1, 5.5, 4.1, 3.3, 2.1, 1.9, 0.2], [0., 1.1, 2.2, 3.5, 
4.5, 6.0, 6.6, 7.3], [10., 9.5, 8., 7.1, 6.8, 5., 5.9, 9.9], [0., 1.2, 
3., 4.5, 5., 6.1, 2.5, 0.4 ]] 
タイムスパンと

t = range(9) 

を固定開始値:

initial_values = [7.2., 0., 10., 0.] 

I関数を定義するパラメータの特定のセットのための出力計算する:今すぐ

def y(timerange, a, b):  
    result = odeint(dxdt, initial_values, timerange, 
        args=(a, b)) 
return result.transpose() 

を、私は適切に)(scipy.optimize.curvefitを使用する方法がわかりません。 関数はR^n→Rではなく、R^n-> R^nからではなく、curve_fitの例しか見ていません。 これも可能ですか?

答えて

0

使用はleastsqを使用することができます。

import numpy as np 
from scipy.optimize import leastsq 
from scipy.integrate import odeint 
def dxdt(x, t, Km, kcat): 
    y = np.zeros(4) 
    reaction1 = Km * x[2] * x[0] 
    reaction2 = kcat * x[3] 
    y[0] = - reaction1 
    y[1] = reaction2 
    y[2] = reaction2 - reaction1 
    y[3] = reaction1 - reaction2 
    return y 
x = np.array([[7.2, 6.1, 5.5, 4.1, 3.3, 2.1, 1.9, 0.2], [0., 1.1, 2.2, 3.5, 4.5, 6.0, 6.6, 7.3], [10., 9.5, 8., 7.1, 6.8, 5., 5.9, 9.9], [0., 1.2, 3., 4.5, 5., 6.1, 2.5, 0.4 ]]) 
t = range(8) 
initial_values = [7.2, 0., 10., 0.] 
def y(timerange, a, b):  
    result = odeint(dxdt, initial_values, timerange, 
       args=(a, b)) 
    return result.transpose() 
def residuals(params): 
    a,b=params 
    return (y(t,a,b)-x).flatten() 
result=leastsq(residuals,[0.1,0.1]) 
print(result) 
+0

ありがとうございました!それは私のために働く。 2番目の出力は何を意味しますか? (1つ) 出力: 配列([0.04744236,0.33046273])、1 – PascalIv

+0

ドキュメントによると:«整数フラグ。 1、2、3、または4に等しい場合、解が見つかりました。それ以外の場合は、解決策が見つかりませんでした。どちらの場合でも、オプションの出力変数 'mesg'はより多くの情報を提供します。» – JPG

関連する問題