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

Optimierung eines Simulinkmodells funktioniert nicht!?

 

Waldemar
Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 20.01.2013, 22:03     Titel: Optimierung eines Simulinkmodells funktioniert nicht!?
  Antworten mit Zitat      
Hallo,

meine aktuelle Aufgabe ist, die Eingangsgrößen eines Simulinkmodells so zu optimieren, dass der Ausgangsgröße minimal wird!

Da es nicht gegeklappt hat, habe ich mal meine Gedanken auf das Bsp. der "doc fmincon"-Seite angepasst, um zu schauen (hatte ganze komische Fehlermeldungen, mit denen ich nichts anfangen konnte), ob es bei diesem Bsp. funktioniert!

Leider nicht, so dass ich nicht mehr weiter weiß!

Wäre nett, wenn mir jemand helfen könnte, da ich überhaupt nicht weiter komme:

Mein Simulink-Modell befindet sich im Anhang!

Mein Skript sieht folgendermaßen aus:
Code:
optopt= optimset('Display','iter');
[x, fval, exitflag]=fmincon('@xy_Regelung',[10;10;10],[],[],[],[],[],[],@xy_NB,optopt);
% [x, fval, exitflag]=fmincon('@xy_Regelung',[10;10;10],[],[],[],[],[],[],'xy_NB',optopt);


Mein Aufruf des Modells:
Code:
function Regelguete = xy_Regelung(x)
sim('xy','SrcWorkspace','current');
end
 


und meine Nebenbedingungen:
Code:
function [c,ceq] = xy_NB(x)

c=[-x(1)-2*x(2)-2*x(3);x(1)+2*x(2)+2*x(3)-72];
ceq=[];

end
sind in folgender Form.

Die Nebenbedingungen habe ich - im Bezug zu dem Bsp. auf der "doc fmincon"-Seite - so umgeschrieben, da ich es später auch so brauche.


Wäre super, wenn jemand mal drüber schauen könnte.

Vielen Dank.

MfG, Waldemar

xy_Regelung.m
 Beschreibung:

Download
 Dateiname:  xy_Regelung.m
 Dateigröße:  351 Bytes
 Heruntergeladen:  365 mal
xy_NB.m
 Beschreibung:

Download
 Dateiname:  xy_NB.m
 Dateigröße:  167 Bytes
 Heruntergeladen:  375 mal
xy_fmincon.m
 Beschreibung:

Download
 Dateiname:  xy_fmincon.m
 Dateigröße:  217 Bytes
 Heruntergeladen:  372 mal
xy.mdl
 Beschreibung:

Download
 Dateiname:  xy.mdl
 Dateigröße:  31.28 KB
 Heruntergeladen:  373 mal

_________________

Im "ich brauch Hilfe"-Status
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: 20.01.2013, 22:22     Titel:
  Antworten mit Zitat      
Hallo,

poste doch bitte die "komischen Fehlermeldungen".
Auf den ersten Blick würde ich sagen: die ' ' um @xy_regelung weglassen.

Die Nebenbedingungen sind linear und sollten daher auch als lineare NB übergeben werden

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

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 20.01.2013, 23:42     Titel:
  Antworten mit Zitat      
Hallo Harald,

habe die Anführungszeichen weggelassen (aktuelle Version von xy_fmincon im Anhang!).

Übrige Fehlermeldungen:
Code:
Warning: The default trust-region-reflective algorithm does not solve problems with
the constraints you have specified. FMINCON will use the active-set algorithm instead.
For information on applicable algorithms, see Choosing the Algorithm in the
documentation.
> In fmincon at 486
  In xy_fmincon at 2
Error using feval
Output argument "Regelguete" (and maybe others) not assigned during call to
"C:\01_Algorithmen\Test\xy_Regelung.m>xy_Regelung".

Error in fmincon (line 601)
      initVals.f = feval(funfcn{3},X,varargin{:});

Error in xy_fmincon (line 2)
[x, fval, exitflag]=fmincon(@xy_Regelung,[10;10;10],[],[],[],[],[],[],@xy_NB,optopt);

