WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Übertragungsfunktion optimieren mit Simulinkmodell

 

rebbalmat0887
Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 08.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2016, 17:38     Titel: Übertragungsfunktion optimieren mit Simulinkmodell
  Antworten mit Zitat      
Hallo,

Ich möchte eine Parameteroptimierung eines Systems 2. Ordung aus Simulink berechnen lassen. Dazu habe ich drei Bodeplots des Systems, welche jedoch nichtliniear sind. Ich möchte aber für diese drei Bodeplots nun diejenigen Parameter finden, für die eine Kostenfunktion minimale Werte liefert.

Hatte mir das folgendermaßen vorgestellt:
Code:

function [wn,zeta,lv,la] = runLsqCurveFit

% 1.) Messwerte initialisieren
x  = [10^0 2 3 4 5 6 7 8 9 10 20 30 40 50 60 70 80 90 10^2 ...
    1.1*10^2 1.3*10^2 1.5*10^2 1.7*10^2 2*10^2 3*10^2];
% [Hz]

y5 = [0 0 0 0 0 0 0 0 0 0 0 0 0.7 1 1.1 1.45 1.5 1.5 1.6 1.55 1.1 0 -1.5 ...
    -2.9 -10.5];
y25= [0 0 0 0 0 0 0 0 0 0 0 0 0.9 1.1 1 0.9 -0.1 -1.1 -1.9 -2.7...
    -4.6 -7 -9.5 -12.8 -22.9];
y50= [0 0 0 0 0 0 0 0 0 0 0 0 0.9 0 -1 -2.2 ...
    -3.2 -4.5 -5.5 -7 -9.5 -13.2 -16 -19 -29.5];
% [dB] -> deziBel

% 2.) Simulink Modell aufrufen
simFitting2ndOrderSystem      %hier weiß ich leider nicht, ob das schon reicht

% Startwerte und Genauigkeitsgrenzen angeben
plantDyn0 = [10 0.5 1 0.5];  % Anfangswerte wn,zeta,lv,la
lb = 0.001;
ub = 0.01;
options = optimoptions(@lsqnonlin,'Algorithm','levenberg-marquardt',...
   'Display','off','TolX',0.001,'TolFun',0.001);    % toleranzen festlegen

plantDyn = lsqcurvefit(@tracklsq, plantDyn0, xdata,ydata, lb, ub, options);

wn = plantDyn(1); zeta = plantDyn(2); lv = plantDyn(3); la = plantDyn(4);

    function F = tracklsq(plantDyn)
      % Track the output of optsim to a signal of 1
       
      wn = plantDyn(1);
      zeta = plantDyn(2);
      lv = plantDyn(3);
      la = plantDyn(4);

      %
      myobj = sim('simFitting2ndOrderSystem','SrcWorkspace','Current', ...
          'StopTime','100');
      F = myobj.get('yout') - 1;
    end


end
 


Funktionieren tut's leider überhaupt nicht. In den MathWorks Hilfen sind Beispiele zur Regleroptimierung. Da wird ein PID Regler auf optimale Sprungantwort getrimmt. Konnte damit aber keinen Fortschritt erzielen, da ich zunächst erstmal eine Übertragungsfunktion der Strecke brauche.
Danke im Voraus für die Hilfe!

simFitting2ndOrderSystem.slx
 Beschreibung:

Download
 Dateiname:  simFitting2ndOrderSystem.slx
 Dateigröße:  15.23 KB
 Heruntergeladen:  184 mal
Private Nachricht senden Benutzer-Profile anzeigen


rebbalmat0887
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 08.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.04.2016, 11:59     Titel:
  Antworten mit Zitat      
Hat wirklich niemand eine Idee? Sollte ich das vllt lieber unter der Simulink-Rubrik posten?

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 21.04.2016, 13:52     Titel:
  Antworten mit Zitat      
