Soy nuevo en Python. Tengo una curva de línea en el espacio 3D definido por un conjunto de puntos dados. ¿Alguien puede sugerir cómo puedo usar el interpolar con las funciones spline del paquete scipy para obtener los coeficientes de spline de la curva al igual que la función spline.coeff en MATLAB? ¡Gracias!
EDITAR:
He usado el
tck = interpolate.SmoothBivariateSpline(pts2[:,0], pts2[:,1], pts2[:,2]) test_pts = pts2[:,2]-tck.ev(pts2[:,0], pts2[:,1]) print test_pts
pero esto es para superficies aparentemente y no para curvas de línea pts2
es una numpy array
numpy numpy array
contiene las coordenadas de los puntos
ok me di cuenta de lo que estaba haciendo mal. Mis puntos de entrada fueron muy pocos. Ahora tengo otra pregunta. La función get_coeffs se supone que devuelve los coeficientes de spline en cada no. ¿En qué orden se devuelven esos coeficientes? Tengo una matriz de 79 tx y 79 ty que representan los nudos y obtengo una matriz de 1×5625 cuando llamo a la función para llamar a los nudos
Yo también soy nuevo en Python, pero mi búsqueda reciente me llevó a un tutorial de interpolación scipy muy útil . Al leer esto, estoy de acuerdo en que la familia de clases / funciones BivariateSpline está diseñada para interpolar superficies 3D en lugar de curvas 3D.
Para mi problema de ajuste de curva 3D (que creo que es muy similar al tuyo, pero con la adición de querer suavizar el ruido) terminé usando scipy.interpolate.splprep (no debe confundirse con scipy.interpolate.splrep). Desde el tutorial vinculado anteriormente, los coeficientes de spline que busca están devueltos por splprep.
La salida normal es una tupla de 3, (t, c, k), que contiene los puntos de nudo, t, los coeficientes c y el orden k de la spline.
Los documentos siguen refiriéndose a estas funciones de procedimiento como un “ajuste antiguo, no orientado a objetos de FITPACK” en contraste con las clases “más nuevas, orientadas a objetos” UnivariateSpline y BivariateSpline. Yo hubiera preferido “más nuevo, orientado a objetos” a mí mismo, pero por lo que puedo decir, UnivariateSpline solo maneja el caso 1-D mientras que splprep maneja los datos ND directamente.
A continuación se muestra un caso de prueba simple que utilicé para averiguar estas funciones:
import numpy as np import matplotlib.pyplot as plt from scipy import interpolate from mpl_toolkits.mplot3d import Axes3D # 3D example total_rad = 10 z_factor = 3 noise = 0.1 num_true_pts = 200 s_true = np.linspace(0, total_rad, num_true_pts) x_true = np.cos(s_true) y_true = np.sin(s_true) z_true = s_true/z_factor num_sample_pts = 80 s_sample = np.linspace(0, total_rad, num_sample_pts) x_sample = np.cos(s_sample) + noise * np.random.randn(num_sample_pts) y_sample = np.sin(s_sample) + noise * np.random.randn(num_sample_pts) z_sample = s_sample/z_factor + noise * np.random.randn(num_sample_pts) tck, u = interpolate.splprep([x_sample,y_sample,z_sample], s=2) x_knots, y_knots, z_knots = interpolate.splev(tck[0], tck) u_fine = np.linspace(0,1,num_true_pts) x_fine, y_fine, z_fine = interpolate.splev(u_fine, tck) fig2 = plt.figure(2) ax3d = fig2.add_subplot(111, projection='3d') ax3d.plot(x_true, y_true, z_true, 'b') ax3d.plot(x_sample, y_sample, z_sample, 'r*') ax3d.plot(x_knots, y_knots, z_knots, 'go') ax3d.plot(x_fine, y_fine, z_fine, 'g') fig2.show() plt.show()