|
|
Richtungsableitung, Gradientenvektor - Der schnellste Weg |
|
moe69 |
Forum-Newbie
|
|
Beiträge: 8
|
|
|
|
Anmeldedatum: 20.12.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 20.12.2010, 22:56
Titel: Richtungsableitung, Gradientenvektor - Der schnellste Weg
|
|
|
|
|
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
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
|
|
|
|
|
Scriptor |
Forum-Century
|
|
Beiträge: 217
|
|
|
|
Anmeldedatum: 22.02.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 20.12.2010, 23:45
Titel:
|
|
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
|
|
|
moe69 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 8
|
|
|
|
Anmeldedatum: 20.12.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.12.2010, 00:03
Titel:
|
|
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
was meinst du mit dimension? sind das ableitungen?
meinst du von jedem punkt der funktion die ableitungen berechnen lassen?
|
|
|
Scriptor |
Forum-Century
|
|
Beiträge: 217
|
|
|
|
Anmeldedatum: 22.02.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.12.2010, 00:42
Titel:
|
|
|
|
|
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
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
|
|
|
moe69 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 8
|
|
|
|
Anmeldedatum: 20.12.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.12.2010, 08:23
Titel:
|
|
ok, vielen Dank!
ich werde das heute mittag mal weiter probieren!
|
|
|
Scriptor |
Forum-Century
|
|
Beiträge: 217
|
|
|
|
Anmeldedatum: 22.02.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.12.2010, 14:54
Titel:
|
|
Hey Moe,
is denn was bei rum gekommen?
Fand das Problem sehr interessant.
Grüße!
|
|
|
moe69 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 8
|
|
|
|
Anmeldedatum: 20.12.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.12.2010, 16:47
Titel:
|
|
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!
|
|
|
MatLabNooB |
Forum-Guru
|
|
Beiträge: 262
|
|
|
|
Anmeldedatum: 27.03.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.12.2010, 23:22
Titel:
|
|
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ß
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 29.12.2010, 14:16
Titel: Re: Richtungsableitung, Gradientenvektor - Der schnellste We
|
|
|
|
|
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
|
|
|
|
|
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 - 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.
|
|