Python-Pyomo:ODE系统中的参数估计

2024-06-15 01:41:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始使用Pyomo,所以如果这是一个基本问题,我会提前道歉。嗯,我正在研究动力学模型,我的目标是估计动力学参数。我开始尝试一个复杂的玩具模型。在

所以,我的玩具模型是一个由3个方程组成的简单的ODE系统:

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

我的目标是估计参数k1和k2。我稍微修改了这个tutorial的代码,如下所示:

^{pr2}$

运行此代码后,我收到以下消息:

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

但是,当我删除代码中与x3_meas对应的所有行以及.dat文件中的数据时,它工作得非常好。在

有人知道问题出在哪里吗?在

我的数据看起来像:

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
;

Tags: 代码模型目标参数paramvaluedtk2
1条回答
网友
1楼 · 发布于 2024-06-15 01:41:37

在向Pyomo的google小组寻求帮助后,有人指出我犯了一个愚蠢的错误:

在你的目标函数中,你忘了索引x3。你的目标职能应该是:

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)

相关问题 更多 >