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

Grafik mit Splines aus Matrizen

 

rowJoe
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 25.11.12
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 20.12.2012, 11:48     Titel: Grafik mit Splines aus Matrizen
  Antworten mit Zitat      
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)
Code:

plotMittel(CountSchnitt,1) = N00125_RealProfil_MittelRel(1,1,CountSchnitt,CountMerkmal,CountStufe);
plotStabw(CountSchnitt,1) = N00125_RealProfil_StabwRel(1,1,CountSchnitt,CountMerkmal,CountStufe);
plotMin(CountSchnitt,1) = N00125_RealProfil_MinRel(1,1,CountSchnitt,CountMerkmal,CountStufe);
plotMax(CountSchnitt,1) = N00125_RealProfil_MaxRel(1,1,CountSchnitt,CountMerkmal,CountStufe);
plotSoll(CountSchnitt,1) = Neu_RealProfil_MittelRel(1,1,CountSchnitt,CountMerkmal,CountStufe);
plotSollStabw(CountSchnitt,1) = Neu_RealProfil_StabwRel(1,1,CountSchnitt,CountMerkmal,CountStufe);

plotSchnitt(:,CountSchnitt) = Profilschnitte(:,1,CountStufe);
 


Ausgabe der Grafik:
Code:

plot(plotMittel,plotSchnitt,'-*k',...
                                    'LineWidth',1,...
                                    'MarkerEdgeColor','k',...
                                    'MarkerFaceColor','k',...
                                    'MarkerSize',7)
hold on
       
plot(plotMin,plotSchnitt,'--^k',...
                                 'LineWidth',1,...
                                 'MarkerEdgeColor','k',...
                                 'MarkerFaceColor','k',...
                                 'MarkerSize',7)
hold on
       
plot(plotMax,plotSchnitt,'--vk',...
                                 'LineWidth',1,...
                                 'MarkerEdgeColor','k',...
                                 'MarkerFaceColor','k',...
                                 'MarkerSize',7)
hold on
       
plot(plotSoll,plotSchnitt,'-r',...
                                  'LineWidth',1,...
                                  'MarkerEdgeColor','k',...
                                  'MarkerFaceColor','k',...
                                  'MarkerSize',7)
       
grid on




Vielen Dank für eure Hilfe!

Jonas

Beispiel.jpg
 Beschreibung:

Download
 Dateiname:  Beispiel.jpg
 Dateigröße:  17.96 KB
 Heruntergeladen:  646 mal
Private Nachricht senden Benutzer-Profile anzeigen


HerrErnie
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 21.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.12.2012, 22:25     Titel:
  Antworten mit Zitat      
Hallo,

muss zugeben, dass mir das Problem nicht ganz klar geworden ist. Die Funktion spline funktioniert jedenfalls folgendermaßen:

Gegeben seien 2 Vektoren x=(x_1,\ldots,x_n) und y=(y_1,\ldots,y_n) . 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 (x_1,y_1),\ldots,(x_n,y_n) verlaufen. Man nennt sie kubischen Spline.
Code:

gibt jetzt die Funktionswerte des kubischen Splines durch ebendiese Punkte ausgewertet in z aus (je feiner z ist, desto "glatter" sieht der Plot aus).
Code:

zeigt schließlich den Spline.

Vielleicht hilft das ja weiter.
Private Nachricht senden Benutzer-Profile anzeigen
 
rowJoe
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 25.11.12
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 25.12.2012, 18:58     Titel:
  Antworten mit Zitat      
Guten Abend,

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.

Weiß jemand wie da am einfachsten geht?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.12.2012, 21:01     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
rowJoe
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 25.11.12
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 30.12.2012, 12:49     Titel:
  Antworten mit Zitat      
Moin Leute,

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..

Habt ihr noch ein paar Ideen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.12.2012, 15:24     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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.

Was sind "Schleifenbildungen"?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
HerrErnie
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 21.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.12.2012, 16:26     Titel:
  Antworten mit Zitat      
Hallo,

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.

Nehmen wir testweise mal folgende Datenpunkte:
Code:

x=[0.2569,0.1786,0.2131,0.2270,0.3353,0.4551,0.3260,0.3790,0.4090,0.4919,0.4919,0.5196,0.4804,0.5380];
y=[0.1213,0.2295,0.3260,0.3553,0.4430,0.5132,0.5833,0.6857,0.7529,0.7675,0.8289,0.8582,0.9254,0.9693];
 

Diese sollen einen ähnlichen Verlauf wie die linke Kurve im angehängten Bild haben.
Code:

z=0:1/100:1;
spline(x,y,z);
 

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:
Code:

yy=0:1/100:1;
xx=spline(y,x,yy);
axis equal
plot(x,y,'o',xx,yy);
 


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:
Code:

hold on
fnplt(cscvn([x;y]));
plot(x,y,'o',xx,yy);
 

Das sollte hier also wirklich die Methode der Wahl sein.
Ohne weitere Details ist mir das genaue Problem jetzt jedoch auch wieder unklar.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.12.2012, 18:09     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
rowJoe
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 25.11.12
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 01.01.2013, 18:47     Titel:
  Antworten mit Zitat      
Hallo Harald und HerrErnie,

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.

Bild2.jpg
 Beschreibung:
Bild 2: Piekbildung

Download
 Dateiname:  Bild2.jpg
 Dateigröße:  57.35 KB
 Heruntergeladen:  603 mal
Bild1.jpg
 Beschreibung:
Bild 1: Schleifenbildung

Download
 Dateiname:  Bild1.jpg
 Dateigröße:  56.52 KB
 Heruntergeladen:  612 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.01.2013, 12:45     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
rowJoe
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 25.11.12
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 03.01.2013, 10:23     Titel:
  Antworten mit Zitat      
Guten Morgen,

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 Smile

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...


Nochmals danke für die großartige Hilfe!

Jonas

Splineinterpolation.jpg
 Beschreibung:
Grafikausgabe

Download
 Dateiname:  Splineinterpolation.jpg
 Dateigröße:  89.45 KB
 Heruntergeladen:  600 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.01.2013, 11:34     Titel:
  Antworten mit Zitat      
Hallo,

eine Möglichkeit: pchip statt spline verwenden. Dann wird eine andere Art der Interpolation verwendet, die nicht so sehr überschießt.

Meine Vermutung ist, dass es dann keine Überschneidungen geben wird, außer wenn die Datenpunkte sich überschneiden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
rowJoe
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 25.11.12
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 03.01.2013, 12:18     Titel:
  Antworten mit Zitat      
Moin Harald,

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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.01.2013, 12:36     Titel:
  Antworten mit Zitat      
Hallo,

das geht mit AREA.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
rowJoe
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 25.11.12
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 03.01.2013, 14:31     Titel:
  Antworten mit Zitat      
Hallo Harald,

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? Smile


[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...

Gefüllt.jpg
 Beschreibung:
Mit Füllung

Download
 Dateiname:  Gefüllt.jpg
 Dateigröße:  50.37 KB
 Heruntergeladen:  603 mal
Ungefüllt.jpg
 Beschreibung:
Ohne Füllung

Download
 Dateiname:  Ungefüllt.jpg
 Dateigröße:  50.52 KB
 Heruntergeladen:  601 mal


Zuletzt bearbeitet von rowJoe am 03.01.2013, 14:46, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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 - 2025 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.