Ich hab auch nur eine kurze Frage zu den Nebenbedingungen. Ich möchte gerne eine dreidimensionale Matrix M in die Funktion übergeben und eine weitere Nebenbedingung hinzufügen.
Die Berechnung und Nebenbedingung soll so aussehen (oder schöner (-:
das wäre eine nichtlineare Nebenbedingung, die als weiteres Argument (Function Handle, ähnlich wie die Zielfunktion) an fmincon übergeben werden muss.
Bist du zudem sicher, dass sich deine Zielfunktion nicht schöner hinschreiben lässt? Sieht nach x'*M*x für eine Matrix M aus.
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 ;)
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 ;)
h=@(x)0;
for i=1:(j-1) for p=(i+1):j
h=@(x)(h(x)+2*x(i)*x(p)*datenvektor{1,k}{3,1}(i,p));
end end
%----------------------------------------------------------
ich verstehe deine Frage nicht.
Was bei deinem Code aber sehr gefährlich ist:
i ist zugleich ein Handle auf die Zielfunktion und eine Laufvariable. Dein Aufruf von fmincon wird also scheitern.
Ich würde f, g, h und das Function Handle i jeweils in Unterfunktionen (subfunctions) definieren, um Konstruktionen wie f = @(x) 0 zu umgehen. Anonyme Function Handles sind ja eben in erster Linie für Funktionen gedacht, die in einer Zeile beschreibbar sind.
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 ;)
h=@(x)0;
for i=1:(j-1) for p=(i+1):j
h=@(x)(h(x)+2*x(i)*x(p)*datenvektor{1,k}{3,1}(i,p));
end end
%----------------------------------------------------------
Ich muss wirklich nurnoch diese Nebenbedingung rein bekommen.UNd da hatte ich anfangs gedacht, dass es doch wphl am einfachsten wäre, wenn ich diese auch in dem Minimierungsfile zusammensetzten würde. Dann hätte ich alles schön kompakt.
Code:
f=@(x)0;
for i=1:j
for p=1:j
for q=1:j
f=@(x)(f(x)+(x(i)*x(p)*x(q)*koschiefe(i,p,q)));
end end end
Ich habe jetzt im Netz schon einige BEispiele angesehen. Ich glaube es wäre alles kein Problem, wenn die Nebenbedingung immer gleich aussehen würde. Aber man sieht ja, dass die Anzahl der x von j abhängt. DIe Größe der Funktion ändert sich also. Diese Minimierung ist ja in ein größeres Programm eingebunden. Und ich brauche manchmal eben 2 x und beim anderen mal vielleicht 23 x.
Ich habe auch schon versucht ein eigenes File für diese Nebenbedingung zu schreiben, aber das hat nicht geklappt.
Du solltest in deiner Funktion confun weg von den Function Handles. Zumindest aber muss c am Ende als numerischer Wert zurückgegeben werden. Außerdem fehlt dir die 0.03.
ceq muss auf [] gesetzt 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 ;)
Ich muss zugeben, dass ich mich langsam etwas im Kreis drehe. Muss ich denn unbedingt ein neues File für die Nebenbedingung machen? In dem ersten von mir geposteten File habe ich sie ja einfach in das Minimierungsfile geschrieben. Wenn ich ein neues File machen muss, wo muss ich dann die Matrix und j übergeben?
DIe Idee mit den Funktion Handles kommt aus einer Frage, die ich mal hier im Forum gestellt habe. Ich weiß einfach nicht, wie ich sonst die Funktion dynamisch zusammenbauen soll. Es klappt ja auch.
ich verliere hier zugegebenermaßen langsam den Überblick.
Es muss kein separates File sein, ich würde aber Unterfunktionen verwenden.
Irgendwas (was?) klappt ja nun anscheinend doch noch nicht?
Könntest du nochmal den aktuellen Stand anhängen, falls es eine Funktion ist auch mit einem Beispielaufruf? Ich habe heute tagsüber nicht die Zeit, aber ich werde mir das dann heute abend oder morgen nochmal genauer ansehen.
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 ;)
h=@(x)0;
for i=1:(j-1) for p=(i+1):j
h=@(x)(h(x)+2*x(i)*x(p)*datenvektor{1,k}{3,1}(i,p));
end end
%----------------------------------------------------------
Wie man in der letzten Zeile sieht, ist jetzt ist meine neue Idee, die Parameter j und koschiefe durchzureichen an confun. ICh muss ja irgendwie diese beiden Sachen mit confun verbinden. SO gehts auf jeden Fall nicht. Ich hab in der Funktion confun jetzt ohne Handles gearbeitet. Wenn das so klappt frage ich miich, warum ich es nicht immer so gemacht habe. Aber das hatte irgendeinen Grund, warum´ich die gebraucht habe (-:
Confun sieht jetzt so aus. c soll größer als 0.3 sein. Ich hatte mich da vertan.
h=@(x)0;
for i=1:(j-1) for p=(i+1):j
h=@(x)(h(x)+2*x(i)*x(p)*datenvektor{1,k}{3,1}(i,p));
end end
%----------------------------------------------------------
h=@(x)0;
for i=1:(j-1) for p=(i+1):j
h=@(x)(h(x)+2*x(i)*x(p)*datenvektor{1,k}{3,1}(i,p));
end end
%----------------------------------------------------------
ich geh mal davon aus, dass die letzte Variante jetzt die ist, die ich mir dann anschauen sollte.
Zwei Fragen dazu:
- kannst du Testdaten zur Verfügung stellen, damit ich das ganze wirklich mal laufen lassen kann?
- insbesondere falls nicht: gibt es Fehlermeldungen? welche? inwiefern ist das Resultat nicht wie erwartet?
Grüße,
Haraöd
_________________
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 ;)
h=@(x)0;
for i=1:(j-1) for p=(i+1):j
h=@(x)(h(x)+2*x(i)*x(p)*datenvektor{1,k}{3,1}(i,p));
end end
%----------------------------------------------------------
Warning: Trust-region-reflective algorithm does not solve this type of problem,
using active-set algorithm. You could also try the interior-point or sqp
algorithms: set the Algorithm option to 'interior-point' or 'sqp' and rerun. For more help, see Choosing the Algorithm in the documentation.
> In fmincon at 472
In mark_opt at 34 Warning: Colon operands must be real scalars.
> In mark_opt>mycon at 41
In fmincon at 654
In mark_opt at 34 Warning: Colon operands must be real scalars.
> In mark_opt>mycon at 41
In finitedifferences at 142
In nlconst at 321
In fmincon at 758
In mark_opt at 34
Ob das jetzt Warnungen sind, die ich ignorieren kann, weiß ich nicht.
Er hat noch Probleme, mit "j". Warum auch immer. Ich hatte mir gedacht, dass er j und koschiefe jetzt schon kennt, weil sie ganz oben übergeben werden. Anscheinend ist es aber nicht so.
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
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.