Saltar al contenido

ajuste de curva de python numpy / scipy

Solución:

Te sugiero que comiences con un ajuste polinomial simple, scipy.optimize.curve_fit intenta adaptarse a una función f que debes conocer a un conjunto de puntos.

Este es un ajuste polinomial simple de 3 grados usando numpy.polyfit y poly1d, el primero realiza un ajuste polinomial de mínimos cuadrados y el segundo calcula los nuevos puntos:

import numpy as np
import matplotlib.pyplot as plt

points = np.array([(1, 1), (2, 4), (3, 1), (9, 3)])
# get x and y vectors
x = points[:,0]
y = points[:,1]

# calculate polynomial
z = np.polyfit(x, y, 3)
f = np.poly1d(z)

# calculate new x's and y's
x_new = np.linspace(x[0], x[-1], 50)
y_new = f(x_new)

plt.plot(x,y,'o', x_new, y_new)
plt.xlim([x[0]-1, x[-1] + 1 ])
plt.show()

ingrese la descripción de la imagen aquí

Primero deberá separar su matriz numpy en dos matrices separadas que contengan valores xey.

x = [1, 2, 3, 9]
y = [1, 4, 1, 3]

curve_fit también requiere una función que proporcione el tipo de ajuste que le gustaría. Por ejemplo, un ajuste lineal usaría una función como

def func(x, a, b):
    return a*x + b

scipy.optimize.curve_fit(func, x, y) devolverá una matriz numpy que contiene dos matrices: la primera contendrá valores para a y b que mejor se adapte a sus datos, y el segundo será la covarianza de los parámetros de ajuste óptimos.

A continuación, se muestra un ejemplo de un ajuste lineal con los datos que proporcionó.

import numpy as np
from scipy.optimize import curve_fit

x = np.array([1, 2, 3, 9])
y = np.array([1, 4, 1, 3])

def fit_func(x, a, b):
    return a*x + b

params = curve_fit(fit_func, x, y)

[a, b] = params[0]

Este código volverá a = 0.135483870968 y b = 1.74193548387

Aquí hay un gráfico con sus puntos y el ajuste lineal … que claramente es malo, pero puede cambiar la función de ajuste para obtener el tipo de ajuste que desee.

ingrese la descripción de la imagen aquí

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *