Professional Documents
Culture Documents
TEMA: Solucin de un problema de optimizacin de un controlador PI Realizar un programa para obtener la respuesta ms optima para un controlador PI. 1. Para el presente ejercicio se debe realizar el lazo cerrado del sistema para lo cual se ha utilizado una planta de segundo orden. Para el sistema el parmetro que se desea optimizar es el siguiente:
Simulacin en SimuLink
1 s Product Integrator 1
e_cuadr To Workspace
1 s Integrator
salida To Workspace 3
kp Gain 1
Desarrollo del Algoritmo Gentico (creacin de individuos, obtencin cdigo gentico, reproduccin, mutacin, seleccin)
Codigo Matlab
clc clear all tsim=10; kimax=100; kpmax=100; gene=0; error_=0; %% NUMERO DE INDIVIDUOS nind=input('Ingrese numero de individuos ='); ngene=input('Ingrese el numero de generaciones ='); while (gene<=ngene) %% CREACION DE INDIVIDUOS ALEATORIAMENTE x=0:1:100; kp_ind=x(1)+(x(100)-x(1)).*rand(nind,1) ki_ind=x(1)+(x(100)-x(1)).*rand(nind,1) %% OBTENCION DEL CODIGO GENETICO DE LOS INDIVIDUOS for a=1:nind kp_yentero=fix(kp_ind(a)); ki_yentero=fix(ki_ind(a));%Saca el entero del valor kp_binent=dec2bin(kp_yentero,5);%%Transforma en binario al nmero entero______ ki_binent=dec2bin(ki_yentero,5); kp_ydecimal= kp_ind(a) - kp_yentero;%%Deja solo el valor decimal___ ki_ydecimal= ki_ind(a) - ki_yentero; %%Saca el nmero binario del valor decimal for b=1:5 kp_ydecimal=kp_ydecimal*2; kp_bindec(b)=fix(kp_ydecimal); kp_ydecimal=kp_ydecimal - kp_bindec(b); ki_ydecimal=ki_ydecimal*2; ki_bindec(b)=fix(ki_ydecimal); ki_ydecimal=ki_ydecimal - ki_bindec(b); end kp_auxbindec{a}=num2str(kp_bindec); ki_auxbindec{a}=num2str(ki_bindec); end for z=1:nind kp_repro=str2num(kp_auxbindec{z}); ki_repro=str2num(ki_auxbindec{z}); for y=1:length(kp_repro) kp_auxz(z,y)=kp_repro(y); ki_auxz(z,y)=ki_repro(y); end end kp_bin=kp_auxz; ki_bin=ki_auxz; for i=1:nind j=1; for z=1:10 if z<=5 pi_codg(i,z)=kp_bin(i,z); else
pi_codg(i,z)=ki_bin(i,j); j=j+1; end end end %% Seleccion Mejor Padre for i=1:nind kp=kp_ind(i); ki=ki_ind(i); sim('lazo_pi',tsim) auxe_ecuad(i)=1/e_cuadr; indiv(i,1:10)=pi_codg(i,1:10); indiv(i,11)=kp; indiv(i,12)=ki; indiv(i,13)=1/e_cuadr; end indiv mejor=max(auxe_ecuad) for i=1:nind if mejor==indiv(i,13) mejor_kp=indiv(i,11) mejor_ki=indiv(i,12) end end kp=mejor_kp; ki=mejor_ki; sim('lazo_pi',tsim) figure(1) plot(tiempo,salida) title('Mejor Padre') %% Reproduccin if mod(nind,2)~=0 nind=nind-1 end auxz=pi_codg; hijos=auxz; disp('Punto de Cruce') ptoc=round(1+8.*rand(1,1)) i=1; m=nind; j=ptoc+1; while (i<=m) pr=0.1+(1-0.1).*rand(1,1) %Lanzamiento de rueda para cada pareja if pr<=0.8 for j=ptoc+1:10 hijos(i,j)=auxz(i+1,j); hijos(i+1,j)=auxz(i,j); end i=i+2 else i=i+2 end end
hijos %% Seleccion Mejor Hijo for i=1:nind long_crom=10; kp_codg=hijos(i,1:5); ki_codg=hijos(i,6:10); vector_pesos=2.^((long_crom/2)-1:-1:0); ki=sum((ki_codg).*vector_pesos)./(2.^(long_crom/2)-1)*kimax; kp=sum((kp_codg).*vector_pesos)./(2.^(long_crom/2)-1)*kpmax; sim('lazo_pi',tsim) auxe_ecuad(i)=1/e_cuadr; mat_hijos(i,1:10)=hijos(i,1:10); mat_hijos(i,11)=kp; mat_hijos(i,12)=ki; mat_hijos(i,13)=1/e_cuadr; end mat_hijos mejor_hij=max(auxe_ecuad) for i=1:nind if mejor_hij==mat_hijos(i,13) mejor_kp_hij=mat_hijos(i,11) mejor_ki_hij=mat_hijos(i,12) end end kp=mejor_kp_hij; ki=mejor_ki_hij; sim('lazo_pi',tsim) figure(2) plot(tiempo,salida) title('Mejor Hijo') %% Mutacin mutacion=hijos disp('Punto de Mutacin') n=10; ptom=round(1+(n-1).*rand(1,1)) for i=1:nind pm=0.01+(0.1-0.01).*rand(1,1) %Lanzamiento de rueda para mutacion if pm<=0.02 if hijos(i,ptom)==0 mutacion(i,ptom)=1; else mutacion(i,ptom)=0; end end end disp('Hijo Proceso de Mutacin') mutacion disp('Epoca') gene=gene+1 disp('Error') error_=1/max(auxe_ecuad) pause end
Graficas: las graficas se actualizaran conforme se pase de poca a poca para la simulacin se ingreso 100 individuos y 30 generaciones obteniendo los siguientes resultados
10
10