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

Maxima/ Minima einer Funtion z(x,y) sowie h(x)??

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2007, 05:03     Titel: Maxima/ Minima einer Funtion z(x,y) sowie h(x)??
  Antworten mit Zitat      
Hallo!

Folgendes Problem: Feststellen eines Maximums mit der fminbnd Funktion ?

Bis jetzt habe ich:
Die Oberflächen Funktion beschrieben durch z(x,y) = z = 30x*sin^2(0.5(x-y)), sowie die Funktion h(x) = h = 30x*sin^2(0.5(2x-10))
sind geplottet mit der mesh Funktion im Bereich von 0 <= x <= 10 und 0 <= y <= 10.
Das sieht dann folgendermaßen aus, die Funktion z ergibt im Plot eine Oberfläche die von einer Linie h durchquert wird.
Mein Programm dazu sieht so aus:
Code:

clear
l = 0:0.2:10; % "Intervalllänge"
b = 0:0.2:10; % "Intervallbreite"
[x y] = meshgrid(l,b); % gridspacing 0.2km in x,y directionl,0 - 10km
z = 30.*x.*(sin(0.5.*(x -y))).^2;
mesh(x,y,z)
hold on
y = 10 -x;
h = 30.*x.*(sin(0.5.*(x -y))).^2;
surf(x,y,h)
hold off
xlabel('x')
ylabel('y')
zlabel('z')
title('graph of z(x,y) = 30x*sin^2(0.5(x-y)) and h(x,y) = 30x*sin^2(0.5(2x-10))')
 


Wie kann ich jetzt mit der fminbnd Funktion das Maximum von h feststellen, und die x,y, z Koordinaten ausgeben?
Die Hilfe Funktion zeigt mir einiges an, doch ich kann es nicht umsetzten oder anweden!

Danke für eure Hilfe.
Sebastian[/code]


Michaela
Forum-Century

Forum-Century


Beiträge: 239
Anmeldedatum: 12.07.07
Wohnort: ---
Version: bis 2007b
     Beitrag Verfasst am: 16.09.2007, 17:45     Titel:
  Antworten mit Zitat      
Hallo Sebastian,

die fminbind funktion funktioniert etwas anders: sie sucht nicht das Minimum einer Matrix, sondern einer aufzurufenden Funktion. Zuallererst musst Du dir also einen Funktionsaufruf schreiben, der den Wert von h(x,y) zurückliefert. DUmmerweise sucht die Funktion aber immer das Minimum. Also entweder du berechnest das Minimum von -h(x,y) oder überlegst Dir ob du den Wert des Maximums angegeben kannst minimiere(h(x,y) - Maximum) == 0.

Es stellt sich aber folgendes Problem Du suchst das Maximum in Abhängigkeit von X und Y, aber für eingeschränkte Werte von X und Y. Genau diese Einschränkung der zu variierenden Parameter ist aber in Matlab nicht möglcih (vgl auch mein Post zu Daten fitten mit Matlab), und du bist auf Routinen im FileExchange angewiesen....

Daher meine Frage: was willst du denn genau? Um das Maxium des Grids zu finden kommst Du vermutlihc mit [wert,ind] = max(h) am weitesten, und kannst den Wert von ind dann mittels sub2ind in den entsprechenden MAtrixeintrag und damit die Koordinate X und Y in deinem Grid ausrechnen.

Ansonsten ist es vermutlich sinnvoller gleich die Nullstellen der Ableitung zu prüfen, wenn die FUnktion analytishc bekannt und ableitbar ist.

hth,

Michaela
_________________

---------------------------------------------------------------
Leider habe ich daheim zwar Internet aber kein Matlab - daher sind alle Syntaxbeispiele circa Angaben.....
Private Nachricht senden Benutzer-Profile anzeigen
 
Sebastian

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2007, 18:39     Titel:
  Antworten mit Zitat      
Hallo Michaela!

Danke für deine schnelle Antwort!
Es sollte abe irgendwie über die fminbnd Funktion gehen, da die Fragestellung explizit auf diese Funktion verweist.
Die Fkt h(x) ist ja nur von einer Variablen x abhängig und wird auch im Plot der ja dreidimensional ist als Strich, also als 2-D Fkt dargestellt.
Das die fminbnd Fkt das minimum sucht ist mir bekannt, ich kann ja die Fkt mit h(x) = -h(x) spiegeln und so minimas zu maximas - und umgekehrt machen!
Die Fkt z(x,y) kann ich mit fminbnd eh nicht untersuchen, da fminbnd doch nur für Fkt mit einer Variablen sind!
Aber was mainst du mit Funktionsaufruf?
Unterprogramm, Subroutine?

