Veränderbare Funktion die zweite
psigh
Forum-Century
Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
Verfasst am : 15.08.2010, 17:28
Titel : Veränderbare Funktion die zweite
Mein code bis jetzt:
Ich habe die Beispielfunktion
in Zähler (f) und Nenner (g) aufgespalten und dann in h zusammengesetzt. In diesem Fall ist i=2. Matlab hat, nachdem ich den Code ins Eingabefenster gepostet habe, also
im internen Speicher.
Wenn ich dann z.B. eingebe
kommt 0.6 raus. Er berechnet also wirklich
Wenn ich i=3 setze und dann den obigen Code ins Eingabefenster Poste
und dann bspw. eingebe h([1,3,8]) erhalte ich 0.1622.
Er berechnet also
Toll. Jetzt ist die Funktion dynamisch und abhängig von i.
Die Sache ist aber, dass ich nichts ausrechnen will, sondern minimieren. Ich möchte für i etwas eingeben und dann soll er für das gegebene i die Funktion minimieren. Für i=3 soll er also das Minimum von
angeben
Egal, welches i ich ihm gebe. Deswegen habe ich sowas versucht:
Das erlaubt Matlab aber nicht. Irgendwie muss das doch gehen )-:
Die Nebenbedingungen hab ich jetzt mal weggelassen und den Startvektor hab ich hier auch nicht hingeschrieben. Es geht ja im Moment nur ums Prinzip.
Wäre super, wenn mir da jemand weiterhelfen könnte.
Vielen Dank,
Dominik
Thomas84
Forum-Meister
Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
Verfasst am : 16.08.2010, 06:29
Titel :
wie lautet den der Fehler?
funktioniert. Also muss es an deinem Aufruf liegen. Ich glaub das @ vor dem h ist schonmal falsch.
Außerdem kannst du auch einfach
schreiben. Dann must du die länge der Vektoren nicht per hand verändern.
psigh
Themenstarter
Forum-Century
Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
Verfasst am : 16.08.2010, 12:00
Titel :
Vielen Dank für die Antworten.
Das
funktioniert, macht mir hoffnung.
Ich fände es toll, wenn sowas klappen würde
Code:
function fullexample
j=2 ;
x0 = 0.5 *ones ( j,1 ) ; %starting vektor [ 0.5 ;0.5 ]
lb = 0.1 *ones ( j,1 ) ; %lower boundaries [ 0.1 ;0.1 ] ;
ub= ones ( j,1 ) ; %upper boundaries [ 1 ;1 ] ;
Aeq= ones ( 1 ,j) ;
beq= 1 ;
[ x,fval,exitflag] =fmincon ( h,x0,[ ] ,[ ] ,[ ] ,[ ] ,lb,ub)
%---------------------------------------------------------
f=@( x) 0 ;
for i=1 :2
f=@( x) f( x) +x( i) ;
end
%----------------------------------------------------------
g=@( x) 0 ;
for i=1 :2
g=@( x) ( ( g( x) ) +x( i) ^2 ) ;
end
%---------------------------------------------------------
h=@( x) f( x) /g( x) ;
Denn ich muss den ganzen Ablauf irgendwie mit "j" steuern können. Wenn ich j=3 habe, dann möchte ich bspw. automatisch das Minimum von
berechnet bekommen. Als Startvektor nehme ich zum Testen einfach mal x0 = 0.5*ones(j,1)
Der Grund, ist das ich immer Funktionen einer bestimmten Bauart habe. Diese lassen sich alle mit einer Schleife aufbauen. Ich hab aber mal 4 Variablen, mal 19, mal 31...
Und ich möchte das natürlich nicht immer alles per Hand eingeben. Deswegen soll die Sache von "j" abhängig gemacht werden.
Vielen Dank,
Dominik
psigh
Themenstarter
Forum-Century
Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
Verfasst am : 16.08.2010, 12:26
Titel :
Es gibt was neues
Wenn ich das hier ins Eingabefenster kopiere, bekomme ich wenigstens mal ein Ergebnis:
Code:
j=2 ;
x0 = 0.5 *ones ( j,1 ) ; %starting vektor [ 0.5 ;0.5 ]
lb = 0.1 *ones ( j,1 ) ; %lower boundaries [ 0.1 ;0.1 ] ;
ub= ones ( j,1 ) ; %upper boundaries [ 1 ;1 ] ;
%Aeq= ones ( 1 ,j) ;
%beq= 1 ;
[ x,fval,exitflag] =fmincon ( h,x0,[ ] ,[ ] ,[ ] ,[ ] ,lb,ub)
%---------------------------------------------------------
f=@( x) 0 ;
for i=1 :2
f=@( x) f( x) +x( i) ;
end
%----------------------------------------------------------
g=@( x) 0 ;
for i=1 :2
g=@( x) ( ( g( x) ) +x( i) ^2 ) ;
end
%---------------------------------------------------------
h=@( x) f( x) /g( x) ;
Ich habe die Bedingung, dass alle Variablen addiert 1 ergeben sollen mal weggelassen. Nur Ober und Untergrenze sind noch da.
Das Ergebnis lautet:
x =
1
1
fval =
1
exitflag =
1
Stimmt also nicht.
Wenn ich die Funktion zwischen 0.1 und 1 plotte, ist das Minimum nicht bei [1;1].
Wenn ich als Startvektor [0,0], also x0 = zeros(j,1); nehme kommt raus:
x =
NaN
NaN
fval =
NaN
exitflag =
0
Wenn ich Aeq und beq einschalte bekomme ich übrigens auch Ergbnisse, die zu den Nebenbedingungen passen.
Also es läuft schonmal durch (was super ist),aber irgendwo stimmt da noch etwas nicht.
Vielen Dank,
Dominik
Dominik
Zuletzt bearbeitet von psigh am 16.08.2010, 12:37, insgesamt einmal bearbeitet
Thomas84
Forum-Meister
Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
Verfasst am : 16.08.2010, 12:37
Titel :
Code:
function fullexample
j=2 ;
x0 = 0.5 *ones ( j,1 ) ; %starting vektor [ 0.5 ;0.5 ]
lb = 0.1 *ones ( j,1 ) ; %lower boundaries [ 0.1 ;0.1 ] ;
ub= ones ( j,1 ) ; %upper boundaries [ 1 ;1 ] ;
Aeq= ones ( 1 ,j) ;
beq= 1 ;
f=@( x) 0 ;
for i=1 :2
f=@( x) f( x) +x( i) ;
end
%----------------------------------------------------------
g=@( x) 0 ;
for i=1 :2
g=@( x) ( ( g( x) ) +x( i) ^2 ) ;
end
%---------------------------------------------------------
h=@( x) f( x) /g( x) ;
[ x,fval,exitflag] =fmincon ( h,x0,[ ] ,[ ] ,[ ] ,[ ] ,lb,ub)
%---------------------------------------------------------
Das funktioniert doch. Allerdings ist das mit den Funktionen unnötig kompliziert.
Code:
j=2 ;
x0 = 0.5 *ones ( j,1 ) ; %starting vektor [ 0.5 ;0.5 ]
lb = 0.1 *ones ( j,1 ) ; %lower boundaries [ 0.1 ;0.1 ] ;
ub= ones ( j,1 ) ; %upper boundaries [ 1 ;1 ] ;
h = @( x) sum ( x) /sum ( x.^2 ) ;
[ x,fval,exitflag] =fmincon ( h,x0,[ ] ,[ ] ,[ ] ,[ ] ,lb,ub)
liefert das gleiche Ergebnis.
Thomas84
Forum-Meister
Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
Verfasst am : 16.08.2010, 12:42
Titel :
ich denke schon, dass das Minimum bei (1,1) ist.
psigh
Themenstarter
Forum-Century
Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
Verfasst am : 16.08.2010, 12:48
Titel :
Vielen Dank
Ich jetzt auch (-:
Ich kenne mich mit dem Meshgrid noch nicht so aus.
Was hab ich denn hier falsch gemacht?
Ganz davon abgesehen das ich am Plot sofort hätte sehen müssen, dass das nicht die Funktion sein kann, die ich plotten wollte.
psigh
Themenstarter
Forum-Century
Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
Verfasst am : 16.08.2010, 12:51
Titel :
Code:
j=2 ;
x0 = 0.5 *ones ( j,1 ) ; %starting vektor [ 0.5 ;0.5 ]
lb = 0.1 *ones ( j,1 ) ; %lower boundaries [ 0.1 ;0.1 ] ;
ub= ones ( j,1 ) ; %upper boundaries [ 1 ;1 ] ;
h = @( x) sum ( x) /sum ( x.^2 ) ;
[ x,fval,exitflag] =fmincon ( h,x0,[ ] ,[ ] ,[ ] ,[ ] ,lb,ub)
liefert das gleiche Ergebnis.[/quote]
Hier verstehe ich nochwas nicht. An welcher stelle wird den der Summe mitgeteilt, bis wohin sie laufen soll?
Thomas84
Forum-Meister
Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
Verfasst am : 16.08.2010, 14:15
Titel :
hier fehlen die Punkte für die elementweise Ausführung der Operationen.
Zitat:
An welcher stelle wird den der Summe mitgeteilt, bis wohin sie laufen soll?
Mit sum summiert man automatisch über den gesamten Vektor. Die Länge des Vektors wird durch die Länge des Startwert x0 festgelegt.
psigh
Themenstarter
Forum-Century
Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
Verfasst am : 16.08.2010, 18:10
Titel :
[quote="Thomas84"]
Ich gebe ehrlich zu, dass ich hier nicht verstehe was "elementweise" bedeutet. x und y sind doch Variablen und keine Vektoren. Hab da gerade ein Brett vor dem Kopf.
ich sehe gerade syntxmäßig nicht was der Unterschied zwischen dem obigen und
sein könnte.
Vielen dank übrigens für den Tip, dass ich gar kein j brauche. Das ist sehr hilfreich.
Dominik
psigh
Themenstarter
Forum-Century
Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
Verfasst am : 16.08.2010, 19:03
Titel :
Ich bin drauf gekommen, warum man das so schreiben muss, denke ich.
Eine Frage habe ich noch.
Das Ergbnis, welches zu diesem Code
Code:
function fullexample
j=2 ;
x0 = 0.5 *ones ( j,1 ) ; %starting vektor [ 0.5 ;0.5 ]
lb = zeros ( j,1 ) ; %lower boundaries [ 0 ;0 ] ;
ub= ones ( j,1 ) ; %upper boundaries [ 1 ;1 ] ;
Aeq= ones ( 1 ,j) ;
beq= 1 ;
f=@( x) 0 ;
for i=1 :j
f=@( x) f( x) +x( i) ;
end
%----------------------------------------------------------
g=@( x) 0 ;
for i=1 :j
g=@( x) ( ( g( x) ) +x( i) ^2 ) ;
end
%---------------------------------------------------------
h=@( x) f( x) /g( x) ;
[ x,fval,exitflag] =fmincon ( h,x0,[ ] ,[ ] ,Aeq,beq,lb,ub)
ausgegeben wird lautet:
x =
0.5000
0.5000
fval =
2
exitflag =
1
Das stimmt aber nun wirklich nicht. Bspw. mit x(1)=0.1 und x(2)=0.9 bekommt man was kleineres hin.
Wo ist da der Fehler?
Vielen Dank,
Dominik
Thomas84
Forum-Meister
Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
Verfasst am : 17.08.2010, 06:36
Titel :
Zitat:
Ich gebe ehrlich zu, dass ich hier nicht verstehe was "elementweise" bedeutet. x und y sind doch Variablen und keine Vektoren. Hab da gerade ein Brett vor dem Kopf.
Um die Funktion zu zeichnen muss man erstmal eine Wertetabelle aufstellen. Dazu definiert man die Matrizen xx und yy. Diese muss man dann elementweise multiplizieren ( z(m,n) = x(m,n)*y(m,n) ). Dazu schreibt man vor jede Operation einen Punkt.
Code:
j=2 ;
Aeq= ones ( 1 ,j) ;
beq= 1 ;
x0 = 0.5 *ones ( j,1 ) ; %starting vektor [ 0.5 ;0.5 ]
lb = 0.1 *ones ( j,1 ) ; %lower boundaries [ 0.1 ;0.1 ] ;
ub= ones ( j,1 ) ; %upper boundaries [ 1 ;1 ] ;
h = @( x) sum ( x) /sum ( x.^2 ) ;
[ x,fval,exitflag] =fmincon ( h,x0,[ ] ,[ ] ,Aeq,beq,lb,ub)
[ x,fval,exitflag] =fmincon ( h,[ 0.499 ,0.501 ] ,[ ] ,[ ] ,Aeq,beq,lb,ub)
x = [0.5,0.5] ist glaub ich sogar das Maximum. Wenn man die Anfangswerte verändert findet fmincon dann das richtige Minimum.
[/quote]
psigh
Themenstarter
Forum-Century
Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
Verfasst am : 17.08.2010, 12:03
Titel :
Vielen Dank für Deine Antwort.
Stimmt. Mit Deinen Werten kommt man auf [0.1,0.9]. Wobei ich jetzt immer noch nicht sagen kann, ob das das globale Minimum ist.
Das blöde für mich ist jetzt, dass ich nicht mit den Startwerten rumspielen kann, weil im Idealfall alle möglichen Funktionen automatisch minimiert werden.
Kann man nicht irgendwie etwas besseres als fmincon benutzen?
Dominik
psigh
Themenstarter
Forum-Century
Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
Verfasst am : 17.08.2010, 12:08
Titel :
Aber.....
ich habe gerade mal rumprobiert. Vielleicht dürfen beim Startvektor einfach nicht alle Einträge gleich sein.
psigh
Themenstarter
Forum-Century
Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
Verfasst am : 18.08.2010, 00:00
Titel :
Wenn man bei Maximum anfängt, kanns ja nicht klappen.....
War totaler Zufall
Dominik
Einstellungen und Berechtigungen
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
| 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.