np.polifit() – dopasowanie krzywej z NumPy Polifit
The .Funkcja polyfit()
przyjmuje trzy różne wartości wejściowe: x
, y
i stopień wielomianu. Argumenty x
i y
odpowiadają wartościom punktów danych, które chcemy dopasować, odpowiednio na osiach x
i y
. Trzeci parametr określa stopień naszej funkcji wielomianowej. Na przykład, aby uzyskać dopasowanie liniowe, użyj stopnia 1.
spis treści
Co To jest dopasowanie krzywej?
dopasowanie krzywej polega na zbudowaniu funkcji matematycznej, która jest w stanie dopasować określone punkty danych. W większości przypadków równanie dopasowania podlega ograniczeniom; ponadto możliwe jest również wstępne odgadnięcie, aby zapewnić przydatne punkty wyjściowe do oszacowania parametrów dopasowania, ta ostatnia procedura ma tę zaletę, że obniża pracę obliczeniową. W tym artykule przyjrzymy się funkcji NumPy .polyfit()
, która umożliwia tworzenie funkcji dopasowania wielomianowego w bardzo prosty i natychmiastowy sposób.
dopasowanie liniowe
najprostszym rodzajem dopasowania jest dopasowanie liniowe (funkcja wielomianowa pierwszego stopnia), w której punkty danych są dopasowane za pomocą linii prostej. Ogólne równanie prostej to:
y = mx + q
gdzie „m” nazywa się współczynnikiem kątowym i „Q”. Kiedy stosujemy dopasowanie liniowe, zasadniczo szukamy wartości parametrów „m” i „q”, które dają najlepsze dopasowanie dla naszych punktów danych. W Numpy funkcja np.polyfit()
jest bardzo intuicyjnym i potężnym narzędziem do dopasowywania datapoints; zobaczmy, jak dopasować losową serię punktów danych do linii prostej.
w poniższym przykładzie chcemy zastosować dopasowanie liniowe do niektórych punktów danych, opisanych tablicami x
i y
. The .Funkcja polyfit()
przyjmuje trzy różne wartości wejściowe: x
, y
i stopień wielomianu. Podczas gdy x
i y
odpowiadają wartościom punktów danych, które chcemy dopasować, odpowiednio na osiach x
i y
; trzeci parametr określa stopień naszej funkcji wielomianowej. Ponieważ chcemy dopasowania liniowego, określimy stopień równy 1. Wyjście funkcji polyfit()
będzie listą zawierającą parametry dopasowania; pierwszy to ten, który w funkcji jest mnożony przez najwyższy stopień, Pozostałe następnie wykonują tę kolejność.
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()
jak wspomniano wcześniej, zmienna fit
będzie zawierać parametry dopasowania. Pierwszy to współczynnik kątowy, ostatni to punkt przecięcia. W tym miejscu, aby wykreślić nasze dopasowanie, musimy zbudować wartości osi y z uzyskanych parametrów, używając oryginalnych wartości osi X. W przykładzie ten krok jest opisany przez definicję zmiennej fit_eq
. Ostatnią pozostałą rzeczą jest narysowanie danych i równania dopasowania. Rezultatem jest:
dopasowanie wielomianowe drugiego stopnia
w tym drugim przykładzie utworzymy dopasowanie wielomianowe drugiego stopnia. Funkcje wielomianowe tego typu opisują krzywą paraboliczną w płaszczyźnie xy; ich ogólne równanie to:
y = ax2 + bx + c
gdzie A, b I c są parametrami równania, które szacujemy podczas generowania funkcji dopasowującej. Punkty danych, które zmieścimy w tym przykładzie, reprezentują trajektorię obiektu, który został wyrzucony z nieznanej wysokości. Wykorzystując funkcję .polyfit()
, dopasujemy trajektorię spadającego obiektu, a także uzyskamy oszacowanie jego początkowej prędkości w kierunku x, 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()
po zainicjalizowaniu tablic x
i y
definiujących trajektorię obiektu, stosujemy funkcję .polyfit()
, tym razem wstawiając „2” jako stopień funkcji dopasowania wielomianowego. Dzieje się tak dlatego, że trajektorię spadającego obiektu można opisać wielomianem drugiego stopnia; w naszym przypadku zależność pomiędzy współrzędnymi x
i y
jest określona przez:
y = y0 – ½ (g/ v02)x2
gdzie y0 jest pozycją początkową (wysokość, z której obiekt został rzucony), g przyspieszeniem grawitacyjnym ( 9,81 m/s2) i v0 prędkością początkową (m/s) w kierunku x (odwiedź: https://en.wikipedia.org/wiki/Equations_for_a_falling_body po więcej szczegółów). Następnie przyporządkowujemy do zmiennych a
, b
i c
wartość 3294 parametrów i definiujemy fit_equation
, równanie wielomianowe, które zostanie wykreślone; wynik jest:
jeśli teraz wydrukujemy trzy pasujące parametry, a, b I c, otrzymamy następujące wartości: a = -0,100, b = 0,038, c = 24,92. W równaniu opisującym trajektorię spadającego ciała nie ma terminu b; ponieważ dopasowanie jest zawsze przybliżeniem rzeczywistego wyniku, zawsze otrzymamy wartość dla wszystkich parametrów; zauważmy jednak, że wartość naszego terminu b jest znacznie mniejsza niż pozostałe i może być w jakiś sposób zaniedbana, porównując nasze dopasowanie z równaniem opisującym fizykę problemu. Termin c oznacza Wysokość początkową (y0), natomiast termin a opisuje ilość – ½ (g/ v02). Stąd prędkość początkowa v0 jest określona przez:
v0 = 2-g2a
dając końcową wartość v0 = 6,979 m / s.