He trabajado un poco más en esto, así que supongo que voy a hacer una puñalada en mi propia pregunta. Aquí está nuestro limacon de nuevo.
Fíjate en lo que empezamos: un parámetro de tiempo $t$ que se ejecuta en pasos iguales sobre el intervalo $[t_0,T]$ la distancia acumulada $s$ recorrida a lo largo de la longitud de arco en el tiempo $t$ y las coordenadas cartesianas del limacon $\gamma $ en el momento $t$ . Esto lo hemos establecido en la pregunta. Lo que queremos en cambio es un parámetro de longitud de arco $s$ que se ejecuta en pasos iguales sobre el intervalo $[0,L]$ , donde $L$ es la longitud total del arco, junto con el tiempo $t(s)$ en $s$ y las coordenadas cartesianas $\gamma (t(s))$ .
Muy rápido, vamos a rehacer la distancia acumulada $s$ recorrida a lo largo de la longitud del 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 ) );
Utilizaremos la función de Matlab interp1
para interpolar los puntos de tiempo $t(s_i)$ y coordenadas $\gamma (t(s_i))$ que corresponden a pasos igualmente espaciados $s_i$ a lo largo del arco. En consecuencia, declaramos los argumentos de interp1
con los nombres de las variables que figuran en su documentación. El vector X
es el original $s_i$ es decir, la distancia recorrida a lo largo del arco en el momento $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 = [ t.', x.', y.' ];
Tenemos que 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$ a $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 coordenadas $\gamma (t(s_i))$ que corresponden a los pasos igualmente espaciados de $s_i$ dado 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 del arco $s_i$ en pasos constantes (
Xq
)
- los 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 del arco (segunda y tercera columnas de
Vq
)
Así, la parametrización de la longitud de arco del limacón $\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$ incrementos 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 hemos visitado, aunque sabemos que los limacones son $2\pi$ -periódico. Creo que esto equivale básicamente a elegir un tamaño de paso diferente para $s$ que 0.1058
.
0 votos
Supongo que si un limacon no puede conseguir un upvote, nada lo hará :)