如何在 mpc 中使用矢量设定点,以便为程序提供有关未来设定点将如何变化的信息
How to use a vector set point with mpc inorder to give program information on how the future set point will change
我正在使用 MPC 运行 加热器系统。目前我让它在给定的时间点从我的设定点数组中获取一个单独的值来调整要达到的过程。我希望能够为设定点提供当前的期望值和未来的几个点,以便它可以随着设定点的变化更好地进行调整。我怎样才能给 gekko 一个向量,让它更好地适应未来的设定点?
这是我的代码中当前更新我的设定值的部分。
T1[i] = a.T1
T2[i] = a.T2
TC1.MEAS = T1[i]
TC2.MEAS = T2[i]
DT = .1
TC1.SPHI = sp1[i] + DT #sp1 and sp2 are set point arrays for the two heaters
TC1.SPLO = sp1[i] - DT
TC2.SPHI = sp2[i] + DT
TC2.SPLO = sp2[i] - DT
m.solve(disp=False)
对于每个时间步长,Gekko 会自动以数组的形式为未来的控制范围生成设定值。而且,数组通常填充有您分配的单个值。但是,您可以将设定值作为数组给出,如下所示。
sp1 = np.array([[1,2,3,4,5],
[2,3,4,5,6],
[3,4,5,6,7],
[4,5,6,7,8]])
然后,您可以像在问题中所做的那样为每个时间步分配矩阵的每一行。
DT = .1
TC1.SPHI = sp1[i] + DT
注:
您需要具有相同长度的设定点数组,这意味着您的设定点矩阵中列的大小与控制范围(例如 'm.time')。
如果您不想过滤掉阵列中的设定点序列,则可能需要将设定点轨迹选项设置为“0”。 (TR_INIT = 0)
gekko
CV 对象仅使用 SP
、SPHI
和 SPLO
数组的标量值,因此需要进行一些修改以使优化器考虑未来的设定值变化。一个简单的 MPC 应用程序展示了如何在 Gekko 中使用设定值。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
m.time = np.linspace(0,20,41)
p = m.MV(value=0, lb=0, ub=100) # Declare MV
p.STATUS = 1 # allow optimizer to change
p.DCOST = 0.1 # smooth MV response
p.DMAX = 10.0 # max move each cycle
v = m.CV(value=0) # Declare CV
v.STATUS = 1 # add CV to the objective
m.options.CV_TYPE = 2 # squared error
v.SP = 40 # set point
v.TR_INIT = 1 # set point trajectory
v.TAU = 5 # time constant of trajectory
m.Equation(10*v.dt() == -v + 2*p)
m.options.IMODE = 6 # control
m.solve(disp=False)
# get additional solution information
import json
with open(m.path+'//results.json') as f:
results = json.load(f)
plt.figure()
plt.subplot(2,1,1)
plt.plot(m.time,p.value,'b-',label='MV Optimized')
plt.legend()
plt.ylabel('Input')
plt.subplot(2,1,2)
plt.plot(m.time,results['v1.tr'],'k-',label='Reference Trajectory')
plt.plot(m.time,v.value,'r--',label='CV Response')
plt.ylabel('Output')
plt.xlabel('Time')
plt.legend(loc='best')
plt.show()
有一个设定点值是 40
的目标,参考轨迹是用 5
的时间常数定义的。由于 DMAX=10
的变化率约束,MPC 无法完全遵循参考轨迹。如果您希望优化器了解未来设定值的变化,有两种选择。
选项 1:不使用 CV,使用前馈参数
如果您不需要参考轨迹并且可以接受平方误差 objective 那么预测未来设定点变化的最简单方法是使用前馈参数定义您自己的 MPC objective设定点值的向量。示例问题表明,优化器正在预测设置点变化,并在下一次设置点变化之前主动移动,以最小化总误差平方和。这在许多情况下可能是可取的,但在产品等级发生变化并且生产活动的结束应该在生产转换之前符合规格的制造中可能是不可取的material。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
m.time = np.linspace(0,20,41)
p = m.MV(value=0, lb=0, ub=100) # Declare MV
p.STATUS = 1 # allow optimizer to change
p.DCOST = 0.1 # smooth MV response
p.DMAX = 10.0 # max move constraint
v = m.Var(value=0)
sp = np.ones(41)*40
sp[20:] = 60
s = m.Param(value=sp)
m.Obj((s-v)**2)
m.Equation(10*v.dt() == -v + 2*p)
m.options.IMODE = 6 # control
m.solve(disp=False)
plt.figure()
plt.subplot(2,1,1)
plt.plot(m.time,p.value,'b-',label='MV Optimized')
plt.legend()
plt.ylabel('Input')
plt.subplot(2,1,2)
plt.plot(m.time,sp,'k-',label='Setpoint')
plt.plot(m.time,v.value,'r--',label='CV Response')
plt.ylabel('Output')
plt.xlabel('Time')
plt.legend(loc='best')
plt.show()
选项 2:CV 错误
如果需要使用参考轨迹和 Gekko 内置 CV 选项,那么一个选项是定义一个新的误差变量 e
并对其进行控制。误差变量的设定值始终为零,前馈设定值作为前馈参数实现。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
m.time = np.linspace(0,20,41)
p = m.MV(value=0, lb=0, ub=100) # Declare MV
p.STATUS = 1 # allow optimizer to change
p.DCOST = 0.1 # smooth MV response
p.DMAX = 10.0 # max move constraint
v = m.Var(value=0)
sp = np.ones(41)*40
sp[20:] = 60
s = m.Param(value=sp)
e = m.CV(value=0) # Declare CV
e.STATUS = 1 # add CV to the objective
m.options.CV_TYPE = 2 # squared error
e.SP = 0 # set point
e.TR_INIT = 1 # error trajectory
e.TAU = 5 # time constant of trajectory
m.Equation(e==s-v)
m.Equation(10*v.dt() == -v + 2*p)
m.options.IMODE = 6 # control
m.solve(disp=False)
plt.figure()
plt.subplot(2,1,1)
plt.plot(m.time,p.value,'b-',label='MV Optimized')
plt.legend()
plt.ylabel('Input')
plt.subplot(2,1,2)
plt.plot(m.time,sp,'k-',label='Setpoint')
plt.plot(m.time,v.value,'r--',label='CV Response')
plt.ylabel('Output')
plt.xlabel('Time')
plt.legend(loc='best')
plt.show()
我正在使用 MPC 运行 加热器系统。目前我让它在给定的时间点从我的设定点数组中获取一个单独的值来调整要达到的过程。我希望能够为设定点提供当前的期望值和未来的几个点,以便它可以随着设定点的变化更好地进行调整。我怎样才能给 gekko 一个向量,让它更好地适应未来的设定点?
这是我的代码中当前更新我的设定值的部分。
T1[i] = a.T1
T2[i] = a.T2
TC1.MEAS = T1[i]
TC2.MEAS = T2[i]
DT = .1
TC1.SPHI = sp1[i] + DT #sp1 and sp2 are set point arrays for the two heaters
TC1.SPLO = sp1[i] - DT
TC2.SPHI = sp2[i] + DT
TC2.SPLO = sp2[i] - DT
m.solve(disp=False)
对于每个时间步长,Gekko 会自动以数组的形式为未来的控制范围生成设定值。而且,数组通常填充有您分配的单个值。但是,您可以将设定值作为数组给出,如下所示。
sp1 = np.array([[1,2,3,4,5],
[2,3,4,5,6],
[3,4,5,6,7],
[4,5,6,7,8]])
然后,您可以像在问题中所做的那样为每个时间步分配矩阵的每一行。
DT = .1
TC1.SPHI = sp1[i] + DT
注:
您需要具有相同长度的设定点数组,这意味着您的设定点矩阵中列的大小与控制范围(例如 'm.time')。
如果您不想过滤掉阵列中的设定点序列,则可能需要将设定点轨迹选项设置为“0”。 (TR_INIT = 0)
gekko
CV 对象仅使用 SP
、SPHI
和 SPLO
数组的标量值,因此需要进行一些修改以使优化器考虑未来的设定值变化。一个简单的 MPC 应用程序展示了如何在 Gekko 中使用设定值。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
m.time = np.linspace(0,20,41)
p = m.MV(value=0, lb=0, ub=100) # Declare MV
p.STATUS = 1 # allow optimizer to change
p.DCOST = 0.1 # smooth MV response
p.DMAX = 10.0 # max move each cycle
v = m.CV(value=0) # Declare CV
v.STATUS = 1 # add CV to the objective
m.options.CV_TYPE = 2 # squared error
v.SP = 40 # set point
v.TR_INIT = 1 # set point trajectory
v.TAU = 5 # time constant of trajectory
m.Equation(10*v.dt() == -v + 2*p)
m.options.IMODE = 6 # control
m.solve(disp=False)
# get additional solution information
import json
with open(m.path+'//results.json') as f:
results = json.load(f)
plt.figure()
plt.subplot(2,1,1)
plt.plot(m.time,p.value,'b-',label='MV Optimized')
plt.legend()
plt.ylabel('Input')
plt.subplot(2,1,2)
plt.plot(m.time,results['v1.tr'],'k-',label='Reference Trajectory')
plt.plot(m.time,v.value,'r--',label='CV Response')
plt.ylabel('Output')
plt.xlabel('Time')
plt.legend(loc='best')
plt.show()
有一个设定点值是 40
的目标,参考轨迹是用 5
的时间常数定义的。由于 DMAX=10
的变化率约束,MPC 无法完全遵循参考轨迹。如果您希望优化器了解未来设定值的变化,有两种选择。
选项 1:不使用 CV,使用前馈参数
如果您不需要参考轨迹并且可以接受平方误差 objective 那么预测未来设定点变化的最简单方法是使用前馈参数定义您自己的 MPC objective设定点值的向量。示例问题表明,优化器正在预测设置点变化,并在下一次设置点变化之前主动移动,以最小化总误差平方和。这在许多情况下可能是可取的,但在产品等级发生变化并且生产活动的结束应该在生产转换之前符合规格的制造中可能是不可取的material。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
m.time = np.linspace(0,20,41)
p = m.MV(value=0, lb=0, ub=100) # Declare MV
p.STATUS = 1 # allow optimizer to change
p.DCOST = 0.1 # smooth MV response
p.DMAX = 10.0 # max move constraint
v = m.Var(value=0)
sp = np.ones(41)*40
sp[20:] = 60
s = m.Param(value=sp)
m.Obj((s-v)**2)
m.Equation(10*v.dt() == -v + 2*p)
m.options.IMODE = 6 # control
m.solve(disp=False)
plt.figure()
plt.subplot(2,1,1)
plt.plot(m.time,p.value,'b-',label='MV Optimized')
plt.legend()
plt.ylabel('Input')
plt.subplot(2,1,2)
plt.plot(m.time,sp,'k-',label='Setpoint')
plt.plot(m.time,v.value,'r--',label='CV Response')
plt.ylabel('Output')
plt.xlabel('Time')
plt.legend(loc='best')
plt.show()
选项 2:CV 错误
如果需要使用参考轨迹和 Gekko 内置 CV 选项,那么一个选项是定义一个新的误差变量 e
并对其进行控制。误差变量的设定值始终为零,前馈设定值作为前馈参数实现。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
m.time = np.linspace(0,20,41)
p = m.MV(value=0, lb=0, ub=100) # Declare MV
p.STATUS = 1 # allow optimizer to change
p.DCOST = 0.1 # smooth MV response
p.DMAX = 10.0 # max move constraint
v = m.Var(value=0)
sp = np.ones(41)*40
sp[20:] = 60
s = m.Param(value=sp)
e = m.CV(value=0) # Declare CV
e.STATUS = 1 # add CV to the objective
m.options.CV_TYPE = 2 # squared error
e.SP = 0 # set point
e.TR_INIT = 1 # error trajectory
e.TAU = 5 # time constant of trajectory
m.Equation(e==s-v)
m.Equation(10*v.dt() == -v + 2*p)
m.options.IMODE = 6 # control
m.solve(disp=False)
plt.figure()
plt.subplot(2,1,1)
plt.plot(m.time,p.value,'b-',label='MV Optimized')
plt.legend()
plt.ylabel('Input')
plt.subplot(2,1,2)
plt.plot(m.time,sp,'k-',label='Setpoint')
plt.plot(m.time,v.value,'r--',label='CV Response')
plt.ylabel('Output')
plt.xlabel('Time')
plt.legend(loc='best')
plt.show()