He trabajado un poco más en esto, así que supongo que voy a hacer una puñalada en mi propia pregunta. Aquí está nuestra limacon de nuevo.
Nota lo que empezamos: un parámetro de tiempo $t$ que corre en pasos iguales sobre el intervalo $$, la distancia acumulada $s$ recorrida a lo largo de la longitud de arco en el tiempo $t$, y las coordenadas cartesianas de la limacon $\gamma $ en el tiempo $t$. Todo esto lo hemos establecido en la pregunta. Lo que queremos en cambio es un parámetro de longitud de arco $s$ que recorre en pasos iguales el intervalo $$, donde $L$ es la longitud total del arco, junto con el tiempo $t(s)$ en $s$ y las coordenadas cartesianas $\gamma (t(s))$.
Realmente rápido, rehagamos la distancia acumulada $s$ recorrida a lo largo de la longitud de arco con derivative
(enlace de Intercambio de Archivos) para no perder muestras.
x_t = derivative(x);y_t = derivative(y);s = cumtrapz( sqrt(x_t.^2 + y_t.^2 ) );
Vamos a utilizar la función de Matlab interp1
para interpolar los puntos de tiempo $t(s_i)$ y las coordenadas $\gamma (t(s_i))$ que corresponden a pasos $s_i$ igualmente espaciados a lo largo de la longitud del arco. En consecuencia, declaramos los argumentos a interp1
con los nombres de las variables dadas en su documentación. El vector X
es el original $s_i$, es decir, la distancia recorrida a lo largo de la longitud de arco en el tiempo $t_i$. La matriz V
tiene vectores columna cuyas filas son $t_i$ (nuestro parámetro de tiempo original en tamaño de paso igual), y las coordenadas $\gamma (t_i)$.
X = s.';V = ;
Necesitamos interpolar para encontrar los puntos de tiempo $t(s_i)$ correspondientes a pasos de longitud de arco igualmente espaciados a lo largo de la curva. Estos pasos igualmente espaciados van desde $s_0=0$ hasta $s_N=L$, donde $L$ es la longitud total del arco.
L = s(end);s0 = s(1);N = length(s);Xq = linspace(s0,L,N); % equally spaced indices
Podemos comprobar que s(N) == sum(diff(Xq))
, como debería ser el caso. Utilizamos la capacidad de interpolación lineal multidimensional a trozos de la función de interpolación de Matlab interp1
para encontrar valores interpolados para el tiempo $t(s_i)$ y las coordenadas $\gamma (t(s_i))$ que corresponden a los pasos igualmente espaciados de $s_i$ dados en Xq
.
Vq = interp1(X,V,Xq);
Una llamada a diff(Xq)
muestra que nos movemos en pasos de longitud de arco constante a lo largo de $\gamma $, mientras que una llamada a diff(Vq)
muestra que los pasos de tiempo ya no son iguales (primera columna). Así, el resultado de nuestra interpolación es:
- longitud de arco $s_i$ en pasos constantes (
Xq
) - puntos de tiempo correspondientes $t_i$, ya no en pasos constantes (primera columna de
Vq
) - coordenadas $\gamma(t(s))$ en función de la longitud de arco (segunda y tercera columnas de
Vq
)
Así que la parametrización de la longitud de arco del limacon $\gamma (t(s))$ se expresa en coordenadas cartesianas como xs
y ys
.
xs = Vq(:,2);ys = Vq(:,3);
Estos vectores dan la posición de una partícula que se mueve a lo largo de $\gamma $ en función de $s$, donde $s$ se incrementa en pasos de 0.1058
. Aquí están las dos parametrizaciones de la curva $\gamma $, a saber $\gamma (t)$ en azul y $\gamma (t(s))$ en rojo.
Tendré que trabajar un poco más si quiero permitir soluciones periódicas, ya que el actual script de Matlab no lo hace en general. Para ver esto, basta con mirar la distancia entre la última y la primera muestra de $\gamma (t(s))$ en rojo arriba. Si avanzáramos un paso más de 0.1058
unidades a lo largo del limacón no aterrizaríamos en un punto que ya visitamos, aunque sabemos que los limacones son $2\pi$-periódicos. Creo que esto equivale básicamente a elegir un tamaño de paso diferente para $s$ que 0.1058
.