FAQ MAXIMA
Version 0.9 du 2 novembre 2007
Auteur Michel Gosse
Mel : michel.gosse@free.fr
Cette Faq a pour objectif de répondre de manière concrète et pratique à toutes les questions que l'on peut se poser sur Maxima et son utilisation. La dernière version de cette faq est téléchargeable à l'adresse :
Certaines réponses sont extraites de la liste internationale de Maxima dont nous remercions tous les participants.
Table des matières
1
1.1
1.1.1
1.1.2
1.1.3
1.1.4
1.1.5
1.1.6
1.2
1.2.1
1.2.2
1.2.3
1.2.4
1.2.5
1.3
1.3.1
1.3.2
1.3.3
1.3.4
2
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.7.1
2.7.2
2.8
2.9
3
3.1
3.2
3.3
4
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
4.10
4.11
4.12
4.13
4.14
5
5.1
5.2
5.3
5.4
5.5
5.6
5.7
6
6.1
6.2
6.3
6.3.1
6.3.2
6.4
6.5
7
7.1
8
8.1
8.1.1
8.1.2
8.1.3
8.2
8.2.1
8.2.2
8.2.3
8.2.4
8.2.5
8.2.6
8.2.7
8.2.8
8.2.9
8.2.10
8.3
9
9.1
9.1.1
9.1.2
9.1.3
9.2
9.3
9.3.1
9.4
9.4.1
10
10.1
10.1.1
10.1.2
10.1.3
10.2
10.3
10.3.1
10.3.2
10.3.3
10.4
10.5
10.6
10.7
10.8
10.9
10.10
10.11
10.12
10.13
10.14
10.15
10.16
10.17
10.18
10.19
10.20
10.21
Totalement. Le code de Maxima est en open source. Vous avez droit de le copier, de le modifier, de le distribuer librement. Vous pouvez intaller le logiciel sur autant de postes que vous le désirez.
Tout à fait. Le code de Maxima existe depuis plus de 15 ans. Maxima est utilisé avec succès pour résoudre de nombreux problèmes mathématiques.
L'interface de Maxima n'est pas très performante. Les logiciels commerciaux proposent une interface beaucoup plus ergonomique. Cependant, au niveau mathématique, Maxima n'a rien à envier aux logiciels commerciaux. Signalons que l'usage de Maxima avec TeXmacs ou WxMaxima permet d'obtenir une interface moderne et wysiwyg.
Les informaticiens du département de l'Energie américain ont élaboré le premier code source. Ce code fut d'abord vendu à une société privée qui l'a développé afin de commercialiser le logiciel Macsygma. Le docteur William Schelter a ensuite obtenu l'autorisation d'exploiter le code du logiciel original, qui fut mis en open source sous le nom de Maxima. Le docteur Schelter l'a maintenu et amélioré durant une quinzaine d'année. A sa mort prématurée en 2001, le développement du logiciel a été repris par une équipe de développeurs bénévoles.
Macsygma est un logiciel commercial dont le code source reposait sur le noyau de Maxima. Ce logiciel n'est plus commercialisé. La version en open source s'appelle Maxima.
Le site officiel est désormais hébergé par Sourceforge à l'adresse :
Les versions de Maxima
La dernière version stable est la 5.9.12.
ATTENTION : depuis la version 5.9.2, Maxima différentie les majuscules et les minuscules, à la fois dans le nom des fonctions et dans les variables. Cela implique que certains programmes ou scripts sont à adapter.
Maxima existe en version Linux et Windows. Il existe aussi une version pour Windows CE.
Oui, la version 6.0 est en construction. Elle doit permettre de nettoyer le code du logiciel et de supprimer des bugs rapportés par les utilisateurs. Cette version comportera des améliorations majeures, notamment au niveau de l'interface.
?Une équipe de développeurs bénévoles travaille sur le code de Maxima. Ils communiquent entre eux grâce à Internet. Un site CVS dédié permet de faire les mises à jour du code. Les utilisateurs communiquent les bugs trouvés qui sont éradiqués.
Maxima est le moteur de calcul, programmé en Lisp. On peut se connecter au logiciel par le biais de différents logiciels, qui fournissent ou non une interface graphique. Dans ce cas, Maxima est le serveur, et l'interface est le client. Parmi les interfaces existantes, les suivantes sont les plus performantes :
C'est l'interface graphique qui est livrée avec le programme. Ancienne et un peu sommaire, son remplacement est à l'étude.
Interface moderne et fonctionnelle, qui permet d'entrer une grande partie des commandes de Maxima à l'aide d'icônes. Ses fonctionnalités d'édition et sa simplicité en font un logiciel idéal pour utiliser Maxima. Elle fonctionne sous toutes les plate-formes. Le site de référence est :
http://wxmaxima.sourceforge.net/
Texmacs est un traitement de textes scientifiques, qui permet d'entrer directement des commandes Maxima. Son intérêt est de produire des documents d'une qualité remarquable. Par contre, toutes les commandes Maxima doivent être entrées au clavier. Le site de référence :
http://www.texmacs.org/
Imaxima est une extension pour le traitement de textes Emacs qui permet d'envoyer et de recevoir des commandes Maxima dans un buffer. Le site de référence :
http://members3.jcom.home.ne.jp/imaxima/Site/Welcome.html
La commande ev(x,numer) renvoie une valeur approchée de x.
La commande bfloat(x) renvoie le nombre x en virgule flottante, à la précision donnée par fpprec que l'on peut modifier :
(C7) |
x:%pi;
|
(C8) |
ev(x,numer);
|
(C9) |
fpprec:10;
|
(C20) |
bfloat(x);
|
(C21) |
fpprec:100;
|
(C22) |
bfloat(x);
|
Pour déterminer des valeurs approchées d'une ou des racines d'une équation, on commence par localiser grossièrement cette racine, par exemple avec un graphique. Par exemple, on s'aperçoit que l'équation cos(x) - x = 0 a une solution appartenant à l'intervalle [0,1]. Dans ce cas, on dispose des commandes Maxima suivantes :
(C1) |
interpolate(cos(x)-x=0,x,0,1);
|
(C2) |
load(newton);
|
(C3) |
NEWTON(cos(x)-x,x,1,1/1000);
|
(C5) |
NEWTON(cos(x)-x,x,0,1/1000);
|
(C6) |
NEWTON(cos(x)-x,x,0,1/10000000);
|
Dans un premier temps, il vaut mieux utiliser la commande interpolate. Lorsqu'elle échoue, on peut utiliser la commande NEWTON. Il faut dans ce cas charger le package Newton. On fera attention au fait que Maxima est alors sensible à la casse, et qu'il faut bien respecter les majuscules dans cette commande. La syntaxe de la commande NEWTON est :
NEWTON(expression,variable,point de départ, précision)
Solution proposée par Monsieur Rodriguez sur la liste maxima : Il définit une fonction positive, qui renvoie les éléments d'une liste dont le membre de droite est positif. Cette fonction agit uniquement sur la liste renvoyée par la commande de résolution d'une équation.
(%i21) |
positive(res):=sublist(res,
lambda([z],member(sign(rhs(z[1])),['pos,'pz])))
|
(%i22) |
algsys([x^2+2*x-3],[x])
|
(%i23) |
positive(%)
|
La partie entière d'un réel x est donnée par ENTIER(x) :
(C1) |
entier(2);
|
(C2) |
entier(0.489);
|
(C3) |
entier(-1.45);
|
La valeur absolue d'un réel x est donnée par ABS(x) :
(C1) |
abs(2);
|
(C2) |
abs(-1);
|
(C3) |
abs(x^2);
|
(C4) |
abs(x^2-x);
|
(C5) |
assume(x>1);
|
(C6) |
abs(x^2-x);
|
Comme on le voit, on peut imposer une condition sur x pour permettre à Maxima de déterminer la valeur absolue d'une expression.
Soit X = a + b - c. Pour majorer X par |a| + |b| + |c|, on écrit :
(C1) |
X:a+b+-c;
|
(C2) |
apply(op(%),map(abs,args(%)));
|
Le package sqdnst permet certaines simplifications :
(C1) |
load("sqdnst");
|
(C2) |
a:sqrt(2)+sqrt(6-4*sqrt(2));
|
(C3) |
sqrtdenest(d2);
|
Par défaut, la commande ratsimp de Maxima ne simplifie pas les expressions contenant des racines carrées. Mettre l'option algebraic à true permet d'imposer les simplifications :
(C1) |
q1:1/(sqrt(5)-1);
|
1 |
sqrt (5) - 1 |
(C2) |
ratsimp(q1);
|
1 |
sqrt (5) - 1 |
(C3) |
algebraic:true;
|
(C4) |
ratsimp(q1);
|
sqrt (5) + 1 |
4 |
Il suffit d'appliquer la commande max à une liste grâce à la fonction apply :
(C1) |
apply(max,[5,7,2,3]);
|
Par défaut, Maxima connait la valeur de quelques lignes trigonométriques. Le package ntrig permet d'obtenir des résultats supplémentaires :
(C1) |
cos(%pi/4);
|
sqrt (2) |
2 |
(C2) |
cos(%pi/5);
|
π |
5 |
(C3) |
load(ntrig);
|
(C5) |
cos(%pi/5);
|
sqrt (5) + 1 |
4 |
La commande divide(m,n) renvoie le diviseur et le reste de la division de l'entier m par n. Cette commande fonctionne également avec les polynômes.
(C1) |
divide(100,7);
|
(C2) |
divide(3693,3);
|
(C3) |
divide(X^3-1,X-1);
|
(C4) |
divide(X^4+X^2-3,X^2+1);
|
La commande mod(a,b) renvoie le reste de la division de a par b :
(%i1) |
mod(25,4);
|
(%i2) |
mod(2345,23);
|
La base de départ est définie par le paramètre ibase, celle d'arrivée par le paramètre obase. Il suffit d'affecter les valeurs désirées à ces deux paramètres pour que Maxima effectue les changements de base attendus :
(C1) |
ibase:10;
|
(C2) |
obase:6;
|
(C3) |
[5,6,7,8];
|
(C5) |
obase:12;
|
(C6) |
[10,11,12,13,2576];
|
Il semble qu'un bug empêche de convertir un nombre écrit en base b>10 en un nombre écrit en base 10.
?La version 5.9 de Maxima ( et antérieures ) ne sait pas résoudre les inéquations. Il est à souhaiter que cette fonctionnalité soit implémentée dans les futures versions, notamment la version 6.0.
On utilise la commande partfrac(expression, variable) :
(C1) |
partfrac((x^2+8*x+4)/(x^2-4),x);
|
2 |
x + 2 |
6 |
x - 2 |
On emploie la fonction logcontract(expression) :
(C1) |
logcontract(log(x)+log(x+1));
|
(C2) |
logcontract(log(x)-log(x+1));
|
x |
x + 1 |
(C3) |
logcontract(10*log(x));
|
On utilise la commande declare(x,mainvar), qui déclare x comme variable principale. Dans ce cas, le polynôme s'ordonnera selon les puissances de x. Par exemple :
(C1) |
expand((x+y)^3);
|
(C2) |
declare(x,mainvar);
|
(C3) |
expand((x+y)^3);
|
Autre solution proposée par Richard Fateman, l'utilisation de la commande ratexpand(polynôme,variable) qui développe en respectant la variable x :
(C1) |
rat(expand(x+y)^3,x);
|
(C2) |
rat(expand(x+y+z)^3);
|
(C3) |
rat(expand(x+y+z)^3,x);
|
Le package expandwrt peut aussi contribuer à ordonner les termes d'un polynôme :
La commande ratcoeff(polynome,xn) donne le coefficient du terme en xn :
(C6) |
ratcoeff((z+1)^2*(t+y)^2,t^2);
|
(C12) |
ratcoeff((z+1)^2*(t+y)^2,t);
|
(C1) |
coefficients:[5,4,3,2];
|
(C3) |
sum(coefficients[i+1]*x^i,i,0,length(coefficients)-1);
|
La fonction trigrat(expression) permet de transformer de linéariser :
(%i1) |
trigrat(sin(x)^2);
|
cos (2 x) - 1 |
2 |
(%i2) |
trigrat(cos(x)^4+sin(x)^3);
|
cos (4 x) - 2 sin (3 x) + 4 cos (2 x) + 6 sin (x) + 3 |
8 |
Pour exprimer une fonction trigonométrique ou trigométrique réciproque à l'aide de la fonction inverse, il faut utiliser la commande exponentialize :
(C1) |
exponentialize(cos(x));
|
ei x + e - i x |
2 |
(C2) |
exponentialize(tanh(x));
|
ex - e - x |
ex + e - x |
La commande taylor(fonction,variable,point,ordre) donne la partie principale du développement en série de Taylor d'une fonction :
(C1) |
taylor(cos(x),x,0,5);
|
x2 |
2 |
x4 |
24 |
(C2) |
taylor(log(x),x,1,4);
|
(x - 1)2 |
2 |
(x - 1)3 |
3 |
(x - 1)4 |
4 |
On peut utiliser la commande ratsimp(expression), à condition de positionner l'option algebraic à true :
(C1) |
x:(1+sqrt(5))/(2-sqrt(5));
|
sqrt (5) + 1 |
2 - sqrt (5) |
(C2) |
algebraic:true;
|
(C3) |
ratsimp(x);
|
La fonction subst(valeur,variable,expression) remplace dans expression la variable par valeur.
(C1) |
eq:2*x^2+1/x-(x+1)^3/(1-x)
|
(x + 1)3 |
1 - x |
1 |
x |
(C2) |
subst(3,x,eq);
|
151 |
3 |
Lorsque l'on désire remplacer une variable par une autre (en éliminant la première variable), il faut utiliser à la place de subst la commande ratsubst :
(C3) |
eq;
|
(x + 1)3 |
1 - x |
1 |
x |
(C4) |
subst(y,1-x,eq);
|
(x + 1)3 |
y |
1 |
x |
(C6) |
ratsubst(y,1-x,eq)
|
3 y4 - 13 y3 + 24 y2 - 23 y + 8 |
y2 - y |
Si a est tel que a2 = 1 + a, on veut simplifier l'expression X = (a + 1)5. Pour cela, la commande fullratsubst(expression), du package lrats, est à utiliser :
(C4) |
Y:(a+1)^5;
|
(C14) |
load(lrats);
|
(C15) |
fullratsubst(1+a,a^2,Y);
|
Les opérations élémentaires (somme, multiplication) s'appliquent à chacun des membres d'une équation donnée. Ce comportement ne fonctionne pas si l'on utilise une fonction :
(C1) |
eq:2*x-5=5*x+3;
|
(C2) |
eq+5;
|
(C3) |
eq/2;
|
2 x - 5 |
2 |
5 x + 3 |
2 |
(C4) |
eq^2;
|
(C5) |
sin(eq);
|
Le complexe z = a + i b se définit avec Maxima par z:a+%I*b;
(C1) |
z1:sqrt(3)+%i;
|
(C4) |
z2:sqrt(2)-%I*sqrt(2);
|
La fonction cabs(nombre complexe) renvoie le module :
(C5) |
cabs(z1);
|
(C6) |
cabs(z2);
|
La fonction carg(nombre complexe) renvoie un argument :
(C7) |
carg(z1);
|
π |
6 |
(C8) |
carg(z2);
|
π |
4 |
La commande rectform(z) renvoie la forme algébrique de z :
(C1) |
z1:(1+%I)/(3-2*%I);
|
i + 1 |
3 - 2 i |
(C2) |
rectform(z1);
|
5 i |
13 |
1 |
13 |
(C3) |
z2:2*exp(1+%I);
|
(C4) |
rectform(z2);
|
La commande polarform(z) renvoie la forme exponentielle de z :
(C5) |
z3:1-%i;
|
(C6) |
polarform(z3);
|
i π |
4 |
La fonction exponentialize[nombre complexe] permet l'application des formules d'Euler sur un nombre complexe :
(C2) |
exponentialize(cos(x));
|
ei x + e - i x |
2 |
(C4) |
exponentialize(sin(2*x)+sin(x));
|
i (e2 i x - e - 2 i x) |
2 |
i (ei x - e - i x) |
2 |
(C5) |
exponentialize(cos(x)^2);
|
(ei x + e - i x)2 |
4 |
(C6) |
expand(%);
|
e2 i x |
4 |
e - 2 i x |
4 |
1 |
2 |
Pour transformer une exponentielle complexe en nombre complexe, on utilise la fonction Demoivre :
(C7) |
demoivre(%e^(%i*x)+%e^(-%i*x));
|
La fonction limit(expression,variable,point,direction) répond à cette question. La direction (facultative) est donnée par plus pour la limite par valeur supérieure, et minus pour la limite par valeur inférieure :
(%i1) |
'limit(sin(x)/x,x,0)=limit(sin(x)/x,x,0)
|
sin (x) |
x |
(%i8) |
'limit(exp(x)/x^2,x,inf)=limit(exp(x)/x^2,x,inf)
|
ⅇx |
x2 |
(%i11) |
'limit(1/(x^2+1),x,minf)=limit(1/(x^2+1),x,minf)
|
1 |
x2 + 1 |
(%i12) |
'limit(1/t,t,0,plus)=limit(1/t,t,0,plus)
|
1 |
t |
(%i13) |
'limit(1/t,t,0,minus)=limit(1/t,t,0,minus)
|
1 |
t |
La fonction tlimit effectue aussi le calcul d'une limite, mais en utilisant les développements en série de Taylor. Cela peut quelquefois donner une solution que la fonction limit est incapable de trouver :
(%i6) |
limit(sqrt(9*x^2+6*x+3)+3*x+1,x,minf)
|
Is x positive or negative? |
negative
|
Cette réponse est fausse. Par contre, on obtient la bonne réponse avec tlimit :
(%i15) |
tlimit(sqrt(9*x^2+6*x+3)+3*x+1,x,minf)
|
La commande diff(f(x),x,n) renvoie l'expression de la dérivée n-ième de la fonction f par rapport à la variable x.
(C1) |
f(x):=x^5+1/x;
|
1 |
x |
(C2) |
diff(f(x),x,2);
|
2 |
x3 |
(C3) |
diff(f(x),x,6);
|
720 |
x7 |
Le code suivant permet d'effectuer une intégration par parties. u est la fonction à intégrer, et v est la fonction à différentier :
(C1) |
intpart(u,v,a,b):=subst(x=b,integrate(u,x))*subst(x=b,v)-subst(x=a,integrate(u,x))*subst(x=a,v)-integrate(integrate(u,x)*diff(v,x),x,a,b);
|
(C2) |
'integrate(x*log(x),x,1,%e)=intpart(x,log(x),1,%e);
|
e |
1 |
e2 |
2 |
|
||||
2 |
(C4) |
'integrate(x*exp(2*x),x,0,1)=intpart(x,exp(2*x),0,1);
|
1 |
0 |
e2 |
4 |
1 |
4 |
(C6) |
'integrate(x^n*sin(x),x,0,%pi/2)=intpart(x^n,sin(x),0,%pi/2);
|
Is n + 1 zero or nonzero? |
nonzero;
|
|
||
0 |
2 - n - 1 πn + 1 |
n + 1 |
∫
|
||||
n + 1 |
Le package bypart permet d'effectuer une intégration par parties sans bornes définies. On dispose alors de la fonction byparts(intégrande,variable,u,dv) :
(C1) |
load(bypart);
|
(C2) |
byparts(log(x),x,log(x),1);
|
(C3) |
byparts(x*exp(x),x,x,exp(x));
|
La commande romberg(fonction, variable, borne inférieure, borne supérieure) est à utiliser dans ce cas :
(C14) |
f(x):=sqrt(1+sin(1+x^2));
|
(C15) |
integrate(f(x),x,0,1);
|
1 |
0 |
(C16) |
romberg(f(x),x,0,1);
|
Il s'agit de la fonction définie par
x
⟼∫
x
1
ln(t) |
1 - t |
(C10) |
li[2](1/2);
|
π2 |
12 |
log 22 |
2 |
(C11) |
expand(integrate(log(t)/(1-t),t,1,1/2));
|
π2 |
12 |
log 22 |
2 |
(C14) |
diff(li[2](x),x);
|
log (1 - x) |
x |
Le package descriptive.mac permet l'étude des séries statistiques. Il se télécharge à l'adresse
http://www.telefonica.net/web2/biomates/maxima/descriptive/descriptive.htm
On définit un vecteur par ses coordonnées que l'on note entre deux crochets. Par exemple, la commande u:[a,b,c]; définit le vecteur u&vect; de coordonnées (a,b,c).
(C1) |
u:[1,2,3];
|
(C2) |
v:[-1,2,3];
|
(C3) |
u+v;
|
Le produit scalaire se note avec un point, précédé et suivi d'un espace :
(C13) |
a:[1,2,3];
|
(C14) |
b:[0,-1,5];
|
(C15) |
a . b;
|
Il faut charger le package vect par la commande load("vect"); Ensuite, le produit vectoriel se note ~, et le calcul effectif du produit vectoriel s'effectue par la commande express(vecteur);
maxima] |
load("vect");
|
(C11) |
[x,y,z]~[x1,y1,z1];
|
(C12) |
express(%);
|
On définit une matrice A par la commande A:matrix([1,2,3],[-1,5,2],[4,3,0]);
(C8) |
A:matrix([1,2,3],[-1,5,2],[4,3,0]);
|
1 | 2 | 3 |
- 1 | 5 | 2 |
4 | 3 | 0 |
On entre la matrice et entre crochets le numéro de la ligne désirée.
(C11) |
A[1];
|
La fonction col(matrice,numéro de colonne) renvoie la colonne désirée :
(C12) |
col(A,1);
|
1 |
- 1 |
4 |
La fonction transpose(matrice) effectue cette opération.
(C13) |
A;
|
1 | 2 | 3 |
- 1 | 5 | 2 |
4 | 3 | 0 |
(C14) |
transpose(A);
|
1 | - 1 | 4 |
2 | 5 | 3 |
3 | 2 | 0 |
Elle renvoie une matrice triangulaire supérieure obtenue avec des combinaisons élémentaires de lignes et de colonnes, avec des éléments diagonaux égaux à 1.
(C26) |
A;
|
1 | 2 | 3 |
- 1 | 5 | 2 |
4 | 3 | 0 |
(C27) |
echelon(A);
|
1 |
|
0 | ||
0 | 1 |
|
||
0 | 0 | 1 |
Soit la matrice A = (
3 | 2 |
4 | 5 |
6 | 1 |
(C16) |
A:matrix([3,2],[4,5],[6,1]);
|
3 | 2 |
4 | 5 |
6 | 1 |
(C17) |
flatten_matrix(m):= apply(append,args(transpose(m)))$
|
(C18) |
flatten_matrix(A);
|
On définit une suite double, par exemple f[i,i], qui va générer les coefficients. On termine avec la fonction genmatrix(suite utilisée,nombre de lignes, nombre de colonnes) :
(C2) |
f[i,j]:=i^2+j^2;
|
(C8) |
genmatrix(f,4,5);
|
2 | 3 | 4 | 5 | 26 |
3 | 4 | 5 | 6 | 29 |
4 | 5 | 6 | 7 | 34 |
5 | 6 | 7 | 8 | 41 |
On peut utiliser cette possibilité pour écrire une matrice sous forme générale :
(C10) |
genmatrix(a,3,2);
|
a1,1 | a1,2 |
a2,1 | a2,2 |
a3,1 | a3,2 |
La multiplication des matrices se note avec le point (.), et non pas avec l'étoile (*) :
(C1) |
M:matrix([a,b],[c,d]);
|
a | b |
C | d |
(C2) |
M.M;
|
b C + a2 | b d + a b |
C d + a C | d2 + b C |
La matrice inverse de A se note A^^(-1) :
(C1) |
M:matrix([a,b],[c,d]);
|
a | b |
C | d |
(C2) |
M^^(-1);
|
|
-
|
||||
-
|
|
La matrice An se note A^^n :
(C4) |
M:matrix([u,v],[w,t]);
|
u | v |
w | t |
(C5) |
M^^2;
|
v w + u2 | u v + t v |
u w + t w | v w + t2 |
(C6) |
M^^3;
|
u (v w + u2) + (u v + t v) w | v (v w + u2) + t (u v + t v) |
w (v w + t2) + u (u w + t w) | t (v w + t2) + v (u w + t w) |
(C7) |
expand(%);
|
2 u v w + t v w + u3 | v2 w + u2 v + t u v + t2 v |
v w2 + u2 w + t u w + t2 w | u v w + 2 t v w + t3 |
Le package solve_rec permet dans certains cas d'exprimer, dans le cas d'une suite récurrente linéaire, le terme d'ordre n en fonction de n. Pour cela, on dispose de la fonction solve_rec(définition suite récurrence,suite,valeur d'un terme) :
(%i16) |
load(solve_rec)
|
(%i17) |
solve_rec(u(n)=n*u(n-1)/(1+n),u(n))
|
%k1 |
n + 1 |
(%i18) |
solve_rec(u(n)=n*u(n-1)/(1+n),u(n),u(1)=3)
|
6 |
n + 1 |
(%i19) |
solve_rec(u(n)=u(n-1)+u(n-2),u(n))
|
(sqrt (5) - 1)n %k1 ( - 1)n |
2n |
(sqrt (5) + 1)n %k2 |
2n |
(%i20) |
solve_rec(u(n)=u(n-1)+u(n-2),u(n),u(0)=1,u(2)=5)
|
(sqrt (5) + 1)n (7 sqrt (5) + 5) |
10 2n |
(sqrt (5) - 1)n (7 sqrt (5) - 5) ( - 1)n |
10 2n |
Maxima renvoie un message d'erreur si l'on essaye de représenter une fonction en escalier. Pour y arriver, il faut utiliser une évaluation différée. Par exemple, représentons la fonction f définie sur R par f(x) = - 1 si x<0 et f(x) = 1 si x⩾0 :
maxima] |
f(t):=if t>=0 then 1.0 else -1.0;
|
(C5) |
plot2d('(f(x)),[x,-3,3]);
|
(C1) |
plot2d('(float(entier(x))),[x,0,10]);
|
Pour représenter la famille de fonctions x→cos (n x), pour n variant de 1 à 3, on entre la commande :
(C1) |
plot2d(makelist(cos(n*x),n,1,3),[x,0,2*%pi]);
|
Pour tracer le cercle d'équation x2 + y2 = 1, on utilise la représentation paramétrique x = cos(t) et y = sin(t) :
(C3) |
plot2d([parametric,cos(t),sin(t),[t,-%pi*2,%pi*2],[nticks,80]]);
|
Cette solution est proposée par Stavros Macrakis : on entre le programme suivant :
(C1) |
plot_polar(expr,range) := block([theta_var: range[1]],
plot2d( ['parametric, cos(theta_var)*expr,
sin(theta_var)*expr, range]))$
|
(C2) |
plot_polar(1,[t,0,%pi])$
|
(C3) |
plot_polar( 1 + 2 * cos(t), [t,0,2*%pi])$
|
(C4) |
|
Le tracé de la courbe d'équation ρ = 1 sur [0,π] s'obtient par :
(C2) |
plot_polar(1,[t,0,%pi])$
|
Le tracé d'une cardioide s'obtient par :
(C2) |
plot_polar( 1 + 2 * cos(t), [t,0,2*%pi])$
|
Le tracé d'une courbe définie par un système d'équations paramétriques n'a pas été prévu dans le code de Maxima. Cependant, le docteur Schelter a implémenté dans les dernières versions de Maxima une fonction remplissant ce rôle. Le code suivant ne fonctionne donc qu'avec la version 5.9. Dans ce cas, voici des exemples :
(C1) plot2d([parametric,cos(t),sin(t),[t,-%pi*2,%pi*2]]);
(C2) plot2d([parametric,cos(t),sin(t),[t,-%pi*2,%pi*2], [nticks,8]]);
(C3) plot2d([x^3+2,[parametric,cos(t),sin(t),[t,-5,5]]], [x,-3,3]);
Function: PLOT2D (expr,range,...,options,..)
Function: PLOT2D ([expr1,expr2,..,exprn],xrange,...,options,..)
Function: PLOT2D (parametric_expr)
Function: PLOT2D ([..,expr,..,parametric_expr,..],xrange,...,options)
donnent les différentes possibilités de tracer des courbes en paramétrique.
Les noms de variable C1, D1, C2, D2, .... sont réservées à Maxima. Elles désignent les entrées (Ci) et les sorties (Di). Par exemple (merci à Stavros Macrakis) :
(C1) |
x^3-1;
|
(C2) |
solve(d1,x);
|
sqrt (3) i - 1 |
2 |
sqrt (3) i + 1 |
2 |
(C3) |
part(d2,1,2);
|
sqrt (3) i - 1 |
2 |
(C4) |
pickapart(d3,2);
|
(E4) sqrt (3) i
(D4)
E4 - 1 |
2 |
(C5) |
c2;
|
(C6) |
d3;
|
sqrt (3) i - 1 |
2 |
(C7) |
e4;
|
Attention : à compter de la version 5.9.2, la numérotation des entrées/sorties a été modifiée. L'entrée d'une commande est notée %in, où n est un entier qui s'incrémente d'une unité après chaque commande, tandis que les sorties se numérotent %on. Les variables c et d sont donc libres dorénavant.
Maxima utilise la variable réservée inf :
(C1) |
limit((x+1)/(x+5),x,inf)
|
(C2) |
integrate(exp(-x^2),x,0,inf)
|
sqrt (π) |
2 |
Maxima utilise la variable réservée minf :
(C3) |
limit(exp(x),x,minf)
|
La commande kill(variable) efface la définition précédemment entrée :
(C22) |
x:3+sqrt(5);
|
(C23) |
x;
|
(C24) |
kill(x);
|
(C25) |
x;
|
Elle se note log sous Maxima :
maxima] |
log(1);
|
(C6) |
log(exp(x));
|
(C3) |
log10(x):=log(x)/log(10);
|
log x |
log 10 |
(C4) |
log10(10);
|
(C9) |
diff(log10(x),x);
|
1 |
log 10 x |
On veut définir la fonction dérivée d'une fonction f, pour pouvoir la réutiliser :
(C1) |
expression:x^2+1/x;
|
1 |
x |
(C2) |
define(f(x),expression);
|
1 |
x |
(C3) |
define(df(x),diff(f(x),'x));
|
1 |
x2 |
(C4) |
df(1);
|
Si on a définit une expression expr, on peut définir une fonction à l'aide de la commande f(x):=”(expr); On utilise deux fois la simple quote. Une autre syntaxe possible est define('f(x),expr); Par exemple :
maxima] |
expr:logcontract(integrate(2/(x^2-1),x));
|
x - 1 |
x + 1 |
(C8) |
f(x):=”(expr);
|
x - 1 |
x + 1 |
(C9) |
f(5);
|
2 |
3 |
(C10) |
expand(factor(diff(f(x),x)));
|
2 |
x2 - 1 |
(C13) |
define('g(x),D12);
|
2 |
x2 - 1 |
(C14) |
g(5);
|
1 |
12 |
Il est possible de définir une fonction f en précisant uniquement la variable dont elle dépend. Cela permet d'effectuer notamment du calcul différentiel dans le cas général. La commande à utiliser est dans ce cas depends(fonction, variable) :
(C5) |
depends(f,x);
|
(C6) |
depends(g,x);
|
(C7) |
diff(f*g,x);
|
d |
d x |
d |
d x |
(C8) |
diff(f/g,x);
|
|
||
g |
f (
|
||
g2 |
(C9) |
ratsimp(%);
|
f (
|
||||
g2 |
Les commandes first(liste), second(liste), third(liste) renvoient respectivement les premier, deuxième et troisième élément de la liste nommée liste. Par exemple :
maxima] |
first([a,b,c,d]);
|
(C16) |
second([a,b,c,d]);
|
(C17) |
third([a,b,c,d]);
|
(C1) |
apply("+",[1,5,7,-1]);
|
On peut utiliser la fonction trigsimp(expression) :
maxima] |
trigsimp(tan(x));
|
sin x |
cos x |
(C20) |
tan(x);
|
La fonction is(equal(expression1,expression2) renvoie vrai ou faux :
(C15) |
is(equal(4,2+2));
|
(C16) |
is(equal((x+1)^2,x^2+2*x+1));
|
(C17) |
is(equal((x+1)^2,x^2+1));
|
Attention, cette fonction n'est pas très sûre et semble renvoyer un résultat faux sur certains tests :
(C21) |
is(equal(sqrt(x^2),x));
|
La commande declare(n,integer) le réalise facilement.
(C1) |
sin(n*%PI);
|
(C2) |
declare(n,integer);
|
(C3) |
sin(n*%PI);
|
La commande assume(x>0) permet à Maxima de savoir que le réel x est positif. Le renseignement sera utilisé dans les calculs :
(C1) |
'abs(x)=abs(x);
|
(C2) |
assume(x>0);
|
(C3) |
'abs(x)=abs(x);
|
La commande freeof(x,expression) renvoie true si expression contient x, et false dans le cas contraire.
(C1) |
freeof(x,2*a+5*y^2);
|
(C2) |
freeof(x,x^2-5*y+6);
|
Attention, la commande n'est pas récursive, et donc le résultat renvoyé est faux si l'expression a été définie précédemment :
(C3) |
x:5*a+2;
|
(C4) |
freeof(x,a);
|
La commande pickapart(expression, profondeur) isole les sous-expressions d'une expression donnée. Par exemple :
(C10) |
u2:(sqrt(7)-1)/(1+sqrt(3));
|
sqrt (7) - 1 |
sqrt (3) + 1 |
(C19) |
pickapart(u2,1);
|
(E19) sqrt (7) - 1
(E20) sqrt (3) + 1
E19 |
E20 |
(C20) |
pickapart(u2,2);
|
(E21) sqrt (7)
(E22) sqrt (3)
E21 - 1 |
E22 + 1 |
La commande tex(expression) renvoie l'expresssion codée en tex :
(C1) |
tex(sqrt(2)+1/2);
|
(D1) false
(C4) |
'integrate(1/(x+1),x)=integrate(1/(x+1),x);
|
1 |
x + 1 |
(C6) |
tex(%);
|
On dispose d'un fichier dont le nom est contenu dans une variable. Pour l'utiliser avec la commande tex, on utilise les syntaxes suivantes :
(C2) |
nomfichier:"test.tex";
|
(C4) |
tex(sqrt(3)+sqrt(2),”nomfichier);
|
(C5) |
nomfichier2:"/home/michel/temp/test.tex";
|
(C7) |
tex(%pi,”nomfichier2);
|
Dans le premier cas, un fichier test.tex est créé dans le répertoire courant, tandis que dans le deuxième cas le fichier test.tex est situé dans le dossier /home/michel/temp/.
Il suffit de les mettre dans le fichier :
/usr/share/maxima/5.9.0/share/maxima-init.mac
qui est lu automatiquement au démarrage de maxima. On peut aussi rajouter des fonctions lisp personnalisées dans le fichier :
/usr/share/maxima/5.9.0/share/maxima-init.lisp
Voici les codes proposés par Barton Willis pour le calcul de :
n |
k = 1 |
où f est une fonction donnée et n un entier. Les tests se font avec la fonction identité puis la fonction carrée.
(C1) |
xsum(f,n):=block([s:0],for k:1 thru n do (s:s +
apply(f,[k])),s)$
|
(C6) |
f(x):=x$
|
(C7) |
g(x):=x^2$
|
(C8) |
xsum(f,2);
|
(C9) |
xsum(g,3);
|
Autre solution, utilisant la commande translate :
(C10) |
ysum(f,n):=block([s:0],for k:1 thru n do (s:s+f(k)),s)$
|
(C11) |
ysum(f,2);
|
(C12) |
ysum(g,3);
|
(C13) |
translate(ysum)$
|
(C14) |
ysum(g,3);
|
On définit une procédure qui permet de composer n fois une fonction (astuce de Stavros Macrakis) :
(C4) |
composen(f,n,x):=if n=0 then x else f(composen(f,n-1,x))$
|
(C5) |
composen(sin,3,y) ;
|
(C6) |
composen(f,2,x);
|
On veut exprimer un polynôme de plusieurs variables en fonction des puissances de l'une d'entre elles (astuce de Barton Willis) :
(C7) |
p : expand((a+b+c)^3);
|
(C8) |
collectterms(p,c);
|
(D8) C3 + (3 b + 3 a) C2 + (3 b2 + 6 a b + 3 a2) C + b3 + 3 a b2 + 3 a2 b + a3
(C9) |
facsum(p,c);
|
Par défaut, Maxima dispose d'une fonction pour générer du TeX. Pour obtenir du Latex, il suffit d'utiliser le package mactex-utilities :
(C10) |
tex(x/y);
|
(C12) |
load("mactex-utilities");
|
(C13) |
tex(x/y);
|
Sous Windows XP, Maxima communique avec le moteur de calcul formel par le port 4040. Il faut donc ouvrir ce port en cas d'utilisation d'un firewall pour que Maxima puisse fonctionner.