J’ai travaillé un peu plus sur ce sujet, donc je suppose que je vais prendre un coup de couteau à ma propre question. Voici à nouveau notre limacon.
Notez ce avec quoi nous commençons : un paramètre temporel $t$ qui s’exécute en pas égaux sur l’intervalle $$, la distance cumulée $s$ parcourue sur la longueur de l’arc au temps $t$, et les coordonnées cartésiennes du limacon $\gamma $ au temps $t$. Nous avons défini tout cela dans la question. Ce que nous voulons plutôt, c’est un paramètre de longueur d’arc $s$ qui se déroule en pas égaux sur l’intervalle $$, où $L$ est la longueur totale de l’arc, ainsi que le temps $t(s)$ à $s$ et les coordonnées cartésiennes $\gamma (t(s))$.
Réellement rapide, refaisons la distance cumulée $s$ parcourue le long de la longueur de l’arc avec derivative
(lien File Exchange) pour ne pas perdre d’échantillons.
x_t = derivative(x);y_t = derivative(y);s = cumtrapz( sqrt(x_t.^2 + y_t.^2 ) );
Nous allons utiliser la fonction Matlab interp1
afin d’interpoler les points temporels $t(s_i)$ et les coordonnées $\gamma (t(s_i))$ qui correspondent à des pas $s_i$ également espacés le long de la longueur de l’arc. En conséquence, nous déclarons les arguments de interp1
avec les noms de variables donnés dans sa documentation. Le vecteur X
est l’original $s_i$, c’est-à-dire la distance parcourue sur la longueur de l’arc au temps $t_i$. La matrice V
possède des vecteurs colonnes dont les lignes sont $t_i$ (notre paramètre temporel original en pas égaux), et les coordonnées $\gamma (t_i)$.
X = s.';V = ;
Nous devons interpoler pour trouver les points temporels $t(s_i)$ correspondant à des pas de longueur d’arc également espacés le long de la courbe. Ces pas également espacés vont de $s_0=0$ à $s_N=L$, où $L$ est la longueur totale de l’arc.
L = s(end);s0 = s(1);N = length(s);Xq = linspace(s0,L,N); % equally spaced indices
Nous pouvons vérifier que s(N) == sum(diff(Xq))
, comme cela devrait être le cas. Nous utilisons la capacité d’interpolation linéaire multidimensionnelle par morceaux de la fonction d’interpolation interp1
de Matlab pour trouver des valeurs interpolées pour le temps $t(s_i)$ et les coordonnées $\gamma (t(s_i))$ qui correspondent aux étapes équidistantes de $s_i$ données dans Xq
.
Vq = interp1(X,V,Xq);
Un appel à diff(Xq)
montre que nous nous déplaçons par pas de longueur d’arc constante le long de $\gamma $, tandis qu’un appel à diff(Vq)
montre que les pas de temps ne sont plus égaux (première colonne). Ainsi, le résultat de notre interpolation est :
- longueur de l’arc $s_i$ en pas constants (
Xq
) - points temporels correspondants $t_i$, plus en pas constants (première colonne de
Vq
) - coordonnées $\gamma(t(s))$ en fonction de la longueur de l’arc (deuxième et troisième colonnes de
Vq
)
Donc la paramétrisation de la longueur de l’arc du limacon $\gamma (t(s))$ s’exprime en coordonnées cartésiennes sous la forme xs
et ys
.
xs = Vq(:,2);ys = Vq(:,3);
Ces vecteurs donnent la position d’une particule se déplaçant le long de $\gamma $ en fonction de $s$, où $s$ s’incrémente par pas de 0.1058
. Voici les deux paramétrages de la courbe $\gamma $, à savoir $\gamma (t)$ en bleu et $\gamma (t(s))$ en rouge.
Je vais devoir faire un peu plus de travail si je veux autoriser les solutions périodiques, car le script Matlab actuel ne le fait pas en général. Pour s’en rendre compte, il suffit de regarder la distance entre le dernier et le premier échantillon de $\gamma (t(s))$ en rouge ci-dessus. Si nous devions avancer d’un pas supplémentaire de 0.1058
unités le long du limacon, nous n’arriverions pas sur un point que nous avons déjà visité, même si nous savons que les limacons sont $2\pi$-périodiques. Je pense que cela revient essentiellement à choisir pour $s$ une taille de pas différente de 0.1058
.
.