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

fmincon

 

Ahornhorn
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.10.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2021, 11:10     Titel: fmincon
  Antworten mit Zitat      
Hallo zusammen,

ich versuche derzeit ein Minimierungsproblem mit fmincon zu lösen. Dies funktioniert auch für kleine Mengen (kurze Vektoren) sehr gut. Bei größeren werden hingegen die NB nicht erfüllt und es gibt ein entsprechende Fehlermeldung. Ziel ist es je nach Ladestand einen Speicher innerhalb seiner Grenzen zu entladen.
Ich sehe den Fehler leider nicht bzw. kann ich es mir nicht erklären warum bei größeren Zusammenschlüssen von Speichern die NB überschritten wird

Code:

%% Eingabeparameter
E_S1 = [80;60;40;20];
E_S1 = repmat(E_S1,4,1);
E_aktuell_S1 = [21; 20; 20; 19];
E_aktuell_S1 = repmat(E_aktuell_S1,4,1);
P_S1 = [7.2; 7.2; 11; 22];
P_S1 = repmat(P_S1,4,1);
E_min_S1 = (0.2 .* E_S1);

%% Optim.
delta_E = max(E_aktuell_S1)*ones(length(P_S1),1)-E_aktuell_S1; % Bestimme Differenz jedes Wertes zum maximalen E_aktuell_S1
fun = @(x)-prod((delta_E+transpose(x))*10);   % erstelle Fitnessfunktion

x0 = zeros(1,length(P_S1));

A = diag(ones(1,length(P_S1)));
b = E_aktuell_S1 - E_min_S1;

Aeq = ones(1,length(P_S1));
beq = P_PRL_Soll_S1*dt;

lb = zeros(1,length(P_S1));
ub = (P_S1*dt)';

[x,y,z] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub); % x = zu entladende Energie je Bat. und Zeitschritt
P_dis_S1 = x./dt   % <-- benötigter Wert
 
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.03.2021, 11:22     Titel:
  Antworten mit Zitat      
Hallo,

wenn du noch P_PRL_Soll_S1 und dt zur Verfügung stellst, kann man das auch nachvollziehen.

Zitat:
es gibt ein entsprechende Fehlermeldung.

Wie lautet die Fehlermeldung?

Da A eine Diagonalmatrix ist, ist A*x <= b effektiv eine Schrankenbedingung. Dann sollte das in ub eingearbeitet werden.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Ahornhorn
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.10.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2021, 11:31     Titel:
  Antworten mit Zitat      
-P_PRL_SOll_S1 ist eine beliebige Leistung die in Summe durch die Speicher erbracht werden soll. Bsp.: 5
-dt ist ein betrachteter Zeitschritt (1/3600), um aus P die Energie E zu bestimmen.

- die Fehlermeldung lautet
Converged to an infeasible point.

fmincon stopped because the size of the current step is less than
the value of the step size tolerance but constraints are not
satisfied to within the value of the constraint tolerance.
Details:
Optimization stopped because the relative changes in all elements of x are
less than options.StepTolerance = 1.000000e-10, but the relative maximum constraint
violation, 1.305556e-02, exceeds options.ConstraintTolerance = 1.000000e-06.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.03.2021, 11:46     Titel:
  Antworten mit Zitat      
Hallo,

um zu wissen, warum das so ist, müsste man in den Algorithmus "hineinschauen".

Einen Vektor von Nullen als Startvektor anzugeben sollte man nur machen, wenn einem wirklich nichts besseres einfällt. Hier bietet sich aus meiner Sicht folgendes an:
Code:
x0 = ones(1,length(P_S1)) * P_PRL_Soll_S1*dt / length(P_S1);


Dann klappt es zumindest für die genannten Daten auch mit der Optimierung.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Ahornhorn
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.10.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2021, 13:08     Titel:
  Antworten mit Zitat      
Vielen Dank für Deine schnellen Antworten.
Die Startpunkte habe ich angepasst und kann auch gewisse Verbesserungen erkennen.
Sobald ich jedoch eine Größere Menge (repmat(E_aktuell_S1,100,1) etwa) betrachte findet er ein lokales Minima, welches jedem x nahezu den gleichen Wert zuweist und nicht wie erwünscht eine Staffelung nach E_diff erfolgt. Durch Verringern der Toleranzen konnte ich nochmal etwas heraus holen jedoch auch nicht in der benötigten Größenordnung.

Mein Ansatz war es die Werte im Vorfeld mit 1.000 zu multiplizieren und somit geringe Abweichungen besser feststellen zu können.
In dem Fall erhalte ich allerdings die Fehlermeldung.. Objective function is undefined at initial point. Fmincon cannot continue....
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.03.2021, 18:08     Titel:
  Antworten mit Zitat      
