Sur les changements de paramètre admissibles :

Une représentation paramétrique (en bref RPR) d'une courbe dans l'espace est une fonction continûment différentiable d'un intervalle I de R dans R^3, x : t |-> x(t), dont la dérivée x' ne s'annule pour aucun t dans I. Une courbe régulière est une classe d'équivalence de RPR, la relation d'équivalence entre deux RPR étant définie par l'existence d'une bijection différentiable entre leur domaine, donc par l'existence d'un changement de paramètre admissible. Le problème se pose donc de savoir comment exécuter un tel changement de paramètre. En particulier, on va examiner un tel changement dans le cas particulier important de ce qu'on appelle l'abcisse curviligne, un paramètre qui fournit la distance mesurée le long de la courbe étudiée.

Décrivons l'expérience de ce changement sur la fonction vectorielle x suivante avec Mathematica :

x[t_]:= {t,t^2/2,0} (* 0 < t < 2 *)
x'[t]
(* donc x est une RPR! *)
norme[vecteur_]:= Sqrt[vecteur . vecteur]
(* calcul de l'abcisse curviligne *)
Integrate[norme[x'[v]]//Evaluate,{v,0,t}]
s[t_]:= Evaluate[%]
s[t]
Voici le graphe de s
graphe1 = Plot[s[t],{t,0,2}]
(* Puisque la dérivée s'[t] = norme[x'[t]] ne s'annule pas dans l'intervalle considéré, t |-> s[t] est un changement de paramètre admissible *)
(* Trouver t en fonction de s ! *)
(* calcul d'une approximation de la fonction inverse, s|-> t[s] *)
(* dans un voisinage de t = 1 *)
Développement de Taylor d'ordre 5 de la fonction s autour de t=1,
Series[s[t],{t,1,5}]
Inversons la série pour obtenir le développement de la fonction inverse
fctinv = InverseSeries[%,u]
(* Vérification que la composition donne une approximation de la fonction identité *)
ComposeSeries[%,Series[s[t],{t,1,5}]]
Simplify[%]
g[t_]:= Normal[%]//Evaluate
g[t]
q[u_]:= Evaluate[Normal[fctinv]]
Voici le graphe de la fonction inverse de s:
graphe2 = Plot[q[u],{u,s[0],s[2]}]
Voici le graphe de la composition de la fonction s avec son inverse
graphe 3 = Plot[{q[s[t]],t},{t,0,2},AspectRatio->Automatic]
Essayons de simplifier l'expression de la fonction q. Après quelques essais, on s'aperçoît qu'il suffit d'exécuter:
Expand[N[q[u]]
Comparons, dans une même figure, la fonction identité avec la composition de q avec s, pour apprécier la qualité de l'approximation choisie.
graphe4 = Plot[{s[q[u]],u},{u,0,2}]
Dans l'espace des fonctions continues sur l'intervalle [0,2], la "distance" entre les 2 fonctions , s[q[u]] et l'identité peut être mesurée par l'intégrale:
distanceentrefct = NIntegrate[Abs[s[q[u]]-u],{u,0,s[2]}]

(* un exemple plus compliqué *)
(* attention: pour éviter des collisions entre symboles, réinitialisons ceux déja utilisés *)
Voici comment afficher la liste de ces symboles :
?Global`*
Voici comment les réinitialiser :
Clear["Global`*"]
?Global`*

Considérons la fonction vectorielle suivante :
x[t_]:={t,Sin[t],Cos[t^2]} (* 0 <= t <= 2 *)
?x
ParametricPlot3D[x[t]//Evaluate,{t,0,2},AxesLabel->{x,y,z}]
x'[t]
(* donc une RPR, puisque une des composante est une constante non nulle ! *)
Visuellement, voici ce que cela donne :
graphe1 = Plot[Sqrt[x'[t].x'[t]]//Evaluate,{t,0,2}]
A bien noter : par défaut Mathematica ne dessine pas nécessairement l'axe horizontal passant par l'origine. Pour l'obliger à le faire, exécutons la commande :
graphe2 = Show[graphe1,PlotRange->{0,3}]
A bien noter aussi : Par défaut, dans une figure engendrée par Plot, les unités sur les axes ne sont pas les mêmes. L'option AspectRatio->Automatic rétablit les mêmes échelles :
graphe3 = Show[graphe1,PlotRange->{0,3},AspectRatio->Automatic]

Calculons la longueur f(t) de l'arc x([0,t]), image du segment [0,t] par la fonction x :
f[t_]:= Integrate[Sqrt[x'[u].x'[u]]//Evaluate,{u,0,t}]
Après environ une minute de calcul, Mathematica abandonne en affichant pourquoi : par défaut, incapable de vérifier la convergence ...
Integrate::gener: Unable to check convergence
Pourtant, la syntaxe semble correcte, lorsqu'on vérifie la définition de f (au passage, on constate que Mathematica traite la dérivée comme un opérateur sur les fonctions) :
?f
Essayons de calculer f pour, disons, une liste de trois valeurs de t prises en 0, au hasard entre 0 et 1, entre 1 et 2.
{f[0],f[Random[]],f[1+Random[]]}
La réponse semble décevante mais, en arrière plan, Mathematica a utilisé des algorithmes numériques. En effet, si l'on exécute maintenant
N[%]
on obtient trois valeurs numériques.
Ceci nous suggère de procéder par intégration numérique et de définir :
fnum[t_]:= NIntegrate[Sqrt[x'[u].x'[u]]//Evaluate,{u,0,t}]
{fnum[0],fnum[Random[]],fnum[1+Random[]]}
A bien noter : la liste obtenue n'est pas la même que ci-dessus parce que la commande Random produit à chaque exécution un nouveau nombre pseudo-aléatoire.
Le détour par la fonction fnum nous permet d'en avoir facilement le graphe :
graphe4 = Plot[fnum[t]//Evaluate,{t,0,2},AspectRatio->Automatic]
A titre documentaire, voici comment, au besoin, construire une table de valeurs de la fonction fnum, comme on le faisait autrefois …
abcisses = Range[0,2,.01]
Pour évaluer la fonction fnum sur chaque élément de liste des abcisses, on utilise la commande Map, ce qui va nous donner une nouvelle liste, celle des ordonnées :
ordonnees = Map[fnum,abcisses]
Pour avoir une table des valeurs, il faut avoir les paires de type : une abcisse et la coordonnée correspondante, donc des paires {ti,fnum[ti]}. Il suffit pour cela de transposer la liste de listes {abcisses,ordonnees}:
tabledevaleurs = Transpose[{abcisses,ordonnees}]
La commande ListPlot nous donne rapidement la répartition de ces données :
graphe5 = ListPlot[tabledevaleurs]
Options[Plot,AspectRatio]
graphe6 = Show[graphe5,AspectRatio->1/GoldenRatio]
Pour connaître la structure de notre table de valeurs, on fait :
Dimensions[tabledevaleurs]
tabledevaleurs[[1]]
A noter que les abcisses sont tellement rapprochées que la résolution de la figure peut faire croire en une courbe continue. Pour voir qu'il n'en est rien, nous ne dessinons, avec la commande suivante, que les points dont le numéro dans la liste est un multiple de 3, donc le numéro 1,3,6,9,...etc.
La façon de procéder peut se lire dans la commande suivante :
graphe7 = ListPlot[Table[tabledevaleurs[[3k]],{k,1,67}]]
Show[graphe6,graphe7]

Retour à ma page personnelle



©jmt 000919