Interpolation von Messwerten < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) überfällig | Datum: | 18:14 Sa 09.12.2006 | Autor: | mjh53 |
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
hallo,
folgendes Problem... ich habe verschiedene geographische messpunkte, von denen ich windgeschwindigkeit und windrichtung habe... nun möchte ich zwischen diesen messpunkten diese Variablen interpolieren... mein gedanke ist, dass "messfeld" zuerst in dreiecke zu untergliedern... dann bei einem vorgegebener Punkt das Dreieck zu lokalisieren in welchem dieser punkt liegt und dann mittels einer dreidimensionalen Darstellung zu interpolieren...
da meine programmierfähigkeiten noch nicht dafür ausreichen, erhoffe ich mir, dass mir jdn. bei dem ersten Schritt behilflich ist...
gruss
mathias
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:25 So 10.12.2006 | Autor: | Martin243 |
Hallo,
da musst du beim Trigonalisieren aber höllisch aufpassen. Es gibt nämlich etliche Aufteilungen in Dreiecke und wenn du Pech hast dann erwischst du bei gegebenen blauen Messpunkten folgende:
[Dateianhang nicht öffentlich]
Hier würdest du den Wert für den roten Punkt aus den drei weit entfernten Eckpunkten des langgezogenen Dreiecks berechnen, die (zumindest geografisch) doch wenig damit zu tun haben.
Vielleicht wäre eine Suche der nächsten Nachbarn geeigneter:
[Dateianhang nicht öffentlich]
Hier kannst du jederzeit die Anzahl der Nachbarn, die für die Interpolation herangezogen werden, anpassen (bei Ausreißern o.ä.).
Der Aufwand beide Methoden richtet sich an der Anzahl der Stützstellen.
Nur eine Anregung...
Das Programmieren kommt dann noch.
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: gif) [nicht öffentlich] Anhang Nr. 2 (Typ: gif) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 09:50 Mo 11.12.2006 | Autor: | mjh53 |
hallo,
ich kann das noch nicht einschätzen, was für mich besser ist... ich denke aber, dass die zweite variante erstens sicherer und vielleicht auch einfacher zu programmieren ist... dann wäre die erste Frage, wie finde ich die drei punkte, die am nächsten an meinem vorgegebenen liegen....
bevor ich mit der interpolation beginne, kann diese suche ja im zweidimensionalen stattfinden...
gruss
mathias
|
|
|
|
|
Hallo,
wenn du die 3 nächsten Punkte [mm] n_1, n_2, n_3 [/mm] zu einem gegebenen Punkt p suchst, dann kannst du zuerst in einer for-Schleife durch alle Punkte deines Datensatzes gehen und von jedem die euklidische Distanz (oder muss man in der Geographie zu anderen Maßen greifen? Welche Größenordnung haben die Abstände?) zu p bestimmen und in einen Vektor "abstaende" schreiben.
Danach sortiert du den Vektor abstaende per:
[abst_sortiert, abst_indizes] = sort(abstaende);
Nun stehen an in abst_indizes die Indizes der Punkte in aufsteigender Entfernung zu p.
Dann kannst du überlegen, wie man am besten interpolieren sollte. So, wie ich das verstanden habe, wolltest du eine Ebene durch die drei Stützstellen legen und daraus den Wert bei p bestimmen?
Wenn du Probleme bei der Umsetzung hast, dann kannst du vielleicht noch einige Beispieldaten liefern, damit man mal die Struktur (spaltenweise/zeilenweise) bestimmen kann.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:43 Mo 11.12.2006 | Autor: | mjh53 |
hallo,
dein vorschlag hat mir erst mal wieder weitergeholfen, danke, gleichzeitig ist mir beim programmieren aufgefallen, dass ich meine frage ungenau formuliert habe... wenn ich nur diese drei Punkte nehme (mit dem geringsten Abstand), dann ist natürlich noch lange nicht garantiert, dass diese in dem von diesen Punkten aufgespannten dreieck liegen...
hast du eine Idee...?
gruss
mathias
|
|
|
|
|
Hallo,
du hast natürlich Recht! Das heißt, entweder nehmen wir direkt zu Anfang eine globale Unterteilung in Dreiecke vor, dann wäre aber die Nachbarschaft hinfällig, oder wir suchen uns geeignete Punktetripel, die zusammen ein Dreieck ergeben, das den zu interpolierenden Punkt umgibt.
Schau dir mal meine Spielerei an. Falls dir das Prinzip zusagt, können wir das ja weiterverfolgen.
Falls nicht, können wir mal schauen, was man noch mit Dreiecken machen kann...
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 10:54 Di 12.12.2006 | Autor: | mjh53 |
hallo..
das ist natürlich sehr interessant ) ... muss ich erst mal weiter durcharbeiten...
trotzdem die frage zu den dreiecken... ich habe mit delaunay() meine messpunkte verbunden, und es sieht so aus, wie ich das haben möchte (du hattest da ja bedenken), mit ist jetzt nicht ganz klar, wie es dann weitergeht... wenn ich jetzt einen punkt eingebe, bei dem interpoliert werden soll, muss ich ja das dreieck auch irgendwie finden... mich würde interessieren, was es da für möglichkeiten gibt? mmm
gruss
mathias
|
|
|
|
|
Hallo,
also, wenn es die Funktion delaunay gibt, dann ist alles in bester Ordnung! Wusste ich nicht, sorry, man lernt immer wieder dazu. Spart ein gutes Stück Arbeit.
Nun willst du prüfen, in welchem Dreieck ein neuer Punkt p liegt.
Hier musst du wohl nacheinander die Dreiecke abklappern, bis du das richtige findest.
Entweder erzeugst du dir also vorher eine Kandidatenliste, indem du die Dreiecke vielleicht nach der Entfernung des Punktes p zum Umkreismittelpunkt oder Schwerpunkt der Dreiecke sortierst, oder aber du machst es einfach für alle Dreiecke nacheinander. Für nicht zu viele Dreiecke wird es schon problemlos gehen.
Meinen Lösungsvorschlag (ohne irgendwelche Kandidatenlisten) ksnnst du dir mal anschauen. Das Umsortieren der Triangulationsliste ist nicht nötig, aber es halbiert die Bedingungen. Über die Mathematik dahinter können wir dann reden, wenn du daran Interesse hast.
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:21 Do 28.12.2006 | Autor: | mjh53 |
hallo,
dieser Vorschlag gefällt mir sehr, habe dein Skript nun durchgearbeitet, und werde damit weitermachen können... danke...
erstmal habe ich nur zur Mathematik eine Frage...
if [-(b(2)-a(2)) ; (b(1)-a(1))]'*(c-b) < 0
diese Abfrage benutzt du ja später nochmal...
ich komme nicht ganz dahinter, was da passiert!!
du erzeugst eine senkrechte Gerade zu ab, durch b mit derselben Länge wie ab... multiplizierst dies dann mit bc.... was bedeutet dann dieses Ergebnis? im Falle <,>,= 0.... ich habe dies nirgends gefunden, daher frage ich hier mal nach!!!
gruss
mathias
|
|
|
|
|
Hallo,
diese Konstruktion dient (s. Kommentar) dem gleichen Umlaufsinn in allen Dreiecken. Bedeuten tut sie Folgendes:
Die Seite AB teilt die Ebene in zwei Halbebenen, wenn man die Strecke zu einer Geraden verlängert.
Das Skalarprodukt des um 90° nach links gedrehten Vektors [mm] $\vec{AB}$ [/mm] mit dem Vektor [mm] $\vec{BC}$ [/mm] ist positiv, wenn diese beiden Vektoren von AB aus gesehen in dieselbe Halbebene zeigen. Dann ist der Umlaufsinn von ABC gegen den Uhrzeigersinn.
Falls das Skalarprodukt negativ ist, wissen wir, dass die beiden Faktoren in verschiedene Richtungen zeigen, was bedeutet, dass hier der Umlauf sinn im Uhrzeigersinn ist. Das wollen wir nicht und vertauschen daraufhin die beiden Eckenbezeichnungen.
Falls das Skalarprodukt 0 ist, dann sind zwei Seiten des Dreiecks kollinear. Der Fall wird also nie eintreten.
Ich schlage vor, du zeichnest einfach mal zwei Dreiecke, einmal im Uhrzeigersinn, einmal dagegen. Vollzieh die Konstruktion mal nach. Das Ganze ist eine Projektion der einen gedrehten Seite auf die Seite BC.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:00 Fr 29.12.2006 | Autor: | mjh53 |
hallo,
sehr gut...man lernt nie aus... danke...
nun zu matlab... ich habe mit deinem Code nun mein skript verfollständigen können... das gewünschte Dreieck ist ausgewählt und die Daten dazu sind eingelesen... mein problem nun.. die interpolation an sich....
ich würde dies gerne folgendermaßen machen...
ich habe nun das Dreieck in der Ebene, worin sich der Punkt befindet, bei dem ich interpolieren möchte....
nun möchte ich ein Dreieck im Raum erzeugen, dessen Eckpunkte senkrecht über meinem Dreieck in der Ebene liegen...
die Höhe der drei Punkte berechnet sich aus den gegebenen Daten...
z.B z1= 10, z2=15, z3=12... der interpolierte Wert ist dann die Höhe von meinem ausgewählten P(p1,p2) bis zum Durchstosspunkt des im Raum liegenden Dreiecks, wenn ich senkrecht nach oben gehe. (hier muss der Wert zwischen 10 und 15 liegen)
das Problem ist die Umsetzung!!
Gruss
mathias
|
|
|
|
|
Hallo,
da x- und y-Koordinaten des gesuchten Punktes P bekannt sind und wir nur z suchen, können wir folgenden Ansatz wählen:
Da P in derselben Ebene liegt wie ABC, können wir dessen Ortsvektor so darstellen:
[mm] $\vec{p} [/mm] = [mm] \vec{a} [/mm] + [mm] r\cdot\left(\vec{b} - \vec{a}\right) [/mm] + [mm] s\cdot\left(\vec{c} - \vec{a}\right)$
[/mm]
Nehmen wir nur die x- und y-Komponenten dieser Vektoren, können wir ein Gleichungssystem aufstellen und so r und s berechnen. Mit den so bestimmten r und s können wir dann für unseren Punkt die z-Komponente berechnen.
Man kann dafür Matlab-Funktionen benutzen oder es aber vorher auf dem Papier durchrechnen und sich eine kleine Formel erstellen. Ich würde zu Letzterem tendieren...
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 01:53 Mo 01.01.2007 | Autor: | mjh53 |
hallo,
sehr gut.. ich habe mit deinem Ansatz gearbeit und habe zwei Formeln für r und s aufgestellt...
Bsp für s
a=[2;3];
b=[1;1];
c=[3;2];
p=[2;2];
s=-((a(1,1)-p(1,1))*(b(2,1)-a(2,1))-(a(2,1)-p(2,1))*(b(1,1)-a(1,1)))/...
(c(1,1)-a(1,1))*(b(2,1)-a(2,1))-(c(2,1)-a(2,1))*(b(1,1)-a(1,1));
mein Problem... s müsste 1/3 sein... ist es aber nicht... wenn ich allerdings
Nenner und Zähler separat berechnen lasse.. stimmt es wieder... Nenner=-3, Zähler=1... mit dem negativen Vorzeichen vor der klammer ist das dann 1/3... wenn ich den Term allerdings zusammen berechnen lasse, kommt 1 als Endresultat??
Wo ist mein Fehler??
gruss
mathias
|
|
|
|
|
Hallo,
du hast da eine Klammer verschlampt. Es müsste heißen:
s=-((a(1,1)-p(1,1))*(b(2,1)-a(2,1))-(a(2,1)-p(2,1))*(b(1,1)-a(1,1)))/...
((c(1,1)-a(1,1))*(b(2,1)-a(2,1))-(c(2,1)-a(2,1))*(b(1,1)-a(1,1)));
Der gesamte Nenner muss nochmal von einer Klammer umschlossen werden!
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:17 Mo 01.01.2007 | Autor: | mjh53 |
hallo,
sehr gut.. jetzt läufts.. danke...
aber weiter gehts... um die dritte Dimension, also die Interpolation durchführen zu können, benötige ich ja die Daten der Messpunkte...
im Moment vergleiche ich jeden Messpunktnamen mit den Ergebnissen meines Dreiecks... stimmt ein Namen überein, lade ich diese Datei ein...
so macht das wohl ein programmieranfänger... ich schicke das skript mal mit, dann siehst du sofort, was ich meine...
das funktioniert auch, nur habe ich dann probleme, wenn ich die eingelesenen Daten im weiteren Verlauf des Skripts verwenden möchte... das Skript, bzw ich weiß ja dann nicht, welche Parameter nun anzuwenden sind... daher denke ich, dass schon beim Einlesen der Daten ein anderer Weg genommen werden sollte, so dass eindeutig ist, welche Daten danach zur Verfügung stehen...
Gruss
mathias
Datei-Anhang
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Hallo,
ich sehe dein Problem und es ist recht leicht zu lösen:
Wir erzeugen uns unsere Dateinamen passend zum aktuellen Punkt und weisen die Dateinhalte immer denselben Variablen zu.
Den Quelltext hänge ich an.
Das Cell Array Name habe ich darin selber erzeugt, weil es wohl außerhalb der Datei definiert war. Aber so sollte es laufen.
Alles, was von mir verändert wurde, ist mit %MARTIN kommentiert.
Gruß
Martin
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|