hallo
topicbumping bitte erst nach 24h. sihe dazu auch den thread http://www.gomatlab.de/der-kleine-gomatlab-de-knigge-t125.html
was mir auf die schnelle auffällt. in deinem code ist xdata und ydata nicht bekannt.
deine lb und ub haben nicht die diemmension von plantDyn
dein simulink modell ist bei mir auch nicht lauffähig
was ist zb fn
grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
rebbalmat0887
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 08.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.05.2016, 11:53     Titel:
  Antworten mit Zitat      
Hallo,

sorry für meine späte Antwort aber bin ziemlich krank gewesen. Ich habe jedoch versucht, das Problem etwas langsamer und Schritt für Schritt anzugehen.

Ich habe erstmal versucht, mir Messwerte eines liniearen Systems zweiter Ordung zu generieren und dann die allgemeine Übertragungsfunktion eines Systems zweiter Ordung als Ansatzfunktion zu hinterlegen, um diese dann an die Messwerte anzufitten.
Diese Funktion lautet:

|G(jw)| = A(w) =

K * w0^2
--------------------------------------------------------------
wurzel( (w0^2 - w^2 )^2 + ( 2*zeta*w0*w )^2 )

Bei niedrigen Frequenzen bis zu 10 Hz liegt aber ein zu großer Fehler vor. Der Lösungsvektor für die Verstärkung, Eigenkreisfrequenz und die Dämpfung weicht auch erheblich von denen ab, mit denen ich die Messwerte erzeugt habe.

Habt ihr bessere Vorschläge für die Lösung des Problems? Andere Optimierungsfunktionen, die das globale Minimum finden?

Hier der Code:
Code:

%% Ausgleichsgerade eines linearen Amplitudengangs erstellen
%  Werte:   K    = 5;
%           w0   = 3;
%           zeta = 1;

clear all
close all
clc

K   = 5;
w0  = 3;
zeta= 1;

Gs = tf(K*w0^2,[1 2*zeta*w0 w0^2]);
[mag,phase,wMess] = bode(Gs,{0.01,300});

n = length(mag);

for i = 1:n
    AMess(i) = 20*log10(mag(i));
end

AMess = AMess';

% 'Messwerte' plotten
figure(1)
semilogx(wMess,AMess,'b-o')
grid on

% Lösungsvektor berechnen
x0    = [5;5;5];
options1 = optimset('lsqcurvefit');
x = lsqcurvefit(@(x,wMess) (x(1)*x(2).^2./sqrt((x(2).^2-wMess.^2).^2+(2*x(3)*x(2)*wMess).^2)),x0,wMess,AMess,[],[],options1);

figure(2)
% Plotten der tatsächlichen Messwerte
semilogx(wMess,AMess)  
hold on
% Plotten der gefitteten Werte der Ausgleichsgerade
omega    = 0.01:0.01:3*10^2;
fktwert = x(1)*x(2).^2./sqrt((x(2).^2-omega.^2).^2+(2*x(3)*x(2)*omega).^2);
A       = 20*log10(fktwert);
plot(omega,A,'g-')
grid on
 


Danke im Voraus für die Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
rebbalmat0887
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 08.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2016, 16:25     Titel:
  Antworten mit Zitat      
Hallo,

so richtig Lust hat anscheinend keiner aber wollte trotzdem mal ein paar Fortschritte posten. Vllt. findet dann doch der ein oder andere Gefallen an dem Thread Wink
Ich habe jetzt drei nichtleneare Messdatensätze von drei unterschiedlichen Bodeplots einzeln an jeweils drei unterschiedliche Systeme zweiter Ordnung gefittet.
Hier ist der Code:

Code:

%% Fitten nichtlinearer Messwerte mit System 2. Ordnung

clear all
close all
clc

% Step 1: Create an objective function
% Syntax zur Funktionsdefinition
% Funktionsname = @(Koeffizienten,Messwerte) (Funktion);
fitfcn = @(koeff,wMess) 20*log10(koeff(1)*koeff(2).^2./sqrt((koeff(2).^2-wMess.^2).^2+(2*koeff(3)*koeff(2)*wMess).^2));

