Apps

Also see [[Apps/DiscreteStateSpace|Discrete State Space]]

!!!! Example Model Predictive Control in GEKKO

(:source lang=python:)

import numpy as np

from gekko import GEKKO

A = np.array([[-.003, 0.039, 0, -0.322],

[-0.065, -0.319, 7.74, 0],

[0.020, -0.101, -0.429, 0],

[0, 0, 1, 0]])

B = np.array([[0.01, 1, 2],

[-0.18, -0.04, 2],

[-1.16, 0.598, 2],

[0, 0, 2]]

)

C = np.array([[1, 0, 0, 0],

[0, -1, 0, 7.74]])

#%% Build GEKKO State Space model

m = GEKKO()

x,y,u = m.state_space(A,B,C,D=None)

# customize names

# MVs

mv0 = u[0]

mv1 = u[1]

# Feedforward

ff0 = u[2]

# CVs

cv0 = y[0]

cv1 = y[1]

m.time = [0, 0.1, 0.2, 0.4, 1, 1.5, 2, 3, 4]

m.options.imode = 6

m.options.nodes = 3

u[1].lower = -5

u[1].upper = 5

u[1].dcost = 1

u[1].status = 1

u[1].lower = -5

u[1].upper = 5

u[1].dcost = 1

u[1].status = 1

## CV tuning

# tau = first order time constant for trajectories

y[0].tau = 5

y[1].tau = 8

# tr_init = 0 (dead-band)

# = 1 (first order trajectory)

# = 2 (first order traj, re-center with each cycle)

y[0].tr_init = 0

y[1].tr_init = 0

# targets (dead-band needs upper and lower values)

# SPHI = upper set point

# SPLO = lower set point

y[0].sphi= -8.5

y[0].splo= -9.5

y[1].sphi= 5.4

y[1].splo= 4.6

y[0].status = 1

y[1].status = 1

# feedforward

u[2].status = 0

u[2].value = np.zeros(np.size(m.time))

u[2].value[3:] = 2.5

m.solve() # (GUI=True)

# also create a Python plot

import matplotlib.pyplot as plt

plt.subplot(2,1,1)

plt.plot(m.time,mv0.value,'r-',label=r'$u_0$ as MV')

plt.plot(m.time,mv1.value,'b--',label=r'$u_1$ as MV')

plt.plot(m.time,ff0.value,'g:',label=r'$u_2$ as feedforward')

plt.subplot(2,1,2)

plt.plot(m.time,cv0.value,'r-',label=r'$y_0$')

plt.plot(m.time,cv1.value,'b--',label=r'$y_1$')

plt.show()

(:sourceend:)
~~!~~ Model information

~~!~~ continuous form

~~!~~ dx/dt = A * x + B * u

~~!~~ y = C * x + D * u

!

~~! dimensions~~

! ~~(nx1) =~~ (~~nxn~~)~~*(nx1) +~~ (~~nxm~~)*(~~mx1~~)

~~!~~ (~~px1~~) ~~=~~ (~~pxn~~)~~*(nx1) +~~ (~~pxm~~)*(~~mx1~~)

~~!~~

! discrete form

! ~~x[k+1] = A *~~ x[k] ~~+ B~~ * ~~u~~[k]

! y[k] = C * x[k] + D * u[k]
~~Attach:lti_step_response.png~~
~~Linear model predictive controllers are based on models in the finite impulse response form or linear state space form. Either model form can be converted to a form that %blue%A%red%P%black%Monitor uses for estimation and control~~.

Linear model predictive controllers are based on models in the finite impulse response form or linear state space form. Either model form can be converted to a form that %blue%A%red%P%black%Monitor uses for estimation and control.

## Linear State Space

## Apps.LinearStateSpace History

Hide minor edits - Show changes to output

Added lines 152-153:

Also see [[Apps/DiscreteStateSpace|Discrete State Space]]

Changed line 65 from:

!!!! Example Model Predictive Control in ~~GEKKO~~

to:

!!!! Example Model Predictive Control in [[https://gekko.readthedocs.io/en/latest/|GEKKO]]

Changed lines 10-12 from:

!! Example Model

to:

!!!! Example Model in APMonitor

Added lines 64-151:

!!!! Example Model Predictive Control in GEKKO

(:source lang=python:)

import numpy as np

from gekko import GEKKO

A = np.array([[-.003, 0.039, 0, -0.322],

[-0.065, -0.319, 7.74, 0],

[0.020, -0.101, -0.429, 0],

[0, 0, 1, 0]])

B = np.array([[0.01, 1, 2],

[-0.18, -0.04, 2],

[-1.16, 0.598, 2],

[0, 0, 2]]

)

C = np.array([[1, 0, 0, 0],

[0, -1, 0, 7.74]])

#%% Build GEKKO State Space model

m = GEKKO()

x,y,u = m.state_space(A,B,C,D=None)

# customize names

# MVs

mv0 = u[0]

mv1 = u[1]

# Feedforward

ff0 = u[2]

# CVs

cv0 = y[0]

cv1 = y[1]

m.time = [0, 0.1, 0.2, 0.4, 1, 1.5, 2, 3, 4]

m.options.imode = 6

m.options.nodes = 3

u[1].lower = -5

u[1].upper = 5

u[1].dcost = 1

u[1].status = 1

u[1].lower = -5

u[1].upper = 5

u[1].dcost = 1

u[1].status = 1

## CV tuning

# tau = first order time constant for trajectories

y[0].tau = 5

y[1].tau = 8

# tr_init = 0 (dead-band)

# = 1 (first order trajectory)

# = 2 (first order traj, re-center with each cycle)

y[0].tr_init = 0

y[1].tr_init = 0

# targets (dead-band needs upper and lower values)

# SPHI = upper set point

# SPLO = lower set point

y[0].sphi= -8.5

y[0].splo= -9.5

y[1].sphi= 5.4

y[1].splo= 4.6

y[0].status = 1

y[1].status = 1

# feedforward

u[2].status = 0

u[2].value = np.zeros(np.size(m.time))

u[2].value[3:] = 2.5

m.solve() # (GUI=True)

# also create a Python plot

import matplotlib.pyplot as plt

plt.subplot(2,1,1)

plt.plot(m.time,mv0.value,'r-',label=r'$u_0$ as MV')

plt.plot(m.time,mv1.value,'b--',label=r'$u_1$ as MV')

plt.plot(m.time,ff0.value,'g:',label=r'$u_2$ as feedforward')

plt.subplot(2,1,2)

plt.plot(m.time,cv0.value,'r-',label=r'$y_0$')

plt.plot(m.time,cv1.value,'b--',label=r'$y_1$')

plt.show()

(:sourceend:)

Changed line 32 from:

File ~~*.~~mpc.txt

to:

File mpc.txt

Changed line 40 from:

File ~~*.~~mpc.a.txt

to:

File mpc.a.txt

Changed line 47 from:

File ~~*.~~mpc.b.txt

to:

File mpc.b.txt

Changed line 55 from:

File ~~*.~~mpc.c.txt

to:

File mpc.c.txt

Changed line 62 from:

File ~~*.~~mpc.d.txt

to:

File mpc.d.txt

Changed lines 14-19 from:

Model control

Objects

mpc = lti

End Objects

End Model

Objects

mpc = lti

End Objects

End Model

to:

Model control

Objects

mpc = lti

End Objects

End Model

Objects

mpc = lti

End Objects

End Model

Changed lines 32-38 from:

File *.mpc.txt

sparse, continuous ! dense/sparse, continuous/discrete

2 ! m=number of inputs

3 ! n=number of states

3 ! p=number of outputs

End File

sparse, continuous ! dense/sparse, continuous/discrete

2 ! m=number of inputs

3 ! n=number of states

3 ! p=number of outputs

End File

to:

File *.mpc.txt

sparse, continuous ! dense/sparse, continuous/discrete

2 ! m=number of inputs

3 ! n=number of states

3 ! p=number of outputs

End File

sparse, continuous ! dense/sparse, continuous/discrete

2 ! m=number of inputs

3 ! n=number of states

3 ! p=number of outputs

End File

Changed lines 40-45 from:

File *.mpc.a.txt

1 1 0.9

2 2 0.1

3 3 0.5

End File

1 1 0.9

2 2 0.1

3 3 0.5

End File

to:

File *.mpc.a.txt

1 1 0.9

2 2 0.1

3 3 0.5

End File

1 1 0.9

2 2 0.1

3 3 0.5

End File

Changed lines 47-53 from:

File *.mpc.b.txt

1 1 1.0

2 2 1.0

3 1 0.5

3 2 0.5

End File

1 1 1.0

2 2 1.0

3 1 0.5

3 2 0.5

End File

to:

File *.mpc.b.txt

1 1 1.0

2 2 1.0

3 1 0.5

3 2 0.5

End File

1 1 1.0

2 2 1.0

3 1 0.5

3 2 0.5

End File

Changed lines 55-60 from:

File *.mpc.c.txt

1 1 0.5

2 2 1.0

3 3 2.0

End File

1 1 0.5

2 2 1.0

3 3 2.0

End File

to:

File *.mpc.c.txt

1 1 0.5

2 2 1.0

3 3 2.0

End File

1 1 0.5

2 2 1.0

3 3 2.0

End File

Changed lines 62-64 from:

File *.mpc.d.txt

1 1 0.2

End File

1 1 0.2

End File

to:

File *.mpc.d.txt

1 1 0.2

End File

1 1 0.2

End File

Changed lines 10-13 from:

!!~~!~~ Example Model

! new linear time-invariant object

! new linear time-invariant object

to:

!! Example Model

! new linear time-invariant object

! new linear time-invariant object

Changed lines 20-31 from:

!

! discrete form

! y[k] = C * x[k] + D * u[k]

to:

! Model information

! continuous form

! dx/dt = A * x + B * u

! y = C * x + D * u

!

! dimensions

! (nx1) = (nxn)*(nx1) + (nxm)*(mx1)

! (px1) = (pxn)*(nx1) + (pxm)*(mx1)

!

! discrete form

! x[k+1] = A * x[k] + B * u[k]

! y[k] = C * x[k] + D * u[k]

! continuous form

! dx/dt = A * x + B * u

! y = C * x + D * u

!

! dimensions

! (nx1) = (nxn)*(nx1) + (nxm)*(mx1)

! (px1) = (pxn)*(nx1) + (pxm)*(mx1)

!

! discrete form

! x[k+1] = A * x[k] + B * u[k]

! y[k] = C * x[k] + D * u[k]

Changed line 39 from:

! A matrix (row, column, value)

to:

! A matrix (row, column, value)

Changed line 46 from:

! B matrix (row, column, value)

to:

! B matrix (row, column, value)

Changed line 54 from:

! C matrix (row, column, value)

to:

! C matrix (row, column, value)

Changed line 61 from:

! D matrix (row, column, value)

to:

! D matrix (row, column, value)

Changed lines 8-64 from:

to:

Attach:lti_step_response.png

!!! Example Model

! new linear time-invariant object

Model control

Objects

mpc = lti

End Objects

End Model

! Model information

! continuous form

! dx/dt = A * x + B * u

! y = C * x + D * u

!

! dimensions

! (nx1) = (nxn)*(nx1) + (nxm)*(mx1)

! (px1) = (pxn)*(nx1) + (pxm)*(mx1)

!

! discrete form

! x[k+1] = A * x[k] + B * u[k]

! y[k] = C * x[k] + D * u[k]

File *.mpc.txt

sparse, continuous ! dense/sparse, continuous/discrete

2 ! m=number of inputs

3 ! n=number of states

3 ! p=number of outputs

End File

! A matrix (row, column, value)

File *.mpc.a.txt

1 1 0.9

2 2 0.1

3 3 0.5

End File

! B matrix (row, column, value)

File *.mpc.b.txt

1 1 1.0

2 2 1.0

3 1 0.5

3 2 0.5

End File

! C matrix (row, column, value)

File *.mpc.c.txt

1 1 0.5

2 2 1.0

3 3 2.0

End File

! D matrix (row, column, value)

File *.mpc.d.txt

1 1 0.2

End File

!!! Example Model

! new linear time-invariant object

Model control

Objects

mpc = lti

End Objects

End Model

! Model information

! continuous form

! dx/dt = A * x + B * u

! y = C * x + D * u

!

! dimensions

! (nx1) = (nxn)*(nx1) + (nxm)*(mx1)

! (px1) = (pxn)*(nx1) + (pxm)*(mx1)

!

! discrete form

! x[k+1] = A * x[k] + B * u[k]

! y[k] = C * x[k] + D * u[k]

File *.mpc.txt

sparse, continuous ! dense/sparse, continuous/discrete

2 ! m=number of inputs

3 ! n=number of states

3 ! p=number of outputs

End File

! A matrix (row, column, value)

File *.mpc.a.txt

1 1 0.9

2 2 0.1

3 3 0.5

End File

! B matrix (row, column, value)

File *.mpc.b.txt

1 1 1.0

2 2 1.0

3 1 0.5

3 2 0.5

End File

! C matrix (row, column, value)

File *.mpc.c.txt

1 1 0.5

2 2 1.0

3 3 2.0

End File

! D matrix (row, column, value)

File *.mpc.d.txt

1 1 0.2

End File

Changed line 6 from:

These models are typically in the finite impulse response form or linear state space form. Either model form can be converted to an %blue%A%red%P%black%Monitor for a linear MPC upgrade. Once ~~the linear MPC model is converted~~, nonlinear elements can be added to avoid multiple model switching, gain scheduling, or other ad hoc measures commonly employed because of linear MPC restrictions.

to:

These models are typically in the finite impulse response form or linear state space form. Either model form can be converted to an %blue%A%red%P%black%Monitor for a linear MPC upgrade. Once in %blue%A%red%P%black%Monitor form, nonlinear elements can be added to avoid multiple model switching, gain scheduling, or other ad hoc measures commonly employed because of linear MPC restrictions.

Changed line 6 from:

These models are typically in the finite impulse response form or linear state space form. Either model form can be converted to an %blue%A%red%P%black%Monitor for a linear MPC upgrade. Once the linear MPC model is converted, nonlinear elements can be added to avoid multiple model switching, gain scheduling, or other ad hoc measures commonly employed because of linear MPC ~~shortcomings~~.

to:

These models are typically in the finite impulse response form or linear state space form. Either model form can be converted to an %blue%A%red%P%black%Monitor for a linear MPC upgrade. Once the linear MPC model is converted, nonlinear elements can be added to avoid multiple model switching, gain scheduling, or other ad hoc measures commonly employed because of linear MPC restrictions.

Changed lines 4-6 from:

to:

Model Predictive Control, or MPC, is an advanced method of process control that has been in use in the process industries such as chemical plants and oil refineries since the 1980s. Model predictive controllers rely on dynamic models of the process, most often linear empirical models obtained by system identification.

These models are typically in the finite impulse response form or linear state space form. Either model form can be converted to an %blue%A%red%P%black%Monitor for a linear MPC upgrade. Once the linear MPC model is converted, nonlinear elements can be added to avoid multiple model switching, gain scheduling, or other ad hoc measures commonly employed because of linear MPC shortcomings.

These models are typically in the finite impulse response form or linear state space form. Either model form can be converted to an %blue%A%red%P%black%Monitor for a linear MPC upgrade. Once the linear MPC model is converted, nonlinear elements can be added to avoid multiple model switching, gain scheduling, or other ad hoc measures commonly employed because of linear MPC shortcomings.

Changed lines 1-2 from:

!! Linear ~~State Space Model~~

to:

!! Linear Model Predictive Control

Added lines 3-4:

Linear model predictive controllers are based on models in the finite impulse response form or linear state space form. Either model form can be converted to a form that %blue%A%red%P%black%Monitor uses for estimation and control.

Changed line 5 from:

Attach:~~linear~~_~~ss~~.png

to:

Attach:lti_step_response.png

Changed lines 3-5 from:

* %list list-page% [[Attach:fir.apm | Linear State Space]]

to:

* %list list-page% [[Attach:fir.apm | Linear State Space]]

Attach:linear_ss.png

Attach:linear_ss.png

Added lines 1-3:

!! Linear State Space Model

* %list list-page% [[Attach:fir.apm | Linear State Space]]

* %list list-page% [[Attach:fir.apm | Linear State Space]]