Regleroptimierung auf Grundlage des identifizierten Übertragungsverhaltens
(EN google-translate)
(PL google-translate)
003_optimierung.zip - Skripte zu nachfolgender Darstellung.
Besonderheiten bei der Modellierung:
|
Zur besseren Übersicht, ist das Skript in mehrere Teile gegliedert:
hauptprogramm.sce
clear(); pa=1.2929002 pb=5.6333807 pc=3069.5433 u_begrenzt_aktuell = 0; //global, wird in modell und simulation benötigt. exec einachsermodell.sce; exec ruku.sce; //Rauschen: MITTELWERT = 0.0; STREUUNG = 0.2; exec simulation.sce exec fehlerfunktion.sce exec optimierer.sce P_ANTEIL=25000.0; I_ANTEIL=1000.0; D_ANTEIL=500.0; x0=[P_ANTEIL;I_ANTEIL;D_ANTEIL]; xopt = meinoptimierer(berechneFehler,x0,x0.*0.01, x0.*100.0); P_ANTEIL_OPT=xopt(1); I_ANTEIL_OPT=xopt(2); D_ANTEIL_OPT=xopt(3); //Testsimulationen durchführen: y0=[0.2;0;0]; t=0:dt:1.5; y=simulation(xopt,y0,t); plot(t,y(1,:));
Code 0-1: hauptprogramm.sce
einachsermodell.sce
Agii=[ 0, 1, 0;
0, 0, 1;
0,-pc/pa,-pb/pa];
Bgii=[0;0;1/pa];
function f = modell(t,yy)
f = Agii*yy+Bgii*u_begrenzt_aktuell;
endfunction
Code 0-2: einachsermodell.sce
ruku.sce
function yneu=ruku(y,t,dt)
k1=modell(t,y);
k2=modell(t+0.5*dt,y+0.5.*dt.*k1);
k3=modell(t+0.5*dt,y+0.5.*dt.*k2);
k4=modell(t+dt,y+dt.*k3);
yneu=y+dt.*(k1+2.*k2+2.*k3+k4)./6;
endfunction
Code 0-3: ruku.sce
simulation.sce
function ygir_sim=simulation(x,y0,t)
P_ANTEIL=x(1);
I_ANTEIL=x(2);
D_ANTEIL=x(3);
zs=size(t);
z=zs(2);
t0 = 0;
yalt = y0;
ygir_sim = yalt
u_begrenzt_aktuell = 0;
u_merk = [0];
index_umerk = 1;
//Für die numerische Bestimmung der Zustandsgrößen
phi = y0(1);
phi_alt = y0(1);
phi_integ = 0.0;
omega = 0.0;
for i=1:1:z-1
takt = t(i);
phi_alt = phi;
phi = yalt(1) + grand(1, 1, "nor", MITTELWERT, STREUUNG);
;
phi_integ = phi_integ + phi*dt;
omega = (phi - phi_alt)/dt;
//Zeitschritt durchführen:
yneu=ruku(yalt,takt,dt);
ygir_sim=[ygir_sim,yneu];
yalt=yneu;
//Erst danach das Stellsignal aktualisieren:
u_begrenzt_aktuell = -P_ANTEIL*phi - I_ANTEIL*phi_integ - D_ANTEIL*omega;
if u_begrenzt_aktuell>480 then
u_begrenzt_aktuell=480;
end
if u_begrenzt_aktuell<-480 then
u_begrenzt_aktuell=-480;
end
end
endfunction
Code 0-4: simulation.sce
fehlerfunktion.sce
dt=0.01;
t=0:dt:1.5;
zs=size(t);
z=zs(2);
function err=berechneFehler(x)
err=0.0;
t=0:dt:3.0;
y0=[0.2;0;0];
ygir_sim=simulation(x,y0,t);
err = err + ygir_sim(1,1:z)*ygir_sim(2,1:z)';
y0=[0.0;0.2;0];
ygir_sim=simulation(x,y0,t);
err = err + ygir_sim(1,1:z)*ygir_sim(2,1:z)';
y0=[-0.4;0;0];
ygir_sim=simulation(x,y0,t);
err = err + ygir_sim(1,1:z)*ygir_sim(2,1:z)';
y0=[0.3;0.2;0];
ygir_sim=simulation(x,y0,t);
err = err + ygir_sim(1,1:z)*ygir_sim(2,1:z)';
endfunction
Code 0-5: fehlerfunktion.sce
optimierer.sce
function bestparam = meinoptimierer(fehlerfunktion,startparam,minparam,maxparam)
x0 = startparam;
deltax = (maxparam-minparam).*0.0001;
xakt=x0;
sx = size(x0);
zx = sx(1);
fehler_akt = fehlerfunktion(x0);
for i=1:100
k = grand(1, 1, "uin", 1, zx);
xneu = xakt;
if xneu(k)+deltax(k)<maxparam(k) & xneu(k)-deltax(k)>minparam(k) then
xneu(k)=xneu(k)+deltax(k);
fehler_neu_plus = fehlerfunktion(xneu);
xneu = xakt;
xneu(k)=xneu(k)-deltax(k);
fehler_neu_minus = fehlerfunktion(xneu);
if fehler_neu_plus<fehler_akt then
fehler_akt=fehler_neu_plus;
xakt(k)=xakt(k)+deltax(k);
deltax(k) = deltax(k)*1.01;
elseif fehler_neu_minus<fehler_akt then
fehler_akt=fehler_neu_minus;
xakt(k)=xakt(k)-deltax(k);
deltax(k) = deltax(k)*1.01;
else
deltax(k) = deltax(k)*0.99;
end
end
end
bestparam = xakt;
endfunction
Code 0-6: optimierer.sce
P_ANTEIL = 25009.874 I_ANTEIL = 980.10298 D_ANTEIL = 495.63126
Code 0-7: Gefundene Parameter.
Bild 0-1: Zeitverlauf des Kippwinkels φ in rad mit den optimierten Parametern in der Simulation (Beispiel-Anfangsbedingung φ0=0.2rad).