np.Polifit () – ajuste da curva com Polifit NumPy
The .polyfit()
função, Aceita três valores de entrada diferentes: x
, y
e o grau polinomial. Os argumentos x
e y
correspondem aos valores dos pontos de dados que queremos ajustar, nos eixos x
e y
, respectivamente. O terceiro parâmetro especifica o grau de nossa função polinomial. Por exemplo, para obter um ajuste linear, use grau 1.
Índice
o que é Ajuste de curva?
a adaptação da curva consiste na construção de uma função matemática capaz de encaixar alguns pontos de dados específicos. Na maioria das vezes, a equação de ajuste é sujeita a restrições; além disso, também é possível fazer uma suposição inicial para fornecer pontos de partida úteis para a estimativa dos parâmetros de ajuste, este último procedimento tem a vantagem de reduzir o trabalho computacional. Neste artigo vamos explorar a função NumPy .polyfit()
, que permite criar funções de ajuste polinomial de uma forma muito simples e imediata.
ajuste Linear
o tipo mais simples de ajuste é o ajuste linear (uma função polinomial de primeiro grau), em que os pontos de dados são instalados usando uma linha reta. A equação geral de uma linha reta é:
y = mx + q
onde “m” é chamado de coeficiente angular e “q” interceptação. Quando aplicamos um ajuste linear, estamos basicamente buscando os valores para os parâmetros “m” e “q” que produzem o melhor ajuste para nossos pontos de dados. Em Numpy, a função np.polyfit()
é uma ferramenta muito intuitiva e poderosa para encaixar pontos de dados; vamos ver como encaixar uma série aleatória de pontos de dados com uma linha reta.
no exemplo a seguir, queremos aplicar um ajuste linear a alguns pontos de dados, descritos pelas matrizes x
e y
. O .polyfit()
função, Aceita três valores de entrada diferentes: x
, y
e o grau polinomial. Enquanto x
e y
correspondem aos valores dos pontos de dados que queremos ajustar, nos eixos x
e y
, respectivamente; o terceiro parâmetro especifica o grau de nossa função polinomial. Uma vez que queremos um ajuste linear, vamos especificar um grau igual a 1. As saídas da função polyfit()
serão uma lista contendo os parâmetros de ajuste; o primeiro é aquele que na função é multiplicado pelo termo de maior grau; os outros então seguem esta ordem.
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()
como mencionado anteriormente, a variável fit
conterá os parâmetros de instalação. O primeiro é o coeficiente angular, o último a interceptar. Neste ponto, a fim de traçar o nosso ajuste, temos que construir os valores do eixo y a partir dos parâmetros obtidos, usando os valores do eixo x original. No exemplo, este passo é descrito pela definição da variável fit_eq
. A última coisa que resta é traçar os dados e a equação de ajuste. O resultado é:
ajuste Polinomial de segundo grau
neste segundo exemplo, vamos criar um polinómio de segundo grau de ajuste. As funções polinomiais de este tipo de descrever uma curva parabólica no plano xy; sua equação geral é:
y = ax2 + bx + c
onde a, b e c são os parâmetros da equação que estimamos ao gerar uma função de ajuste. Os pontos de dados que vamos encaixar neste exemplo, representam a trajetória de um objeto que foi lançado a partir de uma altura desconhecida. Explorando a função .polyfit()
, Ajustaremos a trajetória do objeto em queda e também obteremos uma estimativa para a sua velocidade inicial na direção 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()
Once initialized the x
and y
arrays defining the object trajectory, we apply the function .polyfit()
, this time inserting ” 2 ” as degree of the polynomial fit function. Isto porque a trajetória de um objeto em queda pode ser descrita por um polinômio de segundo grau; no nosso caso, a relação entre o x
e y
coordenadas é dada por:
y = y0 – ½ (g/ v02)x2
onde y0 é a posição inicial (a altura a partir da qual o objeto foi jogado), g a aceleração da gravidade ( 9,81 m/s2) e v0 a velocidade inicial (m/s) na direção x (visite: https://en.wikipedia.org/wiki/Equations_for_a_falling_body para mais detalhes). Então atribuímos às variáveis a
, b
e c
o valor dos 3 parâmetros de ajuste e definimos fit_equation
, a equação polinomial que será plotada; o resultado é:
Se nós agora imprima os três parâmetros de ajuste, a,b e c, obtemos os seguintes valores: a = -0.100 , b = 0.038, c = 24.92. A equação que descreve a trajetória de queda do corpo não há b termo; desde que o ajuste é sempre uma aproximação do resultado real, podemos sempre obter um valor para todos os parâmetros; no entanto, devemos notar que o valor de nossa b termo é muito menor do que os outros e podem ser, de alguma forma, negligenciado, ao comparar a nossa ajuste com a equação que descreve a física do problema. O termo c representa a altura inicial (y0) enquanto o termo a descreve a quantidade – ½ (g/ v02). Assim, a velocidade inicial v0 é dada por:
v0=2-g2a
dando o valor final de v0 = 6.979 m / s.