mirror of
https://github.com/NickNair/Adaptive-PID-controller.git
synced 2026-02-05 17:59:42 +08:00
362 lines
8.4 KiB
Python
362 lines
8.4 KiB
Python
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
from numpy.lib.function_base import append
|
|
|
|
import warnings
|
|
warnings.filterwarnings("ignore")
|
|
|
|
|
|
from two_area import *
|
|
|
|
import neuralnetwork
|
|
|
|
|
|
def y(yd):
|
|
|
|
PL1 = 0
|
|
PL2 = 0
|
|
|
|
# rbf = RBF.RBF( aw = 0.000065, av = 0.022, au = 0.025 , asig = 0.01, gamma = 0.95)
|
|
|
|
nn1 = neuralnetwork.NeuralNetwork( aw = 0.000065, av = 0.022, au = 0.025 , gamma = 0.98)
|
|
nn2 = neuralnetwork.NeuralNetwork( aw = 0.000065, av = 0.022, au = 0.025 , gamma = 0.98)
|
|
|
|
# av=0.021,au = 0.025, aw = 0.0003asig = 0.01 gamma = 0.9
|
|
|
|
# ( aw = 0.0003, av = 0.021, au = 0.025 , asig = 0.01, gamma = 0.9) ---> Steady State Error : 0.00474099
|
|
# ( aw = 0.00008, av = 0.021, au = 0.025 , asig = 0.01, gamma = 0.9) ---> Steady State Error : 0.00037917 Settling Time ~ 70
|
|
# ( aw = 0.00007, av = 0.021, au = 0.025 , asig = 0.01, gamma = 0.9) ---> Steady State Error : 0.00033166 Settling Time ~ 60
|
|
# ( aw = 0.000065, av = 0.022, au = 0.025 , asig = 0.01, gamma = 0.9) ---> Steady State Error : 0.00031556 Settling Time ~ 60
|
|
# ( aw = 0.000065, av = 0.022, au = 0.025 , asig = 0.01, gamma = 0.98) ----> Steady State Error : 0.00118022
|
|
|
|
|
|
|
|
|
|
|
|
Tg = 0.08
|
|
Tp = 20
|
|
Tt = 0.3
|
|
Kp = 120
|
|
T12 = 0.545/(2*np.pi)
|
|
a12 = -1
|
|
R = 5
|
|
T = dt = 1/80
|
|
beta1 = 0.425
|
|
beta2 = 0.425
|
|
|
|
yt_1 = 0
|
|
yt_2 = 0
|
|
yt_3 = 0
|
|
|
|
yt_1_ = 0
|
|
yt_2_ = 0
|
|
yt_3_ = 0
|
|
|
|
System = TwoAreaPS( Tg, Tp, Tt, Kp, T12, a12, R, T, beta1, beta2, yt_1,yt_2,yt_3 , yt_1_ ,yt_2_,yt_3_ )
|
|
|
|
|
|
|
|
initial_states = [ yt_1, yt_2 , yt_3 , yt_1_ , yt_2_ , yt_3_]
|
|
|
|
plot_data = {"ut1":[] , "pl1" : [] , "delF1":[] , 'KI1' : [], 'KP1' : [] , 'KD1' : [] ,
|
|
"ut2":[] , "pl2" : [] , "delF2":[] , 'KI2' : [], 'KP2' : [] , 'KD2' : [] , 'Tie Line' : [ ] ,"time" : []}
|
|
|
|
|
|
Ki = 0
|
|
Kd = 0
|
|
Kp = 0
|
|
|
|
|
|
nn1.K[0] = 13
|
|
nn1.K[1] = 1132
|
|
nn1.K[2] = 32
|
|
|
|
nn2.K[0] = 13
|
|
nn2.K[1] = 1132
|
|
nn2.K[2] = 32
|
|
|
|
|
|
ut_1 = 0
|
|
ut_2 = 0
|
|
|
|
t = 200
|
|
|
|
y=[]
|
|
x=[]
|
|
|
|
|
|
for i in range(0, int(t/dt) ):
|
|
|
|
# print(System.yt_1)
|
|
e_t_a1 = 0 - System.yt_1_a1
|
|
del_y_a1 = System.yt_1_a1 - System.yt_2_a1
|
|
del2_y_a1 = System.yt_1_a1 - 2*System.yt_2_a1 + System.yt_3_a1
|
|
|
|
nn1.X[:,0] = [ e_t_a1 , -del_y_a1 , -del2_y_a1]
|
|
nn1.HiddenLayer()
|
|
nn1.OutputLayer()
|
|
|
|
e_t_a2 = 0 - System.yt_1_a2
|
|
del_y_a2 = System.yt_1_a2 - System.yt_2_a2
|
|
del2_y_a2 = System.yt_1_a2 - 2*System.yt_2_a2 + System.yt_3_a2
|
|
|
|
nn2.X[:,0] = [ e_t_a2 , -del_y_a2 , -del2_y_a2]
|
|
nn2.HiddenLayer()
|
|
nn2.OutputLayer()
|
|
|
|
|
|
# ut_1 = ut_1 + 0.00043*e_t - 0.01*del_y - 0*del2_y
|
|
ut_1 = ut_1 + nn1.K[1]*e_t_a1 - nn1.K[0]*del_y_a1 - nn1.K[2]*del2_y_a1
|
|
|
|
ut_2 = ut_2 + nn2.K[1]*e_t_a2 - nn2.K[0]*del_y_a2 - nn2.K[2]*del2_y_a2
|
|
|
|
|
|
plot_data["ut1"].append(ut_1)
|
|
plot_data["ut2"].append(ut_2)
|
|
|
|
# Load Graph 1
|
|
|
|
# if( i*dt >= 40 ):
|
|
# PL = 0.2
|
|
# elif ( i*dt >= 10 ):
|
|
# PL = 0.8
|
|
# else:
|
|
# PL = 0
|
|
|
|
# Load Graph 2
|
|
|
|
# if( i*dt <=10 ):
|
|
# PL = 0.2
|
|
# elif ( i*dt <= 20 ):
|
|
# PL = 0.3
|
|
# elif ( i*dt <= 30 ):
|
|
# PL = 0.4
|
|
# elif ( i*dt <= 40 ):
|
|
# PL = 0.5
|
|
# elif ( i*dt <= 50 ):
|
|
# PL = 0.6
|
|
# else:
|
|
# PL = 0.6
|
|
|
|
# Load Graph 3
|
|
|
|
# if( i*dt <=10 ):
|
|
# PL = 0.2
|
|
# elif ( i*dt <= 20 ):
|
|
# PL = 0.3
|
|
# elif ( i*dt <= 30 ):
|
|
# PL = 0.4
|
|
# elif ( i*dt <= 40 ):
|
|
# PL = 0.5
|
|
# elif ( i*dt <= 50 ):
|
|
# PL = 0.6
|
|
# elif ( i*dt <= 60 ):
|
|
# PL = 0.6
|
|
# elif ( i*dt <= 70 ):
|
|
# PL = 0.5
|
|
# elif ( i*dt <= 80 ):
|
|
# PL = 0.4
|
|
# elif ( i*dt <= 90 ):
|
|
# PL = 0.3
|
|
# elif ( i*dt <= 100 ):
|
|
# PL = 0.2
|
|
# else:
|
|
# PL = 0.1
|
|
|
|
# Load Graph 4
|
|
|
|
# PL = np.random.normal(0.5,0.1)
|
|
|
|
# Load Graph 5
|
|
|
|
# if( (i*dt)%10==0 and (i*dt)!=0 ):
|
|
# PL1 = np.random.normal(0.5,0.1)
|
|
# PL2 = np.random.normal(0.5,0.1)
|
|
|
|
# Load Graph 6
|
|
|
|
if ( i*dt > 50 and i*dt <130):
|
|
PL1 = 0.5
|
|
|
|
else:
|
|
PL1 = 0
|
|
|
|
if ( i*dt > 20 and i*dt <70):
|
|
PL2 = 0.5
|
|
|
|
else:
|
|
PL2 = 0
|
|
|
|
|
|
plot_data["pl1"].append(PL1)
|
|
plot_data["pl2"].append(PL2)
|
|
|
|
Ut = [ [ut_1] , [ut_2] , [ PL1] , [PL2] ]
|
|
|
|
System.Output(Ut)
|
|
|
|
# print(rbf.K)
|
|
|
|
nn1.Update(0 ,System.Y[0,0] ,System.yt_1_a1 , System.yt_2_a1, System.yt_3_a1 )
|
|
nn2.Update(0 ,System.Y[1,0] ,System.yt_1_a2 , System.yt_2_a2, System.yt_3_a2 )
|
|
|
|
|
|
plot_data["delF1"].append(System.Y[0,0])
|
|
|
|
plot_data["delF2"].append(System.Y[1,0])
|
|
|
|
plot_data["KI1"].append(nn1.K[1])
|
|
plot_data["KP1"].append(nn1.K[0])
|
|
plot_data["KD1"].append(nn1.K[2])
|
|
|
|
|
|
plot_data["KI2"].append(nn2.K[1])
|
|
plot_data["KP2"].append(nn2.K[0])
|
|
plot_data["KD2"].append(nn2.K[2])
|
|
|
|
plot_data["time"].append(i*dt)
|
|
|
|
plot_data["Tie Line"].append(System.Y[2,0])
|
|
|
|
print("Final Tuned Kp , Ki and Kd values for area 1 are :" , nn1.K)
|
|
|
|
print("The steady state error of area 1 system is : ", System.Y[0][0])
|
|
|
|
print("Final Tuned Kp , Ki and Kd values for area 2 are :" , nn2.K)
|
|
|
|
print("The steady state error of area 2 system is : ", System.Y[1][0])
|
|
|
|
return plot_data,initial_states
|
|
|
|
|
|
if __name__=="__main__":
|
|
|
|
|
|
yd = [0 for i in range(200*80) ]
|
|
|
|
|
|
## Generate Reference array here
|
|
|
|
plot_data,i = y(yd)
|
|
|
|
|
|
plt.subplot(2,3,1)
|
|
plt.plot(plot_data["time"],plot_data["pl1"], label="Reference Signal")
|
|
plt.title( "Load vs Time")
|
|
plt.ylabel(" Output from System ")
|
|
plt.xlabel("Time (s)")
|
|
|
|
|
|
|
|
plt.subplot(2,3,2)
|
|
plt.plot(plot_data["time"],plot_data["ut1"], label="Reference Signal")
|
|
plt.title( "Control Signal vs Time")
|
|
plt.ylabel("Control Signal")
|
|
plt.xlabel("Time (s)")
|
|
|
|
plt.subplot(2,3,3)
|
|
plt.plot(plot_data["time"],yd, label="Reference Signal")
|
|
plt.plot(plot_data["time"],plot_data["delF1"],label ="Output")
|
|
|
|
|
|
plt.title( " Initial States y(t-1) , y(t-2) and y(t-3) are " + str(i[0]) + ", " + str(i[1]) +" and "+ str(i[2]) )
|
|
|
|
plt.legend()
|
|
|
|
plt.subplot(2,3,4)
|
|
|
|
plt.plot(plot_data["time"],plot_data["pl2"], label="Reference Signal")
|
|
plt.title( "Load vs Time")
|
|
plt.ylabel(" Output from System ")
|
|
plt.xlabel("Time (s)")
|
|
|
|
|
|
|
|
|
|
|
|
plt.subplot(2,3,5)
|
|
plt.plot(plot_data["time"],plot_data["ut2"], label="Reference Signal")
|
|
plt.title( "Control Signal vs Time")
|
|
plt.ylabel("Control Signal")
|
|
plt.xlabel("Time (s)")
|
|
|
|
|
|
|
|
|
|
plt.subplot(2,3,6)
|
|
plt.plot(plot_data["time"],yd, label="Reference Signal")
|
|
plt.plot(plot_data["time"],plot_data["delF2"],label ="Output")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plt.ylabel(" Output from System ")
|
|
plt.xlabel("Time (s)")
|
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
plt.subplot(2,3,1)
|
|
plt.plot(plot_data["time"],plot_data["KI1"], label="KI")
|
|
plt.title( "KI vs Time")
|
|
plt.ylabel("KI")
|
|
plt.xlabel("Time (s)")
|
|
|
|
plt.subplot(2,3,2)
|
|
plt.plot(plot_data["time"],plot_data["KP1"], label="KP")
|
|
plt.title( "KP vs Time")
|
|
plt.ylabel("KP ")
|
|
plt.xlabel("Time (s)")
|
|
|
|
plt.subplot(2,3,3)
|
|
plt.plot(plot_data["time"],plot_data["KD1"], label="KD")
|
|
plt.title( "KD vs Time")
|
|
plt.ylabel("KD")
|
|
plt.xlabel("Time (s)")
|
|
|
|
|
|
|
|
plt.title( " Initial States y(t-1) , y(t-2) and y(t-3) are " + str(i[0]) + ", " + str(i[1]) +" and "+ str(i[2]) )
|
|
|
|
plt.legend()
|
|
|
|
plt.subplot(2,3,4)
|
|
plt.plot(plot_data["time"],plot_data["KI2"], label="KI")
|
|
plt.title( "KI vs Time")
|
|
plt.ylabel("KI")
|
|
plt.xlabel("Time (s)")
|
|
|
|
|
|
plt.subplot(2,3,5)
|
|
plt.plot(plot_data["time"],plot_data["KP2"], label="KP")
|
|
plt.title( "KP vs Time")
|
|
plt.ylabel("KP ")
|
|
plt.xlabel("Time (s)")
|
|
|
|
plt.subplot(2,3,6)
|
|
plt.plot(plot_data["time"],plot_data["KD2"], label="KD")
|
|
plt.title( "KD vs Time")
|
|
plt.ylabel("KD")
|
|
plt.xlabel("Time (s)")
|
|
|
|
|
|
|
|
|
|
plt.ylabel(" Output from System ")
|
|
plt.xlabel("Time (s)")
|
|
|
|
|
|
plt.show()
|
|
|
|
plt.plot(plot_data["time"],plot_data["Tie Line"])
|
|
plt.title( "Tie Line vs Time")
|
|
plt.ylabel("Tie Line")
|
|
plt.xlabel("Time (s)")
|
|
|
|
|
|
plt.show()
|