Jag har jobbat med det här lite mer, så jag antar att jag ska försöka svara på min egen fråga. Här är vår limacon igen.
Märk vad vi börjar med: en tidsparameter $t$ som löper i lika stora steg över intervallet $$, den kumulativa sträckan $s$ som tillryggaläggs längs med båglängden vid tiden $t$, och limacon $\gamma $’s kartesiska koordinater vid tiden $t$. Vi ställer upp detta i frågan. Vad vi istället vill ha är en båglängdsparameter $s$ som löper i lika stora steg över intervallet $$, där $L$ är den totala båglängden, tillsammans med tiden $t(s)$ vid $s$ och de kartesiska koordinaterna $\gamma (t(s))$.
Snabbt, låt oss göra om den kumulativa sträckan $s$ som förflyttades längs båglängden med derivative
(Filutbyteslänk) så att vi inte förlorar stickprov.
x_t = derivative(x);y_t = derivative(y);s = cumtrapz( sqrt(x_t.^2 + y_t.^2 ) );
Vi kommer att använda Matlab-funktionen interp1
för att interpolera tidpunkterna $t(s_i)$ och koordinaterna $\gamma (t(s_i))$ som motsvarar lika stora steg $s_i$ längs båglängden. Följaktligen deklarerar vi argumenten till interp1
med de variabelnamn som anges i dess dokumentation. Vektorn X
är det ursprungliga $s_i$, dvs. den sträcka som tillryggalagts längs båglängden vid tiden $t_i$. Matrisen V
har kolumnvektorer vars rader är $t_i$ (vår ursprungliga tidsparameter i lika stora steg) och koordinaterna $\gamma (t_i)$.
X = s.';V = ;
Vi måste interpolera för att hitta tidspunkterna $t(s_i)$ som motsvarar lika stora båglängdssteg längs kurvan. Dessa steg med lika stort avstånd löper från $s_0=0$ till $s_N=L$, där $L$ är den totala båglängden.
L = s(end);s0 = s(1);N = length(s);Xq = linspace(s0,L,N); % equally spaced indices
Vi kan verifiera att s(N) == sum(diff(Xq))
, vilket borde vara fallet. Vi använder den flerdimensionella förmågan till styckevis linjär interpolation i Matlabs interpolationsfunktion interp1
för att hitta interpolerade värden för tiden $t(s_i)$ och koordinaterna $\gamma (t(s_i))$ som motsvarar de jämnt fördelade stegen av $s_i$ som ges i Xq
.
Vq = interp1(X,V,Xq);
En anrop till diff(Xq)
visar att vi rör oss i steg med konstant båglängd längs $\gamma $, medan en anrop till diff(Vq)
visar att tidsstegen inte längre är lika stora (första kolumnen). Resultatet av vår interpolation är alltså:
- båglängd $s_i$ i konstanta steg (
Xq
) - korresponderande tidpunkter $t_i$, inte längre i konstanta steg (första kolumnen i
Vq
) - koordinater $\gamma(t(s))$ som funktion av båglängden (andra och tredje kolumnen i
Vq
)
Så båglängdsparametreringen av limakonen $\gamma(t(s))$ uttrycks i kartesianska koordinater som xs
och ys
.
xs = Vq(:,2);ys = Vq(:,3);
Dessa vektorer ger positionen för en partikel som rör sig längs $\gamma $ som en funktion av $s$, där $s$ ökar i steg om 0.1058
. Här visas de två parameteriseringarna av kurvan $\gamma $, nämligen $\gamma (t)$ i blått och $\gamma (t(s))$ i rött.
Jag måste göra lite mer arbete om jag vill tillåta periodiska lösningar, eftersom det nuvarande Matlab-skriptet inte gör det i allmänhet. För att se detta är det bara att titta på avståndet mellan det sista och första provet av $\gamma (t(s))$ i rött ovan. Om vi skulle avancera ytterligare ett steg på 0.1058
enheter längs limakonen skulle vi inte landa på en punkt som vi redan besökt, trots att vi vet att limakoner är $2\pi$-periodiska. Jag tror att detta i princip går ut på att välja en annan stegstorlek för $s$ än 0.1058
.