微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在最优PID参数估计问题中添加MV超调作为约束?

如何解决如何在最优PID参数估计问题中添加MV超调作为约束?

这个问题与我之前的问题有关 how to formulate the problem of finding the optimal PID paramters in gekko?

我已经根据上述问题的答案通过最小化 IAE 成功估计了最佳 PID 参数。但是,我想在目标函数添加 MV 超调的约束。下面是添加 MV 超调应小于 10% 约束的伪代码

MV_Overshoot=  Max_MV - SteadyState_MV 
MV_Overshoot < 0.1*Steady_State MV  # constraint

但是,我被下面的两个问题困住了

  1. 如何找到稳态_MV?
  2. 如何从 MV 数组中找到最大 MV?

或者有没有更好的方法来计算 MV 超调量?

解决方法

通过稳态计算解决第一步,以确定 OP (MV) 和 PV 值。

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

# Process model
Kp = 0.5                    # process gain
tauP = 10.0                 # process time constant

# pre-solve for steady state values
m = GEKKO()
OP = m.Var(value=0.0)       # controller output (MV)
PV = m.Var(value=0.0)       # process variable
SP = m.Param(value=5.0)     # final set point
m.Equation(SP==PV)          # assume PV reaches set point
m.Equation(tauP*PV.dt() + PV == Kp*OP)
m.options.IMODE = 1
m.solve(disp=False)

print('Steady state target values')
print('OP: ' + str(OP.value[0]))
print('PV: ' + str(PV.value[0]))
print('SP: ' + str(SP.value[0]))
PV_ss = PV.value[0]
OP_ss = OP.value[0]

解决第二步以优化调整参数以保持在请求的过冲目标之下。过冲通常是根据高于设定点的距离而不是高于 MV 目标的量来定义的。两者都包含在示例中。

Optimize

# dynamic optimization of controller tuning
m = GEKKO()
tf = 40
m.time = np.linspace(0,tf,2*tf+1)
step = np.zeros(2*tf+1)
step[3:40] = 0.0
step[40:]  = 5.0

# Controller model
Kc = m.FV(15.0,lb=0,ub=100)   # controller gain
tauI = m.FV(100.0,lb=0.01,ub=100) # controller reset time
tauD = m.FV(0.0,ub=100)  # derivative constant
Kc.STATUS = 1; tauI.STATUS = 1; tauD.STATUS = 1

OP_0 = m.Const(value=0.0)   # OP bias
OP = m.Var(value=0.0,ub=OP_ss*1.1) # controller output
                            #  with overshoot bound on OP (MV)
PV = m.Var(value=0.0,ub=PV_ss*1.1) # process variable
                            #  with overshoot bound on PV
SP = m.Param(value=step)    # set point
Intgl = m.Var(value=0.0)    # integral of the error
err = m.Intermediate(SP-PV) # set point error
m.Equation(Intgl.dt()==err) # integral of the error
m.Equation(OP == OP_0 + Kc*err + (Kc/tauI)*Intgl - PV.dt())
m.Equation(tauP*PV.dt() + PV == Kp*OP)
m.Minimize((SP-PV)**2)
m.options.IMODE=6
m.solve(disp=False)

print('Tuning values')
print('Kc: ' + str(Kc.value[0]))
print('tauI: ' + str(tauI.value[0]))
print('tauD: ' + str(tauD.value[0]))

plt.figure()
plt.subplot(2,1,1)
plt.plot([0,max(m.time)],[1.1*OP_ss,1.1*OP_ss],\
         'b-',label='Upper bound')
plt.plot(m.time,OP.value,'b:',label='OP')
plt.ylabel('Output')
plt.legend()
plt.subplot(2,2)
plt.plot(m.time,SP.value,'k-',label='SP')
plt.plot(m.time,PV.value,'r--',label='PV')
plt.plot([0,[1.1*PV_ss,1.1*PV_ss],label='Upper bound')
plt.xlabel('Time (sec)')
plt.ylabel('Process')
plt.legend()
plt.show()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。