In [3]:
import numpy as np
import control as cn
import Algorithms as alg
import matplotlib.pyplot as plt
%matplotlib
from Algorithms import TUBScolorscale,cm2in
MSC = lambda MS, color: plt.Circle((-1 ,0),1/MS, color =color, alpha=0.4)
MTC = lambda MT, color: plt.Circle((-MT**2/(MT**2 - 1),0),MT/(MT**2 -1), color =color, alpha = 0.4)
MCC = lambda M : plt.Circle((-(2*M**2-2*M+1)/(2*M*(M-1)),0), (2*M-1)/(2*M*(M-1)), color = 'b', fill = None,linestyle = 'dashed', alpha = 0.4)
MC = lambda MS,MT,color: plt.Circle((-(MS*(2*MT-1)-MT+1)/(2*MS*(MT-1)),0),(MS+MT-1)/(2*MS*(MT-1)), color =color, alpha = 0.4)
In [9]:
# Matplotlib plot
plt.rcParams['svg.fonttype'] = 'none'
plt.style.use('seaborn-whitegrid')
# Make a system with TSum = 100 and T = TSum/order
TSum = 100.
plt.clf()
fig, ax = plt.subplots(3,3,figsize=(10,10))
fig2, ax2 = plt.subplots(1,figsize=(10,10))
ax2.cla()
row = 0
col = 0
for order in range(1,10):
# Get the current time constant
T = TSum/order
print(T)
# Make a transfer function
G = cn.tf(1,[T,1])
G = 5*G**order
# Step experiment
y,t = cn.step(G)
u = np.ones_like(t)
# FOTD identification
k,t,l = alg.Integral_Identification(y,u,t)
# Make a controller
c, b = alg.AMIGO_Tune(k,t,l)
KY = cn.tf(c[0],1)+cn.tf(c[1],[1,0])
KR = cn.tf(c[0],1)+cn.tf(c[1],[1,0])
# Open Loop
OL = G*KR
# Compute the sensitivity
S = 1/(1+G*KY)
# Complementary
T = G*KR/(1+G*KY)
# Compute the Open Loop Nyquist Plot
real,imag, w = cn.nyquist(OL, np.logspace(-5,5,10000))
ax[row,col].cla()
ax[row,col].plot(real,imag)
# Compute the maximum Sensitivity
mag, phase, freq = cn.freqresp(S, np.logspace(-5,5,10000))
MS = np.max(mag)
# Compute the maximum Complementary Sensitivity
mag, phase, freq = cn.freqresp(T, np.logspace(-5,5,10000))
MT = np.max(mag)
print(order,MS,MT)
# Compute the circles
ax[row,col].add_artist(MC(MS,MT,TUBScolorscale[0]))
ax[row,col].add_artist(MTC(MT, 'w'))
ax[row,col].add_artist(MSC(MS, 'w'))
ax[row,col].add_artist(MSC(MS, TUBScolorscale[1]))
ax[row,col].add_artist(MTC(MT, TUBScolorscale[3]))
ax[row,col].add_artist(MCC(1.4))
ax[row,col].plot(-1,0,'r+')
ax[row,col].set_xlim(-3,3)
ax[row,col].set_ylim(-3,3)
ax[row,col].set_title('Order '+str(order))
# Second plot
ax2.plot(-1,0,'r+')
ax2.add_artist(MSC(1.4,'r'))
ax2.plot(real,imag,color=TUBScolorscale[order])
ax2.set_xlim(-3,3)
ax2.set_ylim(-3,3)
if order%3 != 0:
row = row
col = col+1
else:
row = row+1
col = 0
plt.show()
In [15]:
t,y = cn.step_response(T)
plt.clf()
plt.plot(t,y)
plt.show()
In [54]:
# Get the circles
MS = np.max(abs(re_S+1j*im_S))
MT = np.max(abs(re_T+1j*im_T))
M = 1.4
plt.clf
msc = plt.Circle((-1,0),1/MS, color = 'r', alpha = 0.4)
mtc = plt.Circle((-MT**2/(MT**2-1),0), MT/(MT**2-1), color = 'b', alpha = 0.4)
mc = plt.Circle((-(2*M**2-2*M+1)/(2*M*(M-1)),0),(2*M-1)/(2*M*(M-1)),color = 'g', alpha = 0.4)
mcc = plt.Circle((-(MS*(2*MT-1)-MT+1)/(2*MS*(MT-1)) ,0),(MS+MT-1)/(2*MS*(MT-1)), color = None, alpha=0.4)
fig, ax = plt.subplots(1,figsize = (10,10))
plt.scatter(-1,0)
plt.plot(re_CL,im_CL)
ax.add_artist(msc)
ax.add_artist(mtc)
#ax.add_artist(mc)
#ax.add_artist(mcc)
ax.set_xlim(-3,3)
ax.set_ylim(-3,3)
plt.show()
In [11]:
G = cn.tf(1,[1,1])
c, b = alg.AMIGO_Tune(1,1,0)
KY = cn.tf(c[0],1)+cn.tf(c[1],[1,0])
KR = cn.tf(c[0],1)+cn.tf(c[1],[1,0])
CL = G*KR/(1+G*KY)
y,t = cn.step(CL)
In [12]:
plt.plot(t,y)
plt.show()
In [ ]: