我试图在Python中使用GEKKO实现一个后退地平线控制(RHC)方案,我想判断一下我的公式.目标是在一定范围内求解从t=tk到t=tk+H-1的OCP,在tk处应用控制解,并丢弃剩余值(u\u k+1到u\u k+H-1).下面的代码似乎给出了正确的解决方案,但我想验证我在GEKKO中使用了正确的函数,即在"重置"下一个视界的状态时.我在try 使用.VALUE功能重置x1x2时遇到了一些问题,例如TypeError: 'float' object is not subscriptable.

import numpy as np
import matplotlib.pylab as plt
from gekko import GEKKO

if __name__ == '__main__':

    # Instantiate GEKKO
    m = GEKKO()

    # Constants
    nRHC = 21
    tRHC = 2
    m.time = np.linspace(0, tRHC, nRHC)

    # Control
    u = m.MV(value=0.0,fixed_initial=False)
    u.STATUS = 1 
    u.DCOST = 0

    # Vars
    t = m.SV(value=0)
    x1 = m.SV(value=1)
    x2 = m.SV(value=0)

    # Equations
    m.Equation(t.dt() == 1)
    m.Equation(x1.dt() == x2)
    m.Equation(x2.dt() == (1 - x2*x2)*x1 - x2 + u)

    # Objective Function
    m.Minimize(10*x1**2 + 10*x2**2 + u**2)

    # Solve RHC
    m.options.IMODE = 6
    m.options.NODES = 11
    m.options.MV_TYPE = 2
    m.options.SOLVER = 3
    nTotal = 101
    tTotal = np.linspace(0, 10, nTotal)
    uStore = np.zeros((1,nTotal))
    xStore = np.zeros((2,nTotal))
    xStore[:,0] = [1, 0]
    for i in range(nTotal):
        print('Solving Step: ', i+1, ' of ', nTotal-1)
        if i == nTotal-1:
            break

        # Solve MPC over horizon
        m.solve(disp=False)

        # Update States
        t.VALUE = t[1]
        x1.MEAS = x1[1]
        x2.MEAS = x2[1]
        
        # Store
        uStore[:,i] = u.NEWVAL
        xStore[:,i+1] = np.array([x1[1], x2[1]])

    # Plot States
    f1, axs = plt.subplots(2)    
    axs[0].plot(tTotal, xStore[0,:])
    axs[0].set_ylabel('x')
    axs[0].grid()
    axs[1].plot(tTotal, xStore[1,:])
    axs[1].set_ylabel('x_dot')
    axs[1].set_xlabel('time')
    axs[1].grid()

    # Show Plots
    plt.show()

非常感谢.

推荐答案

不需要更新状态,因为Gekko会自动进行更新.

# Update States
t.VALUE = t[1]
x1.MEAS = x1[1]
x2.MEAS = x2[1]

状态值存储在运行目录文件中(请参阅m.path或用m.open_folder()打开).文件是ctl.t0.在下一个命令m.solve()处,导入该文件并进行时间偏移,以使下一时间步的值成为初始条件.时间偏移调整为m.options.TIME_SHIFT=1(默认值为1).如果确实要覆盖初始条件,请使用x1.MEAS=x1.value[1]x1.value=x1.value[1].

Python相关问答推荐

在Google Colab中设置Llama-2出现问题-加载判断点碎片时Cell-run失败

输出中带有南的亚麻神经网络

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

关于Python异步编程的问题和使用await/await def关键字

将JSON对象转换为Dataframe

如何在表中添加重复的列?

如何指定列数据类型

用渐近模计算含符号的矩阵乘法

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

如何在FastAPI中为我上传的json文件提供索引ID?

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

跳过嵌套JSON中的级别并转换为Pandas Rame

Python—压缩叶 map html作为邮箱附件并通过sendgrid发送

OpenCV轮廓.很难找到给定图像的所需轮廓

当单元测试失败时,是否有一个惯例会抛出许多类似的错误消息?

利用SCIPY沿第一轴对数组进行内插

对于标准的原始类型注释,从键入`和`从www.example.com `?

Match-Case构造中的对象可调用性测试

将时间序列附加到数据帧

使用loc计算特定行的平均值,loc找不到行值