我有一个作为非线性程序的轨迹优化问题。每个时间步的状态 x 和控制 u 连接成一个向量。通过使用索引来提取适当的 x 和 u,我想添加动力学约束,并创建一个目标函数,它是每个时间步的 x'Qx +u'Ru 的总和。我也有将初始条件和目标条件设置为约束
目前,以下是我的代码,我在其中创建了一个数组 Z,但为了强制执行初始条件和目标条件,我必须逐个元素。即使它有效,还有更好的方法吗?
nx = 13
nu = 4
N = int(self.tf/self.h)+1
Q = np.diag(np.ones(nx))
R = 0.1*np.diag(np.ones(nu))
Qf = 10*np.diag(np.ones(nx))
#Initialize Model
m = GEKKO(remote=False)
#Set global options
m.options.IMODE = 3 #steady state optimization
m.options.SOLVER = 3
Z = m.Array(m.Var,self.nz,value=0,lb=-1e5,ub=1e5)
#Set upper and lower bounds: 1) U_lb = 0
for i in np.arange(0,N-1):
for j in self.u_index[:,i]:
Z[j].lower = 0
for count, ele in enumerate(self.x_index[:,0]):
print(Z[ele],xic[count])
m.Equation(Z[ele]==xic[count])
for count, ele in enumerate(self.x_index[:,N-1]):
print(Z[ele],xgoal[count])
m.Equation(Z[ele]==xgoal[count])
#Objective
J = []
for i in np.arange(0,N-1):
x = Z[self.x_index[:,i]]
u = Z[self.u_index[:,i]]
J.append(0.5*(x-xgoal).T@Q@(x-xgoal) + 0.5*u.T@R@u)
#Solve simulation
m.Minimize(J)
m.solve()
我的成本函数目前是主要问题,因为它会导致以下错误:异常:@error:最大方程长度”错误。有关如何解决此问题的任何建议?我知道还有另一种使用 Gekko 解决最优控制问题的方法,但是我想尝试以 NLP 的方式解决它
当前代码应包含
J
值的求和。
for i in np.arange(0,N-1):
x = Z[self.x_index[:,i]]
u = Z[self.u_index[:,i]]
J.append(0.5*(x-xgoal).T@Q@(x-xgoal) + 0.5*u.T@R@u)
#Solve simulation
m.Minimize(m.sum(J))
或者,在循环中添加每个目标项而不定义
J
。
for i in np.arange(0,N-1):
x = Z[self.x_index[:,i]]
u = Z[self.u_index[:,i]]
m.Minimize(0.5*(x-xgoal).T@Q@(x-xgoal) + 0.5*u.T@R@u)
Gekko 中的最大方程大小为
15,000
个字符,如 gk0_model.apm
文件中所示,使用 m.open_folder()
检查该模型文本文件。另一种求和应该有助于将每个符号表达式分解成更小的部分。
如果这不能解决问题,请考虑在 Gekko 中使用 稀疏矩阵运算,例如
axb
和 qobj
函数。