Caused by:
    Failure in initial user-supplied objective function evaluation. FMINCON cannot
    continue.
 



Bei den Fehlermeldungen, die sich auf mein Problem beziehen, stehe ich ziemlich ratlos da....beim dem Fehler:

Code:
Error in fmincon (line 601)
      initVals.f = feval(funfcn{3},X,varargin{:});


der sich auf eine Verwendung von fmincon in einem anderen Skript, welches sich nicht mal im aktuellen Ordner befindet, bezieht, verstehe ich überhaupt nicht, was das soll und wo der Zusammenhang ist!

Vielen Dank für deine Hilfe und Mühe.

MfG, Waldemar

xy_fmincon.m
 Beschreibung:

Download
 Dateiname:  xy_fmincon.m
 Dateigröße:  125 Bytes
 Heruntergeladen:  379 mal

_________________

Im "ich brauch Hilfe"-Status

Zuletzt bearbeitet von Waldemar am 21.01.2013, 00:59, insgesamt 2-mal bearbeitet
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: 20.01.2013, 23:54     Titel:
  Antworten mit Zitat      
Hallo,

den richtigen Teil der Meldung lesen.
Zitat:
Output argument "Regelguete" (and maybe others) not assigned during call to
"C:\Users\Niko\Desktop\DA_Kansy_IRT\01_Algorithmen\Test\xy_Regelung.m>xy_Regelung".


"Regelguete" ist lediglich der Name des Ausgangs im Simulink-Modell, aber nicht der Name der im Workspace erzeugten Variable.

Die Fehlermeldung solltest du schon bei
Code:
xy_Regelung([10;10;10])

bekommen.

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

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 21.01.2013, 02:19     Titel:
  Antworten mit Zitat      
Hallo Harald,

zur Behebung des Fehlers, habe ich mal in xy_Regelung:
Code:

function f = xy_Regelung (x)
f = -x(1) * x(2) * x(3);

(siehe doc fmincon) eingefügt (alles andere in dieser Funktion auskommentiert) und die Optimierung lief!!
Das heißt für mich, dass:
- xy_fmincon und
- xy_NB
richtig sind!

Also liegt mein Problem in der Verknüpfung von Simulink und Matlab!!
...also in xy_Regelung!!

Hab mal folgendes ausprobiert (siehe Anhang).

Allerdings gibt mein Simulink-Modell Fehler bzgl. unbekannter Eingangsgrößen aus und Matlab beschwert sich über:
Code:
Undefined variable "Regelguete_ges" or class "Regelguete_ges.signals.values".

Error in xy_Regelung (line 22)
Ausgang=Regelguete_ges.signals.values;

Error in fmincon (line 601)
      initVals.f = feval(funfcn{3},X,varargin{:});

Error in xy_fmincon (line 5)
[x, fval, exitflag]=fmincon(@xy_Regelung,[10;10;10],[],[],[],[],[],[],@xy_NB,optopt);

Caused by:
    Failure in initial user-supplied objective function evaluation. FMINCON cannot
    continue.


Also ich kriege es nicht hin Simulink und Matlab miteinander zu verknüpfen!!
Hab wirklich keine Ahnung, wie die Verknüpfungen zu Simulink und zurück zu Matlab richtig zu machen sind!

Wäre über Tipps MEGA erfreut!!

Danke schonmal für deine bisherige Hilfe.

Geh jetzt mal schlafen, krieg jetzt eh nichts mehr hin.

MfG, Waldemar

xy_Regelung.m
 Beschreibung:

Download
 Dateiname:  xy_Regelung.m
 Dateigröße:  509 Bytes
 Heruntergeladen:  373 mal
xy_NB.m
 Beschreibung:

Download
 Dateiname:  xy_NB.m
 Dateigröße:  167 Bytes
 Heruntergeladen:  366 mal
xy_fmincon.m
 Beschreibung:

Download
 Dateiname:  xy_fmincon.m
 Dateigröße:  174 Bytes
 Heruntergeladen:  393 mal
