Ho lavorato su questo un po’ di più, quindi credo che farò un tentativo alla mia stessa domanda. Ecco di nuovo il nostro limacon.
Nota con cosa iniziamo: un parametro temporale $t$ che corre a passi uguali sull’intervallo $$, la distanza cumulativa $s$ percorsa lungo la lunghezza dell’arco al tempo $t$, e le coordinate cartesiane del limacon $\gamma$ al tempo $t$. Abbiamo impostato tutto questo nella domanda. Quello che vogliamo invece è un parametro di lunghezza dell’arco $s$ che corre a passi uguali sull’intervallo $$, dove $L$ è la lunghezza totale dell’arco, insieme al tempo $t(s)$ a $s$ e alle coordinate cartesiane $\gamma (t(s))$.
Veramente veloce, rifacciamo la distanza cumulativa $s$ percorsa lungo la lunghezza dell’arco con derivative
(File Exchange link) in modo da non perdere campioni.
x_t = derivative(x);y_t = derivative(y);s = cumtrapz( sqrt(x_t.^2 + y_t.^2 ) );
Utilizzeremo la funzione Matlab interp1
per interpolare i punti di tempo $t(s_i)$ e le coordinate $\gamma (t(s_i))$ che corrispondono a passi equidistanti $s_i$ lungo la lunghezza dell’arco. Di conseguenza, dichiariamo gli argomenti di interp1
con i nomi delle variabili dati nella sua documentazione. Il vettore X
è l’originale $s_i$, cioè la distanza percorsa lungo l’arco al tempo $t_i$. La matrice V
ha dei vettori colonna le cui righe sono $t_i$ (il nostro parametro temporale originale in passi uguali), e le coordinate $\gamma (t_i)$.
X = s.';V = ;
Dobbiamo interpolare per trovare i punti temporali $t(s_i)$ corrispondenti a passi equidistanti lungo la curva. Questi passi equidistanti vanno da $s_0=0$ a $s_N=L$, dove $L$ è la lunghezza totale dell’arco.
L = s(end);s0 = s(1);N = length(s);Xq = linspace(s0,L,N); % equally spaced indices
Si può verificare che s(N) == sum(diff(Xq))
, come dovrebbe essere. Usiamo la capacità di interpolazione lineare multidimensionale piece-wise della funzione di interpolazione di Matlab interp1
per trovare valori interpolati per il tempo $t(s_i)$ e le coordinate $\gamma (t(s_i))$ che corrispondono ai passi equamente distanziati di $s_i$ dati in Xq
.
Vq = interp1(X,V,Xq);
Una chiamata a diff(Xq)
mostra che ci stiamo muovendo a passi di lunghezza d’arco costante lungo $\gamma $, mentre una chiamata a diff(Vq)
mostra che i passi temporali non sono più uguali (prima colonna). Quindi, il risultato della nostra interpolazione è:
- lunghezza dell’arco $s_i$ in passi costanti (
Xq
) - punti di tempo corrispondenti $t_i$, non più in passi costanti (prima colonna di
Vq
) - coordinate $\gamma(t(s))$ in funzione della lunghezza dell’arco (seconda e terza colonna di
Vq
)
Quindi la parametrizzazione della lunghezza dell’arco del limacone $\gamma (t(s))$ è espressa in coordinate cartesiane come xs
e ys
.
xs = Vq(:,2);ys = Vq(:,3);
Questi vettori danno la posizione di una particella che si muove lungo $\gamma $ in funzione di $s$, dove $s$ aumenta a passi di 0.1058
. Ecco le due parametrizzazioni della curva $\gamma $, cioè $\gamma (t)$ in blu e $\gamma (t(s))$ in rosso.
Dovrò fare un po’ più di lavoro se voglio permettere soluzioni periodiche, dato che l’attuale script Matlab non lo fa in generale. Per vedere questo, basta guardare la distanza tra l’ultimo e il primo campione di $\gamma (t(s))$ in rosso sopra. Se dovessimo avanzare di un ulteriore passo di 0.1058
unità lungo il limacone non atterreremmo su un punto che abbiamo già visitato, anche se sappiamo che i limaconi sono $2\pi$-periodici. Penso che questo equivalga fondamentalmente a scegliere una dimensione del passo per $s$ diversa da 0.1058
.