2017-01-08 2 views
2

Ich verwende derzeit Python, um zwei verschiedene Datensätze (xDAT und yDAT) zu vergleichen, die aus 240 Entfernungsmessungen bestehen, die über einen bestimmten Zeitraum hinweg aufgenommen wurden. Der Datensatz xDAT wird jedoch um einen nichtlinearen Betrag versetzt. Diese nichtlineare Menge ist gleich der Breite eines zeitabhängigen, dynamischen Mediums, das ich Level-A nenne. Genauer gesagt misst xDAT vom Ursprung bis zur Spitze der Ebene A, während yDAT vom Ursprung bis zum Ende der Ebene A misst. Siehe Diagramm folgende:Kurvenanpassung und Parameterschätzung in Python

enter image description here

Um beiden Kurven zu vergleichen, ich Faust muß eine Korrektur XDAT gilt für die Offset (die Breite der Stufe-A) zu bilden.

Bis jetzt habe ich mit verschiedenen Graden von numpy.polyfit herum gespielt. I.E:

coefs = np.polynomial.polynomial.polyfit(xDAT, yDAT, 5) 
polyEST=[] 
for i in range(0,len(x-DAT)): 
    polyEST.append(coefs[0] + coefs[1]*xDAT[i] + coefs[2]*pow(xDAT[i],2) + coefs[3]*pow(xDAT[i],3) + coefs[4]*pow(xDAT[i],4) + coefs[5]*pow(xDAT[i],5)) 

Das Problem bei dieser Methode ist, dass, wenn ich plotten Polyest (die die korrigierte Version von XDAT ist), die Handlung noch nicht den Trend der yDAT überein und bleibt ausgeglichen. Bitte beachten Sie die Abbildung unten, wo XDAT = blau, korrigiert XDAT = rot, und yDAT = grün:

enter image description here

Idealerweise die korrigierte XDAT sollte noch bleiben lauter als die yDAT, aber die allgemeine Schwingung und Trend die Kurven sollten übereinstimmen.

Ich wäre sehr dankbar für die Hilfe bei der Implementierung einer anderen Kurvenanpassung und Parameterschätzung Technik, um den nichtlinearen Offset durch Level-A zu korrigieren.

Vielen Dank.

+0

Ich denke nicht, dass es klar ist, was Sie versuchen zu tun. Du nennst 'polyfit', als ob' xDAT' und 'yDAT' die' x'- und 'y'-Koordinaten eines einzelnen Satzes von Abtastpunkten wären, aber deine Problembeschreibung und dein Plot suggerieren, dass sie nicht als solche verwandt sind. – Stelios

+0

Durch Ihre Beschreibung ist der Offset durch eine Konstante. Die Verwendung eines Polynoms mit Grad> 0 erscheint als falscher Ansatz. Außerdem scheinen von Ihrem Plot xDat und yDat nicht "aufgereiht" zu sein - das ist xDat eindeutig nicht yDat +/- etwas Konstante - es scheint auch "umgedreht" oder phasenverschoben zu sein. –

+0

Danke Stelios. In der Einleitung habe ich erwähnt, dass sowohl xDAT als auch yDAT Datensätze von 240 Punkten sind. Jeder dieser Punkte entspricht einer Messung zu einer bestimmten Zeit ... beide Datensätze wurden in gleichen Zeitinkrementen gemessen. Ich habe polyfit verwendet, um ein Polynom abzuleiten, das den Unterschied zwischen den beiden Datensätzen beschreibt, und dann habe ich dieses Polynom verwendet, um den Offset in xDAT zu korrigieren.Ich bin überzeugt, dass es eine geeignetere Methode gibt, um den in XDAT beobachteten Level-A-Offset als np.polyfit zu korrigieren. – LexStJ

Antwort

0

Die Antwort hängt davon ab, welche Stufe A ist. Wenn es unabhängig ist, Ihre erste Zeile sollte so etwas wie

coefs = np.polynomial.polynomial.polyfit(numpy.arange(xDAT.size), yDAT-xDAT, 5)

Dies gibt einen polyfit eines unabhängigen A sein, wie gezeichnet, und dann sollte die korrigierte x sein

xDAT+np.polynomial.polynomial.polyval(numpy.arange(xDAT.size),coefs)

Wenn A ist abhängig von den Variablen (wie es aussieht), wollen Sie nicht polyfit, da nur der reale Teil der Schwingung (der "Feder" Teil eines Feder-Dämpfer-System) regrediert, weshalb Ihre corrected_xDat ist in Phase mit xDat anstelle von yDat. Um etwas wie das zu regressieren, müssen Sie Fourier-Transformationen verwenden (was nicht meine Spezialität ist).