Classes e programações utilizadas para a simulação do sistema pêndulo invertido e controle via o algoritmo PSO
Para realizar o teste de das matrizes Q e R, na classe ControlePenduloInvertido.py, na função cost_func comentar e descomentar as matrizes Q e R que seja desejado testar, em seguida utilizar o seguinte código:
import numpy as np
from ControlePenduloInvertido import
ctrl = CONTROLE()
Q,R=np.zeros((4,4)),np.array([[0.00034]])
Q[0,0]=0.75
Q[1,1]=4
K,X,eigVals=ctrl.lqr(A,B,Q,R)
sis = Sistema()
# inicializa um pêndulo invertido em espaço de estados
tempo,dt = 10,0.01
# tempo de simulação do sistema dinâmico
theta0,x0 = 3np.pi/180,0
x_initial = np.array([[0],[3np.pi/180],[0],[0]])
T,data,dataAva = sis.simulation(Time=tempo,dt=dt,K = K,X0=x_initial,W='n')
CE = np.sum(np.abs(data[0,:]))
ISE = np.sum(dataAva[1,:])
import numpy as np
import matplotlib.pyplot as plt
from ControlePenduloInvertido import
K = np.array([0,0,0,0])
sis = Sistema()
# inicializa um pêndulo invertido em espaço de estados
tempo,dt = 3,0.01
# tempo de simulação do sistema dinâmico
theta0,x0 = 3np.pi/180,0
x_initial = np.array([[0],[3*np.pi/180],[0],[0]])
T,data,dataAva = sis.simulation(Time=tempo,dt=dt,K = K,X0=x_initial,W='n')
fig, ax1 = plt.subplots()
ax1.set_ylabel(r'$\dot{x}_{c}$', color='red')
ax1.plot(T, data[3,:],'r-')
ax2 = ax1.twinx()
ax2.set_ylabel(r'$\dot{\theta}$', color='blue')
ax2.plot(T, data[4,:],'b-')
plt.show()
Para mudar a situação imposta sobre o algoritmo durante as iterações, é necessário comentar e descomentar dentro da programação PSO_simulacao.py. Para a simulação do algoritmo é utilizado a seguinte programação:
from PSO_simulacao.py import *
# selecionar limites dos espaços de busca
x1_lim = (-1000,-1)
x2_lim = (1,1000)
x3_lim = (-1000,-1)
x4_lim = (1,1000)
# importe ou crie uma população de partículas, neste repertório tem um exemplo da população B
Kmaster = np.load('K_LQR.npy')
num_particles=len(Kmaster)
bounds=[x1_lim,
x2_lim,
x3_lim,
x4_lim] # input bounds [(x1_min,x1_max),(x2_min,x2_max)...]
PSO(Kmaster,bounds,num_particles=num_particles,maxiter=301)