% Step 2: Create Training Data
K   = 5;
w0  = 2;
zeta= 1;
koeff = [K w0 zeta];    % real coefficients

% nichtlineare Messwerte
wMess   = [10^0 2 3 4 5 6 7 8 9 10 20 30 40 50 60 70 80 90 10^2 ...
         1.1*10^2 1.3*10^2 1.5*10^2 1.7*10^2 2*10^2 3*10^2];
AMess05 = [0 0 0 0 0 0 0 0 0 0 0 0 0.7 1 1.1 1.45 1.5 1.5 1.6 1.55 1.1 0 -1.5 ...
         -2.9 -10.5];
AMess25 = [0 0 0 0 0 0 0 0 0 0 0 0 0.9 1.1 1 0.9 -0.1 -1.1 -1.9 -2.7...
        -4.6 -7 -9.5 -12.8 -22.9];

AMess50 = [0 0 0 0 0 0 0 0 0 0 0 0 0.9 0 -1 -2.2 ...
        -3.2 -4.5 -5.5 -7 -9.5 -13.2 -16 -19 -29.5];

% Step 3: Obere und untere Grenze sowie Startwerte festlegen
lb = [0,0,0];
ub = [inf,inf,inf];
x0 = [1,1,1];           % Anfangswerte: für alle gleich gewählt

% Step 4: lokales Minimum bezogen auf Startwerte
[xfitted05,errorfitted05] = lsqcurvefit(fitfcn,x0,wMess,AMess05,lb,ub);
[xfitted25,errorfitted25] = lsqcurvefit(fitfcn,x0,wMess,AMess25,lb,ub);
[xfitted50,errorfitted50] = lsqcurvefit(fitfcn,x0,wMess,AMess50,lb,ub);

% Step 5: MultiStart
problem05 = createOptimProblem('lsqcurvefit','x0',x0,'objective',fitfcn,...
    'lb',lb,'ub',ub,'xdata',wMess,'ydata',AMess05);
problem25 = createOptimProblem('lsqcurvefit','x0',x0,'objective',fitfcn,...
    'lb',lb,'ub',ub,'xdata',wMess,'ydata',AMess25);
problem50 = createOptimProblem('lsqcurvefit','x0',x0,'objective',fitfcn,...
    'lb',lb,'ub',ub,'xdata',wMess,'ydata',AMess50);

% Step 6: globales Minimum
% ms = MultiStart('PlotFcns',@gsplotbestf);
[xmulti05,errormulti05] = run(MultiStart,problem05,50);
[xmulti25,errormulti25] = run(MultiStart,problem25,50);
[xmulti50,errormulti50] = run(MultiStart,problem50,50);

figure(1)
semilogx(wMess,AMess05,'go')
grid on
hold on
semilogx(wMess,AMess25,'ro')
semilogx(wMess,AMess50,'bo')
semilogx(wMess,...
    20*log10(xmulti05(1)*xmulti05(2).^2./sqrt((xmulti05(2).^2-wMess.^2).^2+(2*xmulti05(3)*xmulti05(2)*wMess).^2)),'g-','LineWidth',2)
semilogx(wMess,...
    20*log10(xmulti25(1)*xmulti25(2).^2./sqrt((xmulti25(2).^2-wMess.^2).^2+(2*xmulti25(3)*xmulti25(2)*wMess).^2)),'r-','LineWidth',2)
semilogx(wMess,...
    20*log10(xmulti50(1)*xmulti50(2).^2./sqrt((xmulti50(2).^2-wMess.^2).^2+(2*xmulti50(3)*xmulti50(2)*wMess).^2)),'b-','LineWidth',2)

