Ik heb hier wat meer aan gewerkt, dus ik denk dat ik mijn eigen vraag maar eens ga proberen. Hier is ons limacon weer.
Merk op waar we mee beginnen: een tijdparameter $t$ die in gelijke stappen over het interval $$ loopt, de cumulatieve afstand $s$ afgelegd langs de booglengte op tijdstip $t$, en de cartesische coördinaten van het limacon $\gamma$ op tijdstip $t$. We hebben dit al in de vraag gesteld. Wat we in plaats daarvan willen is een booglengteparameter $s$ die in gelijke stappen over het interval $$ loopt, waarbij $L$ de totale booglengte is, samen met de tijd $t(s)$ op $s$ en de cartesische coördinaten $\gamma (t(s))$.
Echt snel, laten we de cumulatieve afstand $s$ afgelegd langs de booglengte opnieuw doen met derivative
(File Exchange link), zodat we geen steekproeven verliezen.
x_t = derivative(x);y_t = derivative(y);s = cumtrapz( sqrt(x_t.^2 + y_t.^2 ) );
We zullen de Matlab-functie interp1
gebruiken om de tijdstippen $t(s_i)$ en coördinaten $gamma (t(s_i))$ te interpoleren die overeenkomen met gelijkmatig verdeelde stappen $s_i$ langs de booglengte. Daarom declareren we de argumenten van interp1
met de variabele namen die in de documentatie worden gegeven. De vector X
is de oorspronkelijke $s_i$, d.w.z. de afstand afgelegd langs de booglengte op het tijdstip $t_i$. De matrix V
heeft kolomvectoren waarvan de rijen $t_i$ zijn (onze oorspronkelijke tijdparameter in gelijke stapgrootte), en de coördinaten $gamma (t_i)$.
X = s.';V = ;
We moeten interpoleren om de tijdspunten $t(s_i)$ te vinden die overeenkomen met even ver uiteen liggende booglengtestappen langs de kromme. Deze evenredig verdeelde stappen lopen van $s_0=0$ tot $s_N=L$, waarbij $L$ de totale booglengte is.
L = s(end);s0 = s(1);N = length(s);Xq = linspace(s0,L,N); % equally spaced indices
We kunnen verifiëren dat s(N) == sum(diff(Xq))
, zoals het hoort. We gebruiken de multidimensionale stuk-wijs lineaire interpolatiemogelijkheid van Matlab’s interpolatiefunctie interp1
om geïnterpoleerde waarden te vinden voor tijd $t(s_i)$ en coördinaten $gamma (t(s_i))$ die overeenkomen met de evenredig verdeelde stappen van $s_i$ gegeven in Xq
.
Vq = interp1(X,V,Xq);
Een oproep aan diff(Xq)
laat zien dat we in stappen van constante booglengte langs $\gamma$ bewegen, terwijl een oproep aan diff(Vq)
laat zien dat de tijdstappen niet meer gelijk zijn (eerste kolom). Het resultaat van onze interpolatie is dus:
- booglengte $s_i$ in constante stappen (
Xq
) - corresponderende tijdstippen $t_i$, niet meer in constante stappen (eerste kolom van
Vq
) - coordinaten $\gamma(t(s))$ als functie van booglengte (tweede en derde kolom van
Vq
)
Dus de booglengte parametrisering van het limacon $\gamma (t(s))$ wordt in cartesische coördinaten uitgedrukt als xs
en ys
.
xs = Vq(:,2);ys = Vq(:,3);
Deze vectoren geven de positie van een deeltje dat langs $\gamma$ beweegt als functie van $s$, waarbij $s$ in stappen van 0.1058
toeneemt. Hier zijn de twee parametervarianten van de kromme $gamma $, namelijk $gamma (t)$ in blauw en $gamma (t(s))$ in rood.
Ik zal nog wat werk moeten verzetten als ik periodieke oplossingen wil toestaan, aangezien het huidige Matlab-script dat in het algemeen niet doet. Om dit te zien, kijk maar naar de afstand tussen het laatste en het eerste monster van $gamma (t(s))$ in het rood hierboven. Als we nog een stap van 0.1058
eenheden langs het limacon zouden zetten, zouden we niet op een punt komen waar we al geweest zijn, ook al weten we dat limacons $22384$-periodiek zijn. Ik denk dat dit neerkomt op het kiezen van een andere stapgrootte voor $s$ dan 0.1058
.