mirror of
https://github.com/gabrielkheisa/control-system.git
synced 2024-11-23 20:03:22 +07:00
Add assignment 6
This commit is contained in:
parent
29bd6fc473
commit
a14b31a134
34
Assignment 6 - Tuning PID/README.md
Normal file
34
Assignment 6 - Tuning PID/README.md
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# Derivative Effect on Control System
|
||||||
|
This dir is belong to Control System class contains with Tuning PID with ZN1 and PSO on motor system.
|
||||||
|
|
||||||
|
## Software
|
||||||
|
This program ran in Matlab
|
||||||
|
|
||||||
|
## Variables
|
||||||
|
`s = tf('s');` defines `s` as 'frequency domain' for transfer function and will be used further.
|
||||||
|
```
|
||||||
|
J = 0.01;
|
||||||
|
b = 0.1;
|
||||||
|
K = 0.01;
|
||||||
|
R = 1;
|
||||||
|
L = 0.5;
|
||||||
|
```
|
||||||
|
Those variable comes from BLDC control system.
|
||||||
|
```
|
||||||
|
c1=2; c2=2; w_max = 1; w_min = 0.1; particles=50; iterations=100;
|
||||||
|
var=3; e_max = 1; e_min=0.1;
|
||||||
|
|
||||||
|
% Search limit
|
||||||
|
lim_min = 0;
|
||||||
|
lim_max = 2500;
|
||||||
|
```
|
||||||
|
Variable above is the constant for PSO tuning.
|
||||||
|
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
### Notes
|
||||||
|
Contact nanda.r.d@mail.ugm.ac.id for more information
|
||||||
|
### Links
|
||||||
|
You can access the source code here
|
||||||
|
[github.com/nandard/control-system.git](https://github.com/nandard/control-system.git)
|
141
Assignment 6 - Tuning PID/assign_6_pso.m
Normal file
141
Assignment 6 - Tuning PID/assign_6_pso.m
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
clc; clear all; close all
|
||||||
|
% system function
|
||||||
|
s = tf('s');
|
||||||
|
J = 0.01;
|
||||||
|
b = 0.1;
|
||||||
|
K = 0.01;
|
||||||
|
R = 1;
|
||||||
|
L = 0.5;
|
||||||
|
|
||||||
|
num_motor = [K];
|
||||||
|
den_motor = [J*L J*R+b*L R*b+K*K];
|
||||||
|
motor = tf(num_motor,den_motor);
|
||||||
|
motor_l = feedback(motor,1);
|
||||||
|
step(motor_l)
|
||||||
|
%step(motor_l/s);
|
||||||
|
%impulse(motor_l);
|
||||||
|
%step(motor_l/s^2);
|
||||||
|
hold on
|
||||||
|
stepinfo(motor_l)
|
||||||
|
[y,t] = step(motor_l);
|
||||||
|
ss_error = abs(1 - y(end))
|
||||||
|
|
||||||
|
tic
|
||||||
|
% Constant
|
||||||
|
c1=2; c2=2; w_max = 1; w_min = 0.1; particles=50; iterations=100;
|
||||||
|
var=3; e_max = 1; e_min=0.1;
|
||||||
|
|
||||||
|
% Search limit
|
||||||
|
lim_min = 0;
|
||||||
|
lim_max = 2500;
|
||||||
|
|
||||||
|
% imization steps
|
||||||
|
steps = 0;
|
||||||
|
|
||||||
|
% Initialization
|
||||||
|
for m=1:particles
|
||||||
|
for n=1:var
|
||||||
|
v(m,n)=0;
|
||||||
|
x(m,n)=lim_min+rand*(lim_max-lim_min);
|
||||||
|
xp(m,n)=x(m,n);
|
||||||
|
end
|
||||||
|
|
||||||
|
% Model Parameters
|
||||||
|
Kp = x(m,1);
|
||||||
|
Ki = x(m,2);
|
||||||
|
Kd = x(m,3);
|
||||||
|
|
||||||
|
% Simulation Model
|
||||||
|
pid = tf([Kd Kp Ki],[0 1 0]);
|
||||||
|
motor_cl = feedback(motor * pid, 1);
|
||||||
|
y = step(motor_cl);
|
||||||
|
|
||||||
|
% TIAE (Objective Function)
|
||||||
|
total = 0;
|
||||||
|
T = size(y);
|
||||||
|
for t=1:T
|
||||||
|
total=total+(t*abs(y(t)-1));
|
||||||
|
end
|
||||||
|
ITAE(m) = total;
|
||||||
|
end
|
||||||
|
|
||||||
|
% Find the best value
|
||||||
|
[prev_best, loc] = min(ITAE);
|
||||||
|
xg(1) = x(loc,1);
|
||||||
|
xg(2) = x(loc,2);
|
||||||
|
xg(3) = x(loc,3);
|
||||||
|
|
||||||
|
for i=1:iterations
|
||||||
|
e = e_max - ((e_max - e_min)*i)/iterations;
|
||||||
|
w = w_min + ((iterations - i)*(w_max - w_min))/iterations;
|
||||||
|
for m=1:particles
|
||||||
|
for n=1:var
|
||||||
|
v(m,n) = w*v(m,n) + c1*rand*(xp(m,n)-x(m,n)) + c2*rand*(xg(n)-x(m,n));
|
||||||
|
x(m,n) = x(m,n) + e*v(m,n);
|
||||||
|
% Constrain
|
||||||
|
if x(m,n) < lim_min
|
||||||
|
x(m,n) = lim_min;
|
||||||
|
end
|
||||||
|
if x(m,n) > lim_max
|
||||||
|
x(m,n) = lim_max;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
% Update Personal Best
|
||||||
|
Kp = x(m,1);
|
||||||
|
Ki = x(m,2);
|
||||||
|
Kd = x(m,3);
|
||||||
|
pid = tf([Kd Kp Ki],[0 1 0]);
|
||||||
|
motor_cl = feedback(motor * pid, 1);
|
||||||
|
y = step(motor_cl);
|
||||||
|
|
||||||
|
total = 0;
|
||||||
|
T = size(y);
|
||||||
|
for t=1:T
|
||||||
|
total=total+(t*abs(y(t)-1));
|
||||||
|
end
|
||||||
|
ITAEp(m) = total;
|
||||||
|
if ITAEp(m) < ITAE(m)
|
||||||
|
ITAE(m) = ITAEp(m);
|
||||||
|
xp(m,1) = x(m,1);
|
||||||
|
xp(m,2) = x(m,2);
|
||||||
|
xp(m,3) = x(m,3);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
% Update Global best
|
||||||
|
[now_best, loc] = min(ITAE);
|
||||||
|
if now_best < prev_best
|
||||||
|
prev_best = now_best;
|
||||||
|
xg(1) = xp(loc,1); % actually this can change to x(loc,n)
|
||||||
|
xg(2) = xp(loc,2);
|
||||||
|
xg(3) = xp(loc,3);
|
||||||
|
end
|
||||||
|
steps = steps + 1;
|
||||||
|
best_value(steps) = prev_best;
|
||||||
|
end
|
||||||
|
toc
|
||||||
|
% Final Testing
|
||||||
|
ITAE_min = prev_best
|
||||||
|
Kp = xg(1)
|
||||||
|
Ki = xg(2)
|
||||||
|
Kd = xg(3)
|
||||||
|
|
||||||
|
pid = tf([Kd Kp Ki],[0 1 0]);
|
||||||
|
motor_cl = feedback(motor * pid, 1);
|
||||||
|
step(motor_cl)
|
||||||
|
%step(motor_cl/s);
|
||||||
|
%impulse(motor_cl);
|
||||||
|
%step(motor_cl/s^2);
|
||||||
|
legend("Before Tuning","After tuning");
|
||||||
|
title("Step Response");
|
||||||
|
stepinfo(motor_cl)
|
||||||
|
[y,t] = step(motor_cl);
|
||||||
|
ss_error = abs(1 - y(end))
|
||||||
|
|
||||||
|
t = 1:steps;
|
||||||
|
figure
|
||||||
|
plot(t,best_value, 'r--','LineWidth',2);
|
||||||
|
xlabel('Iteration');
|
||||||
|
ylabel('Cost Function (ITAE)');
|
||||||
|
legend("ITAE for PSO-PID");
|
||||||
|
title("ITAE with each iteration")
|
Loading…
Reference in New Issue
Block a user