np.polyfit () – kurva montering med NumPy Polyfit
den .polyfit()
funktion, accepterar tre olika ingångsvärden: x
, y
och polynomgraden. Argumenten x
och y
motsvarar värdena för de datapunkter som vi vill passa på axlarna x
respektive y
. Den tredje parametern anger graden av vår polynomfunktion. Till exempel, för att få en linjär passform, använd grad 1.
Innehållsförteckning
Vad är Curve Fitting?
kurvanpassning består i att bygga en matematisk funktion som kan passa vissa specifika datapunkter. För det mesta utsätts den passande ekvationen för begränsningar; dessutom är det också möjligt att göra initial gissning för att ge användbara utgångspunkter för uppskattningen av monteringsparametrarna, det senare förfarandet har fördelen att sänka beräkningsarbetet. I den här artikeln kommer vi att utforska NumPy-funktionen .polyfit()
, vilket gör det möjligt att skapa polynomanpassningsfunktioner på ett mycket enkelt och omedelbart sätt.
linjär passform
den enklaste typen av passform är linjär passform (En första gradens polynomfunktion), där datapunkterna monteras med en rak linje. Den allmänna ekvationen för en rak linje är:
y = mx + q
där ”m” kallas vinkelkoefficient och ”q” avlyssnar. När vi tillämpar en linjär passform söker vi i princip värdena för parametrarna ”m” och ”q” som ger den bästa passformen för våra datapunkter. I Numpy är funktionen np.polyfit()
ett mycket intuitivt och kraftfullt verktyg för montering av datapunkter; låt oss se hur du passar en slumpmässig serie datapunkter med en rak linje.
i följande exempel vill vi tillämpa en linjär anpassning till vissa datapunkter, beskrivna av matriserna x
och y
. Den .polyfit()
funktion, accepterar tre olika ingångsvärden: x
, y
och polynomgraden. Medan x
och y
motsvarar värdena för datapunkterna som vi vill passa, på axlarna x
respektive y
; den tredje parametern anger graden av vår polynomfunktion. Eftersom vi vill ha en linjär passform anger vi en grad som är lika med 1. Utgångarna för funktionen polyfit()
kommer att vara en lista som innehåller anpassningsparametrarna; den första är den som i funktionen multipliceras med den högsta graden; de andra följer sedan denna ordning.
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()
som tidigare nämnts kommer variabeln fit
att innehålla passande parametrar. Den första är vinkelkoefficienten, den sista är avlyssningen. För att plotta vår passform måste vi bygga y-axelvärdena från de erhållna parametrarna med hjälp av de ursprungliga X-axelvärdena. I exemplet beskrivs detta steg med definitionen av variabeln fit_eq
. Det sista som återstår är att plotta data och passande ekvation. Resultatet är:
Polynompassning av andra graden
i detta andra exempel kommer vi att skapa en andra graders polynompassning. Polynomfunktionerna av denna typ beskriver en parabolisk kurva i xy-planet; deras allmänna ekvation är:
y = ax2 + bx + c
där a, b och c är ekvationsparametrarna som vi uppskattar när vi genererar en passande funktion. Datapunkterna som vi kommer att passa i det här exemplet representerar banan för ett objekt som har kastats från en okänd höjd. Genom att utnyttja funktionen .polyfit()
kommer vi att passa banan för det fallande objektet och vi kommer också att få en uppskattning för dess initiala hastighet i x-riktningen, 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()
en gång initierade x
och y
arrays som definierar objektbanan, tillämpar vi funktionen .polyfit()
, den här gången sätter vi in ”2” som grad av polynompassningsfunktionen. Detta beror på att banan för ett fallande föremål kan beskrivas med ett andra gradens polynom; i vårt fall är förhållandet mellan koordinaterna x
och y
ges av:
y = y0-kub (g / v02)x2
där y0 är den ursprungliga positionen (höjden från vilken objektet har kastats), g tyngdkraftsaccelerationen (9,81 m / s2) och v0 initialhastigheten (m / s) i x-riktningen (besök: https://en.wikipedia.org/wiki/Equations_for_a_falling_body för mer information). Vi tilldelar sedan variablerna a
, b
och c
värdet på de 3 passande parametrarna och vi definierar fit_equation
, polynomekvationen som kommer att plottas; resultatet är:
om vi nu skriver ut de tre monteringsparametrarna, A, b och c , får vi följande värden: a = -0.100, b = 0.038, c = 24.92. I ekvationen som beskriver banan för en fallande kropp finns det ingen b-term; eftersom passformen alltid är en approximation av det verkliga resultatet kommer vi alltid att få ett värde för alla parametrar; men vi kommer att märka att värdet på vår b-term är mycket mindre än de andra och på något sätt kan försummas när vi jämför vår passform med ekvationen som beskriver problemets fysik. C-termen representerar den ursprungliga höjden (y0) medan A – termen beskriver kvantiteten-Xiaomi (g/ v02). Därför ges initialhastigheten v0 av:
v0 = 2-g2a
vilket ger det slutliga värdet av v0 = 6.979 m / s.