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

Nebenbedingung fmincon erzeugt fehler

 

Hanspeter

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2012, 08:59     Titel: Nebenbedingung fmincon erzeugt fehler
  Antworten mit Zitat      
Hallo,
ich bin gerade an einer optimierungsaufgabe per fmincon mit einer Nebenbedingung. Leider kriege ich die Nebenbedingung nicht hin und verstehe nicht wieso er es nicht macht.
Meine Funktion lautet:
Code:

function f = myfun(x)
global i;
global C2;
global C3;
global p11;
global p12;
global p13;
global u1;
global ui1;

C2(i)=x(1);
C3(i)=x(2);

ui1(i) = u1(i) - (C2(i)*p12(i)+C3(i)*p13(i));

corrd1 =( xcov(ui1,p11,'biased')/(var(ui1)*var(p11))^0.5) ;

f=(corrd1(435)+corrd1(444)); % Sollen minimal werden
end
 

so nun lautet meine Nebenbedingung:
Code:

function  [c,ceq] = nonlcon(x)
global i;
global u1;
global p11;
global p12;
global p13;

if p11(i) > 0
    c=(x(1)*p12(i)+x(2)*p13(i)) + u1(i);
else
    c=(x(1)*p12(i)+x(2)*p13(i)) - u1(i);
end

ceq=[];
 


also ich möchte das wenn die werte von p11 >0 sind das
x1*p12+x2*p13 >u1 ist und umgekehrt.

hiernochmal mein aufruf mit fmincon:
Code:

ub=[1;1];
lb=[0;0];
x0=[0;0];


for (i=1:430)
    [x,fval] = fmincon(@myfun,x0,[],[],[],[],lb,ub,@nonlcon)
end
 


Das Problem das ich jetz habe ist das er die Nebenbedingung zwar irgendwie anerkennt und etwas ändert aber nicht richtig. Die Nebenbedingung wird nicht erfüllt außerdem ignoriert er plötzlich den lower und upper bound und gibt mir x werte raus die negativ sind obwohl das gar nicht möglich sein sollte?

weiß vll jemand wo mein Fehler liegt? Ich glaube da stimmt noch irgendwas nicht in der Nebenbedingung


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.05.2012, 09:12     Titel:
  Antworten mit Zitat      
Hallo,

in der jetzigen Form wird deine NB nur für eine Komponente (die i-te) von p11 angewendet. Ist das so gedacht? Zudem schreibst du, dass die NB auch im Umkehrschluss erfolgen soll.

Nebenbedingungen werden nur mit einer gewissen Toleranz erfüllt. Diese Toleranz kannst du mit optimset über die Option tolcon anpassen.

Und bitte versuche doch, die globalen Variablen zu vermeiden.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2012, 09:41     Titel:
  Antworten mit Zitat      
Hallo,
Ja das mit der i´ten Komponente ist so gedacht da ich 430 mal optimiere und alle werte die Nebenbedingung erfüllen müssen. Im Umkehrschluss würde es bedeuten das p11 <=0 ist in diesem fall habe ich x1*p12+x2*p13 <u1. Ich werde mir das mit der toleranz mal ansehen.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.05.2012, 09:43     Titel:
  Antworten mit Zitat      
Hallo,

auch ein Hinweis: in deiner Hauptfunktion überschreibst du x und fval in jeder Iteration. Das erscheint mir nicht sinnvoll.

Die Frage ist auch: selbst wenn du die x-Werte und fval-Werte in Vektoren abspeicherst, bekommst du je 430 davon. Was willst du dann mit denen machen?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2012, 10:59     Titel:
  Antworten mit Zitat      
hallo,
die Funktionswerte fval benötige ich nicht unbedingt, und die x Werte sind sozusagen gespeichert in C1 und C2. Mein Ziel ist es die Kreuzkorrelation in den punkten 435 und 444 zu maximieren. Mit den gepsicherten C werten lässt sich jetz die Kreuzkorrelation berechnen und diese ist auch maximal in den punkten nur stimmt die Nebenbedingung noch nicht ganz.
 
Harald
Forum-Meister

Forum-Meister


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

ich sehe gerade, dass deine Umsetzung der NB nicht mit dem zusammenpasst, was du im Text schreibst.

Du möchtest beispielsweise
x1*p12+x2*p13 >u1
Dann musst du das in < 0 umformen, also
-(x1*p12+x2*p13) + u1 < 0
Im Code muss das dann so aussehen, nur ohne < 0.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2012, 13:25     Titel:
  Antworten mit Zitat      
Hallo,
Danke für die Hilfe hat geholfen, verstehe jetz auch wieso der bound/Nebenbedingung nicht immer eingehalten wird.
Es gibt Werte bei denen es nicht möglich ist das x1>0 x2>0 und das die Nebenbedingung eingehalten wird. Bei diesen Werten erhalte ich dann negative Werte.
 
Harald
Forum-Meister

Forum-Meister


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

du solltest dir bei fmincon auch das Rückgabeargument exitflag ansehen. Auf die Weise findest du heraus, wenn beispielsweise kein Punkt gefunden werden konnte, der alle NB erfüllt, und deswegen einer zurückgegeben wird, der sie nicht erfüllt.

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