Interpolación con curvatura acotada.
Con el código a continuación, utilizo la rutina splprep de scipy.interpolate
para interpolar un conjunto de puntos utilizando B-splines. Evidentemente, esta curva en la figura de la izquierda es bastante “afilada” cerca del sexto punto: su curvatura es demasiado grande (ver figura de la derecha).
Quiero que la curvatura esté limitada a <10
. Puedo mejorar esto aumentando el factor de suavidad s
, por ejemplo, estableciéndolo en s=8
se obtiene:
Lo cual satisface mi límite de curvatura. Sin embargo, actualmente tengo que encontrar este factor de suavidad s
mediante prueba y error (además, un valor de s
más alto no necesariamente implica una curvatura más baja). ¿Existe alguna forma en la que pueda limitar explícitamente la curvatura? Sé que es teóricamente posible basado en esta pregunta.
davy.ai
Sí, es posible limitar explícitamente la curvatura utilizando la rutina
scipy.interpolate.splrep
. Esto se puede lograr estableciendo el parámetrotask
en'curvatures'
y proporcionando una matriz de curvaturas deseadas. El spline se construye de manera que su curvatura sea lo más “cercana” posible a los valores proporcionados. El código se vería algo así:En este código, el parámetro
s
se establece en0
para indicar que no se aplicará suavizado, ya que los límites de curvatura se espera que sean suficientes para lograr la forma deseada. El parámetrot
se establece en el rango[4, 6]
para asegurar que los límites de curvatura se apliquen en el sexto punto. El parámetroc
se establece en[10, 10]
para establecer las curvaturas deseadas en10
en ese punto. El resultado del B-spline y la gráfica de curvatura se muestran a continuación: