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

Veränderbare Funktion die zweite

 

psigh
Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.08.2010, 17:28     Titel: Veränderbare Funktion die zweite
  Antworten mit Zitat      
Mein code bis jetzt:

Code:


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 Beispielfunktion
Code:

(x(1)+...+x(i))/(x(1)^2+...+x(i)^2)
 


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

Code:

(x(1)+x(2))/(x(1)^2+x(2)^2)
 


im internen Speicher.




Wenn ich dann z.B. eingebe
Code:

h([1,2])
 

kommt 0.6 raus. Er berechnet also wirklich


Code:

(1+2)/(1^2+2^2)
 




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

Code:

(1+3+8)/(1^2+3^2+8^2)
 

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

Code:

(x(1)+x(2)+x(3))/(x(1)^2+x(2)^2+x(3)^2)
 

angeben


Egal, welches i ich ihm gebe. Deswegen habe ich sowas versucht:

Code:

[x,fval,exitflag]=fmincon(@h,x0,[],[],[],[],[],[])
 



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
Private Nachricht senden Benutzer-Profile anzeigen


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2010, 06:29     Titel:
  Antworten mit Zitat      
wie lautet den der Fehler?

Code:


funktioniert. Also muss es an deinem Aufruf liegen. Ich glaub das @ vor dem h ist schonmal falsch.

Außerdem kannst du auch einfach
Code:

h = @(x) sum(x)/sum(x.^2);
fminsearch(h,[0,0,0])
 

schreiben. Dann must du die länge der Vektoren nicht per hand verändern.
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2010, 12:00     Titel:
  Antworten mit Zitat      
Vielen Dank für die Antworten.

Das

Code:


funktioniert, macht mir hoffnung. Very Happy

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

Code:

(x(1)+x(2)+x(3))/(x(1)^2+x(2)^2+x(3)^2)

unter den Nebenbed.

x(1)+x(2)+x(3)=1
Untergrenze für alle Variablen=0.1
Obergrenze für alle Variablen=1

 


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
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2010, 12:26     Titel:
  Antworten mit Zitat      
Es gibt was neues Very Happy

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2010, 12:37     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2010, 12:42     Titel:
  Antworten mit Zitat      
Code:

x = 0.1:0.01:1;
[xx,yy] = meshgrid(x,x);
z = (xx + yy)./(xx.^2 + yy.^2);
surf(xx,yy,z);
 


ich denke schon, dass das Minimum bei (1,1) ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2010, 12:48     Titel:
  Antworten mit Zitat      
Vielen Dank




Ich jetzt auch (-:


Ich kenne mich mit dem Meshgrid noch nicht so aus.
Was hab ich denn hier falsch gemacht?


Code:

[X,Y] = meshgrid([0.1:0.1:1]);
   Z = (X+Y)/(X^2+Y^2);
surf(X,Y,Z)
 



Ganz davon abgesehen das ich am Plot sofort hätte sehen müssen, dass das nicht die Funktion sein kann, die ich plotten wollte.
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2010, 12:51     Titel:
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2010, 14:15     Titel:
  Antworten mit Zitat      
Code:

   Z = (X+Y)/(X^2+Y^2);
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2010, 18:10     Titel:
  Antworten mit Zitat      
[quote="Thomas84"]
Code:

x = 0.1:0.01:1;
[xx,yy] = meshgrid(x,x);
z = (xx + yy)./(xx.^2 + yy.^2);
surf(xx,yy,z);
 


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

Code:

x = 0.1:0.01:1;
[xx,yy] = meshgrid(x,x);
z = (xx + yy)/(xx^2 + yy^2);
surf(xx,yy,z);
 




sein könnte.


Vielen dank übrigens für den Tip, dass ich gar kein j brauche. Das ist sehr hilfreich.


Dominik
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2010, 19:03     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.08.2010, 06:36     Titel:
  Antworten mit Zitat      
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]
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.08.2010, 12:03     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.08.2010, 12:08     Titel:
  Antworten mit Zitat      
Aber.....


ich habe gerade mal rumprobiert. Vielleicht dürfen beim Startvektor einfach nicht alle Einträge gleich sein.
Private Nachricht senden Benutzer-Profile anzeigen
 
psigh
Themenstarter

Forum-Century

Forum-Century


Beiträge: 118
Anmeldedatum: 16.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2010, 00:00     Titel:
  Antworten mit Zitat      
Wenn man bei Maximum anfängt, kanns ja nicht klappen.....

War totaler Zufall

Dominik
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.