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

Matlab-Optimierer auf Simulink-Modell anwendbar!?

 

bam_bam
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 15.10.10
Wohnort: München
Version: ---
     Beitrag Verfasst am: 15.10.2010, 16:39     Titel: Matlab-Optimierer auf Simulink-Modell anwendbar!?
  Antworten mit Zitat      
Hallo liebe Matlab-Experten,

ich muss für meine Diplomarbeit die Parameter eines bestehenden Simulink-Modells (E-Auto) optimieren.
Die erste Idee war nun, einen in Matlab vorhandenen Optimierungsalgorithmus wie z.B. fmincon zu verwenden.

Dazu habe ich erst einmal dessen Anwendung bei einem sehr einfachen Modell versucht: der berühmten "Banana"-Funktion.. Diese habe ich in Simulink nachgebaut und wollte dann mit fmincon aus Matlab heraus das Minimum finden.

Leider gibt mir der Optimierer immer falsche Werte zurück, ohne eine Fehlermeldung auszugeben.
Ich komme leider selbst nicht drauf, warum das so ist.
Wahrscheinlich irgendwas total Dummes was ich nicht so recht verstehe Embarassed

Hier mein Code der "Objective Function", die auskommentierte Zeile ist die normale Funktionsgleichung:

Code:

function y= banana(x)

%% Normale Variante
% y= 100*(x(2)-x(1)^2)^2+(1-x(1))^2;


%% Simulink Variante

x1= x(1);
x2= x(2);

x1= num2str(x1);
x2= num2str(x2);

set_param('s_banana/Constant1','Value',x1);
set_param('s_banana/Constant2','Value',x2);

sim('s_banana');
y= yout(end);
 


Der Code der Nebenbedingung (Einheitskreis):

Code:

function [c,ceq]= unitdisk(x)

c= x(1)^2+x(2)^2-1;
ceq= [];
 


Mein Aufruf in der Kommandozeile sah dann so aus:

Code:

options= optimset('Display','iter','LargeScale','off');
[x, fval, exitflag]= fmincon(@banana, [0 0], [],[],[],[], [], [],@unitdisk,options);
 


Als Ergebnis bekomme ich dann x= [0.2496 -0.0001] und fval= 0.9524..
Was leider völlig falsch ist..

Benutze ich den selben Aufruf, verwende aber in der "banana"-Funktion den auskommentierten Teil und kommentiere den Simulink-Part aus (siehe oben), bekomme ich das richtige Ergebnis:
x= [0.7864 0.6177] und fval= 0.0457..

Bitte bitte kann mir sagen was ich da für nen Fehler einbaue..
Vielen Dank schonmal
Smile

PS: Ich habe mal meine "Simulink-Banana-Funktion" angehängt, ich weiss dass die nicht besonders elegant gemacht ist, aber richtig müsste sie eigentlich sein, jedenfalls gibt sie bei Auruf mit einem bestimmten x immer das richtige Ergebnis aus..

s_banana.mdl
 Beschreibung:

Download
 Dateiname:  s_banana.mdl
 Dateigröße:  26.12 KB
 Heruntergeladen:  617 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.10.2010, 09:50     Titel:
  Antworten mit Zitat      
Hallo,

das Problem ist, dass du dein x1 und x2 nicht mit der erforderlichen Genauigkeit, sondern (zu grob) gerundet reinschreibst. Angepasst:

Code:
x1= num2str(x1, '%18.15f');
x2= num2str(x2, '%18.15f');


Einfacher wäre es, das Simulink-Modell die Werte direkt aus diesem Workspace entnehmen zu lassen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bam_bam
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 15.10.10
Wohnort: München
Version: ---
     Beitrag Verfasst am: 17.10.2010, 16:48     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für die Hilfe!
Ich dachte irgendwie bei wiederholtem Aufruf des Simulinkmodells müsste ich die Parameter mit set_param setzen.. War natürlich Blödsinn Smile

Was gefehlt hat war die Einstellung
Code:

opt= simset('SrcWorkspace','Current');
sim('s_banana',[0 10],opt);
 


Aber es ist dann natürlich geschickter in Simulink als Konstanten x1 und x2 einzugeben und die jeweils zu belegen..
Private Nachricht senden Benutzer-Profile anzeigen
 
marq
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 18.10.12
Wohnort: Stgt
Version: ---
     Beitrag Verfasst am: 18.10.2012, 10:39     Titel:
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein ähnliches Problem mit fminsearch.
fminsearch wertet ja s_banana mehrfach aus.
Aber wie übergebe ich die Parameter, denn die diversen fx von fminsearch sind doch lokale Variablen?

Oder kann ich die auch mit dem simset('SrcWorkspace','Current') "auslesen"?


Und wieso ruft bam_bam "sim('s_banana',[0 10],opt);" auf?
Ist das nicht 11 mal die selbe Funktionsauswertung, oder liegt das an fmincon??

Herzlichen Dank im Voraus!
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.