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

Richtungsableitung, Gradientenvektor - Der schnellste Weg

 

moe69
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 20.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.12.2010, 23:56     Titel: Richtungsableitung, Gradientenvektor - Der schnellste Weg
  Antworten mit Zitat      
Hallo zusammen!

ich bin noch ein Einsteiger in MatLab und Mathematik ist nicht gerade mein Freund. Nichts desto trotz habe ich hier eine Problemstellung, die ich doch sehr gerne lösen würde.
Wir sollen in Mathematik/Informatik eine kleine Animation in MatLab erstellen. Da wir gerade Partielle Ableitungen durchnehmen und uns mit Extrempunkten usw im 3-Dimensionalen Raum beschäftigen habe ich mir gedacht ich probiere einmal folgendes:

Ein Skifahrer steht auf einem Berg und will die steilste Route ins Tal nehmen.
Hierfür habe ich schon eine Funktion die diesen Berg und das Tal bastelt.
Die höchsten Punkt auf dem Berg und den niedrigesten im Tal habe ich auch schon.
Jetzt kommt nur der Knackpunkt bei dem mir jemand vielleicht helfen kann, ich will nun einen Weg einzeichnen, der diese beiden Punkte über den steilsten Weg verbindet.
Anfürsich müsste das ja über die Richtungsableitung gehen. Dort wo die Richtungsableitung am kleinsten ist, müsste der Steilste weg sein.
Der Gradientenvektor zeigt zum stärksten Abfall der Funktion.
Doch wie bastel ich das alles zusammen? Ich habe leider keine Ahnug Sad

Wäre toll wenn mich jemand unterstüzten , bzw Denkanstöße geben könnte um den Skifahrer ein tolles Erlebnis bieten zu können!

Hier mein bisheriger MatLab-Code:

%% Skifahrer will den schnellsten Weg von Spitze zu Tal nehmen, wo fährt er
% lang?


clc
clear all
clf


f=@(x,y) x.* exp(-x.^2-y.^2)+1/2*(1-x).^2.* exp(-x.^2-(y+1).^2); % Funktionsgleichung

x=linspace(-2.5,2.5,100); % X-Werte
y=linspace(-2.5,2.5,100); % Y-Werte
[X,Y] = meshgrid(x,y); % Gitternetz erstellen
Z=f(X,Y); % Z-Werte berechnen


maxi=max(max(Z));
[ymax,xmax]=find(Z==maxi); % Maximale Höhe aus Z-Wert auslesen
mini=min(min(Z));
[ymin,xmin]=find(Z==mini); % Minimale Höhe aus Z-Wert auslesen

hold on
plot3(x(xmax),y(ymax),maxi,'or') % Maximalpunkt plotten
plot3(x(xmin),y(ymin),mini,'or') % Minimalpunkt plotten
mesh(X,Y,Z,'EdgeColor',0.8*[1 1 1]) % Gitternetz plotten
%contour3 (X,Y,Z,15) % Höhenlinien plotten

view(-119,52) % Ansichtsausgabe
Private Nachricht senden Benutzer-Profile anzeigen


Scriptor
Forum-Century

Forum-Century


Beiträge: 217
Anmeldedatum: 22.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.12.2010, 00:45     Titel:
  Antworten mit Zitat      
als kurz Zusammenfassung zum Verständnis. x und y sind die Raumoordinaten der Landschaft in der senkrechten. Diesem ist die Höhe f in der Funktion abhängig, richtig? So hast du ein 2d array.

In der diskreten Theorie kann man durch abziehen der benachbarten Punkte voneinander die erste Ableitung herholen.

Hierzu hilft dir der Befehl diff. Gib doch einfach "help diff" ein. Anschließend erhälst du ein Array das in jeder Dimension 1 Wert kleiner ist als die Ursprungsarrayausmaße des Arrays sind.

Anschließend musst du dir einen Suchalgorithmus ausdenken, der dir aus dem Datensatz zwischen zwei Punkten die kleinste Summe raussucht.

Vll hilft das erstmal.

Schöne Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
moe69
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 20.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.12.2010, 01:03     Titel:
  Antworten mit Zitat      
hallo!

danke dir schon einmal für deine schnelle hilfestellung.
das mit x,y,z hast du richtig verstanden.

was du mit array meinst weiss ich nun leider nicht.
auch, das mit durch subtraktion auf eine ableitung kommen soll ist mir auch mißverständlich. mathematik ist nun leider nicht wirklich meine stärke Sad

