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

Problem mit "nonlcon" von "fmincon"

 

M@x
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 27.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2015, 10:44     Titel: Problem mit "nonlcon" von "fmincon"
  Antworten mit Zitat      
Hallo Leute Smile,

ich bin gerade über meiner Abschlussarbeit mit Matlab. Ich komme gerade leider nicht mit "nonlcon" von "fmincon" zurecht.

Das ist meine Zielfunktion:

Z=∑((u_r+Ri_r-Xi_i )^2+(u_i+Xi_r+Ri_i )^2-U^2 )^2

mit folgenden Nebenbedingungen

R>0
X>0
0.9≤U≤1.1 bei p.u.
5≤ X/R≤20

soweit so gut, ich bekomme die Nebenbedingung "5≤ X/R≤20" nicht hin.

Code:
%Hier ein Ausschnitt aus meinem Programm:
%lb und ub für "fmincon" definieren
lbl = [0 0 0.9];
ubl = [Inf Inf 1.1];

%Berechnung der Lastszenarien
    myObj = @(x)myLast(ur,ui,ir,ii,x);                                            
    [x,fval] = fmincon(myObj,[1 1 1.0],[],[],[],[],lbl,ubl,@nonlcon,options);
    R = x(1);
    X = x(2);
    U = x(3);
 


Code:
%mit folgenden Funktionen
function Z = myLast(ur,ui,ir,ii,x)
    Z = 0;
    rb = x(1);
    xb = x(2);
    ubn = x(3);
    for i=1:11
        urb = ur(i);
        uib = ui(i);
        irb = ir(i);
        iib = ii(i);
        A = (urb+rb*irb-xb*iib)^2+(uib+xb*irb+rb*iib)^2-ubn^2;
        Z = Z + A^2;
    end
end


function [c,ceq] = nonlcon(x)
        c = x(2)/x(1);
        ceq = [];
end
 


Könntet ihr mir vielleicht mit nonlcon helfen? Verstehe nicht wie man ihm die Grenzen gibt. Ohne die Ungleichung bekomme ich schon eine Berechnung, aber diese ist nicht zufriedenstellend.

[/b]
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: 27.05.2015, 10:57     Titel:
  Antworten mit Zitat      
Hallo,

die nichtlinearen Ungleichungen müssen in der Form <= 0 angegeben werden. Die Bedingung 5≤ X/R≤ 20 wird dann zu

1. X/R - 20 ≤ 0
2. -X/R + 5 ≤ 0

Da R > 0, könnte man das aber natürlich auch leicht in lineare Ungleichungen umformen:
1. X - 20*R ≤ 0
2. -X + 5*R ≤ 0


Bei der Zielfunktion sollte man übrigens ohne for-Schleife auskommen können. Auf Anhieb würde ich sagen:

Code:
Z = sum( ( (ur+rb*ir-xb*ii).^2+(ui+xb*ir+rb*ii).^2-ubn.^2 ).^2 );  


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
M@x
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 27.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2015, 11:08     Titel:
  Antworten mit Zitat      
Danke Harald Smile ,

dein Tipp mit sum funktioniert!

aber das nonlcon bekomme ich immer noch nicht hin? Ich habe es jetzt so geschrieben. Aber es gibt nur Fehlermeldungen.

Code:

function [c] = nonlcon(x)

c(1) = x(2)/x(1) - 20 <= 0;
c(2) = -x(2)/x(1) + 5 <= 0;

end
 
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: 27.05.2015, 11:12     Titel:
  Antworten mit Zitat      
Hallo,

das <= 0 musst du weglassen, da das implizit so aufgefasst wird. Zudem muss das ceq erhalten bleiben. Also so:

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

c(1) = x(2)/x(1) - 20;
c(2) = -x(2)/x(1) + 5;

ceq = [];

end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
M@x
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 27.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2015, 11:19     Titel:
  Antworten mit Zitat      
Hallo,

habe ich jetzt so gemacht und bekomme trotzdem die Fehlermeldung:

