Calcul du repère mobile


Rappelons que le repère mobile d'une courbe C en un de ses points est un ensemble de trois vecteurs unitaires
{tangent, normal, binormal}
fournissant en ce point une base orthonormée de R3.

Si x : t |-> x(t) est une paramétrisation régulière quelconque de C (le paramètre t n'est pas nécessairement l'abcisse curviligne), la commande ci-dessous calcule le repère mobile en un point x(t).
Comme pour d'autres commandes, on a intérêt à la sauvegarder dans un fichier, (je suggère : repmob.m) dans son répertoire personnel, pour utilisation au besoin en la chargeant avec
<<repmob.m
Donc, à copier-coller dans le fichier repmob.m :
(* calcul du repere mobile pour une courbe reguliere x : *)
repmob[x_][t_]:= Module[{u, norme, unit, der1, der2, v1, v2, v3},
    norme[v_]:= Sqrt[v . v];
    unit[v_]:= v/norme[v];
    der1 = D[x[u],u];
    der2 = D[der1,u];
    v1 = unit[der1];
    v2 = 1/norme[Cross[der1,der2]] (norme[der1] der2 - (unit[der1] . der2) der1);
    v3 = unit[Cross[der1,der2]];
    res = {v1,v2,v3} /. u ->t
  ]

Exemple 1 :
x[t_]:= {Cos[t],Sin[t],t}
Prenons l'habitude de nommer nos résultats pour pouvoir y référer plus facilement.
res1 = repmob[x][t]
Comme prévu, on obtient une liste de trois vecteurs de R3 orthonormés. Nous pouvons donc considérer cette liste comme une matrice orthogonale et faire le produit de celle-ci avec sa transposée pour vérifier si l'on obtient bien la matrice identité, autrement dit, les trois vecteurs forment bien un système orthonormé.
res2 = Transpose[res1] . res1//Simplify
L'exemple suivant est un peu plus laborieux, surtout si l'on insiste à le calculer à la main :
Exemple 2 :
y[t]:= {t,t^2,t^3}
res3 = repmob[y][t]
res4 = Transpose[res3] . res3//Simplify
L'exemple suivant est sans compromis. Il s'agit d'une courbe sur une quadrique, courbe qui se projette sur un demi-cercle dans le plan des (x,y):
Exemple 3 :
c1[t_]:= {-1/2 + Sqrt[5/2]*Cos[t], 5/2 + Sqrt[5/2]*Sin[t], (-45 + Sqrt[10]*Cos[t] - 10*Sqrt[10]*Sin[t] - Sqrt[3729 + 54*Sqrt[10]*Cos[t] - 2150*Cos[t]^2 + 1956*Sqrt[10]*Sin[t] - 680*Cos[t]*Sin[t] + 2440*Sin[t]^2])/24}
res5 = repmob[c1][t];
A noter : nous ajoutons un point-virgule après la commande pour éviter un affichage trop long …. La vérification, comme plus haut, soit est aussi très longue ou demande trop de temps :
res6 = Transpose[res5] . res5;
On peut, après quelques minutes de patience, stopper le calcul avec la commande
Ctrl-C (on appuie sur la touche Ctrl et on tape c)
A la demande de Mathematica, on répond
a (pour abort, arrêt)
Au lieu d'une vérification analytique, on peut au besoin procéder à une vérification ponctuelle, par exemple en prenant une suite de points dans le domaine de définition de la courbe c1, approximativement le segment [-.322,2.8], avec la commande Range, qui pourrait se traduire par :
Choisis, à partir de -.322 et avec un pas de .5, des points équidistants jusqu'à 2.8, mais sans le dépasser.
res7 = Range[-.322,2.8,.5]
Ceci nous donne 7 valeurs de t pour lesquelles on va évaluer le produit matriciel Transpose[res5] . res5.
La commande qui effectue ces calculs est extrêmement concise :
res8 = Map[(Transpose[res5] . res5 /. t->#)&,res7]//Chop
Elle peut se traduire par :
Pour chaque valeur de t dans la liste du résultat 7, calcule le produit matriciel considéré et tue le bruit algorithmique.
On obtient effectivement une liste de 7 matrices identité.
Notons que cette vérification peut aussi se faire sur un plus grand nombre de points. Il suffit de diminuer le pas dans la commande Range.
On peut aussi choisir des points "au hasard" dans le domaine de définition de c1. Cela n'en rendra la vérification que plus convaincante, à défaut d'une vérification au niveau symbolique.

Retour à ma page personnelle



©jmt : création le 001010 - dernière modification le 011005