Hallo,
es müsste ein absolutes Standard-Problem der Messtechnik sein, ich finde aber die Lösung nicht:
Wie differenziere ich eine Messkurve, die aus diskreten Werten besteht? Speziell geht es hier um ein Zeit-Signal eines Geschwindigkeitssensors, dessen Messgröße elektr. Spannung ist. Aus der Geschwindigkeit möchte ich die Beschleunigung berechnen.
An jedem Messpunkt gibt es ja zwei Tangenten, daher ist eine eindeutige Differentiation nicht möglich. Wie wird das gelöst? Einfach jeweils den Mittelwert aus den beiden Steigungen nehmen?
Hat LabVIEW vielleicht schon eine spezielle Lösung für das Problem und ich übersehe sie nur?
Grüße
Malte
Ab "Full Development System" gibt es die Funktion "Ableitung x(t)". Die Dir vorschwebende Idealösung gibt es nlcht. Statt desen muß man sich für eine von 4 Differentiatiosmethoden entscheiden. In der Hilfe sind diese ausführlich beschrieben.
Allen Methoden gemeinsam ist, daß nach Anfangs- und/oder Endbedingungen verlangt wird. Bei Differenzierung einer echten mathematischen Funktion braucht man ja so einen Wert nicht.
Die Methoden sind:[list]
[*]2. Ordnung (Zentral)<>
[*]4. Ordnung (Zentral)<>
[*]Vorwärts<>
[*]Rückwärts<>
[st]Schau Du mal alles in Ruhe an, und bei Fragen melde Dich wieder.
Hallo Lucki,
danke für den Tipp. Das scheint genau das zu sein, was ich brauche.
Dass es die perfekte Lösung nicht gibt, dachte ich mir schon. Meine Überlegungen waren bisher: Entweder vorher die Kurve interpolieren, so dass eine stetig differenzierbare Funktion herauskommt, oder eben Mittelwertbildung(en). Letzteres tut genau "Ableitung x(t)". Sogar mit verschiedenen Methoden, die tatsächlich in der Hilfe gut beschrieben sind.
Soweit, so gut.
Was ich nicht verstehe, ist die Sache mit den Anfangs- und Endbedingungen. Wofür brauche ich die denn nun genau, bzw. wie verwende ich sie?
Außerdem habe ich noch das Problem, dass ich jetzt den Ausgang (dX/dt) nicht einfach an den Graf anschließen kann. Es erscheint die im Anhang beigefügte Meldung. Sowohl Datenquelle als auch -senke sind irgendwie 1-D Array DBL. Scheinbar aber doch was anderes...
Danke schonmal bis hierher.
Malte
' schrieb:Was ich nicht verstehe, ist die Sache mit den Anfangs- und Endbedingungen. Wofür brauche ich die denn nun genau, bzw. wie verwende ich sie?
Habe schon zu viele Zeit im Forum verplempert, deshalb erst mal kurze Antwort darauf:
Z.B Differenzieren Vorwärts: Es werden alle benachbarten Differenzen genommen. Das Resultat wäre ein Array mit einem Element weniger als der nicht differenzierte Array. Ni hat sich aber vorgenommen, daß bei allen 4 Methoden die Anzahl der Element nach Differentiation gleich bleiben soll, und schreit deshalb nach (einem) zusätzlichen Anfangselement(en). (Bei Methoden 1,2 sind es mehrere Anfangs/Endelemente)
Wenn man diese zusätzliche(n) Element(e) nicht hat, dann muß man sie eben vom Anfang und Ende des Arrays vor der Differentiation abtrennen, um sie als solche zu verwenden. Die differenzierte Restfunktion hat dann aber weniger Elemente als die Originalfunktion und muß in ihrem t0 gegebenenfalls verschoben werden, damit es keine Zeitverscheibung gegenüber der Originalfunktion gibt.
Führe hier npch mal diese verschiedenen Differenzierungen vor. Man sieht, daß mit der Methode 4. Ordnung (Zentral) eine Polynomkurve dritter Ordnung fehlerfrei differenziert wird. Bei den anderen Methoden ist das nicht der Fall. Allerdings muß man bei dieser Methode von der Originalkurve 2 Anfangs- und 2 Endpunkte wegnehmen, da man diese für die Anfangs/Endbedingungen braucht.
In der Praxis ist aber die Methode 4.Ordnung nur wichtig, wenn man bei einer Datenreihe im Bereich weniger Punkte große Krümmungen hat. Man verringert damit systematische Fehler im Krümmungsbereich.
[
attachment=19162]
Hallo Lucki,
vielen Dank für deine Zeit. Leider habe ich nicht die neueste LabVIEW-Version, so dass ich mir dein Beispiel nicht ansehen kann.
Kannst du es nochmal als 8.5-Version speichern? Wäre super!
Gruß
Malte
Ah perfekt! Eine übersichtlichere Darstellung zum Nachvollziehen der Methoden kann ich mir kaum vorstellen. Echt super... Danke! Das werde ich mir jetzt erstmal in Ruhe angucken.
Allerdings gibts immer noch das Problem mit dem Anschluss des Graphen:
Ich benutze einen Signalverlaufsgraph. Kann ich etwa nur einen XY-Graphen verwenden, wenn ich "Ableitung (x)" benutze? Wenn ja, wieso? Das dt ist doch immer noch konstant...?
Gruß
Malte
' schrieb:Allerdings gibts immer noch das Problem mit dem Anschluss des Graphen:
Ich benutze einen Signalverlaufsgraph. Kann ich etwa nur einen XY-Graphen verwenden, wenn ich "Ableitung (x)" benutze? Wenn ja, wieso? Das dt ist doch immer noch konstant...?
Du hast ja recht, und wenn Du genau hingeguckt hättest, hättest Du bemerken müssen, daß ich XY-Graphen gar nicht verwendet habe.
Man sieht es ja schon auf den ersten Blick: XY-Graphen benötigen 2 Arrays als Eingänge (Oder wahlweise ein Array, bestehend aus [X.Y]- Datenpunkt-Clustern. Hier im Beispielwird nur das Y-Array eingegeben.
Hallo.
Lucki schrieb:wenn Du genau hingeguckt hättest, hättest Du bemerken müssen, daß ich XY-Graphen gar nicht verwendet habe.
Da hast du natürlich Recht
Ich würde jetzt gerne, wie in Deinem Beispiel, den Signalverlaufsgraph mittels eines Clusters "füttern". Das ist ja eigentlich ganz einfach, die LabVIEW-Hilfe sagt:
Zitat:Der Graph akzeptiert außerdem einen Cluster mit einem x-Anfangswert, einem Dx-Wert und einem Array von Y-Daten.
Bei mir ist allerdings die Sache: Ich habe einen einzigen Signalverlaufsgraphen für 3 verschiedene Cases in einer Casestruktur und bei einem Case kommen die Daten direkt aus dem "DAQmx - Lesen" (da soll direkt das Geschwindigkeitssignal in den Graph gezeichnet werden, ohne irgendeine Umrechnung). Wenn mein Signalverlaufsgraph aber jetzt auf Cluster eingestellt ist, muss ja auch aus diesem Case der x-Anfangswert, der Dx-Wert und das Y-Array getrennt ankommen.
Die Frage lautet also: Wie bekomme ich aus der Daten-Leitung des "DAQmx - Lesen" die y-Werte extrahiert? Finde dazu nichts in der Hilfe...
Die Differenzierungs-Methoden habe ich inzwischen mathematisch nachvollzogen. Ich denke für meine Anwendung ist die Methode 4. Ordnung (zentral) die geeignetste. Denn bei kleiner Abtastfrequenz können ja sehr starke Krümmungen auftreten.
Naja, nochmals vielen Dank!
Edit:
Achso und wie kann ich eigentlich im Nachhinein den Signalverlaufsgraph so umstellen, dass er mit einem anderen Datentyp arbeitet?