2016-05-26 10 views
0

私はPyomoを使用して新しくなったので、これが基本的な質問であれば事前にお詫びします。まあ、私は動力学モデルで作業しています、私の目標は動力学的パラメータを推定することです。私は複雑なものを試す前に、より良いPyomoを理解するための「おもちゃモデル」から始めました。Python Pyomo:ODEシステムでのパラメータ推定

だから、私のおもちゃのモデルは、3次方程式の簡単なODEシステムです:

dX1/dt = -k1*X1 
dX2/dt = k1*X1 - k2*X2 
dX3/dt = k2*X2 

私の目的は、パラメータK1およびK2を推定することです。私は少しこのtutorialからコードを変更し、以下の通りです:

from pyomo.environ import * 
from pyomo.dae import * 

model = AbstractModel() 
model.t = ContinuousSet() 
model.MEAS_t = Set(within=model.t) 
model.x1_meas = Param(model.MEAS_t) 
model.x2_meas = Param(model.MEAS_t) 
model.x3_meas = Param(model.MEAS_t) 

model.x1 = Var(model.t) 
model.x2 = Var(model.t) 
model.x3 = Var(model.t) 

model.k1 = Var(bounds=(0,3)) 
model.k2 = Var(bounds=(0,3)) 

model.x1dot = DerivativeVar(model.x1,wrt=model.t) 
model.x2dot = DerivativeVar(model.x2,wrt=model.t) 
model.x3dot = DerivativeVar(model.x3,wrt=model.t) 

def _x1dot(model,i): 
    return model.x1dot[i] == -model.k1*model.x1[i] 
model.x1dotcon = Constraint(model.t, rule=_x1dot) 

def _x2dot(model,i): 
    return model.x2dot[i] == model.k1*model.x1[i]-model.k2*model.x2[i] 
model.x2dotcon = Constraint(model.t, rule=_x2dot) 

def _x3dot(model,i): 
    return model.x3dot[i] == model.k2*model.x2[i] 
model.x3dotcon = Constraint(model.t, rule=_x3dot) 


def _obj(model): 
    return sum((model.x1[i]-model.x1_meas[i])**2+(model.x2[i]-model.x2_meas[i])**2+(model.x3[i]-model.x3_meas)**2 for i in model.MEAS_t) 
model.obj = Objective(rule=_obj) 

model.pprint() 

instance = model.create_instance('data2.dat') 
instance.t.pprint() 

discretizer = TransformationFactory('dae.collocation') 
discretizer.apply_to(instance,nfe=8,ncp=5) 

solver=SolverFactory('ipopt') 

results = solver.solve(instance,tee=True) 

instance.k1.pprint() 
instance.k2.pprint() 

私はこのコードを実行すると、私は次のようなメッセージだ:私はx3_measに対応するすべての行を消去するとき、しかし

TypeError: Cannot convert object of type 'IndexedParam' (value = x3_meas) to a numeric value. 

を私のコードでは、私の.datファイルのデータだけでなく、それは完全に動作します。

問題は何ですか?私のデータがどのように見える

:あなたはインデックスx3_measに忘れてしまったあなたの目的関数で

:PyomoのGoogleグループで助けを求める後

set t := 0.00 0.66 1.33 2.00 2.66 3.33 4.00 4.66 5.33 6.00 ; 
set MEAS_t := 0.00 0.66 1.33 2.00 2.66 3.33 4.00 4.66 5.33 6.00 ; 
param x1_meas := 
0.00 1.000000 
0.66 0.263597 
1.33 0.069483 
2.00 0.018316 
2.66 0.004828 
3.33 0.001273 
4.00 0.000335 
4.66 0.000088 
5.33 0.000023 
6.00 0.000006 
; 
param x2_meas := 
0.00 0.000000 
0.66 0.499640 
1.33 0.388227 
2.00 0.234039 
2.66 0.129311 
3.33 0.068803 
4.00 0.035960 
4.66 0.018630 
5.33 0.009609 
6.00 0.004945 
; 
param x3_meas := 
0.00 0.000000 
0.66 0.236763 
1.33 0.542289 
2.00 0.747645 
2.66 0.865861 
3.33 0.929925 
4.00 0.963704 
4.66 0.981281 
5.33 0.990367 
6.00 0.995049 
; 

答えて

0

、私は私が愚かなミスをコミットしていることが指摘されました。目的の関数は次のとおりです。

def _obj(model): 
    return sum((model.x1[i]-model.x1_meas[i])**2+(model.x2[i]-model.x2_meas[i])**2+(model.x3[i]-model.x3_meas[i])**2 for i in model.MEAS_t) 
関連する問題