xy.mdl
 Beschreibung:

Download
 Dateiname:  xy.mdl
 Dateigröße:  31.53 KB
 Heruntergeladen:  389 mal

_________________

Im "ich brauch Hilfe"-Status
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: 21.01.2013, 03:06     Titel:
  Antworten mit Zitat      
Hallo,

verwende doch mal den Debugger um zu sehen, in welche Variable und welchen Workspace die Simulationsergebnisse geschrieben werden.

Ich empfehle weiterhin, die Nebenbedingungen linear zu definieren. Das ist in der jetzigen Form zwar nicht falsch, bremst den Algorithmus aber unnötig aus.

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

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 21.01.2013, 13:02     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deinen Tipp.

Ich verstehe jetzt zwar wo der Fehler liegt, aber ich weiß nicht, wie ich das Problem lösen kann (Hatte bislang keinen Kontakt mit verschiedenen Arbeitsspeichern, unterschiedlichen Variablen und alles was ich momentan dazu lese, macht mich noch verrückter).

Kannst du mir nicht ein kokretes Bsp. geben, wie ich zum Bsp. die Eingangsgröße aus dem Skript an das Simulink-Modell weiterleiten kann oder wie ich die Ausgangsgröße aus dem Simulink-Modell an das Skript überführen kann?

Wäre wirklich super.

Mein aktueller Stand ist:
Skript:
Code:
optopt= optimset('Display','iter');
[x, fval, exitflag]=fmincon(@xy_Regelung,[10;10;10],[],[],[],[],[],[],@xy_NB,optopt);

Modellaufruf:
Code:

% Variante1 (funktioniert):
% % function f = myfun(x)
% % f = -x(1) * x(2) * x(3);

% Variante2 (funktioniert nicht):
function y = xy_Regelung(x)

MDLsim  = 'xy';
open(MDLsim);
set_param('xy','SimulationCommand','start');

pause(5)

Ausgang=Regelguete_ges.signals.values;
y=Ausgang(end);
 


Nebenbedinungen:
Code:

function [c,ceq] = xy_NB(x)
c=[-x(1)-2*x(2)-2*x(3);x(1)+2*x(2)+2*x(3)-72];
ceq=[];
 


Modell im Anhang.

Vielen Dank.

MfG, Waldemar

xy.mdl
 Beschreibung:

Download
 Dateiname:  xy.mdl
 Dateigröße:  31.54 KB
 Heruntergeladen:  369 mal

_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 21.01.2013, 15:33     Titel:
  Antworten mit Zitat      
Hallo,

habe es mal mit assignin probiert:
Code:

x=[10;10;10]; % Eingefügt, um mich erstmal mit der Ausgangsseite zu befassen!
optopt= optimset('Display','iter');
[x, fval, exitflag]=fmincon(@xy_Regelung,[10;10;10],[],[],[],[],[],[],@xy_NB,optopt);


Code:

function y = xy_Regelung(x)

MDLsim  = 'xy';
open(MDLsim);
set_param('xy','SimulationCommand','start');

pause(10)

assignin('base','Ausgang',Regelguete_ges.signals.values);
% Ausgang=Regelguete_ges.signals.values;

length_Ausgang=length(Ausgang);
y=Ausgang(length_Ausgang);

 


aber der Fehler blieb der Gleiche.

Hab es mal mit dem debugger probiert (Brackpiont in die Zeile von assignin gesetzt) und dabei fiel mir auf, dass Regelguete_ges nach dem Durchlaufen des Simulink-Modells gar nicht in den 'base'-Workspace übergeben wurde!?
Anstelle 'base' habe ich 'caller' probiert, aber auch keine Verbesserung!
Wie kann ich denn nun in einer functionfile auf Werte des Simulink-Modells zu greifen, wenn diese - nach Beendigung der Simulation - nicht im 'base' workspace stehen?

bin ratlos.

MfG, Waldemar


PS:
Wenn ich xy_Regelung nicht als functionfile, sondern als Skript ausführe,
Code:

x=[10;10;10];
% function y = xy_Regelung(x)

