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

Plateau-Region in Messdaten

 

rcsapo
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 55
Anmeldedatum: 11.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2011, 13:39     Titel: Plateau-Region in Messdaten
  Antworten mit Zitat      
Liebe Matlab-Experten,

ich habe (leicht rauschige) Messdaten, die u.a. Angaben zur Winkelgeschwindigkeit mit der eine Bewegung durchgeführt wurde, beinhalten.

Meine Geschwindigkeitswerte starten bei 0 (Gelenk gebeugt), erreichen nach einer Beschleunigungsphase einen (über eine gewisse Zeit recht stabilen) Wert von etwa 180°/s und verringern sich danach wieder in Richtung 0 (Gelenk gestreckt). Es handelt sich um eine zyklische Bewegung (mehrfache Beuge-Streck-Zyklen), demnach wiederholt sich dieser Kurvenverlauf mehrfach.

Ich bin nun nur an jenen Phasen der Bewegung interessiert, in der die Bewegungsgeschwindigkeit jene relativ konstanten 180°/s beträgt, wo also die Steigung der Geschwindigkeits-Kurve (fast) genau 0 beträgt.

Wie könnte ich das in einer Funktion am besten bewerkstelligen? Bin kein besonders versierter Matlab-Anwender…

Vielen Dank für Eure Ratschläge,
Robert
Private Nachricht senden Benutzer-Profile anzeigen


draussen
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 26.11.10
Wohnort: DE
Version: 2010b,2020a
     Beitrag Verfasst am: 04.08.2011, 16:15     Titel:
  Antworten mit Zitat      
Hallo,

ich bin mir nicht Sicher ob das direkt hilft. Evtl. musst Du die Daten erstmal glätten. Je nachdem wie schlimm das gezackel ist.

Ansonsten würde ich da mathematisch vorgehen und die Daten numerisch ableiten.
Einen einfachen Weg bietet der Differenzenquot.:
Code:

deri_=diff(y)./diff(x);
 


Da kann man sich ja mal die Sachen nahe 0 anschauen.
Code:

y(deri_>-0.2&deri_<0.2)
 


Den leichten Versatz der Stellen durch die Differenzen (deltax/2) blenden wir jetzt mal aus.

MfG

Georg
_________________

Der Einäugige ist unter den Blinden der König!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
draussen
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 26.11.10
Wohnort: DE
Version: 2010b,2020a
     Beitrag Verfasst am: 04.08.2011, 16:22     Titel:
  Antworten mit Zitat      
...sollten die Daten zu zackelig sein kann man einfach größere Abstände für Differenzen wählen.

Code:

deri_=diff(y(1:4:end))./diff(x(1:4:end));
 


Dann muss man allerdings etwas mit der Zuordnung der Stellen von den Differenzen aufpassen.

MfG
_________________

Der Einäugige ist unter den Blinden der König!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
rcsapo
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 55
Anmeldedatum: 11.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2011, 19:07     Titel:
  Antworten mit Zitat      
Hallo Georg,

Vielen Dank für Deinen Vorschlag. Ich verstehe, dass der Differenzenquotient die Steigung meiner Geschwindigkeitskurve angibt und demnach dort wo dieser ungefähr 0 ist, gleichbleibende Geschwindigkeit vorliegen sollte. Ich bin Deinem ersten Vorschlag gefolgt und hab dann sowohl Deine Variable deri als auch die Geschwindigkeit über die Zeit geplottet und das hat so halbwegs gepasst. Das Problem, das ich jetzt erst bemerkt habe, ist, dass zwischen den einzelnen Wiederholungen offenbar immer eine kurze Pause eingehalten wurde, in der dann die Beschleunigung ebenfalls 0 ist.

In der Grafik anbei hab ich mal die Phasen markiert, an denen ich tatsächlich interessiert bin. Die entsprechenden Rohdaten leg ich auch dazu.
Code:
time = data(:,1);
vel = data(:,2);
vel = smooth(vel,30); % Moving average Glättung
deri = diff(vel)./diff(time);
plot(time,deri);
hold on
plot(time,vel,'g');


Abschließend würde mich dann auch noch interessieren, wie ich zu den entsprechenden x-Werten (also time-Werten oder Array-Indizes) komme. Mein Versuch
Code:
index_isovel = find(deri>1&deri<1);

mündet in einem leeren Vektor.

Vielen Dank nochmals für die Hilfe,
Robert

data.txt
 Beschreibung:

Download
 Dateiname:  data.txt
 Dateigröße:  722.39 KB
 Heruntergeladen:  478 mal
untitled.jpg
 Beschreibung:

Download
 Dateiname:  untitled.jpg
 Dateigröße:  74.46 KB
 Heruntergeladen:  658 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
draussen
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 26.11.10
Wohnort: DE
Version: 2010b,2020a
     Beitrag Verfasst am: 04.08.2011, 20:59     Titel:
  Antworten mit Zitat      
Hallo,

so erst mal das figure...

test.fig
 Beschreibung:

Download
 Dateiname:  test.fig
 Dateigröße:  895.96 KB
 Heruntergeladen:  481 mal

_________________

Der Einäugige ist unter den Blinden der König!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
draussen
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 26.11.10
Wohnort: DE
Version: 2010b,2020a
     Beitrag Verfasst am: 04.08.2011, 21:12     Titel:
  Antworten mit Zitat      
...
ich hab das im Prinzip gemacht wie Du...

Code:

% mit velsm als geglättete daten
 deri = diff(velsm)./diff(data(:,1));

%dann deri mit den zugehörigen original x werten geplottet

 x_deri=(data(1:(end-1),1)+diff(data(:,1))./2);

 plot(x_deri,deri,'m')

%und dann die x-indexe abgefragt:

%erst mal mit nullen gefüllt
 x_ind=zeros(size(x_deri));


%und dann den gesuchten x stellen den Wert 4500 verpasst:
x_ind((180>deri&deri>-180)&(velsm(1:1:(end-1))>100))=4500;

%hierbei werden die Daten berücksichtigt bei denen die Ableitung %zwischen +/-180 liegt und die originalwerte größer 100 sind.

plot(x_deri,x_ind,'g')
 



MfG

Georg
_________________

Der Einäugige ist unter den Blinden der König!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
rcsapo
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 55
Anmeldedatum: 11.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.08.2011, 08:54     Titel:
  Antworten mit Zitat      
Georg, das ist super vielen Dank!

Nur zum Verständnis:
Ich hätte die zu "deri" passenden x-Werte einfach mit
Code:

x_deri = data(:,1);
x_deri = x_deri(1:end-1);
 

erzeugt. Was genau tut Dein Term?
Code:

x_deri=(data(1:(end-1),1)+diff(data(:,1))./2);
 

Und bei
Code:

x_ind((180>deri&deri>-180)&(velsm(1:1:(end-1))>100))=4500;
 

ist der Wert 4500 beliebig gewählt oder hat das auch einen bestimmten Grund?
Private Nachricht senden Benutzer-Profile anzeigen
 
draussen
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 26.11.10
Wohnort: DE
Version: 2010b,2020a
     Beitrag Verfasst am: 05.08.2011, 09:11     Titel:
  Antworten mit Zitat      
Hallo,

den Term
Code:

x_deri=(data(1:(end-1),1)+diff(data(:,1))./2);
 

setzt quasi die x stellen von deri zwischen die xstellen der daten.

Also so in der Art:
xderi(1)=xdata(1)+delta_x(1)/2
...
xderi(n)=xdata(n)+delta_x(n)/2

Das erschien mir wichtig, damit die Ableitung den "richtigen" x-Stellen zugeordnet wird. Wenn (wie jetzt) jeder Datenpunkt ausgewertet wird, spielt das wahrscheinlich erstmal keine große Geige da der Fehler in x maximal delta_x/2 ist. Ich hatte aber wie vorher angekündigt erstmal mit einer Datenausdünnung zur Glättung "rumpropiert". Wenn man 20 x Werte auslässt wird der Fehler dann auch zu 20*delta_x/2. Das macht dann schon mehr aus.
Zumindest erschien mir das logisch.

Den Wert 4500 hatte ich so gewählt, damit das Ergebnis im Plot schön zu sehen ist - ist also für Dein Ziel belanglos.


MfG

Georg
_________________

Der Einäugige ist unter den Blinden der König!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
rcsapo
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 55
Anmeldedatum: 11.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.08.2011, 09:17     Titel:
  Antworten mit Zitat      
Ok, jetzt hab ich's auch verstanden. Eine letzte Frage hab ich noch. Warum sind die Phasen gleicher Geschwindigkeit in x_deri teilweise gerade mal für einen Messwert unterbrochen? Und kann man das unterbinden?

Liebe Grüße,
Robert
Private Nachricht senden Benutzer-Profile anzeigen
 
draussen
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 26.11.10
Wohnort: DE
Version: 2010b,2020a
     Beitrag Verfasst am: 05.08.2011, 09:55     Titel:
  Antworten mit Zitat      
Hallo,

das liegt an den Bedingungen für die x-stellen Suche. Das Ergebnis zeigt nur das Prinzip muss aber noch angepasst werden.

Also die Zahlen, 180, -180 und 100 in
Code:

x_ind((180>deri&deri>-180)&(velsm(1:1:(end-1))>100))
 


Ich hatte da nur mal schnell drüber gehuscht und die kriterien so angepasst dass man was sieht.

MfG

Georg
_________________

Der Einäugige ist unter den Blinden der König!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
rcsapo
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 55
Anmeldedatum: 11.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.08.2011, 11:01     Titel:
  Antworten mit Zitat      
Super, vielen Dank!
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.