GA Algorithm for PID tuning

13 vues (au cours des 30 derniers jours)
SURBHI GOEL
SURBHI GOEL le 8 Nov 2020
Modifié(e) : Sam Chak le 31 Oct 2023
I have a second order transfer function which I want to control using PID controller. I want Kp, Ki, Kd values using GA toolbox in matlab. My question is if I want suppose 5% overshoot or 0.1s settling time, how can I specify it in fitness function/app?
Here is my fitness function
function J = pidtest(x)
s = tf('s');
G = 49/(s^2+7*s+49);
Kp=x(1); Ki=x(2); Kd=x(3);
controller = Kp + Ki/s + Kd*s;
Loop = series(controller,G);
ClosedLoop = feedback(Loop,1);
dt = 0.1;
t = 0:dt:30;
y = step(ClosedLoop,t);
J = sum(t'.*abs(1-y)*dt); %ITAE
  1 commentaire
krishna
krishna le 31 Oct 2023
thanks surbhi for this code . can you help me , if my plant is quadcopter(drone) whose output is position(x, y , z) and angle(phi, theta, psi) so how i can tune PID controller using Genetic algorithm?

Connectez-vous pour commenter.

Réponses (1)

Sam Chak
Sam Chak le 31 Oct 2023
Modifié(e) : Sam Chak le 31 Oct 2023
Sometimes you can let GA randomly search during the initial run to observe if the performance requirements are satisfied.
s = tf('s');
Gp = 49/(s^2 + 7*s + 49)
Gp = 49 -------------- s^2 + 7 s + 49 Continuous-time transfer function.
step(Gp, 2), grid on
nvars = 3;
[K, fval] = ga(@pidtest, nvars)
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
K = 1×3
13.8153 96.6499 1.9877
fval = 3.5202e-05
Gc = K(1) + K(2)/s + K(3)*s; % ideal type
Gcl = feedback(Gc*Gp, 1);
step(Gcl, 2), grid on
S = stepinfo(Gcl)
S = struct with fields:
RiseTime: 0.0226 TransientTime: 0.0404 SettlingTime: 0.0404 SettlingMin: 0.9040 SettlingMax: 0.9989 Overshoot: 0 Undershoot: 0 Peak: 0.9989 PeakTime: 0.0751
function J = pidtest(K)
s = tf('s');
% plant
G = 49/(s^2 + 7*s + 49);
% pid controller
Kp = K(1);
Ki = K(2);
Kd = K(3);
controller = Kp + Ki/s + Kd*s; % ideal type
% closed-loop tf
Loop = series(controller, G);
ClosedLoop = feedback(Loop, 1);
% cost
dt = 0.1;
t = 0:dt:3;
y = step(ClosedLoop, t);
J = sum(t'.*abs(1-y)*dt); % ITAE
end

Catégories

En savoir plus sur Agriculture dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by