5 votos

parametrización de la longitud de arco de una curva plana en Matlab

Dejemos que $\gamma (t)$ sea una curva plana parametrizada por el tiempo $t$ . Por diversión, que sea un limacon. En Matlab $\gamma (t)$ se ve así.

% t parameterizes the limacon x=(x(t),y(t)).
h=.1; t0 = 0; T = 2*pi+h;
t = t0:h:T;
a = 1; b = .5;
% This is the cartesian version of the polar curve r = b + a*cos(theta)
x = a/2 + b*cos(t) + (a/2)*cos(2*t);
y = b*sin(t) + (a/2)*sin(2*t);

Supongamos que $\gamma '(t)$ es la derivada temporal de $\gamma $ y la longitud del arco $s$ satisface $s=\int _{t0} ^T \| \gamma '(t) \| \mathrm{d}t $ . El vector s a continuación da la distancia recorrida a lo largo de $\gamma $ en función del tiempo.

x_t = diff(x);
y_t = diff(y);
s = cumtrapz( sqrt(x_t.^2 + y_t.^2 ) );

Quiero reparametrizar $\gamma $ en términos de longitud de arco $s$ . Básicamente, quiero un vector que dé el tiempo $t$ en función de $s$ . También necesito que sea una solución numérica, ya que en general mis curvas son bastante arbitrarias (datos experimentales), y no pequeños limacons ordenados como estoy jugando aquí. Así que probablemente será necesario interpolar entre los valores del vector s .

0 votos

Supongo que si un limacon no puede conseguir un upvote, nada lo hará :)

3voto

Sepius Puntos 21

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.

the limacon $\gamma(t)$

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.

two parametrizations

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

¿tiene idea de cómo ampliar este método a dimensiones arbitrarias?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X