Error using optimfcnchk/checkfun (line 333)
User function 'myNonlcon' returned Inf or -Inf when evaluated;
FMINCON cannot continue.

Error in nlconst (line 754)
[nctmp,nceqtmp] = feval(confcn{3},x,varargin{:});

Error in fmincon (line 748)
[X,FVAL,LAMBDA,EXITFLAG,OUTPUT,GRAD,HESSIAN]=...

Error in Kurzschlussszenario (line 5Cool
[x,fval] = fmincon(myObj,[1 1 1.0],[],[],[],[],lbl,ubl,@myNonlcon,options);

Code:

%Berechnung der Lastszenarien
    myObj = @(x)myLast(ur,ui,ir,ii,x);
    [x,fval] = fmincon(myObj,[1 1 1.0],[],[],[],[],lbl,ubl,@myNonlcon,options);
    R = x(1);
    X = x(2);
    U = x(3);

function [c,ceq] = myNonlcon(x)

c(1) = x(2)/x(1) - 20;
c(2) = -x(2)/x(1) + 5;

ceq = [];

end

 
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: 27.05.2015, 11:23     Titel:
  Antworten mit Zitat      
Hallo,

bitte nochmal den kompletten momentanen Code.
Ansonsten wie gesagt: man kann das auch als lineare Ungleichungen umsetzen. Das dürfte effizienter sein und das augenscheinliche Problem bei R = 0 lösen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
M@x
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 27.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2015, 11:26     Titel:
  Antworten mit Zitat      
Das ist der ganze Code, siehst du einen Fehler in der Funktion? Die linearen Begrenzungen wurden ja schon verwendet.

Code:


%Aufgabe Programm: Kurzschlussszenario

%ermittelte Daten von Powerfactory einlesen
u_PF = xlsread('Ergebnisse Berechnung Powerfactory','Tabelle1','J3:J13');
i_PF  = xlsread('Ergebnisse Berechnung Powerfactory','Tabelle1','K3:K13');
Uwin_PF = xlsread('Ergebnisse Berechnung Powerfactory','Tabelle1','L3:L13');
Iwin_PF = xlsread('Ergebnisse Berechnung Powerfactory','Tabelle1','M3:M13');

%Variablen erstellen
uk = zeros(11,1);
ik = zeros(11,1);
ur = zeros(11,1);
ui = zeros(11,1);
ir = zeros(11,1);
ii = zeros(11,1);
Urad_PF = zeros(11,1);
Irad_PF = zeros(11,1);

%lb und ub für "fmincon" definieren
lbl = [0 0 0.9];
ubl = [Inf Inf 1.1];

%options für "fmincon" definieren
options   = optimoptions(   @fmincon,                                               ...
                            'Algorithm',                'active-set',               ...
                            'Display',                  'iter-detailed',            ...
                            'Diagnostics',              'on',                       ...
                            'FunValCheck',              'on',                       ...
                            'MaxFunEvals',              1e10,                       ...
                            'TolCon',                   1e-20,                      ...
                            'TolFun',                   1e-20,                      ...                        
                            'TolX',                     1e-20,                      ...
                            'AlwaysHonorConstraints',   'bounds',                   ...
                            'MaxIter',                  60,                        ...
                            'PlotFcns',                 @optimplotfval          );
                       
%Betrag und Phase in Komplex umbrechnen
for i=1:11
    Urad_PF(i) = Uwin_PF(i)*pi/180;                                         %Winkel in rad umrechen
    Irad_PF(i) = Iwin_PF(i)*pi/180;
    uk(i) = u_PF(i)*exp(1i*Urad_PF(i));                                     %Realteil und Imaginärtiel berechnen
    ik(i) = i_PF(i)*exp(1i*Irad_PF(i));
   
    ur(i) = real(uk(i));                                                    %Real und Imaginärteil filtern
    ui(i) = imag(uk(i));
    ir(i) = real(ik(i));
    ii(i) = imag(ik(i));
end

%Berechnung der Lastszenarien
    myObj = @(x)myLast(ur,ui,ir,ii,x);
    [x,fval] = fmincon(myObj,[1 1 1.0],[],[],[],[],lbl,ubl,@myNonlcon,options);
    R = x(1);
    X = x(2);
    U = x(3);

 


Code:
%die beiden Funktionen

function Z = myLast(ur,ui,ir,ii,x)
    Z = 0;
    rb = x(1);
    xb = x(2);
    ubn = x(3);
    Z = sum( ( (ur+rb*ir-xb*ii).^2+(ui+xb*ir+rb*ii).^2-ubn.^2 ).^2 );  
    end

    function [c,ceq] = myNonlcon(x)

    c(1) = x(2)/x(1) - 20;
    c(2) = -x(2)/x(1) + 5;

    ceq = [];

    end
 
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: 27.05.2015, 12:45     Titel:
  Antworten mit Zitat      
Hallo,

es ging mir darum, das Problem zu reproduzieren. Das ginge aber nur mit den Daten.

Zitat:
Die linearen Begrenzungen wurden ja schon verwendet.

Damit meinst du vermutlich die Schrankenbedingungen. Ich meine aber, dass du die momentanen nichtlinearen NB wie beschrieben als lineare umschreiben und dann als A und b an fmincon übergeben kannst.

Grüße,
Harald

Hinweise:
- wenn du alle benötigten Daten aus der Excel-Tabelle auf einmal ausliest und denn per Indizierung aufspaltest, sollte es deutlich schneller gehen
- auch die for-Schleife unter "%Betrag und Phase in Komplex umbrechnen " ist unnötig.
Private Nachricht senden Benutzer-Profile anzeigen
 
M@x
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 27.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2015, 12:54     Titel:
  Antworten mit Zitat      
Das sind die Daten, ich weiß nicht was man unten noch ändern könnte. Habe gerade mit meinem Betreuer gesprochen und er möchte es mit der Ungleichung gelöst haben :/ ...

u_Pf= [0.950000000000000;
0.950000000000000;
0.950000000000000;
0.950000000000000;
0.960000000000000;
0.960000000000000;
0.960000000000000;
0.960000000000000;
0.970000000000000;
0.970000000000000;
0.970000000000000];

i_Pf=[0.940000000000000;
0.910000000000000;
0.880000000000000;
0.860000000000000;
0.830000000000000;
0.800000000000000;
0.780000000000000;
0.750000000000000;
0.730000000000000;
0.700000000000000;
0.670000000000000];

IwinPF=[-13.5800000000000;
-13.3500000000000;
-13.1200000000000;
-12.9000000000000;
-12.6800000000000;
-12.4600000000000;
-12.2400000000000;
-12.0200000000000;
-11.8000000000000;
-11.5900000000000;
-11.3700000000000];

UwinPF=[-40.0900000000000;
-39.8500000000000;
-39.6100000000000;
-39.3600000000000;
-39.1200000000000;
-38.8900000000000;
-38.6500000000000;
-38.4100000000000;
-38.1800000000000;
-37.9500000000000;
-37.7200000000000];
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: 27.05.2015, 12:58     Titel:
  Antworten mit Zitat      
Hallo,

es spricht ja auch nichts dagegen, die Ungleichungen zu berücksichtigen.

Ich möchte lediglich darauf hinaus, dass man die Ungleichungen als lineare Ungleichungen angeben kann und sollte. Warum soll man die Ungleichungen in der allgemeinen Form c(x) <= 0 angeben, wenn man sie in linearer Form A*x <= b angeben kann?

Mit den Daten schaue ich es mir später noch an.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
M@x
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 27.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.05.2015, 13:45     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe den Fehler gefunden. Vielen Dank für deine Hilfe!!!

Das Problem lag bei der unteren linearen Grenze.

habe diese so geändert:

Code:

%lb und ub für "fmincon" definieren
lbl = [0.00001 0.00001 0.9];
ubl = [Inf Inf 1.1];
 


Durch die beiden 0en ist das Problem mit Inf bzw -Inf aufgetreten.

Das Programm an sich hat gepasst.

Danke und bis bald Smile

Grüße
Max
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.