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

Nichtlineare Optimierungsprobleme (fmincon)

 

Metallions
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 23.04.18
Wohnort: Duisburg
Version: ---
     Beitrag Verfasst am: 01.05.2018, 18:58     Titel: Nichtlineare Optimierungsprobleme (fmincon)
  Antworten mit Zitat      
Hallo, liebe Matlab-Gemeinde

Ich Matlab-Anfänger habe folgendes Problem:
Soweit von mir schon in Matlab programmiert:

Gegebenes nichtlineares Optimierungsproblem:
Zielfunktion: Maximiere (2*x1+3*x2)^2

Nebenbedingungen
x1^2 + x2^3 = 100
2*x1^2 + 4*x2^2 <= 120
x2 <= 35
x1,x2 >= 0

options = optimoptions('fmincon','Display','final')
A = [1 1; X X; 0 1];
b = [100 120 35];
lb = [0 0];
x0 = [1 2];
[x,Fval] = fmincon(@funk,x0,A,b,[],[],lb,[],[],options)

Ich habe nun folgende Fragen:

1) Ich weiß leider nicht, was ich bei A (für die beiden X) eintragen muss. Die Gleichung: 2*x1^2 + 4*x2^2 <= 120 spielt dafür eine Rolle. Ich bin mir unsicher ob ich nun 2 und 4 oder 4 (wegen 2^2) und 16 (wegen 4^2) eintragen muss.

2) Habe ich die Zielfunktion: Maximiere (2*x1+3x2)^2 in der function-file richtig?
function f = funk(x)
f = (2*x(1)+3*x(2))^2
end

Ich bedanke mich schon mal für eure Hilfe.
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: 01.05.2018, 19:04     Titel:
  Antworten mit Zitat      
Hallo,

die Zielfunktion ist korrekt.

Die beiden ersten Nebenbedingungen sind nichtlinear. Das sollte also nicht in A und b, sondern in die nichtlinearen NB, die auch als Function Handle angegeben werden müssen.

x2 <= 35 kannst du auch als Schrankenbedingung umsetzen mit ub = [inf, 35]

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 23.04.18
Wohnort: Duisburg
Version: ---
     Beitrag Verfasst am: 01.05.2018, 19:11     Titel:
  Antworten mit Zitat      
Wow, echt super, dass man so schnell eine Antwort bekommt.
Erstmal vielen vielen Dank.

Da die ersten beiden Nebenbedingungen nicht linear sind, heißt das, dass ich für jede dieser beiden ein eigenes function-file machen muss ? oder habe ich das falsch verstanden ?
Und wenn ja, wie kann ich sie in x,Fval] = fmincon() einfügen ?
Da ich leider ein Anfänger bin, habe ich die "Matlab-Sprache" noch nicht so raus.
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: 01.05.2018, 20:19     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
heißt das, dass ich für jede dieser beiden ein eigenes function-file machen muss ?

Nein, eines für beide zusammen.

Wenn du mit einer Funktion nicht zurechtkommst, bitte immer die Doku sorgfältig lesen. Da gibt es sogar ein Beispiel "Nonlinear Constraints".

Übrigens: fmincon minimiert, du willst aber maximieren. Solltest du bei der Zielfunktion berücksichtigen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 23.04.18
Wohnort: Duisburg
Version: ---
     Beitrag Verfasst am: 02.05.2018, 10:44     Titel:
  Antworten mit Zitat      
Hallo,
nochmals danke für deine Hilfe.

Ich habe nun alles und wollte wissen, ob ich soweit alles richtig gemacht habe:
Zur Veranschaulichung:
Gegebenes nichtlineares Optimierungsproblem:
Zielfunktion: Maximiere (2*x1+3*x2)^2

Nebenbedingungen
x1^2 + x2^3 = 100
2*x1^2 + 4*x2^2 <= 120
x2 <= 35
x1,x2 >= 0

function f = funk(x)
f = (-1)*(2*x(1)+3*x(2))^2
% Maximierungsproblem ins Minimierungsproblem umgewandelt
% durch *(-1)
end


function [c,ceq] = confunk(x)
c = 2*x(1)^2+4*x(2)^2; % Entspricht 2*x1^2 + 4*x2^2 <= 120
ceq = x(1)^2+x(2)^3; % Entspricht x1^2 + x2^3 = 100
end


options = optimoptions('fmincon','Display','final')
lb = [0 0];
ub = [inf,35]; % Hier Nebenbedingung x(2) <= 35
x0 = [1 1];
[x,Fval] = fmincon(@funk,x0,[],[],[],[],lb,ub,@confunk,options)

Ich hätte dazu noch 2 Fragen:
1) In function [c,ceq] = confunk(x) habe ich ja die 2 Nebenbedingungen, aber nirgendwo habe ich die Grenzen beider drin, also <= 120 (siehe c) und = 100 (siehe ceq). Wo muss ich diese beiden Grenzen reinschreiben?

2) Ich soll noch die Indizes der Nebenbedingungen angeben, welche als Gleichung erfüllt sind. Wie kann ich das hier umsetzen?

Mit freundlichen Grüßen
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: 02.05.2018, 11:23     Titel:
  Antworten mit Zitat      
Hallo,

1)
(Un)gleichungen und müssen in der Form <= 0 bzw. = 0 angegeben werden, also

Code:
function [c,ceq] = confunk(x)
c = 2*x(1)^2+4*x(2)^2 - 120; % Entspricht 2*x1^2 + 4*x2^2 <= 120
ceq = x(1)^2+x(2)^3 - 100; % Entspricht x1^2 + x2^3 = 100
end


2)
Du kannst mal schauen, ob eines der weiteren Rückgabeargumente von fmincon weiter hilft. Ansonsten würde ich die Lösung einsetzen und das so analysieren.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 23.04.18
Wohnort: Duisburg
Version: ---
     Beitrag Verfasst am: 02.05.2018, 14:45     Titel:
  Antworten mit Zitat      
Einfach super, ich habe nun Werte raus, die logisch klingen. Ich danke dir wirklich.

oder waren in meinen Functions usw. irgendwo ein Fehler drin ?

Meine letzte Frage:
Zu 2) Leider habe ich schon fmincon durchgeschaut und kein Rückgabeargument gefunden. Output und exitflag machen meiner Meinung nach leider keine Angaben darüber. Leider darf ich die Lösung so nicht einsetzen. Es soll so sein, dass wenn ich z.b. die gegebenen Funktionen durch andere Funktionen ersetze, dass mir Matlab dann auch ausspuckt, welche von den Nebenbedingungen als Gleichung erfüllt sind.
Ich wollte zuerst mit if-Befehl arbeiten, doch habe ich da leider versagt.
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.