Introduction au logiciel Maxima/Interface et premiers exemples

Un livre de Wikilivres.


1. Interface utilisateur et premiers exemples

Interface WxMaxima.

Interface[modifier | modifier le wikicode]

Maxima est un langage interprété, en ligne de commande : on tape une expression (suite de commandes et de paramètres), on valide avec la touche [Entrée], et on obtient son résultat.

Attention :

il peut y avoir une différence de comportement entre la touche [Entrée] du pavé numérique et la touche [Entrée] située à côté des touches alphabétiques.

L'invite de commande est de la forme %inn est le numéro de la commande (« i » pour input). Le résultat est indiqué sur la ligne d'après, précédé de %on (« o » pour output).

Si l'on ne veut pas que le résultat s'affiche, on termine la ligne par un signe dollar $.

Si l'on ne veut pas qu'une expression soit évaluée, on met une apostrophe ' devant. Par exemple, diff(x, t, 2); renvoie 0 (on dérive deux fois par rapport à t une expression ne contenant pas t), tandis que 'diff(x, t, 2); renvoie d2x/dt2 (expression non évaluée, laissée telle quelle).

Premiers exemples[modifier | modifier le wikicode]

Calculs simples[modifier | modifier le wikicode]

(%i1) 1+1;
(%o1) 2

(%i2) %+2;
(%o2) 4

(%i3) sin(%pi/4)
(%o3)  1
      ———
      2

(%i4) float(sqrt(3));
(%o4) 1.732050807568877

(%i5) f(x) := sin(x)/x;
(%o5)         sin(x)
      f(x) := ——————
                x
(%i6) a:2
(%o6) 2

(%i7) f(a);
(%o7) sin(2)
      ——————
        2

(%i8) float(%)
(%o8) 0.4546487134128409

(%i9) (81*y^4)^(1/4);
(%o9) 3|y|

Dans les expressions n°2 et 8, le pour-cent % désigne le dernier résultat obtenu.

Dans l'expression n°3, la commande float() transforme la valeur symbolique √3 en nombre décimal approché (réel à virgule flottante). De même, dans l'expression n°8, il transforme l'expression symbolique sin(2)/2 en valeur décimale approchée.

Dans l'expression n°5, on définit la fonction ƒ. Dans l'expression n°6, on définit la variable a et on lui attribue la valeur de 2. L'expression n°7 calcule ƒ(a).

Tracés graphiques[modifier | modifier le wikicode]

(%i1) plot2d(x^2, [x, -1, 1]);
(%o1) []

(%i2) f(x,y):= sin(x) + cos(y);
(%o2) f(x,y):= sin(x) + cos(y)

(%i3) plot3d(f(x, y), [x, -2*%pi, 2*%pi], [y, -2*%pi, 2*%pi]);
(%o3) []

L'expression n°1 trace la fonction y = x² pour x variant de -1 à 1.

L'expression n°3 trace la fonction ƒ(x, y), chacune des variables variant entre -2π et 2π.

Calculs formels[modifier | modifier le wikicode]

(%i1) expand((x+y)^3);
(%o1)  + 3xy² + 3x²y + 

(%i2) factor(x^2 - y^2);
(%o2) -(y-x)(y+x)

(%i3) a:(x^2 - 2)/(2*x^3 + 3*x + 2);
(%o3)   -2
      ————————
      2+3x+2

(%i4) subst(2, x, a);
(%o4) 1
      ——
      12

(%i5) diff(a, x);
(%o5)    2x      (-2)(6+3)      ⎪———————— - —————————————⎪
      2+3x+2    (2+3x+2)² (%i6) integrate(sin(x), x);
(%o6) -cos(x)

(%i7) integrate(sin(t), t, 0, x);
"Is x positive, negative or zero?" positive;
(%o7) 1-cos(x)

Les expressions n°1 et 2 montrent le développement et la factorisation d'une expression.

L'expression n°3 définit une fonction rationnelle et la met dans la variable a.

L'expression n°4 calcule a(2) : elle consiste à substituer 2 à « x » dans l'expression de a.

L'expression n°6 donne la primitive de sin(x). L'expression n°7 consiste à intégrer sin(t) entre 0 et x. Maxima demande si x est positif, négatif ou nul. Les réponses peuvent être positive, negative, zero, ou bien les abréviations pos, neg ou 0.

Résolution d'équations linéaires et polynomiales[modifier | modifier le wikicode]

(%i1) solve(x^2 + 2*x - 10 = 0, x)
(%o1) [x=-sqrt(11)-1,x=sqrt(11)-1]

(%i2) linsolve([3*x + 4*y = 7, 2*x + 2*y = 13], [x, y]);
(%o2) [x=19,y=-25/2]

(%i3) algsys([3*x^2 + 4*y = 7, 2*x + 2*y = 13], [x, y]);
(%o3) [[x=-(sqrt(53)*%i-2)/3, y=(2*sqrt(53)*%i+35)/6], [x=(sqrt(53)*%i+2)/3, y=-(2*sqrt(53)*%i-35)/6]]

L'expression n°1 cherche les valeurs de x qui sont solution de

x2 + 2x - 10 = 0.

Notons que si le second membre est nul, on peut l'omettre : on aurait pu écrire solve(x^2 + 2*x - 10, x).

L'expression n°2 cherche les couples de valeurs (x, y) qui sont la solution du système linéaire

S'il s'agit d'un système polynomial, on utilise algsys(), avec la même syntaxe (expression n°3).

La fonction eliminate() permet d'éliminer une inconnue. Par exemple :

(%i4) eliminate([3*x + 4*y = 7, 2*x + 2*y = 13], [x]);
(%o4) [-2*y-25]

nous indique que si l'on élimine la variable x du système n°2, on obtient l'équation . Cela permet de contourner des défaut du solveur. Par exemple, la version 5.43.0 de Maxima n'est pas capable de résoudre directement le système :

c'est-à-dire d'exprimer x et y' en fonction de X et de Y. En effet :

(%i1) Eq1:X = x*(1+(1-x)^2*y^2/(1-x^2*y^2))$
(%i2) Eq2:Y = y*(1-x)^2/(1-x^2*y^2)$
(%i3) solve([Eq1, Eq2], [x, y]);
(%o3) [[x=1,y=-1],[x=1,y=1]]

Les solutions trouvées correspondent à des situations de type 0/0. On peut contourner le problème avec

(%i4) Eqint1:eliminate([Eq2, Eq1], [x])$
(%i5) soluy:solve(Eqint1, y);
(%o5) [y=-(sqrt(Y^4+(-2*X^2+4*X+2)*Y^2+X^4-4*X^3+6*X^2-4*X+1)-Y^2+X^2-2*X+1)/(2*Y),y=
(sqrt(Y^4+(-2*X^2+4*X+2)*Y^2+X^4-4*X^3+6*X^2-4*X+1)+Y^2-X^2+2*X-1)/(2*Y),y=1,y=-1,y=0]
(%i6) Eqint2:eliminate([Eq2, Eq1], [y])$
(%i7) solux:solve(Eqint2, x);
(%o7) [x=-(sqrt(Y^4+(-2*X^2+4*X+2)*Y^2+X^4-4*X^3+6*X^2-4*X+1)+Y^2-X^2+2*X+1)/(2*X-4),x=
(sqrt(Y^4+(-2*X^2+4*X+2)*Y^2+X^4-4*X^3+6*X^2-4*X+1)-Y^2+X^2-2*X-1)/(2*X-4),x=1,x=0]
tout le programme: ctrlC+ctrlV:

Eq1:X = x*(1+(1-x)^2*y^2/(1-x^2*y^2))$
Eq2:Y = y*(1-x)^2/(1-x^2*y^2)$
Eqint1:eliminate([Eq2, Eq1], [x])$
Eqint2:eliminate([Eq2, Eq1], [y])$
solux:solve(Eqint2, x);
e:'diff(x, t, 2) + 2*x + 1= 0;
ode2(e, x, t);

mais il faut ensuite trier les paires de solution…

Résolution d'équations différentielles ordinaires[modifier | modifier le wikicode]

(%i1) e:'diff(x, t, 2) + 2*x + 1= 0;
(%o1) (d²x/dt²) + 2x + 1 = 0

(%i2) ode2(e, x, t);
(%o2) x = %k1*sin(sqrt(2)*t) + %k2*cos(sqrt(2)*t) - 1/2

Dans l'expression n°1, nous définissons une équation différentielle ordinaire (EDO) d'ordre 2. Notez l'apostrophe qui interdit à Maxima d'effectuer la dérivation : l'expression « x » ne contenant pas de « t », l'évaluation de diff(x, t, 2) donnerait 0. L'apostrophe au début de 'diff(x, t, 2) permet de garder l'expression intacte et donc de travaille avec (d²x/dt²).

L'expression n°2 résout cette EDO. Les paramètres %k1 et %k2 désignent des constantes arbitraires k1 et k2. Une constante d'intégration serait notée %c.

Donc ici, Maxima nous indique que les solutions de l'EDO sont les fonctions de la forme .

Optimisation[modifier | modifier le wikicode]

Pour l'optimisation linéaire par la méthode du simplex, on peut utiliser la commande minimize_lp du module « simplex » :

(%i1) load("simplex")$;

(%i2) minimize_lp(x + y, [x + 2*y >= 2, x >= 0, y >= 0]);
(%o2) [1,[y=1,x=0]]

Ici, nous cherchons le minimum dex + y avec pour contraintes x + 2y ≥ 2, x ≥ 0 et y ≥ 0. La valeur minimale est 1 et est obtenue pour le couple de valeurs (x = 0 ; y = 1).

On peut utiliser la méthode de quasi-Newton, en particulier la méthode de Broyden-Fletcher-Goldfard-Shanno à mémoire limitée (L-BFGS) :

(%i1) load("lbfgs")$;

(%i2) lbfgs(x^2+2, '[x], '[5], 1e-3, [0, 0]);

*************************************************
  N=    1   NUMBER OF CORRECTIONS=25
       INITIAL VALUES
 F=  2.700000000000000D+01   GNORM=  1.000000000000000D+01
*************************************************
   I  NFN     FUNC                    GNORM                   STEPLENGTH
   1    2     1.800000000000000D+01   8.000000000000000D+00   1.000000000000000D-01  
   2    3     2.000000000000000D+00   0.000000000000000D+00   1.000000000000000D+00  
 THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS.
 IFLAG = 0
(%o2) [x=0.0]

Ici, nous cherchons la valeur de x donnant le minimum de y = x2 + 2, en partant d'une valeur initiale de x valant x0 = 5, et avec un pas de 10-3. Le dernier paramètre [0, 0] détermine le rapport de calcul généré.

La dernière ligne du rapport nous indique qu'il a fallu 2 itérations (I), donc trois évaluations de la fonction (NFN), et que la valeur minimale est 2 (FUNC). Cette valeur est atteinte pour x = 0.

Vecteurs[modifier | modifier le wikicode]

(%i1) i:[1, 0, 0]; j:[0, 1, 0]; k:[0, 0, 1];

(%o1) [1,0,0]
(%o2) [0,1,0]
(%o3) [0,0,1]

(%i4) i . j;
(%o4) 0

(%i5) load("vect")$

(%i6) i~j;
(%o6) -[0,1,0]~[1,0,0]

(%i7) express(%);
(%o7) [0,0,1]

Dans l'expression n°1, nous définissons les vecteurs (i, j, k) de la base canonique de ℝ3. Dans l'expression n°4, nous calculons le produit scalaire. Pour éviter la confusion avec le point décimal, nous mettons un espace avant et après.

Dans l'expression n°5, nous chargeons un module complémentaire appelé « vect ». Ce module fournit entre autres le produit vectoriel (cross product), par l'opérateur ~ (tilde). Il faut utiliser la commande express() pour que le calcul soit effectué (expression n°7).

(%i1) a:[3, 2, 1];
(%o1) [3,2,1]

(%i2) a[1];
(%o2) 3

(%i3) sqrt(a . a);
(%o3) sqrt(14)

(%i4) load("eigen")$;

(%i5) uvect(a);
(%o5) [3/sqrt(14), 2/sqrt(14), 1/sqrt(14)]

Ici, nous définission un vecteur a. L'expression n°2 extrait la première composante du vecteur. En n°3, nous calculons la norme d'un vecteur a. Puis, nous chargeons l'extension « eigen » ; cela nous fournit la commande unitvector() (abrégée en uvect()), qui calcule le vecteur unitaire colinéaire à a.

(%i1) A:[[1, 0, 0], [0, 1, 0], [0, 0, 1]];
(%o1) [[1,0,0],[0,1,0],[0,0,1]]

(%i2) A[1]
(%o2) [1, 0, 0]

(%i3) A[1][1]
(%o3) 1

Ici, nous définissons un vecteur de vecteurs. La première composante de A est le vecteur i, et la première composante de la première composante est le nombre 1.

Matrices[modifier | modifier le wikicode]

(%i1) A:matrix([3, 2, 1]);
(%o1) [3 2 1]

(%i2) transpose(A);
(%o2) 3      2      1(%i3) 5*A . transpose(A);
(%o3) 70

(%i4) B:transpose(A) . A;
(%o4) 9 6 3      6 4 2      3 2 1(%i5) B*B;
(%o5) 81 36 9      36 16 4       9  4 1(%i6) I:matrix([1, 0, 0], [0, 1, 0], [0, 0, 1]);
(%o6) 1 0 0      0 1 0      0 0 1

Nous définissons ici la matrice A de ℝ3. Nous en prenons la transposée. Dans l'expression n°3, nous calculons le produit matriciel de A par sa transposée, que nous multiplions par 5. Dans l'expression n°4, nous calculons le produit matriciel de la transposée de A par A.

Dans l'expression 5, nous effectuons une multiplication terme-à-terme.

Dans l'expression n°6, nous définissons la matrice unité de ℝ3×ℝ3.

Notes et références[modifier | modifier le wikicode]


Sommaire < > Calculs élémentaires