Eu já trabalhei um pouco mais nisto, por isso acho que vou pegar uma facada na minha própria pergunta. Aqui está nosso limacon novamente.
Notem com o que começamos: um parâmetro de tempo $t$ que corre em passos iguais no intervalo $$, a distância cumulativa $s$ percorrida ao longo do comprimento do arco no tempo $t$, e as coordenadas cartesianas do limacon $\gamma $ no tempo $t$. Nós colocamos este valor na pergunta. O que queremos em vez disso é um parâmetro $s$ que corre em passos iguais no intervalo $$, onde $L$ é o comprimento total do arco, juntamente com o tempo $t(s)$ a $s$ e as coordenadas cartesianas $\gamma (t(s))$.
Real quick, vamos refazer a distância cumulativa $s$ percorrida ao longo do comprimento do arco com derivative
(link File Exchange) para que não percamos amostras.
x_t = derivative(x);y_t = derivative(y);s = cumtrapz( sqrt(x_t.^2 + y_t.^2 ) );
Estaremos usando a função Matlab interp1
para interpolar os timepoints $t(s_i)$ e as coordenadas $\gamma (t(s_i))$ que correspondem aos passos igualmente espaçados $s_i$ ao longo do comprimento do arco. Assim, nós declaramos os argumentos para interp1
com os nomes das variáveis dados na sua documentação. O vetor X
é o $s_i$ original, ou seja, a distância percorrida ao longo do comprimento do arco no tempo $t_i$. A matriz V
tem vetores de coluna cujas linhas são $t_i$ (nosso parâmetro de tempo original em tamanho de passo igual), e as coordenadas $\gamma (t_i)$.
X = s.';V = ;
Precisamos interpolar para encontrar os pontos de tempo $t(s_i)$ correspondentes aos passos de comprimento do arco igualmente espaçados ao longo da curva. Estes passos igualmente espaçados correm de $s_0=0$ a $s_N=L$, onde $L$ é o comprimento total do arco.
L = s(end);s0 = s(1);N = length(s);Xq = linspace(s0,L,N); % equally spaced indices
Podemos verificar que s(N) == sum(diff(Xq))
, como deve ser o caso. Usamos a capacidade de interpolação linear multidimensional em sentido de peça da função de interpolação do Matlab interp1
para encontrar valores interpolados para o tempo $t(s_i)$ e coordenadas $\gamma (t(s_i))$ que correspondem aos passos igualmente espaçados de $s_i$ dados em Xq
.
Vq = interp1(X,V,Xq);
Uma chamada para diff(Xq)
mostra que estamos nos movendo em passos de comprimento de arco constante ao longo de $\gamma $, enquanto uma chamada para diff(Vq)
mostra que os passos de tempo não são mais iguais (primeira coluna). Assim, o resultado da nossa interpolação é:
- comprimento do arco $s_i$ em passos constantes (
Xq
) - pontos de tempo correspondentes $t_i$, não mais em passos constantes (primeira coluna de
Vq
) - coordenadas $\gamma(t(s))$ como função do comprimento do arco (segunda e terceira colunas de
Vq
)
Então a parametrização do comprimento do arco do limacon $\gamma(t(s))$ é expressa em coordenadas cartesianas como xs
e ys
.
xs = Vq(:,2);ys = Vq(:,3);
Estes vetores dão a posição de uma partícula movendo-se ao longo de $\gamma $ em função de $s$, onde $s$ incrementos em passos de 0.1058
. Aqui estão as duas parametrizações da curva $\gamma $, nomeadamente $\gamma (t)$ em azul e $\gamma (t(s))$ em vermelho.
Tenho de fazer mais algum trabalho se quiser permitir soluções periódicas, uma vez que o actual script Matlab não o faz em geral. Para ver isto, basta olhar para a distância entre a última e primeira amostra de $\gamma (t(s))$ em vermelho acima. Se avançássemos mais um passo de 0.1058
unidades ao longo do limacon não pousaríamos num ponto que já visitámos, apesar de sabermos que os limacons são $2\pi$-periódicos. Eu acho que isso equivale basicamente a escolher um passo de tamanho diferente para $s$ do que 0.1058
.
.