Am mai lucrat puțin la asta, așa că cred că voi încerca să răspund la propria întrebare. Iată din nou limconul nostru.
Rețineți cu ce începem: un parametru de timp $t$ care se desfășoară în pași egali pe intervalul $$, distanța cumulată $s$ parcursă de-a lungul lungimii arcului la momentul $t$ și coordonatele carteziene ale limconului $\gamma$ la momentul $t$. Am stabilit toate acestea în întrebare. Ceea ce dorim în schimb este un parametru al lungimii arcului $s$ care se parcurge în pași egali pe intervalul $$, unde $L$ este lungimea totală a arcului, împreună cu timpul $t(s)$ la $s$ și coordonatele carteziene $\gamma (t(s))$.
Rapid de tot, să refacem distanța cumulată $s$ parcursă de-a lungul lungimii arcului cu derivative
(link File Exchange) ca să nu pierdem eșantioane.
x_t = derivative(x);y_t = derivative(y);s = cumtrapz( sqrt(x_t.^2 + y_t.^2 ) );
Vom folosi funcția Matlab interp1
pentru a interpola punctele de timp $t(s_i)$ și coordonatele $\gamma (t(s_i))$ care corespund unor pași $s_i$ la distanțe egale de-a lungul lungimii arcului. În consecință, declarăm argumentele pentru interp1
cu numele variabilelor date în documentația sa. Vectorul X
este vectorul inițial $s_i$, adică distanța parcursă de-a lungul lungimii arcului la momentul $t_i$. Matricea V
are vectori coloană ale căror rânduri sunt $t_i$ (parametrul nostru de timp original în pași de mărime egală) și coordonatele $\gamma (t_i)$.
X = s.';V = ;
Trebuie să interpolăm pentru a găsi punctele de timp $t(s_i)$ care corespund unor pași de lungime de arc la distanțe egale de-a lungul curbei. Acești pași echidistanți se întind de la $s_0=0$ la $s_N=L$, unde $L$ este lungimea totală a arcului.
L = s(end);s0 = s(1);N = length(s);Xq = linspace(s0,L,N); % equally spaced indices
Potem verifica că s(N) == sum(diff(Xq))
, așa cum ar trebui să fie cazul. Utilizăm capacitatea de interpolare liniară multidimensională pe bucăți a funcției de interpolare interp1
din Matlab pentru a găsi valorile interpolate pentru timpul $t(s_i)$ și coordonatele $\gamma (t(s_i))$ care corespund pașilor egal distanțați ai lui $s_i$ date în Xq
.
Vq = interp1(X,V,Xq);
Un apel la diff(Xq)
arată că ne deplasăm în pași de lungime de arc constantă de-a lungul lui $\gamma $, în timp ce un apel la diff(Vq)
arată că pașii de timp nu mai sunt egali (prima coloană). Astfel, rezultatul interpolării noastre este:
- lungimea arcului $s_i$ în pași constanți (
Xq
) - punctele de timp corespunzătoare $t_i$, nu mai sunt în pași constanți (prima coloană din
Vq
) - coordonate $\gamma(t(s))$ în funcție de lungimea arcului (a doua și a treia coloană din
Vq
)
Atunci parametrizarea lungimii arcului limaconului $\gamma (t(s))$ se exprimă în coordonate carteziene ca xs
și ys
.
xs = Vq(:,2);ys = Vq(:,3);
Acești vectori dau poziția unei particule care se deplasează de-a lungul lui $\gamma $ în funcție de $s$, unde $s$ crește în pași de 0.1058
. Iată cele două parametrizări ale curbei $\gamma $, și anume $\gamma (t)$ în albastru și $\gamma (t(s))$ în roșu.
Va trebui să mai lucrez puțin dacă vreau să permit soluții periodice, deoarece actualul script Matlab nu o face în general. Pentru a vedea acest lucru, este suficient să vă uitați la distanța dintre ultimul și primul eșantion de $\gamma (t(s))$ cu roșu de mai sus. Dacă am avansa încă un pas de 0.1058
unități de-a lungul limaconului, nu am ateriza într-un punct pe care l-am vizitat deja, chiar dacă știm că limaconii sunt $2\pi$-periodice. Cred că acest lucru echivale practic cu alegerea unei mărimi a pasului pentru $s$ diferită de 0.1058
.
.