c++ - plana - la curvatura de una recta
¿Encontrar la curvatura de un conjunto ruidoso de puntos de datos usando 2d/3dsplines?(C++) (1)
Estoy tratando de extraer la curvatura de un pulso a lo largo de su perfil (vea la imagen a continuación). El pulso se calcula en una cuadrícula de longitud y altura: 150 x 100 celdas mediante el uso de diferencias finitas, implementado en C ++.
Extraje todos los puntos con el mismo valor (conjunto de contorno / nivel) y los marqué como la línea roja continua en la imagen de abajo. Los otros colores son despreciables.
Luego traté de encontrar la curvatura de esta línea de contorno ya ruidosa (debido a la discretización de la red) por los siguientes medios:
(media móvil ya aplicada)
1) Curvatura a través de tangentes
La curvatura de la línea en el punto P se define por:
Entonces, la curvatura es la del ángulo delta sobre la longitud del arco entre P y N. Como mis puntos tienen una cierta distancia entre ellos, no pude aproximarme lo suficiente a las limas, de modo que la curvatura no se calculó correctamente. Lo probé con un círculo, que naturalmente tiene una curvatura constante. Pero no pude reproducir esto (solo 1 dígito significativo era correcto).
2) Segunda derivada de la línea parametrizada por arclength.
Calculé la primera derivada de la línea con respecto a la longitud del arco, la suavicé con un promedio móvil y luego tomé la derivada nuevamente (segunda derivada). Pero aquí también tengo sólo un dígito significativo correcto. Desafortunadamente, tomar una derivada multiplica el ruido ya inherente a niveles más grandes.
3) Aproximando la línea localmente con un círculo
Dado que el recíproco del radio del círculo es la curvatura, utilicé el siguiente enfoque:
Esto funcionó mejor hasta ahora (2 dígitos significativos correctos), pero necesito refinar aún más. Así que mi nueva idea es la siguiente:
En lugar de utilizar los valores en los puntos discretos para determinar la curvatura, quiero aproximar el perfil de pulso con una superficie de spline tridimensional. Luego extraigo el conjunto de niveles de cierto valor para obtener una línea suave de puntos, desde la cual puedo encontrar una buena curvatura.
Hasta ahora no he podido encontrar una biblioteca de C ++ que pueda generar tal superficie de spline Bezier. ¿Podrías tal vez señalarme alguna?
¿También crees que vale la pena darle una oportunidad a este enfoque o perderé demasiada precisión en mi curvatura?
¿Conoces algún otro enfoque?
Con un cordial saludo, Jan
Editar: Parece que no puedo publicar imágenes como nuevo usuario, así que las eliminé de mi pregunta, aunque las encuentro importantes para explicar mi problema. ¿Hay alguna manera de que todavía pueda mostrarlos?
edit2: ok, hecho :)
Hay ALGLIB que soporta varios sabores de interpolación:
- Interpolación polinómica
- Interpolacion racional
- Interpolación spline
- Ajuste de cuadrados mínimos (lineal / no lineal)
- Interpolación spline bilineal y bicúbica.
- Interpolación rápida RBF / ajuste
No sé si cumple con todos sus requisitos. Personalmente, todavía no he trabajado con esta biblioteca, pero creo que la interpolación spline cúbica podría ser lo que está buscando (dos veces diferenciable).
Para evitar un ajuste excesivo en sus puntos de entrada ruidosos, debe aplicar algún tipo de mecanismo de suavizado, por ejemplo, puede probar si se aplican filtros de Promedio de Ventana Móvil / Gauss / FIR. También eche un vistazo a (cúbicos) alisando splines.