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

linespace verkehrt herum?

 

Torso
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 10.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2011, 09:36     Titel: linespace verkehrt herum?
  Antworten mit Zitat      
Hallo zusammen!

Ich habe folgendes Problem:

Ich möchte durch meinen Datensatz mir 3 x-y-Koordinaten eine Kurve plotten.

Das hab ich über linspace gelöst.
Das Problem ist nur, dass die Kurve falsch gezeichnet wird.

Code:

A = [4 3.6; 4.1 3.5; 4.3 3.7];

a = min(min(A(:,2)));
b = max(max(A(:,2)));

plot(A(:,2),A(:,1), '*');

x = A(:,2);
T = A(:,1);
pp = pchip(x,T);
x_vek = linspace(a,b,1000);
plot(x_vek,ppval(pp,x_vek));hold on;
plot(x,T,'r+');
axis([3.4 3.9 3.8 4.5]);
 


die Linie sollte bei dem ersten Punkt (1. Zeile in A) in meinem Datensatz anfangen und beim letzten Punkt aufhören.
Also vom Punkt (4 3.6) über (4.1 3.5) bis (4.3 3.7) gehen.
Sie wird jedoch von meinem Minimum aus bis zu meinem Maximum auf der x-Achse gezeichnet obwohl das nicht der Reihenfolge im Datensatz entspricht.

Ich denke es liegt an folgender Zeile:
Code:
x_vek = linspace(a,b,1000)

ich weiß nur nicht wie ich die Sache umstellen bzw. umschreiben kann dass die Reihenfolge in dem Datensatz berücksichtigt wird und nicht automatisch nach dem Min bzw. Max gegangen wird.

Oh mann, ich hoffe das war wenigstens ein bisschen verständlich.

Vielen Dank schonmal.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.12.2011, 10:37     Titel:
  Antworten mit Zitat      
Hallo,

bei Interpolation denkt man i.d.R. an Funktionen, d.h. Kurven die von links nach rechts gehen. Deine Kurven würden ja kreuzen. Du kannst höchstens versuchen, sowohl x als auch T gegen eine "Zeit" 1:3 zu interpolieren und hoffen, dass was gescheites herauskommt.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 10.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2011, 12:08     Titel:
  Antworten mit Zitat      
Ich hab mal ein Bild angehängt.

Im Bild ist die von Matlab geplottete Kurve in blau. Sie fängt beim geringsten x-Wert an und geht zum größten x-Wert. - das was ich nicht will.
Die Kurve in schwarz (von mir selbst eingezeichnet) wäre das gewünschte Ergebnis, der Reihenfolge im Datensatz entsprechend.

Ist das irgendiwe zu machen?

b1.jpg
 Beschreibung:

Download
 Dateiname:  b1.jpg
 Dateigröße:  42.25 KB
 Heruntergeladen:  423 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2011, 12:35     Titel:
  Antworten mit Zitat      
Ich glaub ich habe dein Problem nicht so richtig verstanden, denn sonst wäre die Antwort sehr simpel:
- Entweder du sortierst deinen Vektor um, also von groß nach klein, oder schreibst direkt
- linspace(große_Zahl, kleine_Zahl, Anzahl)
 
Torso
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 10.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2011, 13:00     Titel:
  Antworten mit Zitat      
also das Problem ist, dass die 3 Punkte Koordinaten zu unterschiedlichen Zeitpunkten darstellen.
Die Linie soll dann eben in späteren Schritten eine Richtung anzeigen.

d. h.
mein erster Punkt (4 3.6) ist zum ersten Zeitpunkt aufgenommen worden.
zweiter Punkt (10 min. später) ist der Punkt (4.1 3.5)
und der letzte Punkt (nochmal 10 min später) ist der Punkt (4.3 3.7)

genau in dieser Reihenfolge sind die Punkte auch in der Matrix.

nach meinem Code aber plottet Matlab die Punkte so, als wäre der Anfangspunkt Punkt 2 (4.1 3.5), der zweite Punkt Punkt 1 (4 3.6) und der dritte Punkt (4.3 3.7)
also immer vom gerinsgten x-Wert ausgehend und nicht nach der Reihenfolge in der Matrix was ich gerne hätte.

Das ganze läuft auch durch eine Schleife für insgesamt 15 Koordinaten-Trippel zu dem jeweils eben die Linie geplottet werden soll.
So lange die Koordinaten-Trippel (nach Zeitpunkt geordnet) von den x-Werten in aufsteigender Reihenfolge kommen passt ja auch alles.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.12.2011, 13:13     Titel:
  Antworten mit Zitat      
Hallo torso,

ich hatte dir doch einen Lösungsvorschlag gemacht.
Wenn du ihn nicht ganz verstehst, kannst du ja nachfragen? Einfach nicht darauf einzugehen finde ich jedoch merkwürdig.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 10.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2011, 13:33     Titel:
  Antworten mit Zitat      
ja, sorry.

ich verstehe nicht was du damit meinst, dass sich die Kurven kreuzen würden. Und wie ich das gegen eine Zeit interpolieren lassen kann.

Deswegen hab ich dann noch die Bilder angehängt und versucht das ganze etwas deutlicher zu machen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

mir war durchaus klar, was du willst.

Mit "kreuzen" meinte ich, dass ein x-Wert mehrfach vorkommt. Das ist bei Interpolation ausgeschlossen.

Deswegen x und T gegen 1:3 interpolieren, und dann passts:

Code:
a = min(A(:,2));
b = max(A(:,2));

x = A(:,2);
T = A(:,1);
t = 1:length(x);
pp1 = pchip(t,x);
pp2 = pchip(t,T);
t_vek = linspace(min(t),max(t),1000);
plot(ppval(pp1,t_vek),ppval(pp2,t_vek));hold on;
plot(x,T,'r+');
axis([3.4 3.9 3.8 4.5]);


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 10.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2011, 15:19     Titel:
  Antworten mit Zitat      
Wahnsinn Very Happy

vielen Dank, für die ausführliche Hilfe, ich wär da nie drauf gekommen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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.