使用通过移动 horizon 估计修改的参数进行矩阵运算
Matrix operations using parameters modified through moving horizon estimation
我最近开始尝试使用 GEKKO 移动 horizon 估计。我指定的操纵变量用于我模型中的热平衡方程,我在模型中遇到一些矩阵运算问题。
示例代码:
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 的值;但是,我一直收到该错误。
有没有人遇到过类似的问题?
谢谢!
您可以使用 np.append()
而不是 np.concatenate()
来解决此问题。尝试类似的东西:
mdot_c_i = np.append(mdot_F_i, p.u)
如果您想尝试,这里有一个最小且完整的示例。
import numpy as np
from gekko import GEKKO
m = 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
作为对象连接。
我最近开始尝试使用 GEKKO 移动 horizon 估计。我指定的操纵变量用于我模型中的热平衡方程,我在模型中遇到一些矩阵运算问题。
示例代码:
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 的值;但是,我一直收到该错误。
有没有人遇到过类似的问题?
谢谢!
您可以使用 np.append()
而不是 np.concatenate()
来解决此问题。尝试类似的东西:
mdot_c_i = np.append(mdot_F_i, p.u)
如果您想尝试,这里有一个最小且完整的示例。
import numpy as np
from gekko import GEKKO
m = 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
作为对象连接。