% Werte ausgeben
fprintf('K_05       = %5f\n',xmulti05(1))
fprintf('w0_05      = %5f\n',xmulti05(2))
fprintf('zeta_05    = %5f\n',xmulti05(3))
fprintf('K_25       = %5f\n',xmulti25(1))
fprintf('w0_25      = %5f\n',xmulti25(2))
fprintf('zeta_025   = %5f\n',xmulti25(3))
fprintf('K_50       = %5f\n',xmulti50(1))
fprintf('w0_50      = %5f\n',xmulti50(2))
fprintf('zeta_50    = %5f\n',xmulti50(3))

 


Jetzt werde ich versuchen, die drei Messdatensätze an ein System anzufitten. Alles nur in Matlab. Wenn das funtioniert, möchte ich das Simulink-Modell an die drei Messdatensätze anpassen.

Wer dazu Vorschläge, Lösungsansätze oder ähnliches parat hat, ich bin für alles dankbar!
Private Nachricht senden Benutzer-Profile anzeigen
 
rebbalmat0887
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 08.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2016, 18:13     Titel:
  Antworten mit Zitat      
Hallo,

Gibt es keine Vorschläge oder Ideen? Nur zur Verdeutlichung, damit man den ganzen Sinn besser verstehen kann: Die drei Plots (5%, 25% und 50%) sind die Bodediagramme eines Proportionalhydraulikventils um die Mittelposition. Ich habe die drei Datensätze einzeln mit lsqcurvefit bzw MultiStart gefittet und erhalte somit drei unterschiedliche Verstärkungen, Eigenkreisfrequenzen und Dämpfungen. Da es sich um Messwerte EINES Systems handelt, möchte ich auch die Messwerte an nur EIN System anfitten für das die Kostenfunktion minimal wird.
Dabei würde ich gerne die Messwerte von 5% höher wichten, da sich das Ventil die meiste Zeit um die Mittelposition bewegt.

Wie kann ich das angehen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.05.2016, 10:22     Titel:
  Antworten mit Zitat      
HAllo rebbalmat0887,

Die erklärungen zur "Verdeutlichung" sind für alle Leser, die nicht exakt im gleichen Gebiet wie du arbeiten, nur verwirrend. Ich verstehe davon z.B. kein einziges Wort. das sollte aber eigentlich auch überflüssig sein, denn für Matlab sind das ja alles nur Zahlen.

Ich komme nach wie vor nicht dahinter, was Deine eigentliche Frage ist. da auch sonst kaum geantwortet wird, geht es anderen Lesern wohl ähnlich.

Zitat:
Dabei würde ich gerne die Messwerte von 5% höher wichten, da sich das Ventil die meiste Zeit um die Mittelposition bewegt.

Das sagt mir z.B. überhaupt nichts.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
rebbalmat0887
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 08.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2016, 13:05     Titel:
  Antworten mit Zitat      
Hallo Jan,

sorry für die Verwirrung, ich versuche es nochmal besser zu erklären. Also ich habe diese drei Messwertreihen (5%, 25%, 50%), bei denen jetzt mal dahingestellt ist, was sie bedeuten.
Ich habe folgende Funktion hinterlegt:

Code:

%                                              K * w0^2
% fitfcn = 20*log10( -------------------------------------------------------- )
%                            [ (w0^2 - w^2 )^2 + ( 2*zeta*w0*w )^2 ]^0.5
 


um für diese Funktion diejenigen Werte (K,w0,zeta) rauszufinden, die am besten zu den Messwerten passen.

Das habe ich jetzt für die drei Messwertreihen einzeln gemacht, weil es erstmal einfacher für mich war.
Ich möchte aber alle drei Messwertreihen mit einmal an meine Ansatzfunktion fitten. Mit dem Zusatz, die 5%-Messreihe höher zu wichten als die anderen zwei.

Etwa so:

F (K,w0,zeta) = 4 * Messreihe5% + Messreihe25% + Messreihe50%

Diese Funtion möchte ich minimieren. Deshalb weiß ich nicht, ob ich vorher erst die Messwerte fitten muss und anschließend vllt mit lsqnonlin die Kostenfunktion F minimieren muss.

Ich hoffe, ich habe es verwirrungstechnisch nicht noch schlimmer gemacht.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.