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

Parameteroptimierung von Simulinkmodell

 

madlate
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 04.04.14
Wohnort: ---
Version: 7.11.1 (R2010b)
     Beitrag Verfasst am: 23.09.2015, 14:15     Titel: Parameteroptimierung von Simulinkmodell
  Antworten mit Zitat      
Hallo Zusammen,

ich habe ein gegebenes Simulink-Modell, welches in Abhängigkeit Parameter (z. B. Abfallzeit an einem TurnOffDelay) und mehre vergebene Eingangssignale den Wunschzustand einer Anlage berechnet. Die Parameter lade ich aus dem Workspace und können beliebig variieren. Die Eingangssignale befinden sich alle in einem Signalbuilder.
Der Wunschzustand der Maschine ist entweder 0 (=aus) oder 1 (=ein). Nun soll sich die Maschine aus Stromspargründen möglichst oft ausschalten, jedoch da sie eine gewisse Anlaufzeit hat möglichst kurze Pausen vermeiden.
Meine Aufgabe ist es nun, die Parameter so zu wählen, dass die Maschine kurze Pausen vermeidet und trotzdem möglichst lange ausgeschaltet bleibt.
Ein klassisches Optimierungsproblem. Nur ich habe keine richtige Funktion, welche ich z. B. über fmincon optimieren kann.

Als ersten Schritt möchte ich, dass kurze Pausen komplett vermieden werden.
Meine kurzen Pausen kann ich über das Ausgangssignal „B_anlage_wunsch“ detektieren und in einen Vektor schreiben. Das Optimum wäre dann, dass dieser Vektor keine Elemente beinhalten.

Ich stehe allerdings auf dem Schlauch wie ich das mittels Matlab umsetzen kann.
Hat jemand Tipps für mich?

Danke
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.09.2015, 20:13     Titel:
  Antworten mit Zitat      
Hallo,

es ist durchaus möglich, dass man in fmincon über den sim-Befehl ein Simulink ausführt, und dann den Output analysiert. Man könnte z.B. die Laufzeit summieren und Strafterme oder Nebenbedingungen für die Anzahl der kurzen Pausen definieren. Schwierig ist nur, dass diese Anzahl nicht stetig, geschweige denn differenzierbar ist.

Was genau sind denn eigentlich die zu optimierenden Parameter?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 04.04.14
Wohnort: ---
Version: 7.11.1 (R2010b)
     Beitrag Verfasst am: 24.09.2015, 10:16     Titel:
  Antworten mit Zitat      
Servus Harald,

danke für deine Hilfe. Ich habe mal ein triviales Minimalmodell aufgebaut mit einem TurnOffDelay. Wenn der Parameter des TurnOffDelay auf 10s setzte werden alle Pausen unterhalb dieser Zeit vermeiden.
Nur soll Matlab dies eben selbst herausfinden:
Code:

func = @(x) runSimulation_test(x);

A = [];
b = [];
Aeq = [];
beq = [];
lb = [0];
ub = [10];
x0 = [8];
[x,fval]= fmincon(func,x0,A,b,Aeq,beq,lb,ub)


Code:
function number_short_stops=runSimulation_test(x)

%--------------------------------------------------------------------------
modelName ='optimierungsTest';
load_system(modelName);
%-------------------------------------------------------------------------

turn_off_delay_time=x(1);
   
%Simulation starten

%Parameter definition
set_param(bdroot,'Solver','FixedStepDiscrete','FixedStep','0.01');

Options =simset('SrcWorkspace','current');

simout = sim(modelName,[], Options);

bwunsch=logsout.get('bwunsch').data;
time=logsout.get('bwunsch').time;

%Initialwerte
start_idx=0;
stop_idx=0;

m=1;
for j=2:length(bwunsch)
               
    if bwunsch(j)==0 && bwunsch(j-1)==1
        %Beginn stopp
        stop_idx=j;
    elseif bwunsch(j)==1 && bwunsch(j-1)==0
        %Ende Stopp
        start_idx=j-1;        
    end

    %Stopp erkannt
    if start_idx > stop_idx && stop_idx ~=0          
        stop_time=time(start_idx)-time(stop_idx);
        total_stops(m)=stop_time;
        m=m+1;
        start_idx=0;
        stop_idx=0;
    end      
 
end

if(exist('total_stops', 'var'))
    short_stops_idx=find(total_stops<10);
    short_stops=total_stops(short_stops_idx);
    number_short_stops=length(short_stops);
else
    number_short_stops=0;
end


end


Das ganze funktionert ohne Probleme nur wird nichts optimiert.
Als Antwort erhalte ich meistens nur den Startwert:
Zitat:
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in
feasible directions, to within the default value of the function tolerance,
and constraints were satisfied to within the default value of the constraint tolerance.

<stopping criteria details>

No active inequalities.

x =

8


fval =

2

Das Problem scheint zu sein, dass fmincon die Funktion lediglich zweimal aufruft mit den Werten 8 und 8.0000 und dementsprechend keine besseren Ergebnisse zurückliefert, weil sie ein vermeindliches lokales Minimum gefunden hat
Was gibt es den für Möglichkeiten das ganze öfter ablaufen zulassen?

Danke
madlate

optimierungsTest.mdl
 Beschreibung:

Download
 Dateiname:  optimierungsTest.mdl
 Dateigröße:  568.24 KB
 Heruntergeladen:  450 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.09.2015, 20:02     Titel:
  Antworten mit Zitat      
Hallo,

deine Funktion liefert eine ganze Zahl zurück. fmincon ist gradientenbasiert und nimmt somit an, dass die Funktion differenzierbar ist. Das passt denkbar schlecht zusammen.

Ich würde Verfahren wie fminsearch , patternsearch oder ga versuchen, die nicht gradientenbasiert sind.

Siehe auch
http://de.mathworks.com/help/gads/choosing-a-solver.html#bsbjg7m

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 04.04.14
Wohnort: ---
Version: 7.11.1 (R2010b)
     Beitrag Verfasst am: 14.10.2015, 10:13     Titel:
  Antworten mit Zitat      
ich habe alle drei mal ausprobiert.
jeder Algorithmus hat seine Vorteile
ga: da meine Parameter zu 80% Integerwerte sind kann ich hier nur mit diesen rechnen lassen.
patternsearch: ich kann Grenzen definieren im Gensatz zu fimsearch.

Ich bin jetzt noch auf die Simulink Design Optimization Toolbox gestoßen. Diese hat die Funktionalität "ParameterEstimate". Mein optimales Signal könnte ich mir generieren. Allerdings weiß ich nicht ob die Funktionalität auch bei meinem binären Problem anwendbar ist. Hat hier schon jemand Erfahrung?
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 - 2025 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.