Jeg har arbejdet på dette lidt mere, så jeg tror jeg vil tage en stikning på mit eget spørgsmål. Her er vores limacon igen.
Mærk, hvad vi begynder med: en tidsparameter $t$, der løber i lige store skridt over intervallet $$, den kumulative afstand $s$, der er tilbagelagt langs buelængden til tiden $t$, og de kartesiske koordinater for limacon $\gamma $ til tiden $t$. Vi opstiller dette meget i spørgsmålet. Det, vi i stedet ønsker, er en parameter for buelængden $s$, der løber i lige store skridt over intervallet $$$, hvor $L$ er den samlede buelængde, sammen med tidspunktet $t(s)$ ved $s$ og de kartesiske koordinater $\gamma (t(s))$.
Helt hurtigt, lad os lave den kumulative afstand $s$ tilbagelagt langs buelængden om med derivative
(File Exchange-link), så vi ikke mister stikprøver.
x_t = derivative(x);y_t = derivative(y);s = cumtrapz( sqrt(x_t.^2 + y_t.^2 ) );
Vi vil bruge Matlab-funktionen interp1
til at interpolere tidspunkterne $t(s_i)$ og koordinaterne $\gamma (t(s_i))$, der svarer til lige store skridt $s_i$ langs buelængden. I overensstemmelse hermed angiver vi argumenterne til interp1
med de variabelnavne, der er angivet i dokumentationen. Vektoren X
er den oprindelige $s_i$, dvs. den afstand, der er tilbagelagt langs buelængden på tidspunktet $t_i$. Matrixen V
har kolonnevektorer, hvis rækker er $t_i$ (vores oprindelige tidsparameter i lige store skridt) og koordinaterne $\gamma (t_i)$.
X = s.';V = ;
Vi skal interpolere for at finde de tidspunkter $t(s_i)$, der svarer til lige store skridt af buelængden langs kurven. Disse trin med lige store mellemrum løber fra $s_0=0$ til $s_N=L$, hvor $L$ er den samlede buelængde.
L = s(end);s0 = s(1);N = length(s);Xq = linspace(s0,L,N); % equally spaced indices
Vi kan verificere, at s(N) == sum(diff(Xq))
, som det burde være tilfældet. Vi bruger den flerdimensionale stykkevis lineære interpolationsmulighed i Matlabs interpolationsfunktion interp1
til at finde interpolerede værdier for tiden $t(s_i)$ og koordinaterne $\gamma (t(s_i))$, som svarer til de lige store trin af $s_i$, der er givet i Xq
.
Vq = interp1(X,V,Xq);
Et kald til diff(Xq)
viser, at vi bevæger os i trin med konstant buelængde langs $\gamma $, mens et kald til diff(Vq)
viser, at tidstemplerne ikke længere er lige store (første kolonne). Resultatet af vores interpolation er således:
- buelængde $s_i$ i konstante trin (
Xq
) - korresponderende tidspunkter $t_i$, ikke længere i konstante trin (første kolonne i
Vq
) - koordinater $\gamma(t(s))$ som funktion af buelængden (anden og tredje kolonne i
Vq
)
Så parametrisering af buelængden af limacon $\gamma (t(s))$ udtrykkes i kartesiske koordinater som xs
og ys
.
xs = Vq(:,2);ys = Vq(:,3);
Disse vektorer giver positionen for en partikel, der bevæger sig langs $\gamma $ som en funktion af $s$, hvor $s$ øges i trin på 0.1058
. Her ses de to parameteriseringer af kurven $\gamma $, nemlig $\gamma (t)$ i blå og $\gamma (t(s))$ i rødt.
Jeg skal arbejde lidt mere, hvis jeg vil tillade periodiske løsninger, da det nuværende Matlab-script ikke gør det generelt. For at se dette skal man blot se på afstanden mellem den sidste og den første prøve af $\gamma (t(s))$ i rødt ovenfor. Hvis vi skulle bevæge os et trin mere på 0.1058
enheder langs limakonen, ville vi ikke lande på et punkt, vi allerede har besøgt, selv om vi ved, at limakoner er $2pi\\$-periodiske. Jeg mener, at dette i bund og grund svarer til at vælge en anden skridtstørrelse for $s$ end 0.1058
.