np.polyfit() – Curve passend bij NumPy Polyfit
The .polyfit()
functie, accepteert drie verschillende ingangswaarden: x
, y
en de polynoomgraad. Argumenten x
en y
komen overeen met de waarden van de gegevenspunten die we willen inpassen, op respectievelijk de assen x
en y
. De derde parameter specificeert de mate van onze veeltermfunctie. Om bijvoorbeeld een lineaire pasvorm te verkrijgen, gebruik je graad 1.
inhoudsopgave:
Wat is Curve Fitting?
Curvefitting bestaat uit het bouwen van een wiskundige functie die in staat is om op bepaalde specifieke gegevenspunten te passen. Meestal wordt de montagevergelijking onderworpen aan beperkingen; bovendien is het ook mogelijk om een eerste gok te maken voor het verstrekken van nuttige startpunten voor de schatting van de montageparameters, deze laatste procedure heeft het voordeel van het verlagen van het rekenwerk. In dit artikel zullen we de NumPy-functie .polyfit()
verkennen, die het mogelijk maakt om polynomiale fit-functies op een zeer eenvoudige en directe manier te creëren.
Lineaire pasvorm
het eenvoudigste type pasvorm is de lineaire pasvorm (een eerstegraads veeltermfunctie), waarbij de gegevenspunten met behulp van een rechte lijn worden gemonteerd. De algemene vergelijking van een rechte is:
y = mx + q
waarbij” m “hoekcoëfficiënt en” q ” – snijpunt wordt genoemd. Wanneer we een lineaire pasvorm toepassen, zoeken we in principe de waarden voor de parameters “m” en “q” die de beste pasvorm voor onze datapunten opleveren. In Numpy is de functie np.polyfit()
een zeer intuïtief en krachtig hulpmiddel voor het plaatsen van datapunten; laten we eens kijken hoe je een willekeurige reeks gegevenspunten past met een rechte lijn.
in het volgende voorbeeld willen we een lineaire pasvorm toepassen op sommige gegevenspunten, beschreven door de arrays x
en y
. De .polyfit()
functie, accepteert drie verschillende ingangswaarden: x
, y
en de polynoomgraad. Terwijl x
en y
overeenkomen met de waarden van de gegevenspunten die we willen inpassen, op respectievelijk de assen x
en y
, specificeert de derde parameter de mate van onze veeltermfunctie. Omdat we een lineaire pasvorm willen, geven we een graad gelijk aan 1. De output van de functie polyfit()
zal een lijst zijn met de passende parameters; de eerste is degene die in de functie wordt vermenigvuldigd met de hoogste graad term; de andere volgen dan deze volgorde.
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()
zoals eerder vermeld, bevat de variabele fit
de passende parameters. De eerste is de hoekcoëfficiënt, de laatste de onderschepping. Op dit punt, om onze fit te plotten, moeten we de y-as waarden bouwen uit de verkregen parameters, met behulp van de oorspronkelijke X-as waarden. In het voorbeeld wordt deze stap beschreven door de definitie van de variabele fit_eq
. Het laatste wat overblijft is het plotten van de gegevens en de passende vergelijking. Het resultaat is:
polynomiale fit van tweede graad
In dit tweede voorbeeld maken we een tweedegraads polynomiale fit. De veeltermfuncties van dit type beschrijven een parabolische kromme in het xy-vlak; hun algemene vergelijking is:
y = ax2 + bx + c
waarbij a, b en c de vergelijkingsparameters zijn die we schatten bij het genereren van een passende functie. De datapunten die we in dit voorbeeld zullen passen, vertegenwoordigen de baan van een object dat vanaf een onbekende hoogte is geworpen. Door gebruik te maken van de functie .polyfit()
zullen we de baan van het vallende object aanpassen en zullen we ook een schatting krijgen van de beginsnelheid in de x-richting, 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()
zodra de arrays x
en y
zijn geïnitialiseerd die het objecttraject definiëren, passen we de functie .polyfit()
toe, deze keer door “2” in te voegen als graad van de polynomiale fit-functie. Dit komt omdat de baan van een vallend voorwerp kan worden beschreven door een tweedegraads veelterm; in ons geval wordt de relatie tussen de coördinaten x
en y
gegeven door:
y = y0 – ½ (g/ v02)x2
waarbij y0 de beginpositie is ( de hoogte van waaruit het object is geworpen), g de versnelling van de zwaartekracht (9,81 m/s2) en v0 de beginsnelheid (m/s) in de x-richting (bezoek: https://en.wikipedia.org/wiki/Equations_for_a_falling_body voor meer details). Vervolgens wijzen we bij de variabelen a
, b
en c
de waarde van de 3 passende parameters toe en definiëren we fit_equation
, de veeltermvergelijking die zal worden uitgezet; het resultaat is:
als we nu de drie passende parameters a, b en c printen,krijgen we de volgende waarden: a = -0.100, b = 0,038 , c = 24.92. In de vergelijking die het traject van een vallend lichaam beschrijft is er geen b term; omdat de fit altijd een benadering is van het werkelijke resultaat, zullen we altijd een waarde krijgen voor alle parameters; maar we zullen merken dat de waarde van onze B term veel kleiner is dan de andere en op de een of andere manier kan worden verwaarloosd, wanneer we onze fit vergelijken met de vergelijking die de fysica van het probleem beschrijft. De term c staat voor de beginhoogte (y0), terwijl de term a de hoeveelheid – ½ (g/ v02) beschrijft. De beginsnelheid v0 wordt dus gegeven door:
v0 = 2-g2a
hetgeen de eindwaarde van v0 = 6,979 m/s oplevert.