Verfasst am: 20.12.2012, 11:48
Titel: Grafik mit Splines aus Matrizen
Hallo zusammen,
ich habe nochmal ein (hoffentlich) kleines Problem, bei dem ich nicht weiter komme.
Es sollen verschiedene Messwerte in eine Grafik eingefügt werden. Diese Messwerte liegen jeweils in 4 Matrizen (Typ: 22x1 double).
[edit]
Das Problem mit der Übelragerung hat sich eben geklärt. Da sich die Grafik in einer Schlaife befindet, wurden alle Punkte bis zum Schleifenende eingetragen - sorry. Ich habe nun versucht die Punkte mit einer Kurve zu verbinden, bin allerdings durch die spline() Funktion nicht durchgestiegen. Könnt ihr mir dabei vielleicht ein wenig helfen?
[/edit]
Erstellung der zu plottenden Matrizen (22x1 double)
muss zugeben, dass mir das Problem nicht ganz klar geworden ist. Die Funktion spline funktioniert jedenfalls folgendermaßen:
Gegeben seien 2 Vektoren und . Gesucht ist eine reelle stetige Funktion (i. d. R. hat sie noch weitere Eigenschaften wie stetige Differenzierbarkeit überall), welche stückweise aus Polynomen 3. Grades besteht. Deren Graph soll durch die Punkte verlaufen. Man nennt sie kubischen Spline.
allen im Forum erst einmal frohe Feiertage und dir, Ernie, vielen Dnak für deine Mühe!
Wenn ich in Excel ein Diagramm erstelle, dann ich doch die Datenpunkte in ein Diagramm eintragen lassen. Diese sind dann nicht mit geraden Linien sondern Kurven (Interpolationen, Splines?!) verbunden. Das möchte ich auch in Matlab realisieren.
dazu kannst du, wie von HerrErnie gezeigt, die SPLINE-Funktion verwenden. Du musst nur als z die x-Werte übergeben, an denen zusätzliche Datenpunkte berechnet werden sollen.
ich habe mich jetzt die ganze Zeit seit eurem letzten Post mit der Thematik beschäftigt und habe versucht das Problem zu lösen, leider klappt das nicht ohne weiteres.
Wenn ich die spline-Funktion nutze, habe ich zwar wunderschöne Kurvenabschnitte, allerdings durchläuft die Kurve dann nicht die Datenpunkte.
Ich habe ein wenig weitergesucht und dieses Tutorial mit der cscvn-Funktion gefunden. Eigentlich schon genau das, was ich gesucht habe. Allerdings habe ich dann "Fehler" in den Abbildungen, da ich zwischen den Datenpunkten oft Schleifenbildungen habe..
Wenn ich die spline-Funktion nutze, habe ich zwar wunderschöne Kurvenabschnitte, allerdings durchläuft die Kurve dann nicht die Datenpunkte.
Das legt die Vermutung nahe, dass du die Funktion falsch verwendet hast. Um mehr zu sagen, müsste man den konkreten Code, am besten mit Testdaten, haben.
habe tatsächlich jetzt erst das angehängt Bild gesehen...
Da die Datenpunkte keinen funktionalen Zusammenhang darstellen (zumindest nicht von x auf y), kann da die Spline-Funktion gar nicht funktionieren. Genaugenommen wundert es mich, dass du überhaupt ein Ergebnis erhältst, wenn du sie darauf anwendest.
liefert bei mir jetzt logischerweise einen Fehler, einfach weil keine stetige Funktion existiert, welche diese x-Koordinaten auf die jeweiligen y-Koordinaten abbildet, folglich auch kein Spline.
Es gibt jedoch einen Spline, welcher y auf x abbildet. Daher kann man sich behelfen, indem man zur Spline-Berechnung einfach x und y vertauscht:
Der so erzeugte Spline verläuft schließlich tatsächlich durch die gegebenen Datenpunkte, wie man sieht, auch wenn dieser hier im Beispiel zugebenermaßen an 2 Stellen einen etwas ungünstigen Verlauf nimmt.
Vielleicht hilft das ja bei der Lösung des Problems.
Edit: Hab schon wieder nicht alles gelesen... Das verlinkte Tutorial sieht tatsächlich nach einer wesentlich schöneren Lösung aus, kann dir da aber momentan leider auch nicht weiterhelfen, da mir die dort benutzten Funktionen unbekannt sind.
Edit 2: Auf mein Beispiel angewendet liefert die cscvn-Funktion in der Tat eine "schönere" Interpolation der Datenpunkte, wie man sieht:
ich habe mir nun auch mal die Grafik angesehen ;) Man kann ja für die Spline x- und y-Werte vertauschen und hat dann den benötigten funktionalen Zusammenhang.
vielen Dank für eure Mühe. Da habt ihr ja doch einige Zeit investiert. Euch beiden wünsche ich ein frohes und erfolgreiches neues Jahr (natürlich auch allen anderen)!
Zitat:
Das sollte hier also wirklich die Methode der Wahl sein.
Ich habe jetzt die Funktion nochmal angesehen und ein wenig herumprobiert. Die beiden Bilder im Anhang sind unter anderem das Ergebnis meiner Experimente. Es klappt also inzwischen also soweit, dass eine halbwegs vernünftige Darstellung ausgegeben wird (DANKE nochmal!).
Zitat:
Was sind "Schleifenbildungen"?
Guck doch dazu mal in Bild 1 (unten angehängt), außerdem sollten Pieks wie in Bild 2 nicht auftreten. Mir ist schon klar, dass die Pieks aufgrund der Lage auftreten, allerdings ist die Darstellung unrealistisch für eine Bauteiloberfläche...
Zitat:
Ohne weitere Details ist mir das genaue Problem jetzt jedoch auch wieder unklar.
Ich habe verschiedene Bauteile (alle haben die gleiche Bestellnummer) vermessen und möchte die Messpunkte prozentual verteilt über die Höhe des Bauteils darstellen. Daher ist die y-Achse auch von 0 bis 100 % skaliert. Wenn ich die Datenpunkte eintrage sollen diese verbunden werden. Da die Oberfläche des Bauteils nicht mit geraden Linien von Messstelle zu Messstelle verbunden ist, habe ich mit Splines die Punkte verbinden wollen.
ich würde tatsächlich den Vorschlag ausprobieren, x- und y-Koordinaten für den Aufruf von spline zu vertauschen. Dann sollten schönere Kurven herauskommen.
Wenn die Peaks in der Form nicht gewollt sind, müssen entweder die Daten vorverarbeitet werden oder man muss zu einem anderen Technik, z.B. Regression, greifen.
ich habe mich nun doch nochmal an die Splines gemacht - das hatte ja am Anfang nicht so recht funktioniert.
Harald hat Folgendes geschrieben:
... x- und y-Koordinaten für den Aufruf von spline zu vertauschen.
Das hat wunderbar geklappt - danke für den Tipp! Ich habe nun die im Anhang beigefügte Grafik erstellen können. Ich erhalte dabei keine Pieks oder Schleifenbildungen, was mich schonmal sehr glücklich macht
Nun bin ich doch noch ein wenig am Basteln... Die Splines sollen - ähnlich von so Wachstumslinien - nebeneinander leigen. Der Abstand der Linien zueinander darf (oder muss) also variieren, jedoch dürfen sich diese nicht schneiden. Habt ihr hier eine Idee, wie ich das realisieren kann?
Vielleicht wäre es auch super, wenn die Wendepunkte/Extrempunkte immer in den Datenpunkten (Messwerten liegen), da die Linien ja die Kante eines Bauteils beschreiben.
Den fertigen Code stelle ich dann gerne wieder allen zur Verfügung...
danke für den schnellen Tipp! Ich habe es eben mal ausprobiert und bei den ersten Datensätzen sieht es super aus! Mal sehen, wie es mit den anderen Datensätzen läuft. Die Punkte dürften sich nicht überschneiden, da immer z.B. das 65% oder 95% Quantil miteinander verbunden wird.
Hast du eine Idee, wie ich den Zwischenraum (Beispiel: Vertikale bei 100% und der jeweiligen durch die pchip erstellte Quartilslinie) farbig hinterlegen kann? Dass die Fläche z.B. hellblau ist?
Hast du hier eine Idee? Ich hatte eben schonmal im Handbuch geguckt und bin auf fill() und patch() aufmerksam geworden. Habe mit beiden bsiher jedoch nichts zu tun gehabt...
edit: Kann ich die Füllfarbe dann auch in der Legende beschriften?
danke für den Tip! Ich habe ihn auch gleich mal ausprobiert (du siehst die Versuche wieder auf den beiden Bildern).
Die Senkrechte (rot) zeigt Sollmaße. Die blauen Kurven stellen in diesem Fall die Fertigungsstreuungen entlang der Bauteilkante da. Die blauen Linien habe ich mit der pchip-Funktion berechnen lassen (Soll - Fertigungsstreuung bzw. Soll + Fertigungsstreuung).
Wenn ich nun mit der Funktion area() die Linien ausfüllen lasse, erhalte ich die ebenfalls angehängte Darstellung. Der Zwischenraum der beiden blauen Linien soll ausgefüllt sein. Versucht hatte ich es mit zwei Aufruden der Area-Funktion (für jede Linie einmal).
Kannst du mir sagen, was ich anders machen muss, damits es klappt?
[edit] Bei den Quantilen (siehe oben) möchte ich das dann auch anwenden, daher habe ich es erstmal mit etwas einfacherem (?) wie der Fertigungsstreuung versucht...
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
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.