Hallo,

fmincon geht vom Startpunkt ausgehend in die Richtung des steilsten Abstiegs. Das gefundene Minimum kann durchaus "nur" ein lokales sein. Meist hilft dann nur ein anderer Startpunkt oder globale Optimierung, entweder händisch (mehrere Startpunkte in einer for-Schleife durchlaufen) oder mit Ansätzen aus der Global Optimization Toolbox.

Zitat:
Mein Ansatz war es die Werte im Vorfeld mit 1.000 zu multiplizieren und somit geringe Abweichungen besser feststellen zu können.

Mir ist nicht klar, welche Werte genau mit 1000 multipliziert werden und was du dir davon versprichst.

Zitat:
In dem Fall erhalte ich allerdings die Fehlermeldung.. Objective function is undefined at initial point. Fmincon cannot continue....

Dann wird das vermutlich genau so sein @ Objective function is undefined at initial point. Wenn du diesen Code zur Verfügung stellst, schaue ich mir das gerne genauer an.

Edit: Mich verwundert das prod in der Zielfunktion. Ist das wirklich beabsichtigt?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Ahornhorn
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 07.10.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2021, 20:17     Titel:
  Antworten mit Zitat      
ich habe versucht die Funktion mit 100 oder 1000 zu multiplizieren und somit kleinere Änderungen im Gradienten feststellen zu können. dies hat mir bei kleinen Mengen bereits helfen können

der Code ist wie oben der gleiche nur, dass ich mit repmat anstatt 10 das ganze 100 mal in den Vektoren der Eingangswerte zu stehen habe.
Code:
E_S1 = repmat(E_KFZ_S1,100,1);
E_aktuell_S1 = repmat(E_aktuell_S1,100,1);
P_S1 = repmat(P_KFZ_S1,100,1);


und ich die Funktion auf
Code:
fun = @(x)-prod((delta_E+transpose(x))*100);

geändert habe.


Das Produkt ist gewollt, da ich versuche in Anhängigkeit der Differenz delta_E die Entladung der Speicher zu koordinieren. Es sollen den Speichern mit hoher Differenz zum Ladestand des nächst niedriger geladenen so viel entnommen werden, dass die Ladestände nach der Optimierung möglichst gleich groß sind. Begrenzt wird der Speicher dabei nur von seiner maximalen Leistung.
Da die Summe immer gleich groß ist, egal von welchem Speicher die Leistung genommen wird, nutzte ich das Produkt. Wird nach diesem minimiert wird automatisch aus dem Speicher mit der geringsten delta_E, also dem mit höchsten Ladestand entladen. zumindest in der Theorie.

Ich bin leider mit dem Genetische Algo nicht so firm und habe mich daher erstmal für dieses Tool entschieden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
ich habe versucht die Funktion mit 100 oder 1000 zu multiplizieren und somit kleinere Änderungen im Gradienten feststellen zu können. dies hat mir bei kleinen Mengen bereits helfen können

Das ist aus meiner Sicht nicht empfehlenswert. Eine solche Skalierung sollte wenn über die Optionen stattfinden.

Insbesondere produziert deine Zielfunktion bei Faktor 1000 am Anfangswert:
fun(x0)
ans =

-Inf

Zitat:
Das Produkt ist gewollt, da ich versuche in Anhängigkeit der Differenz delta_E die Entladung der Speicher zu koordinieren. Es sollen den Speichern mit hoher Differenz zum Ladestand des nächst niedriger geladenen so viel entnommen werden, dass die Ladestände nach der Optimierung möglichst gleich groß sind. Begrenzt wird der Speicher dabei nur von seiner maximalen Leistung.
Da die Summe immer gleich groß ist, egal von welchem Speicher die Leistung genommen wird, nutzte ich das Produkt. Wird nach diesem minimiert wird automatisch aus dem Speicher mit der geringsten delta_E, also dem mit höchsten Ladestand entladen. zumindest in der Theorie.

Dem kann ich nicht folgen. Insofern kann ich nur hoffen, dass du weißt, was du tust.

Zitat:
Ich bin leider mit dem Genetische Algo nicht so firm und habe mich daher erstmal für dieses Tool entschieden.

Die Schnittstelle für ga ist recht ähnlich. Davon abgesehen ist ga zwar vielleicht die bekannteste Methode für globale Optimierung, hier aber nicht unbedingt die beste:
https://www.mathworks.com/help/gads.....osing-another-solver.html

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.