微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用通过移动视界估计修改的参数进行矩阵运算

如何解决使用通过移动视界估计修改的参数进行矩阵运算

我最近开始尝试使用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,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连接为对象。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。