Pracowałem nad tym trochę więcej, więc chyba spróbuję odpowiedzieć na moje własne pytanie. Oto znowu nasz limakon.
Zauważ, z czym zaczynamy: parametr czasowy $t$, który przebiega w równych krokach w przedziale $$, skumulowana odległość $s$ przebyta wzdłuż długości łuku w czasie $t$ oraz współrzędne kartezjańskie limakonu $gamma$ w czasie $t$. Tyle ustaliliśmy w pytaniu. To, czego chcemy zamiast tego, to parametr długości łuku $s$, który biegnie w równych krokach przez przedział $$, gdzie $L$ jest całkowitą długością łuku, wraz z czasem $t(s)$ w $s$ i współrzędnymi kartezjańskimi $gamma (t(s))$.
Real quick, let’s redo the cumulative distance $s$ traveled along the arc length with derivative
(File Exchange link) so that we don’t lose samples.
x_t = derivative(x);y_t = derivative(y);s = cumtrapz( sqrt(x_t.^2 + y_t.^2 ) );
Będziemy używać funkcji Matlaba interp1
w celu interpolacji punktów czasowych $t(s_i)$ i współrzędnych $gamma (t(s_i))$, które odpowiadają równomiernie rozłożonym krokom $s_i$ wzdłuż długości łuku. W związku z tym deklarujemy argumenty do interp1
o nazwach zmiennych podanych w jego dokumentacji. Wektor X
jest pierwotną wartością $s_i$, czyli odległością przebytą wzdłuż długości łuku w czasie $t_i$. Macierz V
ma wektory kolumnowe, których wierszami są $t_i$ (nasz oryginalny parametr czasowy w równych krokach), oraz współrzędne $gamma (t_i)$.
X = s.';V = ;
Musimy dokonać interpolacji, aby znaleźć punkty czasowe $t(s_i)$ odpowiadające równomiernie rozłożonym krokom długości łuku wzdłuż krzywej. Te równo rozmieszczone kroki biegną od $s_0=0$ do $s_N=L$, gdzie $L$ jest całkowitą długością łuku.
L = s(end);s0 = s(1);N = length(s);Xq = linspace(s0,L,N); % equally spaced indices
Możemy sprawdzić, że s(N) == sum(diff(Xq))
, tak jak powinno być. Korzystamy z możliwości wielowymiarowej interpolacji liniowej typu piece-wise funkcji interpolacyjnej interp1
programu Matlab, aby znaleźć interpolowane wartości dla czasu $t(s_i)$ i współrzędnych $gamma (t(s_i))$, które odpowiadają równomiernie rozłożonym krokom $s_i$ podanym w Xq
.
Vq = interp1(X,V,Xq);
Wywołanie do diff(Xq)
pokazuje, że poruszamy się krokami o stałej długości łuku wzdłuż $gamma $, natomiast wywołanie do diff(Vq)
pokazuje, że kroki czasowe nie są już równe (pierwsza kolumna). Zatem wynik naszej interpolacji to:
- długość łuku $s_i$ w stałych krokach (
Xq
) - odpowiednie timepointy $t_i$, już nie w stałych krokach (pierwsza kolumna
Vq
) - współrzędne $s_i$ w funkcji długości łuku (druga i trzecia kolumna
Vq
)
Zatem parametryzacja długości łuku limakonu $s_i$ wyraża się we współrzędnych kartezjańskich jako xs
i ys
.
xs = Vq(:,2);ys = Vq(:,3);
Wektory te dają położenie cząstki poruszającej się wzdłuż $gamma $ w funkcji $s$, gdzie $s$ przyrasta z krokiem 0.1058
. Oto dwie parametryzacje krzywej $gamma $, czyli $gamma (t)$ na niebiesko i $gamma (t(s))$ na czerwono.
Będę musiał jeszcze trochę popracować, jeśli chcę dopuścić rozwiązania okresowe, ponieważ obecny skrypt Matlaba w ogólności tego nie robi. Aby się o tym przekonać, wystarczy spojrzeć na odległość między ostatnią a pierwszą próbką $gamma (t(s))$ na czerwono powyżej. Jeśli posunęlibyśmy się jeszcze o jeden krok 0.1058
jednostek wzdłuż limakonu, nie wylądowalibyśmy w punkcie, który już odwiedziliśmy, mimo że wiemy, że limakony są $2pi$-periodyczne. Myślę, że to w zasadzie sprowadza się do wybrania innego rozmiaru kroku dla $s$ niż 0.1058
.
.