Per Hand würde ich h(x) ableiten, zu 0 setzen und anschliessend wieder einsetzen! Hier habe ich ja dann noch y = 10 -x, somit kann ich doch y auch berechnen, oder höngt meine Logic gerade?
Aber so muss es doch gehen?!!
Kann MatLab eigentlich ableiten?
Ich habe den Plot mal angehängt und hoffe man kann den hier erkennen.
Das Maxima sollte bei x ? 9.5, y ? 1 und z ? 300 liegen, aus dem Bild abgeschätzt!

Sebastian

ass15b.png
 Beschreibung:

Download
 Dateiname:  ass15b.png
 Dateigröße:  5.75 KB
 Heruntergeladen:  2676 mal
 
Michaela
Forum-Century

Forum-Century


Beiträge: 239
Anmeldedatum: 12.07.07
Wohnort: ---
Version: bis 2007b
     Beitrag Verfasst am: 17.09.2007, 05:21     Titel:
  Antworten mit Zitat      
Sebastian hat Folgendes geschrieben:
Es sollte abe irgendwie über die fminbnd Funktion gehen, da die Fragestellung explizit auf diese Funktion verweist.

Hmm zum Hausaufgabenlösen ist dieses Forum eigentlich nicht gedacht...

Sebastian hat Folgendes geschrieben:
Die Fkt h(x) ist ja nur von einer Variablen x abhängig und wird auch im Plot der ja dreidimensional ist als Strich, also als 2-D Fkt dargestellt.

Hmm man kann es aber auch alsEbene interpretieren oder? Irgendwie verstehe ich es noch nicht so ganz. Das Maximum von h ist dann ja gar nicht mehr von Y abhängig? Weshalb dan nüberhaupt der 2D Ansatz?

Sebastian hat Folgendes geschrieben:
Das die fminbnd Fkt das minimum sucht ist mir bekannt, ich kann ja die Fkt mit h(x) = -h(x) spiegeln und so minimas zu maximas - und umgekehrt machen!
Die Fkt z(x,y) kann ich mit fminbnd eh nicht untersuchen, da fminbnd doch nur für Fkt mit einer Variablen sind!

Nein, fminbnd minimiert einen Vektor. Typischer Aufruf
Code:
Vektorwertbeiminimum = fminbnd(Vektor,@Funktionsname,[],optionalekonstante1,optionalekonstante2,etc)
 




Sebastian hat Folgendes geschrieben:
Aber was mainst du mit Funktionsaufruf?
Unterprogramm, Subroutine?

Nun ja, wie die HIlfe sagt: der zweite Parameter von fminsearch ist ein FUnktionsaufruf (der mit dem @)

Bsp: Du willst eine Gerade fitten und hast die Punkte X und Y. Dann könntest du dir eine funktion schreiben die so aussieht
Code:
function fehler = fittemeineGerade(p,X,Y)
m = p(1);
t = p(2);

fitY = m*X + t;

fehler = sum( (Y(:) - fitY(:)).^2) )
 

fehler enthält den Least-squares Fehler von Y und fitY. Dieser wird in Abhängigkeit von m und t (bzw vektor p) minimiert . Mit diesem Aufruf bekommst du den gefitteten Wert von p bzw den Geradenfit

Code:
popt = fminsearch(p,@fittemeineGerade,[],X,Y)
 


Zur BEdeutung der [] vgl. die Hilfe zu fminsearch bzw optimset (falls Du die statistical toolbox hast)


Sebastian hat Folgendes geschrieben:
Per Hand würde ich h(x) ableiten, zu 0 setzen und anschliessend wieder einsetzen! Hier habe ich ja dann noch y = 10 -x, somit kann ich doch y auch berechnen, oder höngt meine Logic gerade?

Aber so muss es doch gehen?!!
Kann MatLab eigentlich ableiten?

Yep, analytisch sollte es so gehen.

Und ja, matlab kann auf jeden Fall Polynome ableiten (hab den befehl dazu im momenet vergessen) und vermutlich mittels symbolic toolbox auch anderes. Dazu gibt es dann noch div. FUnktionien zum numerischen Ableiten...
_________________

---------------------------------------------------------------
Leider habe ich daheim zwar Internet aber kein Matlab - daher sind alle Syntaxbeispiele circa Angaben.....
Private Nachricht senden Benutzer-Profile anzeigen
 
Sebastian

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2007, 09:56     Titel:
  Antworten mit Zitat      
