GEKKO为什么不进行初始测量?

丹尼尔·希尔

在使用GEKKO对具有初始测量值的动态系统进行建模时,即使打开了FSTATUS,GEKKO似乎也完全忽略了测量值。是什么原因造成的?如何使GEKKO识别初始测量值?

我希望求解器将初始测量结果考虑在内,从而相应地调整解决方案。

调整

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

# measurement
tm = 0
xm = 25

m = GEKKO()
m.time = np.linspace(0,20,41)
tau = 10
b = m.Param(value=50)
K = m.Param(value=0.8)

# Manipulated Variable
u = m.MV(value=0, lb=0, ub=100)
u.STATUS = 1  # allow optimizer to change
u.DCOST = 0.1
u.DMAX = 30

# Controlled Variable
x = m.CV(value=0,name='x')
x.STATUS = 1  # add the SP to the objective
m.options.CV_TYPE = 2 # squared error
x.SP = 40     # set point
x.TR_INIT = 1 # set point trajectory
x.TAU = 5     # time constant of trajectory
x.FSTATUS = 1
x.MEAS = xm

# Process model
m.Equation(tau*x.dt() == -x + K*u)
m.options.IMODE = 6 # control
m.solve()

# 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,u.value,'b-',label='MV Optimized')
plt.legend()
plt.ylabel('Input')
plt.subplot(2,1,2)
plt.plot(tm,xm,'ro', label='Measurement')
plt.plot(m.time,results['x.tr'],'k-',label='Reference Trajectory')
plt.plot(m.time,results['x.bcv'],'r--',label='CV Response')
plt.ylabel('Output')
plt.xlabel('Time')
plt.legend()
plt.show()
约翰·海登格伦

Gekko忽略了MPC初始化的第一个周期的测量。如果您进行其他求解,则它将使用度量。

m.solve() # for MPC initialization

x.MEAS = xm
m.solve() # update initial condition with measurement

反馈状态(FSTATUS)是一阶过滤器,用于介于0(无更新)和1(完整的测量更新)之间的测量。

MEAS = LSTVAL * (1-FSTATUS) + MEAS * FSTATUS

然后将新的测量值(MEAS)用于偏差计算。有无偏(原始预测不受测量影响)模型预测和有偏模型预测。偏差被计算为无偏差模型预测和测量之间的差。

BIAS = MEAS - UNBIASED_MODEL

有偏和无偏模型

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

# measurement
tm = 0
xm = 25

m = GEKKO()
m.time = np.linspace(0,20,41)
tau = 10
b = m.Param(value=50)
K = m.Param(value=0.8)

# Manipulated Variable
u = m.MV(value=0, lb=0, ub=100)
u.STATUS = 1  # allow optimizer to change
u.DCOST = 0.1
u.DMAX = 30

# Controlled Variable
x = m.CV(value=0,name='x')
x.STATUS = 1  # add the SP to the objective
m.options.CV_TYPE = 2 # squared error
x.SP = 40     # set point
x.TR_INIT = 1 # set point trajectory
x.TAU = 5     # time constant of trajectory
x.FSTATUS = 1

# Process model
m.Equation(tau*x.dt() == -x + K*u)
m.options.IMODE = 6 # control
m.solve(disp=False)

m.options.TIME_SHIFT = 0
x.MEAS = xm
m.solve(disp=False)
# turn off time shift, only for initialization
m.options.TIME_SHIFT = 1

# 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,u.value,'b-',label='MV Optimized')
plt.legend()
plt.ylabel('Input')
plt.ylim([-5,105])
plt.subplot(2,1,2)
plt.plot(tm,xm,'ro', label='Measurement')
plt.plot(m.time,results['x.tr'],'k-',label='Reference Trajectory')
plt.plot(m.time,results['x.bcv'],'r--',label='CV Response Biased')
plt.plot(m.time,x.value,'g:',label='CV Response Unbiased')
plt.ylim([-1,41])
plt.ylabel('Output')
plt.xlabel('Time')
plt.legend()
plt.show()

这是当前的工作方式,因为LSTVAL上述计算没有模型预测或没有偏见。第一个周期计算这些值,并允许后续周期进行更新。如果确实在第一个循环中需要更新的值,则可以m.option.TIME_SHIFT=0在第二个求解中使用选项进行求解,以不更新模型的初始条件。您将需要更改TIME_SHIFT=1以使后续循环具有动态模型的预期时间进度。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么不进行比较就返回假?

