Lot auf Ellipse
-
Hallo Mathe- Spezies.
Ich habe ds Problem, den Lotpunkt auf eine Ellipse zu ermitteln.Gegeben:
1. Ellipse in Form B^2 * X^2 + A^2 * Y^2 = A^2 * B^2
2. Punkt P = (Xp,Yp)Ich benötige die Koordinate des Punktes Plot auf der Ellipse, der dem Punkt P am nächsten liegt - das sollte ds Lot von P auf die Ellipse sein.
Ich krieg das einfach nicht in eine programmierbare Formel.
Bisher habe ich ein Näherungsverfahren gefunden (in Parameterform mit Winkel), womit man sich an den Punkt annähern kann.
Die Berechnung soll aber oft wiederholt erfolgen, da wäre mir eine direkte Berechnung der Koordinate lieber.Hat jemnd eine Idee, das direkt zu berechnen oder einen brauchbaren Link?
Gruss
frank
-
3 uhr morgens. mal sehen ob ich das noch vernünftig erklären kann.
ich würde daraus eine extremwertaufgabe machen. ich hoffe, dass du schon differenzieren kannst. wenn nicht dann gibts noch andere möglichkeiten, aber ich halte die folgende variante am zielführensten.
wendet man den satz des pythagoras an kommt man auf folgende beziehung:
d2=(xp-x)2+(yp-y)^2
d... abstand von ellipse und p
nun formen wir die ellipsengleichung auf x=, oder y= um.
y=b/a*(a2-x2)^0.5
** achtung: es müßte +-b/a*(a2-x2)^0.5 lauten, aber das lasse ich außen vor. dem widmen wir uns später.
nun setzen wir ein:
d2=(xp-x)2 + (yp-b/a*(a2-x2)0.5)2
nun differenzieren wir nach x:
d2´=-2*(xp-x)+2*(yp-b/x*(a2-x2)0.5)*b/a*(a2-x2)^-0.5*2*x
nun setzen wir die ableitung 0, um die extremstelle zu finden.
0=-2*(xp-x)+2*(yp-b/x*(a2-x2)0.5)*b/a*(a2-x2)-0.5*2*x
nun dürfte es für den computer ein leichtes sein den wert x zu errechnen.
ansonsten muß man noch umformen. ***
den errechtneten wert x dann in y=b/a*(a2-x2)^0.5 einsetzen und schon hat man den extrempunkt. auf eine überprüfung mittels der zweiten ableitung, ob es sich tatsächlich um einen minimalen abstand handelt, kann man als nicht mathematiker sparen.
** der errechnete y wert ist immer positiv. darum müssen wir eine fallunterscheidung machen.
wenn yp>0, so ist auch y positiv
wenn yp<0, so ist y negativ
meine berechnungen aber bitte überprüfen, weil ich schon kurz vorm einschlafen bin.*** kann sein, dass es da 2 lösungen gibt.
man nehme die lösung die folgendem entspricht:
wenn xp>0, so ist auch die positive x lösung zu nehmen
wenn xp<0, so ist auch die negative x lösung zu nehmenmfg
EricC
-
Wenn du schon mal Funktionen von mehreren Variablen benutzt hast und partielle Ableitungen kennst, würde ich es wie folgt angehen:
Du willst den Abstand minimieren, allerdings macht es keinen unterschied, wenn du das Quadrat des Abstandes minimierst - dann sind wir schon mal die lästige Wurzel los.
Dazu geben wir die Nebenbedingung an, dass (x,y) auf der Ellipse liegt.
Nun stellen wir die sogenannte Lagrange-Funktion auf (-> http://de.wikipedia.org/wiki/Lagrange-Multiplikator)
Setzt man die pariellen Ableitungen von h nach x und y gleich 0 und berücksichtig zusätzlich die Nebenbedingung, erhalten wir ein Gleichungssystem mit drei Gleichungen und den drei Unbekannten x,y, und λ:
Löse am besten die ersten beiden Gleichungen nach x bzw. y auf, und setze das dann in die dritte Gleichung ein, dann hast du eine polynomiale Gleichung vom Grad 4 für λ. Damit bestimmst du λ und bekommst damit x und y heraus.
Und jetzt der Haken: Du musst alle Nullstellen für ein Polynom vierten Grades bestimmen (einfach ein passendes Paket raussuchen). Du bekommst also bis zu vier Lösungen für das Gleichungssystem oben (jedes λ ergibt einen Punkt (x,y)). Aber nicht alle diese Lösungen sind Lösungen unseres Optimierungsproblems. Das ist aber nicht schlimm: Einfach alle Lösungen (sind ja maximal 4 Stück) ausprobieren und die wählen, die den geringsten Abstand zum Ausgangspunkt hat.
Insgesamt nicht viel weniger Arbeit als bei der Lösung von EricC, allerdings sind die resultierenden Gleichungen etwas hübscher. (Keine Wurzelterme oder Brüche mit einer unbekannten im Nenner)
Ich hab EricC Lösung jetzt nicht im Detail nachgerechnet, aber die Gleichung, die da steht, sieht so aus, als hätte sie auch möglicherweise mehr als eine Lösung.
-
@EricC:
danke erstmal für den Ansatz.Beim Nchvollziehen komme ich aber bei d^2' auf
- anderes Vorzeichen im ersten Teilterm
- den halben Wert im 2. Teilterm
??? Ev. bin ich aber nur zu bl*** ???Mein Hauptproblem geht aber danach erst los:
- Wie knn ich die Gleichung nach x auflösen?
Da hab ich ja immer Summen von Quadraten IN Wurzen drin.
Genau dort hab ich das eigentliche ProblemÜbrigens: Differenzieren habe ich jahrelang gelernt, ist aber schon über 20 Jahre her.
@Taurin:
auch Dir sei gedankt. Dein Ansatz sieht besser verwendbar aus. Aber:
- Ich kenne die Lagrange- Funktion nicht
- Du sagst, 3 Gleichungen und 3 Unbekannte
dann sollte das ja berechenbar seinaber es gibt doch 2 x Lambda (mit x bzw y) ???
Darf ich die gleichsetzen?Dann bekomme ich nämlich eine schöne quadratische Funktion.
Die sollte sich lösen lassen für ein (gemeinsames) Lambda.- Der Rest sollte dann kein Problem sein.
Thx
Frank
-
Beim Nchvollziehen komme ich aber bei d^2' auf
- anderes Vorzeichen im ersten Teilterm
- den halben Wert im 2. Teilterm
??? Ev. bin ich aber nur zu bl*** ???nö, bist du nicht.
d2´=-2*(xp-x)+2*(yp-b/x*(a2-x2)0.5)*b/a*(a2-x2)^-0.5*x heißt es korrekt.
das vorzeichen im ersten term kommt von der inneren ableitung (kettenregel).
aber meinen ansatz muß man in die tonne befördern, da ich gestern nacht der irrigen annahme war, dass sich die 0 gesetzte ableitung auf eine quadratische funktion umformen läßt. das war falsch. die nullstelle ausrechnen ist alles andere als lustig. eine exakte lösung gibt es nicht. da müßte man dann wieder mit näherungswerten rechnen, was du ja nicht willst.- Ich kenne die Lagrange- Funktion nicht
doch sie steht in seinem text. er hat sie auch schon für dich partiell differenziert.
aber es gibt doch 2 x Lambda (mit x bzw y) ???
Darf ich die gleichsetzen?es heißt lambda*x und lambda*y
leider kann man den zusammenhang auch knicken, da wie bei meinem ansatz eine ziemlich bösartige nullstelle zu berechnen ist.auch habe auch 2 andere verfahren probiert, und bei beiden bin ich auch auf keine exakte lösung gestoßen.
mir fällt nicht dazu leider nichts mehr ein.
entweder ich habe etwas übersehen, oder es gibt nur näherungslösungen.mfg
EricC
-
Hallo EricC
Das mit dem Vorzeichen leuchtet mir noch nicht ganz ein.
Die Innere Ableitung liefert bei mir 2 x ein Minus - ich muss die Kettenregel doch zweimal anwenden?
- für den Teil (.....)^2
- und für den darin befindlichen Teil (...) ^0.5
damit hebt sich bei mir das Minus auf. Ist ja aber auch egal - ich hab lange
nicht solche Formeln berechnetDas problem ist, dass keine einfache quadratische Funktion rauskommt.
Schaaaaaaaaaade.Das mit ner Näherung zu lösen will ich nicht NICHT, das habe ich momentan so.
Das will ich aber weghaben, da die Näherung ja doch immer etwas dauert - und die Berechnung wird sehr oft ausgeführt. Ich will mein Programm beschleunigen.
( Ich habe eine Vektor- Geometrie- Datensammlung - Geometrische Masken in
einem Bild - mit Rechteck, polygonen, Kreisen und Ellipsen.
bei Mausbewegung im Programm soll die Kontur gesucht werden, die der Maus
am dichtesten liegt.
Bei sehr umfangreichen Kontur- Ansammlungen (mit vielen Ellipse) kann das
dann z.T zu langsam werden.)Die Lagrange Funktion kenn ich nicht, bedeutet: ich habe bisher nie davon gehört.
Die ist auch schon schön differenziert.Was bedeutet aber: "bösartige Nullstelle" zu berechnen?
Wenn die beiden Lambda ( lambda*x und lambda*y ) gleich zusetzen gehen,
kommt bei mir was "leichtes" raus.Darf mann die NICHT gleichsetzen, kann man das Teil gar nicht lösen:
- 3 Gleichungen mit 4 Unbekannten.Die Frage ist für mich: sind lambda*x und lambda*y gleichsetzbar oder nicht?
Thx
FrankPS:
Ich habe bisher einen Ansatz mit Parameterform der Ellipse - ist von ner Uni.
b/a*Yp + (a^2 - b^2)/a*sin(t)=Xp*tan(t)
das Teil bin ich aber zu dusselig aufzulösen nach t - oder es geht nicht?.
Der Prof hat auch ne Häherung als Übung von seinen Studenten angeraten.das mach ich momentan mit ner Näherung:
- von 45° ausgehend testen, ist linker oder rechter Teil grösser
- bei Bedarf Winkel zu X- Achse oder Y- Achse (je nach Auswertung)
halbieren.
- Abbruch, wenn Differenz klein genug geworden ist/ mximle Schrittanzahl.
Das klappt auch soweit, aber die Winkelfunktionen und die Suchzyklen bremsen mir doch irgendwie das Programm ein.Ok, so grosse Datenmengen hat das Proggi eigentlich (noch) nicht.
Aber ich wollte mal sehen, ob es nicht auch direkt zu rechnen geht.
Ev. brauch ich das ja irgendwann mal in einem anderen Programm ???
Als "Hobby- Mathematiker" interessiert mich das schon.
-
Das mit dem Vorzeichen leuchtet mir noch nicht ganz ein.
Die Innere Ableitung liefert bei mir 2 x ein Minus - ich muss die Kettenregel doch zweimal anwenden?
- für den Teil (.....)^2
- und für den darin befindlichen Teil (...) ^0.5
damit hebt sich bei mir das Minus auf. Ist ja aber auch egal - ich hab lange
nicht solche Formeln berechnetdie wurzel abgeleitet ist ^-0.5, aber eh egal, da mein ansatz nur näherungsweise zu lösen geht.
Was bedeutet aber: "bösartige Nullstelle" zu berechnen?
in diesem fall geht es auch nur numerisch.
Die Frage ist für mich: sind lambda*x und lambda*y gleichsetzbar oder nicht?
nein darfst du nicht. die lambdas sind natürlich gleich, aber sie sind eben mit *x und mit *y verbunden. das bringt dich leider auch wieder auf eine näherungsweise lösung.
Ich habe bisher einen Ansatz mit Parameterform der Ellipse - ist von ner Uni.
b/a*Yp + (a^2 - b^2)/a*sin(t)=Xp*tan(t)
das Teil bin ich aber zu dusselig aufzulösen nach t - oder es geht nicht?.
Der Prof hat auch ne Häherung als Übung von seinen Studenten angeraten.anders geht es auch nicht, da die variable t in der winkelfunktion steht.
wie es aussieht wirst du um einen näherungslösung nicht herum kommen.
mfg
EricC
-
DerAltenburger schrieb:
@Taurin:
auch Dir sei gedankt. Dein Ansatz sieht besser verwendbar aus. Aber:
- Ich kenne die Lagrange- Funktion nicht
- Du sagst, 3 Gleichungen und 3 Unbekannte
dann sollte das ja berechenbar seinaber es gibt doch 2 x Lambda (mit x bzw y) ???
Darf ich die gleichsetzen?Dann bekomme ich nämlich eine schöne quadratische Funktion.
Die sollte sich lösen lassen für ein (gemeinsames) Lambda.- Der Rest sollte dann kein Problem sein.
Die drei Gleichungen sind (wie gesagt):
(1)
(2)
(3)Unbekannte sind x, y und λ. Konstanten sind x_p, y_p, a und b
Umformen ergibt:
(1)
(2)Einsetzen in (3) ergibt (edit: Der Schritt ist Quatsch!)
Und das ist tatsächlich ein Polynom 4. Grades (bzgl. λ), aber man kann daraus durch Wurzel ziehen zwei quadratische Gleichungen machen (hab ich ganz übersehen). Zurückeinsetzen von λ in (1) und (2) ergibt dann x und y.
Allerdings musst du immer noch aufpassen, dass die Lösungen des Gleichungssystems nur notwendigerweise Lösungen deines Optimierungsproblems sind. Du muss also alle durchgehen, und schauen, welche Lösung die richtige ist.
Die Lagrangefunktion wird in der Wiki ganz gut erklärt, bloß ohne Beweis. Kannst ja mal ein bischen googeln, ob du was dazu findest. Wenn es dich sehr interessiert, kann ich auch mal schauen, ob ich hier irgendwo den Beweis rausgesucht bekomme.
Mit den Begriffen partielle Ableitung, Gradient etc. kommst du klar?
edit: Ich hab das ganze eben mal in Matlab eingehämmert, und es klappt noch nicht so richtig.... im Prinzip ist der Weg richtig, aber evtl. ist noch irgendwo ein kleiner Fehler drin.
-
Bin ich aber d***.
Klar, das mit dem Vorzeichen mach ich oft falsch - wenn die innere Ableitung von X bzw -X kommt, lass ich die manchmal weg - ist ja ohnehin eins. Und damit vergesse ich dann natürlich das Vorzeichen.Aber im zweiten Term kommt bei mir die hälfte raus - muss d nicht noch ein 1/2 von der inneren Ableitung der Wurzel hin? Nur mal so wegen der Vollständigleit, auch wenn das Teil am Ende nicht aufzulösen geht. Mit solchen Differenzierungen arbeite ich sonst recht selten.
************************
Der zweite Ansatz ist jetzt klarer.
Formeln müsste man lesen können. Ich hab das lambda immer mit Index gesehen - Dussel ich der ich bin.Hab das mal eingesetzt und aufgelöst.
da kommt aber ein Bandwurm raus, den keine Sau auflösen kann.
@Taurin:
Bei Dir sieht das Ergebnis ja fast schön aus. Wieso krieg ich immer so ne Bandwurmformel? Sieht ähnlich kompliziert aus wie der erste Ansatz?***********************
das Teil in Parameterform KANN also NICHT aufgelöst werden?
Dasnn muss ich wohl bei der Annäherungsfunktion bleiben.das mach ich momentan mit ner Näherung:
- von 45° ausgehend testen, ist linker oder rechter Teil grösser
- bei Bedarf Winkel zu X- Achse oder Y- Achse (je nach Auswertung)
halbieren.
- Abbruch, wenn Differenz klein genug geworden ist/ mximle Schrittanzahl.
Das klappt auch soweit, aber die Winkelfunktionen und die Suchzyklen bremsen mir doch irgendwie das Programm ein.ist so nicht ganz richtig gewesen:
So würde das ja nur grosse Sprünge machen und nie ankommen.ich habe eigentlich zwei Grenzwerte gespeichert - 0° und 90°,
Ich halbiere natürlich die Differenz zum jeweiligen Grenzwert und ziehe den anderen auf die aktuelle Grösse.
Dmit wird mein "Testintervall" ja immer kleiner- und so klappt das auch.
Aber eben viele Schritte, wenn hohe Genauigkeit gewünscht.Thx an alle
Frank
-
@Turin
danke für Dein Angebot.
Aber mit den Beweisen kann ich wahrscheinlich nicht so viel anfangen - so gut ist mein Mathe auch nicht.
Ich bin Praktiker/ Techniker (EAT und Programmierung), mir genügen lösbare Formeln, die berechenbar sind. Warum die berechenbar sind, ist meist weniger interessant.Mit den Begriffen partielle Ableitung, Gradient etc. kommst du klar?
So halbwegs geht das. Hatten wir beim Studium mal - war aber 1974 .. 1978, da geht schon einiges wieder verloren.
Deine letzte Formel kann man ja tatsächlich gut "Verwurzeln". Da kommen zwei saubere quadratische Teile heraus, die sich eigentlich gut berechnen lassen.
ABER:
Kann es sein, dass in den ersten beiden Termen was fehlt?Beim Einsetzen von (1) und (2) in (3) habe ich in den ersten beiden Termen noch ne Multiplikation mit:
(b^2 * Lambda)^2 bzw (a^2 * Lambda)^2Und dann kommt ein Bandwurm raus, den ich nicht auflösen kann.
Gruss
Frank
-
@Taurin
ich hab jetzt was ganz putziges:ich habe nach Umstellen und Einsetzen:
k1 * (b^2 + Lambda)^2 + k2 * (a^2 + Lambda)^2 - (a^2 + Lambda)^2 + (b^2 + Lambda)^2 = 0
Das geht doch auch als:
(Wurzel(k1 * (b^2 + Lambda)^2 + k2 * (a^2 + Lambda)^2) + (a^2 + Lambda) * (b^2 + Lambda)) * (Wurzel(k1 * (b^2 + Lambda)^2 + k2 * (a^2 + Lambda)^2) - (a^2 + Lambda) * (b^2 + Lambda))
oder ist das falsch??? Ich sehe da ein Binom
Wenn ich eine der Seiten getrennt = 0 setze und auflöse, komme ich wieder auf die Anfangsformel.
(Wurzel(k1 * (b^2 + Lambda)^2 + k2 * (a^2 + Lambda)^2) - (a^2 + Lambda) * (b^2 + Lambda)
oder
(Wurzel(k1 * (b^2 + Lambda)^2 + k2 * (a^2 + Lambda)^2) = (a^2 + Lambda) * (b^2 + Lambda)
Das quadriere ich und habe :
(k1 * (b^2 + Lambda)^2 + k2 * (a^2 + Lambda)2=(a2 + Lambda)^2 * (b^2 + Lambda)^2
oder
(k1 * (b^2 + Lambda)^2 + k2 * (a^2 + Lambda)2-(a2 + Lambda)^2 * (b^2 + Lambda)^2=0Mach ich da was falsch oder bedeutet das, das Teil ist nicht auflösbar?
Gruss
Frank
-
DerAltenburger schrieb:
@Turin
Beim Einsetzen von (1) und (2) in (3) habe ich in den ersten beiden Termen noch ne Multiplikation mit:
(b^2 * Lambda)^2 bzw (a^2 * Lambda)^2Autsch... da hast du natürlich recht. Hast du also doch ein Polyonom 4ten Grades. Mit Wurzelziehen kommt da nix feines raus. Ich würde mir an deiner Stelle einfach eine fertige Lösung für das Lösen von polynomialen Gleichungen suchen. Das gibt es bestimmt, anders kommst du der Gleichung bestimmt nicht bei.
Schlecht stehst du damit allerdings nicht da: Polynomiale Gleichung von niedrigem Grad sind ja nix schlimmes.Es gibt für Gleichung vom Grad 4 sogar noch geschlossene Lösungsdarstellungen, aber die sind nicht mehr so richtig einfach... vielleicht findest du da ja auch was.
-
Da kann mal wohl nix machen.
Wenn die Spezies das nicht auflösen können, scheint das also auch nicht so recht gehen zu wollen.Da bleib ich halt erstmal bei meiner Näherungs- Routine. Ist zwar nicht schnell, liefert aber erstml gute Ergebnisse.
Da werd ev. ich mal weitersuchen.
Trotzdem erstmal Dank an alle.
Frank