was meinst du mit dimension? sind das ableitungen?
meinst du von jedem punkt der funktion die ableitungen berechnen lassen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Scriptor
Forum-Century

Forum-Century


Beiträge: 217
Anmeldedatum: 22.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.12.2010, 01:42     Titel:
  Antworten mit Zitat      
Ich habe das auch nie durch erklärt bekommen verstanden eher mit Learning by Doing, daher versuch ichs es dir audf die Art un Weise näher zu bringen Wink

nimm dir einfach mal den Befehl diff vor.

Erzeuge ein Array f von eins bis 1000.

Anschließend gibst du mal ein

erg = diff(f);

Du erhälst ein Array der Größe length(f)- 1 voll von einsen. Was macht diff also?

Es bildet die Differenz zwischen zwei Punkten (Daher auch eine um eins verkleinerte Arraygröße) und somit eine Approximation an eine Ableitung. Nun hast du durch einsetzen von x und y in f ein 100*100 2d Array Z erhalten. Mit diff(Z) hättest du ein angenäherte partieller Dimensionen nach x und y. Probier einfach mal

figure(2)
mesh(diff(Z));

Vll ist aber ein anderer Weg besser, da diff nur eine Approx bietet. Versuche mal einfach zwei partielle Ableitungen mit der Symbol toolbox. Dieses Ergebnis dürfte genauer werden. Dafür müsstest du aber dich kurz in die Toolbox reinarbeiten..

Frag einfach weiter wenn du nicht weiterkommst.
Schöne Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
moe69
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 20.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.12.2010, 09:23     Titel:
  Antworten mit Zitat      
ok, vielen Dank!

ich werde das heute mittag mal weiter probieren! Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Scriptor
Forum-Century

Forum-Century


Beiträge: 217
Anmeldedatum: 22.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.12.2010, 15:54     Titel:
  Antworten mit Zitat      
Hey Moe,

is denn was bei rum gekommen?

Fand das Problem sehr interessant.

Grüße!
Private Nachricht senden Benutzer-Profile anzeigen
 
moe69
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 20.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.12.2010, 17:47     Titel:
  Antworten mit Zitat      
hi!

ich habe noch etwas probiert, aber es ist nichts wirklich konkretes dabei heraus gekommen. im moment liegt der fokus aber auch gerade wo anders. deswegen kann ich mich damit leider nicht so beschäftigen.

wünsche dir aber nichts desto trotz ein frohes fest! Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabNooB
Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.12.2010, 00:22     Titel:
  Antworten mit Zitat      
hi, was du da machen willst hört sich für mich nach einem minimierungsverfahren (du sucht das minimum von f(x,y) mit dem startpunkt im maximum), wie zB von fminsearch etc. benutzt wird, an. Ich denk wenn du dir die matlab funktionsminimierer mal anschaust, solltest du einen entsprechenden algorithmus finden...gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.12.2010, 15:16     Titel: Re: Richtungsableitung, Gradientenvektor - Der schnellste We
  Antworten mit Zitat      
Hallo moe69,

Zitat:
Jetzt kommt nur der Knackpunkt bei dem mir jemand vielleicht helfen kann, ich will nun einen Weg einzeichnen, der diese beiden Punkte über den steilsten Weg verbindet.

Das ist mathematisch korrekt definiert, aber nicht numerisch: Du kannst zu jedem Punkt die Richtung des steilsten Abstiegs finden indem Du den Gradienten berechnest. Aber dann musst Du den nächtsen Punkt finden und der liegt mathematisch gesehen infinitesimal neben dem vorhergehenden. Damit dauert Deine Rechnung auf dem Computer aber ungefähr ewig.

Du musst also irgendwie entscheiden, wie weit Du in der Richtung des berechneten Gradienten abwärts steigen möchtest und nimmst dabei in Kauf, dass der wirkliche Gradient sich auf dieser Geraden ändert. Oft benutzt man dafür die zweite Ableitung als Kriterium, um die Länge der Geraden zu wählen. Oder man geht so lange in Richtung des Gradienten, bis der Funktionswert wieder ansteigt - man such also praktisch das lokale Minimum entlang der Gradientenrichtung.

Im Endeffekt kann man diese Methoden solange ausfeilen und verbessern, bis man eine Doktorarbeit geschrieben hat. Also muss man auch beim Schreiben des Programms selbst ein Optimierungsproblem lösen: Wie genau möchte man das Ergebnis eigentlich haben, wieviel Zeit steckt man in die Programmierung, und welche Qualität ist als Ergebnis überhaupt nötig.

Viel Erfolg, Jan
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 - 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.