来自分类Dev

为什么文件全局不进行分词?

来自分类Dev

请告知错误是什么...为什么不进行编译?

来自分类Dev

为什么std :: atomic初始化不进行原子释放,以便其他线程可以看到初始化值?

来自分类常见问题

WebSockets ping / pong,为什么不进行TCP keepalive?

来自分类Dev

为什么要从多个表中选择而不进行联接

来自分类Dev

我为什么要使用mercurial而不进行合并?

来自分类Dev

为什么这里不进行隐式转换?

来自分类Dev

为什么对WeakRef对象的WeakReference不进行垃圾收集?

来自分类Dev

为什么在我的情况下不进行整数提升?

来自分类Dev

为什么要从多个表中选择而不进行联接

来自分类Dev

为什么此@Transactional方法不进行多次保存

来自分类Dev

为什么不进行屏幕外更新的UICollectionViewCells?

来自分类Dev

为什么不进行这种简单的Morte程序类型检查?

来自分类Dev

初始化SortedDictionary而不进行比较

来自分类Dev

为什么不进入if条件?

来自分类Dev

为什么不进入“ for循环”

来自分类Dev

DLL使用__stdcall而不进行名称修饰:为什么它甚至可以工作?

来自分类Dev

设置这些表单后,为什么我的表单不进行验证检查?

来自分类Dev

C#FormatException double.parse(),为什么不进行0.89解析?

来自分类Dev

捆绑程序为什么不进行“更改” Gemfile.lock而没有真正的更改?

来自分类Dev

为什么我的变量在strtok()和fgets()之后更改而不进行修改?

来自分类Dev

为什么不进行修改以使其无法利用?

来自分类Dev

如何在Python中进行调试:pdb为什么不进入函数调用?

来自分类Dev

如果未定义析构函数,为什么不进行返回值优化?

来自分类Dev

为什么对纽约证交所1个月的高/低数据不进行这种汇总?

来自分类Dev

为什么在第二个循环中不进行for循环打印?

来自分类Dev

设置这些表单后,为什么我的表单不进行验证检查?

来自分类Dev

为什么不进行Redshift接受我的fixedwidth文本文件

Related 相关文章

  1. 1

    为什么不进行比较就返回假?

  2. 2

    为什么文件全局不进行分词?

  3. 3

    请告知错误是什么...为什么不进行编译?

  4. 4

    为什么std :: atomic初始化不进行原子释放,以便其他线程可以看到初始化值?

  5. 5

    WebSockets ping / pong,为什么不进行TCP keepalive?

  6. 6

    为什么要从多个表中选择而不进行联接

  7. 7

    我为什么要使用mercurial而不进行合并?

  8. 8

    为什么这里不进行隐式转换?

  9. 9

    为什么对WeakRef对象的WeakReference不进行垃圾收集?

  10. 10

    为什么在我的情况下不进行整数提升?

  11. 11

    为什么要从多个表中选择而不进行联接

  12. 12

    为什么此@Transactional方法不进行多次保存

  13. 13

    为什么不进行屏幕外更新的UICollectionViewCells?

  14. 14

    为什么不进行这种简单的Morte程序类型检查?

  15. 15

    初始化SortedDictionary而不进行比较

  16. 16

    为什么不进入if条件?

  17. 17

    为什么不进入“ for循环”

  18. 18

    DLL使用__stdcall而不进行名称修饰:为什么它甚至可以工作?

  19. 19

    设置这些表单后,为什么我的表单不进行验证检查?

  20. 20

    C#FormatException double.parse(),为什么不进行0.89解析?

  21. 21

    捆绑程序为什么不进行“更改” Gemfile.lock而没有真正的更改?

  22. 22

    为什么我的变量在strtok()和fgets()之后更改而不进行修改?

  23. 23

    为什么不进行修改以使其无法利用?

  24. 24

    如何在Python中进行调试:pdb为什么不进入函数调用?

  25. 25

    如果未定义析构函数,为什么不进行返回值优化?

  26. 26

    为什么对纽约证交所1个月的高/低数据不进行这种汇总?

  27. 27

    为什么在第二个循环中不进行for循环打印?

  28. 28

    设置这些表单后,为什么我的表单不进行验证检查?

  29. 29

    为什么不进行Redshift接受我的fixedwidth文本文件

热门标签

归档