MDLsim  = 'xy';
open(MDLsim);
set_param('xy','SimulationCommand','start');

pause(10)

assignin('base','Ausgang',Regelguete_ges.signals.values);
% Ausgang=Regelguete_ges.signals.values;
 
length_Ausgang=length(Ausgang);
y=Ausgang(length_Ausgang);

 

kann ich sofort nach dem Durchlaufen des Simulationsmodells auf Regelguete_ges zu greifen!
Muss doch auch gehen, wenn xy_Regelung eine functionfile ist!!
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 21.01.2013, 21:24     Titel:
  Antworten mit Zitat      
War das ein Krampf!!

Läuft aber jetzt!

Meine Lsg:

Code:
% Entweder mit A und b (Variante1) oder über @NB (Variante2):
% Variante1:
A = [-1 -2 -2;1  2  2];
b = [0;72];
optopt= optimset('Display','iter');
[x, fval, exitflag]=fmincon(@xy_Regelung,[10;10;10],A,b,[],[],[],[],[],optopt);

% Variante2:
% optopt= optimset('Display','iter');
% [x, fval, exitflag]=fmincon(@xy_Regelung,[10;10;10],[],[],[],[],[],[],@xy_NB,optopt);


Code:

function y = xy_Regelung(x)
simOut=sim('xy','SrcWorkspace','current','SaveOutput','on','OutputSaveName','youtNew');
pause(7)
simOutVars = simOut.who;
yout = simOut.get('youtNew');
length_yout=length(yout);
y=yout(length_yout);


Code:
function [c,ceq] = xy_NB(x)

c=[-x(1)-2*x(2)-2*x(3);x(1)+2*x(2)+2*x(3)-72];
ceq=[];

 


S.-Modell im Anhang.

Danke für die Hilfe.

MfG, Waldemar

xy.mdl
 Beschreibung:

Download
 Dateiname:  xy.mdl
 Dateigröße:  31.38 KB
 Heruntergeladen:  388 mal

_________________

Im "ich brauch Hilfe"-Status
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: 22.01.2013, 03:39     Titel:
  Antworten mit Zitat      
Hallo,

das vorige Problem hätte sich vermutlich gelöst mit
Code:
sim(..., 'DstWorkspace', 'Current')


Brauchst du im aktuellsten Code das
Code:

wirklich?

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

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 22.01.2013, 11:19     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort....interessant!

Wenn ich fragen darf, was ist denn der Unterschied zwischen:

Code:
sim(..., 'DstWorkspace', 'Current')


und

Code:
sim(...,'SrcWorkspace','current')
?

Mit
Code:
sim(...,'SrcWorkspace','current')
kann ich ja den Arbeitsspeicher des Simulink-Modells von 'base' auf den der Funktion wechseln.

Die weiteren Parameter/(Befehle) in
Code:
simOut=sim('xy','SrcWorkspace','current','SaveOutput','on','OutputSaveName','youtNew');
nutze ich als Hilfe für mich zur genauen Zuordnung der Ausgangsgröße des Simulink-Modells.

Code:
...

...brauche ich, weil mein eigentliches Modell ungefähr 18s dauert!
Nutze den Befehl bereits hier, um zu schauen, ob es so zusammen passt!


MfG, Waldemar
_________________

Im "ich brauch Hilfe"-Status
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: 22.01.2013, 12:41     Titel:
  Antworten mit Zitat      
Hallo,

SrcWorkspace (für "Source", also Quelle) bestimmt, aus welchem Workspace Parameter, die z.B. in Blöcken eingetragen sind, entnommen werden.
DstWorkspace (für "Destination", also Bestimmung) gibt an, in welchen Workspace Variablen, z.B. Simulationsergebnisse, hineingeschrieben werden.

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

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 22.01.2013, 13:12     Titel:
  Antworten mit Zitat      
Hallo Harald,

Danke sehr.
Super Information.
Werde ich bestimmt nutzen können.
Prima.

MfG, Waldemar
_________________

Im "ich brauch Hilfe"-Status
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.