使用通过移动水平估计修改的参数的矩阵运算

我最近开始尝试使用 GEKKO 进行移动地平线估计。我指定的操纵变量用于我的模型中的热平衡方程,我在模型中遇到一些矩阵运算问题。


示例代码:


from gekko import GEKKO

import numpy as np


#creating a sample array of input values

nt = 51

u_meas = np.zeros(nt)

u_meas[3:10] = 1.0

u_meas[10:20] = 2.0

u_meas[20:40] = 0.5

u_meas[40:] = 3.0


p = GEKKO(remote=False)

p.time = np.linspace(0,10,nt)


n = 1 #process model order


#designating u as my input, and that I'm going to be using these measurements to estimate my parameters with MHE

p.u = p.MV(value=u_meas)

p.u.FSTATUS=1


#parameters I'm looking to modulate

p.K = p.FV(value=1, lb = 1, ub = 3) #gain

p.tau = p.FV(value=5, lb = 1, ub = 10) #time constant


p.x = [p.Intermediate(p.u)]


#constants within the model that do not change

X_O2 = 0.5

X_SiO2 = 0.25

X_N2 = 0.1

m_feed = 100


#creating an array with my feed separated into components. This creates a 1D array with the individual feed streams of my components. 

mdot_F_i = (np.tile(m_feed,3)*np.array([X_O2, X_SiO2, X_N2])


#at this point, I want to add my MV values to the end of my component feed array for later heat and mass balance equations. Normally, in my previous model without MHE, I would put


mdot_c_i = np.concatenate(mdot_F_i, x, (other MV variables after))


但是,现在 u 是 GEKKO 中指定的 MV,而不是设定值,我在 mdot_c_i 行收到一个错误,指出索引 0 处的数组有 1 维,而索引 1 处的数组有 2 维。


我猜我必须将 mdot_c_i 指定为 Gekko 中的中间变量。我尝试了几种不同的变体,交替指定 mdot_c_i 作为中间值并尝试仅使用 MV 的值;但是,我不断收到该错误。


有没有人遇到类似的问题?


紫衣仙女
浏览 85回答 1
1回答

aluckdog

您可以使用np.append()而不是来解决此问题np.concatenate()。尝试类似的东西:mdot_c_i = np.append(mdot_F_i, p.u)如果您想尝试,这是一个最小且完整的示例。import numpy as npfrom gekko import GEKKOm = GEKKO(remote=False)x = m.Array(m.Var,3,lb=-10,ub=10)y = m.Var(5,lb=-5,ub=5)z = np.append(x,y)m.Minimize(np.dot([1,1,-1,1],z))m.solve(disp=False)print([zi.value[0] for zi in z])# solution: [-10.0, -10.0, 10.0, -5.0]Gekko 变量需要存储为对象,而不是数值。该错误可能是因为np.concatenate()函数试图访问 Gekko 操纵变量数据的长度p.u.value以连接这些值而不是连接p.u为对象。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python