Michaela hat Folgendes geschrieben:
Hmm zum Hausaufgabenlösen ist dieses Forum eigentlich nicht gedacht...


Hausaufgaben kann in einer weiten Spanne betrachtet werden. Auch ein Unternehmer der zum vereinbarten Termin sein Project nicht an den Kunden abliefert, hat doch seine Hausaufgaben nicht gemacht! Jeder der irgendeine Frage stellt weis sich in seiner Aufgabe nicht weiter, also gibt seine Hausaufgaben weiter ans Forum! Ich denke mal das sich keiner mit programmieren aus jux und tollerei beschäftigt?!
Ich habe mein Problem geschildert, und gefragt wie ich die fminbnd Funktion anzuwenden habe, da ich mich die Hilfe- Fkt sowie Bücher auch nicht weiterbrachten! Ich habe nicht die Aufgabenstellung des Projects gepostet und druntergesetzt "Macht mal jemand!" Dies würde ausserdem das Gesetz des Betriebsgeheimnises verletzten.
Ausserdem löse ich meine Hausaufgaben gerne selbst denn dann bin ich mir wenigstens sicher das sie gemacht wurden!
So, danke für deine Hilfe! Werde auch keine Frage mehr stellen!

Gruss Sebastian
 
Martin
Admin

Admin



Beiträge: 651
Anmeldedatum: 16.06.07
Wohnort: Bietigheim-Bissingen
Version: ---
     Beitrag Verfasst am: 17.09.2007, 10:18     Titel:
  Antworten mit Zitat      
Möchte hier mal ein bisschen Dampf aus der Angelegenheit nehmen.

Jeder sollte sich an das goMatlab-Knigge halten.
Hierbei geht es vor allem um das Kapitel "Angriff ist nicht immer die beste Verteidigung".

Finde Sebastians "Hausaufgabe" nicht gerade anspruchslos und keine Frage in diesem Forum ist "doof" oder unter den Ansprüchen des Forums.
Außerdem sieht man an seiner Frage, dass er sich mit dem Problem auseinandergesetzt hat und wirklich an einer Sache nicht mehr weiter kommt.

Damit ist der morgendliche Zwist beigelegt und die Woche kann beginnen. Smile

Viele Grüße Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 17.09.2007, 11:39     Titel:
  Antworten mit Zitat      
Hallo Sebastian,

ich verstehe Dein Problem folgendermaßen (Korrigier mich Wink): Du möchtest die Funktion z(x,y) = 30x*sin^2(0.5(x-y)) auf der Geraden y = 10 - x maximieren. So sieht es jedenfalls auf dem Bild aus: Du suchst das Maximum der schwarzen Linie.

Das ginge so:
Du parametrierst Deine Gerade, so dass x und y von einem Parameter t abhängen. Wenn x und y jeweils zwischen 0 und 10 liegen sollen, also x=t*10, y = (1-t)*10 für t zwischen 0 und 1.

Dann schreibst Du die zu minimierende Funktion in Abhängigkeit von t. Und dann kannst Du fminbnd verwenden. t_opt kann man dann leicht in x_opt und y_opt umrechnen und hat alle benötigten Werte.

Code:
function OPT_Z

[t_opt,z_opt] = fminbnd(@z_fct,0,1); % Minimierung

x_opt = 10*t_opt
y_opt = 10*(1-t_opt)
z_opt = -z_opt % Minus wegen Maximierung
hold on
plot3(x_opt,y_opt,z_opt,'*r')

function z = z_fct(t)
    x = 10*t;
    y = 10*(1-t);
    z = -30*x.*(sin(0.5*(x -y))).^2; % Minus wegen Maximierung
 


Allerdings findet fminbnd als lokales Verfahren nicht das globale Maximum. Wenn man schon sieht, wo es etwa liegt, kann man das Intervall für t verkleinern (den zweiten und dritten Parameter in fminbnd variieren).

Hoffentlich hilft das weiter. Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Sebastian

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2007, 10:34     Titel:
  Antworten mit Zitat      
