Pracoval jsem na tom trochu víc, takže se asi pokusím o vlastní dotaz. Tady je opět náš limacon.
Všimněte si, čím začínáme: časovým parametrem $t$, který probíhá ve stejných krocích po intervalu $$, kumulativní vzdáleností $s$ ujetou po délce oblouku v čase $t$ a kartézskými souřadnicemi limaconu $\gamma $ v čase $t$. Tolik jsme stanovili v otázce. Místo toho chceme parametr délky oblouku $s$, který probíhá ve stejných krocích po intervalu $$, kde $L$ je celková délka oblouku, spolu s časem $t(s)$ v čase $s$ a kartézskými souřadnicemi $\gamma (t(s))$.
Věru rychle, zopakujme si kumulativní vzdálenost $s$ ujetou po délce oblouku s derivative
(odkaz na výměnu souborů), abychom neztratili vzorky.
x_t = derivative(x);y_t = derivative(y);s = cumtrapz( sqrt(x_t.^2 + y_t.^2 ) );
Pro interpolaci časových bodů $t(s_i)$ a souřadnic $\gamma (t(s_i))$, které odpovídají stejně vzdáleným krokům $s_i$ po délce oblouku, použijeme funkci Matlab interp1
. V souladu s tím deklarujeme argumenty interp1
pomocí názvů proměnných uvedených v jeho dokumentaci. Vektor X
je původní hodnota $s_i$, tj. vzdálenost ujetá podél délky oblouku v čase $t_i$. Matice V
má sloupcové vektory, jejichž řádky jsou $t_i$ (náš původní časový parametr ve stejné velikosti kroku) a souřadnice $\gamma (t_i)$.
X = s.';V = ;
Potřebujeme interpolovat, abychom našli časové body $t(s_i)$ odpovídající stejně vzdáleným krokům délky oblouku podél křivky. Tyto stejně vzdálené kroky probíhají od $s_0=0$ do $s_N=L$, kde $L$ je celková délka oblouku.
L = s(end);s0 = s(1);N = length(s);Xq = linspace(s0,L,N); % equally spaced indices
Můžeme ověřit, že s(N) == sum(diff(Xq))
, jak by mělo být. Využijeme možnosti vícerozměrné kusové lineární interpolace interpolační funkce interp1
programu Matlab k nalezení interpolovaných hodnot pro čas $t(s_i)$ a souřadnice $\gamma (t(s_i))$, které odpovídají stejně vzdáleným krokům $s_i$ uvedeným v Xq
.
Vq = interp1(X,V,Xq);
Volání příkazu diff(Xq)
ukazuje, že se pohybujeme po krocích o konstantní délce oblouku podél $\gamma$, zatímco volání příkazu diff(Vq)
ukazuje, že časové kroky již nejsou stejné (první sloupec). Výsledek naší interpolace je tedy následující:
- délka oblouku $s_i$ v konstantních krocích (
Xq
) - odpovídajících časovým bodům $t_i$, již ne v konstantních krocích (první sloupec
Vq
) - souřadnice $\gamma(t(s))$ jako funkce délky oblouku (druhý a třetí sloupec
Vq
)
Takže parametrizace délky oblouku limaconu $\gamma (t(s))$ je vyjádřena v kartézských souřadnicích jako xs
a ys
.
xs = Vq(:,2);ys = Vq(:,3);
Tyto vektory udávají polohu částice pohybující se po $\gamma$ jako funkci $s$, kde $s$ roste s krokem 0.1058
. Zde jsou dvě parametrizace křivky $\gamma$, a to $\gamma (t)$ modře a $\gamma (t(s))$ červeně.
Budu muset ještě něco udělat, pokud budu chtít umožnit periodické řešení, protože současný skript Matlabu to obecně neumožňuje. Abyste to viděli, stačí se podívat na vzdálenost mezi posledním a prvním vzorkem $\gamma (t(s))$ vyznačenou červeně výše. Kdybychom po limaconu postoupili ještě o jeden krok o 0.1058
jednotek, nepřistáli bychom v bodě, který jsme již navštívili, přestože víme, že limacony jsou $2\pi$-periodické. Myslím, že se to v podstatě rovná volbě jiné velikosti kroku pro $s$ než 0.1058
.