Decir que tengo dos matrices en python y me gustaría conseguir (y uso) de las cubic spline de interpolación entre los puntos. (Es decir: el deseo de integrar la función). Creo firmemente que prefieren un camino en el uso de numpy scipy.

Sé acerca de scipy.interpolar.interp1d. Sin embargo, de que sólo me permite evalute los puntos, para decir la muy simplemente en función de:

Ahora yo podía hacer algo, simplemente, como:

import numpy as np
import scipy.interpolate
import matplotlib.pyplot as plt

y = np.array([0,2,3,4,8,10,12,12,12,10,9,8,7,1,0,0,1,2])
x = np.array(range(len(y)))
xvals = np.linspace(0, len(y)-1, len(y)*100, endpoint = False)
func = scipy.interpolate.interp1d(x, y, kind = "cubic")
yvals = func(xvals)
plt.plot(xvals,yvals)
plt.plot(x,y, "o")

Sin embargo, deseo seguir el proceso de esta cubic spline (es decir, tengo que conseguir la integración).. manual haciendo cosas que se necesitan para obtener los factores, así:

a_i * x^3 + b_i * x^2 + c_i * x + d_i where i goes from 0 to n/3 

(n = número de elemetns – esto es sólo la definición de la i-ésima cúbicos)

Yo de ahí esperar una lista de tuplas (o matriz 2d), que describe todas las splines. – O una forma de llegar a la i-ésima cúbicos, y realmente, realmente me encantaría llegar a tener un conveniencia «x-a-i» a en la que encontrar spline estoy actualmente.

(Aunque, por supuesto, este último problema es una simple búsqueda de su primer valor mayor que el de la referencia en una lista ordenada – yo podría hacer eso con la mano fácilmente, si es necesario).

  • Usted podría utilizar scipy.integrate.quad para integrar la función interpolada.
InformationsquelleAutor paul23 | 2015-04-05

2 Comentarios

  1. 1

    Para la interpolación, puede utilizar scipy.interpolate.UnivariateSpline(..., s=0).

    Tiene, entre otras cosas, la integrar método.

    EDICIÓN: s=0 parámetro para UnivariateSpline constructor de las fuerzas de la spline para pasar a través de todos los puntos de datos. El resultado está en la B-spline, usted puede obtener los nudos y los coeficientes con get_coefs() y get_knots() métodos. El formato es el mismo que se utiliza en FITPACK, dierckx, en biblioteca de red. Nota a pesar de que el tck formato utilizado internamente por interp1d (que se basa en splmake ATM) y UnivariateSpline (como alternativa, splrep/splev) son inconsistentes.

    EDIT2: usted puede obtener un polinomio a trozos representación de un spline con PPoly.from_spline — pero esto es no coherente con iterp1d. Uso splrep(…, s=0) para obtener una interpolación de spline, a continuación, convertir el resultado.

    • El univariatespline no es un spline cúbico, en lugar de eso es de lo que se denomina ‘b-spline’, esto es una cosa y tiene muy poco que ver con lo que yo quiero lograr. – por una cosa que no hace un ajuste de curvas a través de los puntos. Un spline cúbico es definido como una serie de 3er orden polinomios, cada conexión de dos puntos, con la restricción adicional de que en cada punto final de la splines tienen la misma derivada.
    • interp1d con tipo=cúbicos trabaja en la b-spline base de bien. Si quieres un local interpolant en scipy, uso BPoly.from_derivatives
    • No son estrías generalmente construido formulario de b-splines?
    • los dos son completamente diferentes campos matemáticos. splines cúbicos son una forma de interpolación. b-splines una forma de aproximación. splines cúbicos VA a ir a través de todos los puntos, B-splines NO garantiza que.
    • Por supuesto, usted puede expresar un cúbicos de la interpolación de spline en la b-spline base. @Dux ver editado mi respuesta.
    • siguientes hasta el último comentario, b-splines formar una base de splines, por lo tanto, se puede expresar de una spline de ir a través de todos los puntos de datos en una b-spline-representación de una spline.
    • bueno, entonces yo en realidad necesidad de matemática «prueba» de que los dos son iguales. – Yo no puedo ver cómo son, pero que podría ser mi limitado conocimiento. Pero ciertamente no puedo usar algo sin saber bajo qué circunstancias los resultados son verdaderas. ¿Cuál es la matemática que rige el B-spline, y ¿cómo encajan a la splines cúbicos. Como he dicho: estoy menos interesado en la apariencia, pero más en matemáticas de las cantidades. (este spline tendrá en cuenta para el análisis, tales como la integración y la búsqueda de raíces)
    • para las pruebas, véase, por ejemplo los libros de Patán o Lyche o Schumaker
    • si quieres «a prueba», de uso UnivariateSpline.derivatives(x) a encontrar los derivados de la spline representación en el punto x. A continuación, puede verificar por sí mismo, para integrar a ti mismo, y comparar los resultados.
    • que sólo muestra las cosas, no es de ninguna manera matemática de sonido – sinceramente, no puedo usar eso en un informe, y miré en él y no puedo pruebas de las funciones de mí tampoco.
    • yo no conseguir lo que quieres. Si usted quiere tener el cúbicos coeficientes, se puede calcular fácilmente a ellos a partir de los derivados. Me pueden enviar una respuesta que muestra cómo, si quieres. Si desea que el spline representación, se puede conseguir a partir de .get_coefs y el cálculo de la b-spline base. Yo sugiero que busque en wikipedia sobre b-splines para que.

  2. 1

    Solo un pensamiento que podría ser de ayuda. A partir de la documentación, usted puede conseguir un cubic spline de interpolación en una manera diferente que puede ayudarle a:

    import numpy as np
    import scipy.interpolate
    import matplotlib.pyplot as plt
    
    y = np.array([0,2,3,4,8,10,12,12,12,10,9,8,7,1,0,0,1,2])
    x = np.array(range(len(y)))
    xvals = np.linspace(0, len(y)-1, len(y)*100, endpoint = False)
    func = scipy.interpolate.splrep(x, y, s=0)
    yvals = scipy.interpolate.splev(xvals, func, der=0)
    
    # display original vs cubic spline representation for security...
    plt.figure()
    plt.plot(x, y, 'x', xvals, yvals, x, y, 'b')
    plt.legend(['Linear', 'Cubic Spline'])
    plt.axis([-0.05, 20, -2, 20])
    plt.title('Cubic-spline interpolation')
    plt.show()

    Esto le da acceso a los coeficientes debe usted desee a través de

    pp = scipy.interpolate.spltopp(func[0][1:-1],func[1],func[2])
    
    #Print the coefficient arrays, one for cubed terms, one for squared etc
    print(pp.coeffs)

    También da un ejemplo en la página de cómo integrar el uso de este cubic spline representación (cambio constante para adaptarse a su situación, espero su kilometraje puede variar):

    def integ(x, tck, constant=0):
        x = np.atleast_1d(x)
        out = np.zeros(x.shape, dtype=x.dtype)
        for n in xrange(len(out)):
            out[n] = scipy.interpolate.splint(0, x[n], tck)
        out += constant
        return out
    
    const_of_integration = 0
    yint = integ(xvals, func, const_of_integration)

Dejar respuesta

Please enter your comment!
Please enter your name here