SORRY!
Das ich letzthin etwas unter Druck stand. Doch aus meiner Sicht sind seriöse Foren dafür da das man sich gegenseitig hilft und nicht an den Kopf schmeisst welche Probleme man doch schon wieder für andere lösst!
Ja ich studiere und arbeite mit MatLab seit 4 Wochen, wenn ich das programmieren auf MatLab nicht von erfahrenen Leuten lerne von wem denn dann? Das zählt für alle Bereiche, denn ich lese immer wieder in Foren "wir machen nicht deine Hausaufgaben!" Wenn wir Schüler/ Studenten das nicht von Leuten mit Erfahrung und Wissen lernen von wem den dann? UND welches Wissen und welche Erfahrung sollen wir weitergeben?
Klar das www ist nicht dein "Hausaufgaben- Lösungs- Sklave", soll es auch nicht sein!
Ich studiere hier in Perth, bin seit ca 7 Monaten in Australien und sehe jetzt nach 20 Jahen zu ersten mal wie weit das Deutsche Bildungssystem ist, und das es keineswegs alt und schlecht ist! Es gibt was zu verbessern doch es anderen Bildungssyystem weit voraus! Soviel kann ich sagen!
Aufgaben die ich selber lösen kann löse ich auch selber!
Danke fürs zuhören!

Nun weiter zum Thema:
Das Lesen des Beitrags letzthin habe ich nach der 2ten Zeile abgebrochen und geantwortet!
Nach Stunden rumprobieren habe ich eine Lösung gefunden, allerdings musste ich das Intervall auf 9 <= x <= 10 einschränken. So das fminbnd in der Funktion h(x) das richtige Maximum herausfindet und zurück gibt.
Was ich nicht verstanden hatte, war das ich ein funktion in fnimbnd einsetzten muss, die von Matlab dann beim abarbeiten aufgerufen wird und durchlaufen wird. Diese Funktion ist als M- File zu sichern und bekommt das Intervall für x übergeben und gibt den Maxima auf der x- Achse zurück ans Hauptprogramm.

Meine Lösung sieht dann wie folgt aus:


Code:
clear
l = 0:0.2:10;
b = 0:0.2:10;
[x y] = meshgrid(l,b); % gridspacing 0.2km in x,y directionl,0 - 10km
z = 30.*x.*(sin(0.5.*(x -y))).^2;
mesh(x,y,z)
hold on
y = 10 -x;
h = 30.*x.*(sin(0.5.*(x -y))).^2;
surf(x,y,h)

xmax = fminbnd('subfunction',8,10); % call subfunction to find the maxima
disp('x-Maxima:')                
disp(xmax)
ymax = 10 -xmax;
disp('y-Maxima:')
disp(ymax)
zmax = 30.*xmax.*(sin(0.5.*(xmax -ymax))).^2;
disp('z-Maxima:')
disp(zmax)
hold off
xlabel('x')
ylabel('y')
zlabel('z')
title('graph of z(x,y) = 30x*sin^2(0.5(x-y)) and h(x,y) = 30x*sin^2(0.5(2x-10))')
 


Das Unterprogramm das ich dafür habe sieht dann so aus:

Code:
function h = subfunction(x)
h = -1*(30.*x.*(sin(0.5.*(x -(10 -x)))).^2);  
%Subfunction search for the Maximum of h(x).


Danke Bijick für deine Lösung, die ist natürlich besser und ich werde mir sie durch den Kopf gehen lassen.

Ciao Sebastian
 
Martin
Admin

Admin



Beiträge: 651
Anmeldedatum: 16.06.07
Wohnort: Bietigheim-Bissingen
Version: ---
     Beitrag Verfasst am: 20.09.2007, 12:08     Titel:
  Antworten mit Zitat      
Hallo Sebastian,

schön dass du es dir doch nochmal anders überlegt hast. Wink

Aber nun noch ein kleiner Beitrag von mir. Hilft vielleicht nicht unbedingt zur Lösung weiter aber mal sehn...

Das Problem mit dem lokalen und globalen Maximum oder Minimum ist in der Technik wesentlich größer. Ich bezweifel das Matlab wirklich jeden Matrixpunkt anschaut und alle miteinander vergleicht.

Somit wird Matlab bei der ersten Maxima oder Minima "hängen" bleiben und für sich selbst sagen dass ist der höchste Punkt.

Ich hatte auch mal eine Vorlesung Namens Computational Intelligence. Da hatten wir dieses Problem auch besprochen und es gibt eine Lösung über das Einführen eines Momentums µ. Damit bleibt man dann eben nicht beim lokalen stehen sondern suchen weiter.

Aber leider weiß ich nicht ob sowas Matlab bei dem Befehl auch eventuell kann.

Viele Grüße Martin
_________________

Der kleine goMatlab.de-Knigge - Eine kleine Liste von wichtigen Regeln, die jeder beachten sollte
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 20.09.2007, 13:06     Titel: Optimierung
  Antworten mit Zitat      
Bevor das hier zu Off-Topic wird, eröffne ich mal unter Mathematik ein Thema zur Optimierung mit Matlab allgemein. Fragen, Probleme und Tipps gerne dort.
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
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.