2010-02-02 18 views
7

Usando la función scipy's interpolate.splprep obtener una spline paramétrica en el parámetro u, pero el dominio de u no es la integral de línea de la spline, es una conexión lineal por partes de las coordenadas de entrada. Intenté integrate.splint, pero eso solo le da a las integrales individuales más de u. Obviamente, puedo integrar numéricamente un montón de distancias diferenciales cartesianas, pero me preguntaba si había un método de forma cerrada para obtener la longitud de un segmento spline o spline (usando scipy o numpy) que estaba pasando por alto.Encontrar la longitud de una B-spline cúbica

Editar: Estoy buscando una solución cerrada o una forma muy rápida de converger a una respuesta de precisión de máquina. Casi he renunciado a los métodos numéricos de búsqueda de raíces y ahora estoy principalmente después de una respuesta cerrada. Si alguien tiene alguna experiencia integrando funciones elípticas o puede indicarme un buen recurso (aparte de Wolfram), sería genial.

Voy a tratar Maxima para tratar de obtener la integral indefinida de lo que creo que es la función de un segmento de la spline: Cruzo publicado esto en-MathOverflow

Respuesta

6

Debido a que tanto x & y son cúbico funciones paramétricas, no hay una solución cerrada en términos de funciones simples. La integración numérica es el camino a seguir. La integración de la expresión de longitud de arco o simplemente la adición de longitudes de segmento de línea depende de la precisión que persiga y de cuánto esfuerzo desee realizar.

un método preciso y rápido "Adición de longitud de segmentos de línea":

Uso de subdivisión recurvise (una forma de algoritmo de de Casteljeau) para generar puntos, se puede dar una representación muy precisa con el número mínimo de puntos . Solo subdivida subdivisiones si no cumplen con un criterio. Por lo general, el criterio se basa en la longitud que une los puntos de control (el casco o la jaula). Para cúbicos, generalmente comparando la cercanía de P0P1 + P1P2 + P2P3 a P0P3, donde P0, P1, P2 & P3 son los puntos de control que definen su bezier.

se pueden encontrar algunos de código de Delphi aquí: link text

Debería ser relativamente fácil de convertir a Python. Generará los puntos. El código ya calcula la longitud de los segmentos para probar los criterios. Simplemente puede acumular esos valores de longitud en el camino.

+0

Esta solución es buena para las aproximaciones, pero debería haber indicado en mi pregunta que busco una respuesta exacta o una precisión de máquina. Es similar a la solución romberg de EOL, pero tendría que iterar en python puro. – Paul

+0

Como la solución analítica general implica integrales elípticas, se integrará numéricamente sin importar el enfoque que tome. El método que he esbozado no integra directamente la expresión de la longitud del arco, pero también es una integración numérica. Todo lo que importa es que el método converja a la precisión deseada en el tiempo deseado. – symmetry

+0

Para ser un poco más preciso acerca de las longitudes a las que me refiero que acumularías en el camino ... mira aquí: http://steve.hollasch.net/cgindex/curves/cbezarclen.html Utilice el promedio de la longitud del casco (L1) y la longitud de la cuerda (L0) para aproximar la longitud del arco de los subsegmentos individuales. – symmetry

4

puede integrar la función sqrt(x'(u)**2+y'(u)**2) sobre u, donde se calculan los derivados x' y y' de sus coordenadas con scipy.interpolate.splev. La integración se puede hacer con una de las rutinas de scipy.integrate (quad es preciso [Clenshaw-Curtis], romberg es generalmente más rápido). Esto debería ser más preciso, y probablemente más rápido que sumar muchas distancias pequeñas (que es equivalente a la integración con la regla del rectángulo).

+0

Me gusta esta solución ya que puede establecer la precisión deseada, pero desafortunadamente estoy buscando la precisión del tipo de precisión de la máquina. Implementé su sugerencia, pero QUADPACK (tan increíble como es) no cumple con mis requisitos de rendimiento. Actualmente estoy buscando una solución cerrada y publicado en MathOverflow. Por cierto: Clenshaw-Curtis es solo exacto/preciso para polinomios. La longitud de esta spline es una función elíptica. – Paul

Cuestiones relacionadas