Skip to content

Issue with Non-Zero starting conditions when using control.forced_response - Not working as expected? #842

@TheWicklowWolf

Description

@TheWicklowWolf

When using forced_response with zero initial conditions it works as expected:

#Sample Data
t=[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
 54, 55, 56, 57, 58, 59, 60]

pv=[13.45,13.45,13.57,13.64,13.43,13.63,13.5,13.63,13.5,14.11,15.13,16.04
,16.88,17.84,18.64,19.2,19.95,20.56,21.33,21.9,22.49,22.86,23.38,23.97
,24.47,24.79,25.14,25.62,26.15,26.28,26.62,26.94,27.52,27.62,28.11,28.37
,28.36,28.87,29.1,29.16,29.55,29.66,29.86,30.08,30.13,30.19,30.52,30.7
,30.82,30.99,31.13,31.2,31.29,31.31,31.5,31.5,31.61,31.82,31.79,31.84
,31.96]

cv=[ 0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10,
 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
 10, 10, 10, 10, 10, 10, 10]

import numpy as np
import matplotlib.pyplot as plt
import control

gain=2
tc=20
bias=13.5

def fo_model(gain, tc):
    num=np.array([gain])
    den=np.array([tc,1])
    H = control.tf(num,den)
    (t_ ,y) = control.forced_response(H, t, cv, X0=0)
    return y+bias

plt.plot(t, pv, 'b', label='PV')
plt.plot(t, cv, 'r', label='CV')
plt.plot(t, fo_model(gain,tc), 'g', label='FO')
plt.legend()
plt.show()

CV goes from 0-10 and produces this, which is as expected:
works


However it doesn't work correctly (or rather it is not what I expected) when initial conditions are not zero:

#Slightly different Sample Data
t=[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
 54, 55, 56, 57, 58, 59, 60]

pv=[33.53,33.37,33.57,33.35,33.53,33.36,33.52,33.31,33.57,33.86,34.69,35.54
,36.61,37.33,38.08,38.75,39.61,40.37,40.91,41.57,42.01,42.6,43.28,43.78
,44.16,44.58,45.03,45.48,45.9,46.07,46.69,46.92,47.16,47.6,47.92,48.01
,48.26,48.49,48.94,48.97,49.39,49.39,49.67,49.8,50.02,50.15,50.5,50.42
,50.68,50.75,51.01,51.06,51.25,51.29,51.44,51.48,51.68,51.57,51.89,51.96
,51.91]

cv=[10, 10, 10, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 20, 20, 20, 20,
 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
 20, 20, 20, 20, 20, 20, 20]

import numpy as np
import matplotlib.pyplot as plt
import control

gain=2
tc=20
bias=13.5

def fo_model(gain, tc):
    num=np.array([gain])
    den=np.array([tc,1])
    H = control.tf(num,den)
    (t_ ,y) = control.forced_response(H, t, cv, X0=pv[0])
    return y+bias

plt.plot(t, pv, 'b', label='PV')
plt.plot(t, cv, 'r', label='CV')
plt.plot(t, fo_model(gain,tc), 'g', label='FO')
plt.legend()
plt.show()

CV now goes from 10-20 (same system so it should match) but it produces:
doesntWork

Any ideas about where I'm going wrong?
Just found this library and it's excellent, I appreciate the work!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions