Manipuler des nombres complexes (et quaternions, et autres objets) avec Maxima

Le but de cet article est de présenter comment manipuler des quaternions avec le logiciel Maxima.

Pour commencer, il faut charger le package atensor qui va nous permettre de réaliser tous les calculs:

load(atensor);

Ensuite, on va effectuer les deux commandes suivantes:

init_atensor(clifford, 0, 0, 2);
q(a,b,c,d):=a+b.v[1]+c.v[2]+d.v[1].v[2];
  • La première indique que l’on veut travailler avec les quaternions. Il s’agit en fait de la définition de la forme quadratique qui définit l’algèbre de Clifford. Le premier 0 représente la dimension positive de l’algèbre, le second la dimension dégénérée et la dernière la dimension négative. Ainsi, ici, on considère la forme quadratique \(Q(x_1,x_2)=-x_1^2-x_2^2\) définie sur \(\mathbb R^2\).
  • La deuxième ligne nous donne un moyen de définir facilement des quaternions, via leurs composantes.

Maintenant, on peut commencer à travailler avec les quaternions. Les deux vecteurs de base sont stockés dans un vecteur v. Ainsi, i correspond à v[1] et j correspond à v[2]. Le vecteur k, quand a lui, correspond à v[1].v[2]. Par exemple, si je veux définir le nombre complexe \(z=1+2i\), je fais

z:1+2.v[1];

Si je veux le multiplier avec le quaternion \(3+4i+5j\), je fais:

(1+2*v[1]).(3+4*v[1]+5*v[2]);

et le résultat est
\(2\,\left( 5\,\left( {v}_{1} . {v}_{2}\right) +4\,\left( {v}_{1} . {v}_{1}\right) +3\,{v}_{1}\right) +5\,{v}_{2}+4\,{v}_{1}+3\)
Si on veut un résultat plus joli, on peut utiliser la commande atensimp:

atensimp((1+2*v[1]).(3+4*v[1]+5*v[2]));

qui nous renvoie
\(
2\,\left( 5\,\left( {v}_{1} . {v}_{2}\right) +3\,{v}_{1}-4\right) +5\,{v}_{2}+4\,{v}_{1}+3
\)
En combinant cela avec la fonction expand

expand(atensimp((1+2*v[1]).(3+4*v[1]+5*v[2]));)

on trouve finalement
\(
10\,\left( {v}_{1} . {v}_{2}\right) +5\,{v}_{2}+10\,{v}_{1}-5
\)
qui correspond au quaternion \(10k+5j+10i-5\).

On peut définir quelques commandes pour nous simplifier la vie:

conj(x):=subst([v[1]=-v[1],v[2]=-v[2],v[1] . v[2]=-v[1] . v[2]] , x);
norm(x):=sqrt(expand(atensimp(x.conj(x))));
inverse(x):=conj(x).expand(atensimp(x.conj(x)))^(-1);

Ainsi, je peux calculer l’inverse du quaternion \(10k+5j+10i-5\):

inverse(q(-5,10,5,10))

On peut aussi faire des calculs plus généraux, comme par exemple multiplier les quaternions \(q(a,b,c,d)\) ainsi que \(q(e,f,g,h)\). Si vous essayez de le faire via la commande

expand(atensimp(q(a,b,c,d).q(e,f,g,h)));

, vous verrez que le résultat est plutôt… horrible (tellement horrible que je vous l’éparnge ;-))! Le problème est que nos variables a, b, …, h ne sont pas considérées comme réelles. On corrige le problème avec le code suivant:

declare([a,b,c,d,e,f,g,h],scalar);
expand(atensimp(q(a,b,c,d).q(e,f,g,h)));

Remarque

Comme indiqué dans l’introduction, on peut travailler avec une forme plus générale de l’algèbre des quaternions en considérant l’une des algèbres de Clifford. Dans ce cas, il faudrait modifier quelques petites choses:

  • L’application de conjugaison n’est pas la bonne.
  • Tous les éléments non-nuls ne sont pas forcément inversibles (il faut se restreindre au groupe de Clifford).

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *