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

Optimierungsproblem mit bestimmten Nebenbedingungen

 

Krueger
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 27.05.2014, 20:09     Titel:
  Antworten mit Zitat      
Hallo,

zu 19:32 -> danke für den Hinweis. Ich habe die Zuweisung der Zufallswerte aus der Funktion herausgenommen.

zu 19:39 -> Ich könnte dir das vollständige Simulinkmodell per PN schicken... Vielleicht wird mein vorhaben dann deutlicher.


Vielen Dank!

Krueger
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: 28.05.2014, 13:27     Titel:
  Antworten mit Zitat      
Hallo,

ich denke, mir ist schon klar, was du erreichen willst. Die einzige Möglichkeit, die ich mir vorstellen kann, sind statische Variablen.

Ein Beispiel:

Code:
function x = optimtest

x = fmincon(@obj, 3, [], [], [], [], [], [], @con);

function y = obj(x)

y = complicatedfun(x).^4;

function [c, ceq] = con(x)

ceq = [];
c = -complicatedfun(x) + 4;

function y = complicatedfun(x)
persistent yold xold
if isempty(xold) || ~isequal(x, xold)
    disp('function is evaluated')
    y = x.^2;
    xold = x;
    yold = y;
else
    disp('function is not evaluated')
    y = yold;
end


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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 28.05.2014, 14:07     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort. Ich werde dein Beispiel gleich umsetzen. Vorab noch zwei Fragen.

1)
Die complicatedfun(x) rufe ich nur für das x(n) auf, wenn ich hier ein Ergebnis aus dem Simulinkmodell verwende oder? Ansonsten schreibe ich die x normal in die Nebenbedingungen und in die Zielfunktion.


2)
was bewirkt die Zeile y = x.^2; in der complicatedfun(x) ?

Viele Grüße

Krueger
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: 28.05.2014, 14:24     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
1)
Die complicatedfun(x) rufe ich nur für das x(n) auf, wenn ich hier ein Ergebnis aus dem Simulinkmodell verwende oder? Ansonsten schreibe ich die x normal in die Nebenbedingungen und in die Zielfunktion.

Die Idee ist, dass du dein Modell innerhalb der complicatedfun simulierst, damit die Ergebnisse sowohl der Zielfunktion als auch der nichtlinearen Nebenbedingungsfunktion zur Verfügung stehen.

Zitat:
2)
was bewirkt die Zeile y = x.^2; in der complicatedfun(x) ?

Das ist die "komplizierte" Berechnung (dezente Ironie), die in Zielfunktion und nichtlinearer NB gebraucht wird.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 28.05.2014, 15:05     Titel:
  Antworten mit Zitat      
Hallo,

entschuldige, dass ich nochmals nachfragen muss. ich habe die Funktion noch nicht ganz verstanden und ich verstehe noch nicht ganz, wie ich das in meine Aufgabe implementieren kann.

Noch einmal bezogen auf mein Beispiel.

Wenn ich nun 2 Anlagen hinter einander auf den Input_A strang addieren und

Code:
x(1)  = Leistung_Anlage1
x(2)  = Leistung_Anlage2


ist. Dann suche ich die Werte für X(1), x(2) bei denen
Code:
y = X(1) * Kosten1 + x(2) * Kosten2

minimiert wird. Als Nebenbedingung soll aber der Array Result zu jedem Zeitschritt 0 sein, also durch x(1) oder x(2) gedeckt werden.
dazu habe ich eine dritte variable

Code:
x(3) = sum(Result);


definiert, welche aber nur in der Nebenbedinung auftaucht und nicht mehr selbst in der ZF also...

Code:


Viele Grüße und danke für deine Geduld Wink

Krueger
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: 28.05.2014, 15:46     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Als Nebenbedingung soll aber der Array Result zu jedem Zeitschritt 0 sein, also durch x(1) oder x(2) gedeckt werden.

Das verstehe ich offen gesagt nicht.

Zitat:
dazu habe ich eine dritte variable

Code:
x(3) = sum(Result);
Funktion ohne Link?

definiert, welche aber nur in der Nebenbedinung auftaucht und nicht mehr selbst in der ZF also...

... was meines Erachtens unnötig und vor allem verwirrend ist.

Die Bedingung sum(Result) = 0 ist einfach eine nichtlineare Nebenbedingung.

Brauchst du denn eigentlich die Ergebnisse des Simulink-Modells für die Zielfunktion?

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 28.05.2014, 16:56     Titel:
  Antworten mit Zitat      
Hallo,

ich habe das Beispielmodell jetzt noch einmal mti deinem Vorschlag bearbeitet.

Die Nebenbedingung, dass x(1) und x(2) den Bedarf decken funkiotniert nun.
Jetzt zu dem Punkt den du angesprochen hast.

Ich möchte den Array "Bedarf" aus dem Simulinkmodell nun in der Zielfunktion mit den Kosten_Bedarf multiplizieren. Daher muss das Ergebnis in der ZF auftauchen.

Ich habe das ganze in dem Beispiel noch einmal kommentiert.

VG

Krueger

Beispielmodell.zip
 Beschreibung:

Download
 Dateiname:  Beispielmodell.zip
 Dateigröße:  10.26 KB
 Heruntergeladen:  321 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: 28.05.2014, 21:23     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich möchte den Array "Bedarf" aus dem Simulinkmodell nun in der Zielfunktion mit den Kosten_Bedarf multiplizieren.

Dann musst du complicated_fun eben auch wie in meinem Beispiel aus der Zielfunktion heraus aufrufen.

Eine wirklich dringende Empfehlung: meide assignins und evals! Ein Vorteil von Funktionen sind die getrennten Workspaces und die daraus folgende klare Struktur der Anwendung, und das verschenkst du damit.
Zudem würde ich sim mit Rückgabeargumenten aufrufen, damit klar ist, woher was kommt.
Desweiteren ist es wie gesagt unnötig und verwirrend, ein Ergebnis (wie hier x(3) )an den zu optimierenden Parametervektor dranzuhängen.

Vielleicht hiflt es, wenn du einfach mal hinschreibst, was du eigentlich unter welchen Nebenbedingungen optimieren willst. Wenn ich das richtig sehe, setzt du nämlich jetzt ganz andere NB um als zuvor und ich kann jetzt nicht wissen, was nun richtig ist.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 31.05.2014, 11:31     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank noch einmal für deine Hilfe. Das mit der Nebenbedingung habe ich hinbekommen. Auch die complicated_fun kann ich nun aus der Zielfunktion aufrufen.

Ich schreibe den Quellcode gerade nach deinen Vorschlägen um. Wo ich mich noch ein bischen schwer tue ist mit dem vermeiden von den assignins und evals. Etwa der Input_A Vektor den ich in der Besipiel.m Datei generiere, müsste ich ja einmal an die mycon function übergeben und dann weiter an die complicated_fun. Ebenso bei der Zielfunktion.

Wenn ich jetzt die Functionen wie folgt aufrufe und x vorher definiere

Code:

x = zeros(1,3);
 
nonlcon = mycon(x,Input_A);

[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(optimize_K(x, Input_A), [50 50 0], A, b, Aeq, beq, lb, ub,nonlcon, options);



funktioniert die optimierung nicht mehr. Es wird auch kein Error ausgegeben. Habe ich da etwas falsch übergeben ? Gibt es da vielleicht einen anderen Weg?

Viele Grüße

Krueger
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: 31.05.2014, 12:29     Titel:
  Antworten mit Zitat      
Hallo,

mit diesen Informationen ist es für mich schwierig, das nachzuvollziehen.
Typischerweise können solche Probleme aber mit anonymous function handles gelöst werden:
http://www.mathworks.de/de/help/opt.....ing-extra-parameters.html

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 03.06.2014, 09:06     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Hilfe, das mit der anonymous function handles hat soweit funktioniert!

Ich habe noch eine letzte Frage zu einer vorherigen Aussage von dir Wink


Zitat:
Die Bedingung sum(Result) = 0 ist einfach eine nichtlineare Nebenbedingung.


Wieso ist diese Nebenbedingung eine nichtlineare Gleichung? das sind doch nur die Werte eines Vektors aufsummiert oder verstehe ich da etwas falsch?

Viele Grüße

Krueger
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: 03.06.2014, 19:25     Titel:
  Antworten mit Zitat      
Hallo,

Result kommt aber doch aus der Simulation des Modells?

Es geht ja darum, ob die NB linear oder nichtlinear in den veränderlichen Parametern ist. Da Result, falls es aus Simulink kommt, nichtlinear von den veränderlichen Parametern abhängen wird, wird letztlich auch die NB nichtlinear sein.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 53
Anmeldedatum: 25.06.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 04.06.2014, 09:04     Titel:
  Antworten mit Zitat      
Ich danke dir für deine Hilfe Harald!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.