Pracowałem nad tym trochę więcej, więc chyba spróbuję odpowiedzieć na moje własne pytanie. Oto znowu nasz limakon.

limakon $gamma(t)$

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.

dwie parametryzacje

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.

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.