python - Python移动地平线时间序列非线性回归中的不良数据
问题描述
我有一个Python Gekko应用于估计和控制对工业聚合物制造过程(UNIPOL 聚乙烯)的干扰。该方法是更新未知的催化剂活性以最小化测量的和预测的生产率之间的差异。然后将催化剂活性用于生产控制。预测的生产率基于与冷却水的热交换。我遇到的问题是,有时由于与测量(流量计、温度)和大瞬变期间的计算相关的间歇性问题,生产率测量并不好。分布式控制系统(Honeywell Experion 与 TDC3000)具有适当的保护措施,可防止错误测量并报告值但状态不佳。如何使用可用的良好测量值,但忽略 Python Gekko 中间歇性的不良测量值?由于专有问题,我没有可以共享的示例代码,但它是类似于这个 TCLab 练习。
for i in range(1,n):
# Read temperatures in Celsius
T1m[i] = a.T1
T2m[i] = a.T2
# Insert measurements
TC1.MEAS = T1m[i]
TC2.MEAS = T2m[i]
Q1.MEAS = Q1s[i-1]
Q2.MEAS = Q2s[i-1]
# Predict Parameters and Temperatures with MHE
m.solve(disp=True)
我可以使用np.nan
(NaN) 作为度量,还是有其他方法来处理不良数据?
解决方案
对于任何不良数据,您可以将FSTATUS
FV、MV、SV 或 CV 的反馈状态设置为关闭 (0)。
if bad_measurements:
TC1.FSTATUS = 0
TC2.FSTATUS = 0
Q1.FSTATUS = 0
Q2.FSTATUS = 0
else:
TC1.FSTATUS = 1
TC2.FSTATUS = 1
Q1.FSTATUS = 1
Q2.FSTATUS = 1
Gekko 消除了时间序列模型更新中的不良测量,但保留了良好的数据。对于 CV,它通过存储和时移每个测量值和 fstatus 值来实现这一点。不良数据最终与FSTATUS=0
指标一起离开数据范围。FSTATUS
如果要过滤输入数据,您还可以使用介于 0 和 1 之间的值:
x=LSTVAL∗(1−FSTATUS)+MEAS∗FSTATUS
其中LSTVAL
是最后一个值,MEAS
是测量值,并且x
是该测量值的新过滤输入。更多信息在FSTATUS
文档中。
推荐阅读
- ids - Pyueye IDS相机
- algol - RESIZE 和 DEALLOCATE 对 CPU 性能的影响是什么
- javascript - discord.js 禁用“交互失败”
- ios - 从 WatchOS 获取近实时 HR 数据,无需注册数据或贡献环
- sql - 如何使用子查询创建选择子句
- python - 如何创建一个函数,通过 numpy 矩阵循环以 z 缩放每个返回标准化数据的数据点
- angular - Angular:如何处理 HMLT 模板中的嵌套 FormGroups?
- php - 将记录插入具有不同ID的mysql(按用户ID)
- python - nsolve 不断抛出 ValueError
- flutter - 你如何使颤振滑块在拇指的每一侧跟踪相同的高度?