将轨迹优化问题呈现为 NLP。如何用 Gekko 解决这个问题?目前面临“异常:@error:最大方程长度”错误

问题描述 投票:0回答:1

我有一个作为非线性程序的轨迹优化问题。每个时间步的状态 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 的方式解决它

python nonlinear-optimization gekko
1个回答
0
投票

当前代码应包含

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
函数。

© www.soinside.com 2019 - 2024. All rights reserved.