Ich habe mich ein wenig mehr damit beschäftigt, also werde ich wohl mal meine eigene Frage beantworten. Hier ist wieder unser limacon.
Beachte, womit wir beginnen: ein Zeitparameter $t$, der in gleichen Schritten über das Intervall $$ läuft, die kumulierte Strecke $s$, die zum Zeitpunkt $t$ entlang der Bogenlänge zurückgelegt wurde, und die kartesischen Koordinaten des limacon $\gamma $ zum Zeitpunkt $t$. So viel haben wir in der Frage festgelegt. Was wir stattdessen wollen, ist ein Bogenlängenparameter $s$, der in gleichen Schritten über das Intervall $$ läuft, wobei $L$ die gesamte Bogenlänge ist, zusammen mit der Zeit $t(s)$ zum Zeitpunkt $s$ und den kartesischen Koordinaten $\gamma (t(s))$.
Echt schnell, machen wir die kumulative Strecke $s$, die entlang der Bogenlänge zurückgelegt wurde, mit derivative
(File Exchange link) neu, damit wir keine Stichproben verlieren.
x_t = derivative(x);y_t = derivative(y);s = cumtrapz( sqrt(x_t.^2 + y_t.^2 ) );
Wir werden die Matlab-Funktion interp1
verwenden, um die Zeitpunkte $t(s_i)$ und die Koordinaten $\gamma (t(s_i))$ zu interpolieren, die den gleichmäßig verteilten Schritten $s_i$ entlang der Bogenlänge entsprechen. Dementsprechend deklarieren wir die Argumente für interp1
mit den in der Dokumentation angegebenen Variablennamen. Der Vektor X
ist der ursprüngliche $s_i$, d.h. die zum Zeitpunkt $t_i$ entlang der Bogenlänge zurückgelegte Strecke. Die Matrix V
hat Spaltenvektoren, deren Zeilen $t_i$ (unser ursprünglicher Zeitparameter in gleicher Schrittweite) und die Koordinaten $\gamma (t_i)$ sind.
X = s.';V = ;
Wir müssen interpolieren, um die Zeitpunkte $t(s_i)$ zu finden, die gleichmäßig verteilten Bogenlängenschritten entlang der Kurve entsprechen. Diese gleichmäßig verteilten Schritte gehen von $s_0=0$ bis $s_N=L$, wobei $L$ die gesamte Bogenlänge ist.
L = s(end);s0 = s(1);N = length(s);Xq = linspace(s0,L,N); % equally spaced indices
Wir können überprüfen, dass s(N) == sum(diff(Xq))
, wie es der Fall sein sollte. Wir verwenden die Fähigkeit der mehrdimensionalen stückweisen linearen Interpolation der Matlab-Interpolationsfunktion interp1
, um interpolierte Werte für die Zeit $t(s_i)$ und die Koordinaten $\gamma (t(s_i))$ zu finden, die den in Xq
angegebenen gleichmäßigen Schritten von $s_i$ entsprechen.
Vq = interp1(X,V,Xq);
Ein Aufruf von diff(Xq)
zeigt, dass wir uns in Schritten mit konstanter Bogenlänge entlang $\gamma $ bewegen, während ein Aufruf von diff(Vq)
zeigt, dass die Zeitschritte nicht mehr gleich sind (erste Spalte). Das Ergebnis unserer Interpolation ist also:
- Bogenlänge $s_i$ in konstanten Schritten (
Xq
) - entsprechende Zeitpunkte $t_i$, nicht mehr in konstanten Schritten (erste Spalte von
Vq
) - Koordinaten $\gamma(t(s))$ als Funktion der Bogenlänge (zweite und dritte Spalte von
Vq
)
So wird die Bogenlängenparametrisierung des Limakons $\gamma (t(s))$ in kartesischen Koordinaten als xs
und ys
ausgedrückt.
xs = Vq(:,2);ys = Vq(:,3);
Diese Vektoren geben die Position eines sich entlang $\gamma $ bewegenden Teilchens in Abhängigkeit von $s$ an, wobei $s$ in Schritten von 0.1058
zunimmt. Hier sind die beiden Parametrisierungen der Kurve $\gamma $, nämlich $\gamma (t)$ in blau und $\gamma (t(s))$ in rot.
Ich werde noch etwas mehr Arbeit leisten müssen, wenn ich periodische Lösungen zulassen will, da das aktuelle Matlab-Skript dies im Allgemeinen nicht tut. Um dies zu sehen, betrachten Sie einfach den Abstand zwischen der letzten und der ersten Probe von $\gamma (t(s))$ in Rot oben. Wenn wir einen weiteren Schritt von 0.1058
Einheiten entlang des Limakons machen würden, würden wir nicht auf einem Punkt landen, den wir bereits besucht haben, obwohl wir wissen, dass Limakons $2\pi$-periodisch sind. Ich denke, dass dies im Grunde darauf hinausläuft, eine andere Schrittweite für $s$ zu wählen als 0.1058
.