np.polyfit() – Kurvenanpassung mit NumPy Polyfit

die .Die Funktion polyfit() akzeptiert drei verschiedene Eingabewerte: x, y und den Polynomgrad. Die Argumente x und y entsprechen den Werten der Datenpunkte, die auf den Achsen x und y angepasst werden sollen. Der dritte Parameter gibt den Grad unserer Polynomfunktion an. Um beispielsweise eine lineare Anpassung zu erhalten, verwenden Sie Grad 1.

Inhaltsverzeichnis

Was ist Curve Fitting?

Kurvenanpassung besteht darin, eine mathematische Funktion zu erstellen, die bestimmte Datenpunkte anpassen kann. Meistens ist die Anpassungsgleichung Einschränkungen unterworfen; darüber hinaus ist es auch möglich, erste Annahmen zu treffen, um nützliche Ausgangspunkte für die Schätzung der Anpassparameter bereitzustellen, wobei letzteres Verfahren den Vorteil hat, den Rechenaufwand zu verringern. In diesem Artikel werden wir die NumPy-Funktion .polyfit() untersuchen, mit der Polynomanpassungsfunktionen auf sehr einfache und unmittelbare Weise erstellt werden können.

Lineare Anpassung

Die einfachste Art der Anpassung ist die lineare Anpassung (eine Polynomfunktion ersten Grades), bei der die Datenpunkte mit einer geraden Linie angepasst werden. Die allgemeine Gleichung einer Geraden lautet:

y = mx + q

Wobei „m“ als Winkelkoeffizient und „q“ als Schnittpunkt bezeichnet wird. Wenn wir eine lineare Anpassung anwenden, suchen wir im Grunde die Werte für die Parameter „m“ und „q“, die die beste Anpassung für unsere Datenpunkte ergeben. In Numpy ist die Funktion np.polyfit() ein sehr intuitives und leistungsfähiges Werkzeug zum Anpassen von Datenpunkten; mal sehen, wie man eine zufällige Reihe von Datenpunkten mit einer geraden Linie anpasst.

Im folgenden Beispiel möchten wir eine lineare Anpassung auf einige Datenpunkte anwenden, die durch die Arrays x und y beschrieben werden. Der .Die Funktion polyfit() akzeptiert drei verschiedene Eingabewerte: x, y und den Polynomgrad. Während x und y den Werten der Datenpunkte entsprechen, die wir auf den Achsen x bzw. y anpassen möchten; Der dritte Parameter gibt den Grad unserer Polynomfunktion an. Da wir eine lineare Anpassung wünschen, geben wir einen Grad gleich 1 an. Die Ausgaben der Funktion polyfit() sind eine Liste mit den Anpassungsparametern. Der erste ist derjenige, der in der Funktion mit dem Term höchsten Grades multipliziert wird; Die anderen folgen dann dieser Reihenfolge.

import numpy as npfrom numpy import random #it will be useful for generating some random noise (on purpose) in the data points that we want to fitimport matplotlib.pyplot as plt #for plotting the data#---LINEAR FIT----#generate the x arrayx = np.linspace(0,60,60) # generate an array of 60 equally space points#generate the y array exploiting the random.randint() function to introduce some random noisey = np.array() #each element is a random number with value between +-2 the respective x axis value#Applying a linear fit with .polyfit()fit = np.polyfit(x,y,1)ang_coeff = fitintercept = fitfit_eq = ang_coeff*x + intercept #obtaining the y axis values for the fitting function#Plotting the datafig = plt.figure()ax = fig.subplots()ax.plot(x, fit_eq,color = 'r', alpha = 0.5, label = 'Linear fit')ax.scatter(x,y,s = 5, color = 'b', label = 'Data points') #Original data pointsax.set_title('Linear fit example')ax.legend()plt.show()

Wie bereits erwähnt, enthält die Variable fit die Anpassparameter. Der erste ist der Winkelkoeffizient, der letzte der Achsenabschnitt. An diesem Punkt müssen wir, um unsere Anpassung zu zeichnen, die Y-Achsenwerte aus den erhaltenen Parametern unter Verwendung der ursprünglichen x-Achsenwerte erstellen. Im Beispiel wird dieser Schritt durch die Definition der Variablen fit_eq beschrieben. Die letzte verbleibende Sache ist, die Daten und die passende Gleichung zu zeichnen. Das Ergebnis ist:

Polynomanpassung zweiten Grades

In diesem zweiten Beispiel erstellen wir eine Polynomanpassung zweiten Grades. Die Polynomfunktionen dieses Typs beschreiben eine parabolische Kurve in der xy-Ebene; ihre allgemeine Gleichung lautet:

y = ax2 + bx + c

wobei a, b und c die Gleichungsparameter sind, die wir bei der Erzeugung einer Anpassungsfunktion schätzen. Die Datenpunkte, die wir in diesem Beispiel anpassen werden, stellen die Flugbahn eines Objekts dar, das aus einer unbekannten Höhe geworfen wurde. Mit der Funktion .polyfit() passen wir die Flugbahn des fallenden Objekts an und erhalten auch eine Schätzung seiner Anfangsgeschwindigkeit in x-Richtung, v0.

#-----POLYNOMIAL FIT----x = np.array() # x coordinatesy = np.array() # y coordinatesfit = np.polyfit(x, y, 2)a = fitb = fitc = fitfit_equation = a * np.square(x) + b * x + c#Plottingfig1 = plt.figure()ax1 = fig1.subplots()ax1.plot(x, fit_equation,color = 'r',alpha = 0.5, label = 'Polynomial fit')ax1.scatter(x, y, s = 5, color = 'b', label = 'Data points')ax1.set_title('Polynomial fit example')ax1.legend()plt.show()

Nach der Initialisierung der Arrays x und y, die die Objekttrajektorie definieren, wenden wir die Funktion .polyfit() an und fügen diesmal „2“ als Grad der Polynomanpassungsfunktion ein. Dies liegt daran, dass die Flugbahn eines fallenden Objekts durch ein Polynom zweiten Grades beschrieben werden kann; in unserem Fall ist die Beziehung zwischen den Koordinaten x und y gegeben durch:

y = y0 – ½ (g / v02)x2

wobei y0 die Anfangsposition (die Höhe, aus der das Objekt geworfen wurde), g die Erdbeschleunigung (9,81 m / s2) und v0 die Anfangsgeschwindigkeit (m / s) in x-Richtung ist (siehe: https://en.wikipedia.org/wiki/Equations_for_a_falling_body für weitere Details). Wir weisen dann an den Variablen a, b und c den Wert der 3 Anpassungsparameter zu und definieren fit_equation, die Polynomgleichung, die aufgetragen wird; das Ergebnis ist:

Wenn wir nun die drei Anpassungsparameter a, b und c drucken, erhalten wir folgende Werte: a = -0,100 , b = 0,038, c = 24,92. In der Gleichung, die die Flugbahn eines fallenden Körpers beschreibt, gibt es keinen b-Term; Da die Anpassung immer eine Annäherung an das reale Ergebnis ist, erhalten wir immer einen Wert für alle Parameter; Wir werden jedoch feststellen, dass der Wert unseres b-Terms viel kleiner ist als die anderen und irgendwie vernachlässigt werden kann, wenn wir unsere Anpassung mit der Gleichung vergleichen, die die Physik des Problems beschreibt. Der c-Term repräsentiert die Anfangshöhe (y0), während der a–Term die Menge – ½ (g / v02) beschreibt. Daher ist die Anfangsgeschwindigkeit v0 gegeben durch:

v0=2-g2a

Was den Endwert von v0 = 6,979 m / s ergibt.