Introduction À Maxima: Table Des Matières
Introduction À Maxima: Table Des Matières
Introduction À Maxima: Table Des Matières
Ozan BAKIS∗
2 Expressions 4
2.1 Opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3 Nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.5 Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.6 Listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.7 Fichiers de données . . . . . . . . . . . . . . . . . . . . . . . . 11
3 Algèbre 12
3.1 Expansion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2 Simplification . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3 Factorisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.4 Substitution . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.5 Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4 Algèbre linéaire 23
4.1 Vecteurs et matrices . . . . . . . . . . . . . . . . . . . . . . . . 23
4.2 Opérations sur les matrices . . . . . . . . . . . . . . . . . . . 24
4.3 Déterminant . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.4 Valeurs propres-vecteurs propres . . . . . . . . . . . . . . . . 25
∗
Je voudrais remercier tous les volontaires qui ont contribué à Maxima.
e-mail : [email protected]
1
5 Résolution des équations 26
5.1 Une seule équation . . . . . . . . . . . . . . . . . . . . . . . . 26
5.2 Système d’équations . . . . . . . . . . . . . . . . . . . . . . . 29
6 Graphiques 32
7 Différentiation et intégration 36
7.1 Différenciation simple . . . . . . . . . . . . . . . . . . . . . . 36
7.2 Différenciation implicite . . . . . . . . . . . . . . . . . . . . . 36
7.3 Application : problème du consommateur . . . . . . . . . . . 37
7.4 Application : Jacobien et Hessien . . . . . . . . . . . . . . . . 39
7.5 Application : approximation de Taylor . . . . . . . . . . . . . 40
8 Equations differentielles 42
1 Introduction
L’objectif de ce cours est de montrer comment, on peut utiliser l’or-
dinateur pour vérifier nos résultats, et résoudre des problèmes typiques
rencontrés en macroéconomie et microéconomie. Nous allons introduire
Maxima pour le calcul formel (symbolique). Pour le calcul numérique Mat-
lab 1 (un logiciel propriétaire) ou GNU Octave 2 (l’équivalent de Matlab
mais un “logiciel libre”) est mieux adapté. Pour vous donner une idée,
c−b
ax + b = c ⇒ x =
a
est un calcul formel, alors que
1−5
2x + 5 = 1 ⇒ x = = −2
2
est un calcul numérique. L’objectif de ce cours est le calcul formel.
Une fausse croyance serait de penser que l’ordinateur a toutes les ré-
ponses chez lui quelque part. C’est faux. Si vous ne métrisez pas le pro-
cessus, si vous ne savez pas où chercher la réponse, l’ordinateur ne sera
aucune d’utilité pour vous. En revanche, si vous savez ce dont vous avez
besoin l’ordinateur peut être utile pour vous, –mais pas toujours. La raison
est simple : d’un côté, il y a des problèmes dont il n’existe pas de solution.
1. www.mathworks.com/
2. www.gnu.org/software/octave/
2
De l’autre, les ordinateurs ont une capacité qui est bornée par les avancées
technologiques et scientifique.
Une condition nécessaire pour utiliser l’ordinateur est de pouvoir com-
muniquer avec lui ! A l’aide de Maxima, nous essayons de voir comment
utiliser l’ordinateur pour résoudre des problèmes économiques.
Maxima est un logiciel libre. Cela signifie que non seulement, on ne
paye pas pour l’utiliser, mais on a accès à son code que l’on peut modifier
à son égard. Pour savoir plus sur les logiciels libres visitez le projet GNU à
l’adresse : http://www.gnu.org/.
Il existe plusieurs manuels compréhensifs et de bonne qualite sur le
site de maxima, http://maxima.sourceforge.net/documentation.html.
Je vous conseille particulièrement “Maxima by example” de Edwin Woolet
téléchargeable sur son site http://www.csulb.edu/~woollett/.
3
Les deux premiers options peuvent êtres utilisées quand le mot que l’on
veut chercher est entré exactement. Le dernier choix est destiné pour les cas
où l’on n’est pas sûr du nom de ce que l’on cherche. Faites attention à “ ; ”
après chaque commande.
2 Expressions
L’unité de base de maxima est expression. Une expression peut être un
opérateur, un nombre, une variable une constante ou une combinaison de
tous ces éléments.
2.1 Opérateurs
Les opérateurs +, −, ∗ et / sont utilisés pour l’addition, soustraction,
multiplication et division.ˆest utilisé pour la puissance. Par exemple, x^2+3
veut dire x2 + 3 pour maxima.
L’ordre des opérations est d’abord ∗, / et après +, −. Les parenthèses
peuvent être utilisés pour le changer. La priorité sera donnée aux paren-
thèses.
Le tableau suivant est repris de Ch.1 p.18 de E. Woollett.
+ addition
- subtraction
* multiplication
/ division
- negation
^ exponentiation
. non-commutative multiplication
^^ non-commutative exponentiation
! factorial
!! double factorial
2.2 Variables
Les variables sont des lettres/mots auxquels nous pouvons attribuer des
valeurs. Une variable doit commencer par une lettre ; après on est libre
d’utiliser soit des lettres, soit des nombres, soit le tiret bas, “_”. Les noms
suivants ne peuvent pas être utilisés comme nom de variable, parce qu’ils
sont des mots-clés de maxima : integrate next from diff in at limit sum for
and elseif then else do or if unless product while thru step.
4
Pour attribuer une valeur à une variable tapez
a:3;
b:a+5;
Comme vous le voyez, pour attribuer le signe deux-points “ : ”. Pour
annuler les valeurs que nous avons attribuées et libérer a, b la commande
est
remvalue(a,b);
Pour libérer toutes les variables
remvalue(all);
On peut attribuer une variable non-connue à une autre variable. Pour
commencer, on peut recommencer de zéro : on supprime TOUT ce qui est
crée par l’utilisateur par la commande
kill(all);
a:k-m ;
b:k+p;
c:a*b;
Le résultat affiché est (k − m)(p + k). NOus pouvons différencier c par
rapport a k par la commande
cprime:diff(c,k) ;
ce qui va donner p − m + 2k. Nous pouvons même résoudre cette dérivé
pour une valeur particulière, disons 4,
solve(cprime= 4,k) ;
La réponse est " #
p−m−4
k=−
2
Etant donné une expression e : f (x)/g(x), on peut assigner/appeler/modifier
le numérateur par la commande num(e) et le dénominateur par denom(e).
Par exemple,
e: (x+5)/(x-2);
x+5
x−2
e1: num(e); e2:denom(e);
solve(e1=0,x); solve(e2=0,x);
[x = −5] [x = 2]
2.3 Nombres
Maxima est capable d’utiliser
– les nombres réels :
5
– les entiers : -2,+5,0, . . .
– les nombre rationnels, i.e. les nombres que l’on peut représenter par
des fractions des entiers : 3/4 mais aussi 8/4=2
– les nombres irrationnels, i.e. les nombres qui ne sont pas rationnel,
c’est-à-dire
√ que l’on ne peut pas les écrire en fraction des entiers :
2
– les nombres complexes : 4 + 3i, qui est noté comme 4+3*%i dans
maxima
Si on définit
a:5/3 ;
et après, si l’on demande
a;
on obtiendra toujours 5/3. Pour voir la valeur numérique de a – qui est
1.66667 –, il faut utiliser la commande numer
a, numer;
2.4 Constantes
Il s’agit des constantes comme π, noté
%pi : la constante π 22/7
%e : la constante e 2.71828
%i : i2 = −1
%gamma : .5772156649
inf : ∞
minf : −∞
Les mots réservés : le tableau suivant est repris de Ch.1 p.19 de E.
Woollett.
6
cv gd min und
del get next unless
diag go not vers
diff hav op while
do ic1 or zeta
2.5 Fonctions
Une fonction est définie grâce à l’opérateur “:=” de manière suivante :
f(x):=x*(1-x);
f(2);
−2
Comme les variables, le premier caractère d’une fonction doit être une
lettre.
Nous allons définir la fonctions f (x) = x3 + 2 ∗ x2 + x − 1 et après évaluer
f (x) et f 0 (x) pour des valeurs arbiraires de x, e.g. x = 3, 4, 7, . . .
f: x^3 + 2*x^2 + x - 1;
df: diff(f,x);
subst([x=3],f);
subst([x=3],df);
x3 + 2 x2 + x − 1
3 x2 + 4 x + 1
...
7
expr : x^3 + 2*x^2 + x - 1;
define(g(x), expr);
define(dg(x), diff(g(x),x));
g(3);
dg(3);
x3 + 2 x2 + x − 1
g (x) := x3 + 2 x2 + x − 1
dg (x) := 3 x2 + 4 x + 1
...
8
f(x):= x^3 + 2*x^2 + x - 1;
df(x):= diff(f(x),x);
at(f(x), x=3);
at(diff(f(x),x), x=3);
...
...
2.6 Listes
Le terme list désigne un ensemble ordonné dans Maxima. Un élément
d’une liste peut être n’importe quelle expression de Maxima : un nombre,
un mot, variable....
maliste: [a,b,c,4,abc];
Pour ajouter un élément à la fin d’une liste :
9
endcons(11, maliste);
Pour ajouter un élément au début d’une liste :
cons(22, maliste);
Mais ces deux commandes ne modifient pas la liste enregistrée. Pour le
voir :
maliste;
[a, b, c, 4, abc]
Pour modifier la liste, il faut faire :
maliste2: cons(22, maliste);
[22, a, b, c, 4, abc]
Pour créer une liste à partir d’une expression, il existe deux commandes.
La première est makelist(expr, i, i0 , iT ). i est la variable muette i0 est la valeur
initiale de i et iT celle finale. expr doit être une expression en i comme i*4-5.
makelist(x*x, x, 1,10);
10
Une méthode alternative est d’utiliser la commande map qui marche
avec une fonction que nous allons préciser.
f(x):=x*x;
map(f, maliste); h i
a2 , b2 , c2 , 16, abc2
11
La valeur par défaut pour séparer les éléments de la liste est un espace.
Pour utiliser la virgule comme séparateur il faudrait que le fichier termine
avec .csv, i.e. dene.csv. Ou encore :
write_data(maliste3,"g:/maxima/dene.dat",comma);
D’autres séparateurs existent : pipe ( | ), semicolon ( ;)
Pour ajouter des nouvelles données à un fichier existant la commande
est (la valeur par défaut est de le remplacer) :
write_data(maliste3,"g:/maxima/dene.dat"), file_output_append:true;
Pour lire à partir d’un fichier, et assigner ces valeurs à une nouvelle liste
qui s’appelle maliste4 la commande est
maliste4:read_list("g:/maxima/dene.dat");
Cette commande lit comme les données comme une liste ordinaire. On
peut aussi utiliser la commande suivante pour lire les données et former
une matrice, disons la matrice A.
A:read_matrix("g:/maxima/dene.dat");
Ici, chaque ligne sera la ligne de la matrice A.
A; !
0 1 4 9 16 25 36 49 64 81
0 1 4 9 16 25 36 49 64 81
Pour obtenir des matrices à plusieurs ligne, il faudrait que la liste ait la
forme :
maliste4:[[0,1,2],[3,4,5],[6,7,8]];
write_data(maliste4,"g:/maxima/dene2.csv");
B:read_matrix("g:/maxima/dene2.csv");
0 1 2
3 4 5
6 7 8
3 Algèbre
L’algèbre 3 est la branche des mathématiques qui étudie les structures al-
gébriques. On étudie ce que c’est un pôlynome, une fonction, un inconnu, un
nombre rationnel, un ensemble et les manipulations autour de ces termes.
L’analyse a pour point de départ le calcul infinitésimal. C’est la branche
des mathématiques qui traite explicitement des notions de limite, conti-
nuité, dérivation et intégration.
3. Toutes les définitions sont obtenues de wikipedia 4
12
Dans cette section, nous allons voir comment manipuler les expressions
algèbriques.
3.1 Expansion
expand permet de développer une expression à coefficients entiers. Pour
les pôlynomes la version ratexpand est conseillée.
a: (x+2+y)ˆ3;
expand(a);
y3 + 3 x y2 + 6 y2 + 3 x2 y + 12 x y + 12 y + x3 + 6 x2 + 12 x + 8
x3 + 3 y x2 + 6 x2 + 3 y2 x + 12 y x + 12 x + y3 + 6 y2 + 12 y + 8
13
expand(e);
x 1 1
− 2 +
x2 + 2x + 1 x + 2x + 1 x − 1
ratexpand(e);
2 x2 2
+ 3
x +x −x−1 x +x −x−1
3 2 2
14
Figure 1 – Comparaison entre multthru, expand et distrib
3.2 Simplification
Les fractions (fonctions) rationnelles peuvent être réduites au même dé-
nominateur par la fonction ratsimp, y compris les fonctions non-rationnelles,
e.g. sin(x2 + 1). La première étape de simplification est de regrouper les frac-
tions partielles en une fonction rationnelle et ensuite élimine le plus grand
commun diviseur du numérateur et du dénominateur. Pour les pôlynomes
ratsimp fait soit la factorisation soit le développement suivant l’expression
en question.
e1 : -(xˆ5 - x)/(x - 1);
x − x5
x−1
ratsimp(e1);
−x4 − x3 − x2 − x
ratsimp(1/x+1/y);
y+x
xy
ratsimp((x+2)ˆ2);
x2 + 4 x + 4
ratsimp(a*xˆ2*z+y*x*z+2);
x y + a x2 z + 2
15
La valeur par défaut de algebraic est false. En la fixant à true, on peut
pousser encore loin la simplification.
ratsimp(1/(sqrt(x)-4));
1
√
x−4
ratsimp(1/(sqrt(x)-4), algebraic:true;
√
x+4
x − 16
radcan est plus efficace quand il s’agit des fonctions rationnelles, loga-
rithmiques et exponentielles. De manière similaire,l’option algebraic peut
être fixée à true pour plus de simplification.
ex1: 1/(sqrt(xˆ2+1)+x)+sqrt(xˆ2+1)+x;
1 √
√ + x2 + 1 + x
x2 + 1 + x
radcan(ex1); √
x2 + 1 + 2 x2 + 2
2x
√
x2 + 1 + x
radcan(ex1),algebraic:true; or equivalently radcan(ex1),algebraic;
√
2 x2 + 1
16
rootscontract(xˆ(1/2)*yˆ(1/4)), rootsconmode:false;
√ 1
x y4
Ces exemples montrent que quand rootsconmode est false la réduction est
limitée aux exposants au dénominateur commun.
rootscontract(xˆ(1/2)*yˆ(1/4)), rootsconmode:true;
√
q
x y
rootscontract(xˆ(1/2)*yˆ(1/3)), rootsconmode:true;
√ 1
x y3
2 2 a log y + a log x
logcontract(exp);
a log x2 y4
La commande declare(a,integer); va déclarer a être un entier. Ceci
amène la modification suivante :
logcontract(exp);
log x2 a y4 a
Considérer le problème suivant : eq: 2*log(b/2+1.01)-log(2.91*(b-0.89));
La commande solve(eq); ne marche pas. Nous avons besoin de d’abord le
simplifier par ratsimp(eq); ou même fullratsimp(eq); qui qui consiste
à appliquer ratsimp(eq) plusiers fois jusqu’à ce qu’il n’y ait pas de change-
ment dans l’expression eq. Ensuite, nous devrons utiliser logcontract(eq);
et finalement solve(eq),numer; pour la solution.
17
La commande scsimp va simplifier une expression à partir des règles
de simplification données.
exp: kˆ2*mˆ2*nˆ2-k*m;
r1: k * m=n;
scsimp(exp,r1);
n4 − n
On aurait pu aussi fixer la valeur de n comme
r2: n=3;
scsimp(exp,r1,r2);
78
map
map(f,[a,b,c]);
[ f (a), f (b), f (c)]
map(f,a+b+c);
f (a) + f (b) + f (c)
e1:x/(xˆ2) + (yˆ2+y)/y;
y2 + y 1
+
y x
ratsimp(e1);
xy+x+1
x
map(ratsimp,e1);
1
+1y+
x
Ou bien la commande : multthru(ratsimp(e1)); aussi donne le même
résultat.
3.3 Factorisation
De manière similaire factor va factoriser des expressions, i.e. nous allons
réécrire les expressions en isolant les facteurs communs.
18
(%o24) (x - 2)
(%i25) eq2: 27*x^3 + 136*x^2 + 227*x + 126;
3 2
(%o25) 27 x + 136 x + 227 x + 126
(%i26) factor(eq2);
2
(%o26) (x + 2) (27 x + 82 x + 63)
(%i27) eq3: (x - 1)*(2*x + 3) + (x - 1)^2;
2
(%o27) (x - 1) (2 x + 3) + (x - 1)
(%i28) factor(eq3);
(%o28) (x - 1) (3 x + 2)
3.4 Substitution
Il existe plusieurs commandes pour la substitution : ev, subst, ratsubst.
ev :
(%i29) a:3;
(%o29) 3
(%i30) b:5;
(%o30) 5
(%i31) c:a*x+b;
(%o31) 3 x + 5
(%i32) ev(c,x=10);
(%o32) 35
e:a*(1-a);
(1 − a) a
ev(e, a=x);
x (1 − x)
Quand on exécute la commande ev, ceci ne change pas la valeur associée à
l’expression originale. En faisant,
e;
(1 − a) a
19
on voit que la valeur originale est gardée. Il existe deux autres opérateurs
liés à l’évaluation : ’ (ce qui est un simple guillemet ou une apostrophe 6 ) et
” (deux apostrophes ou guillemet anglais).
L’opérateur ’ empèche l’évaluation d’une expression :
– Quand elle est appliquée à une variable, elle évite l’évaluation de cette
variable
a:20; b:aˆ2;
400
b:’aˆ2;
a2
– Quand elle est appliquée à une fonction, elle évite l’évaluation de la
focntion alors que les arguments de la fonction sont évalués.
a:c; b:d; c:2; d:4; f(x):=a*x/b+c+d;
xa
f (x) := +c+d
b
f(x);
cx
+6
d
g:’f(x)+ a;
f (x) + c
h:’f(x)+ a+ c;
f (x) + c + 2
– Quand elle est aplliquée aux paranthèses rien n’est évalué.
’(f(x)+ a+ c);
f (x) + c + a
L’opérateur ” assure une évaluation supplémentaire :
– Quand elle est appliquée à une variable, elle remplace l’expression
par sa valeur.
a:20; b:aˆ2;
400
b:’aˆ2;
a2
c:”b;
400
6. Il ne faut pas confondre avec le symbole prime – une apostrophe droite – qui est
utilisé, généralement, en math pour désigner la dérivée d’une fonction, e.g. f 0
20
– Les fonctions sont évaluées de manière similaire.
a:c; b:d; c:2; d:4; f(x):=a*x/b+c+d;
xa
f (x) := +c+d
b
f(x);
cx
+6
d
h:”(f(x));
x
+6
2
– Toutes les expressions dans les paranthèses sont évaluées (sauf si elles
sont empéchées par ’).
”(f(x)+ a + c);
x
+ 10
2
”(’f(x)+ a + c);
f (x) + 4
subst
Pour substituer une varaible a à une variable b dans une expression c,
la commande est :
subst(a,b,c); ou également
subst(b=a,c);
Pour pouvoir utiliser cette commande b doit être un atome (un nombre,
une chaîne de caractères – string – ou une sous-expression complète de c).
Dans le cas où b n’est pas atome, on peut utiliser ratsubst.
e: a*(1-2*a);
(1 − 2 a) a
subst(4,a,e); [ ou également subst(a=4,e);]
subst(e:a*b+c*d);
subst([a=1,b=2],e);
cd + 2
On aurait également pu utiliser ev(e,a=1,b=2); ou encore scsimp(e,a=1,b=2),numer;
ratsubst
e: (a+b+c)/d;
c+b+a
d
21
subst(d,a+b,e);
c+b+a
d
ratsubst(d,a+b,e);
d+c
d
MAIS ratsubst(a+b=d,e); ne marche pas.
Une utilisation importante de ratsubst est quand l’option radsubstflag
est changée en true. Dans ce cas-ci, on peut substituer les expressions conte-
nant des puissances (radicaux).
ratsubst(u,sqrt(x), x+2);
x+2
ratsubst(u,sqrt(x), x+2), radsubstflag:true;
u2 + 2
3.5 Parts
part
On peut extraire et utiliser/assigner les parties d’une equation par la
commande part.
(%i33) eq1:x^2+4*x+3=(y^2+5)/(x-3);
2
2 y + 5
(%o33) x + 4 x + 3 = ------
x - 3
(%i34) part(eq1,0);
(%o34) =
(%i35) part(eq1,1);
2
(%o35) x + 4 x + 3
(%i36) part(eq1,2);
2
y + 5
(%o36) ------
x - 3
22
(%i37) part(eq1,2,0);
(%o37) /
(%i38) part(eq1,2,1);
2
(%o38) y + 5
(%i39) part(eq1,2,2);
(%o39) x - 3
(%i40) lhs(eq1);
2
(%o40) x + 4 x + 3
(%i41) rhs(eq1);
2
y + 5
(%o41) ------
x - 3
4 Algèbre linéaire
L’algèbre linéaire est la branche des mathématiques qui s’intéresse à
l’étude des espaces vectoriels (ou espaces linéaires), des vecteurs, des trans-
formations linéaires et des systèmes d’équations linéaires.
23
a : matrix([x, y, z], [4, 5, 6], [7, 8, 9]);
x y z
4 5 6
7 8 9
a*b;
x 2 y 3 z
4 y 5 z 6 x
7z 8x 9y
24
a.b;
3 z + 2 y + x 2z + y + 3x z + 3 y + 2 x
6 z + 5 y + 4 x 5 z + 4 y + 6 x 4 z + 6 y + 5 x
9z + 8y + 7x 8z + 7y + 9x 7z + 9y + 8x
a^^2;
30 36 42
66 81 96
102 126 150
a^2;
1 4 9
16 25 36
49 64 81
4.3 Déterminant
d : determinant(b);
z x y − z2 + x y z − x2 − y y2 − x z
ratsimp(d);
−z3 + 3 x y z − y3 − x3
factor(d);
− z+y+x z2 − y z − x z + y2 − x y + x2
25
Le premier triple √ √
h 3 33 + 15 i
33 − 15 3
− , ,0
2 2
h i
donne les valeurs propres ; le triple suivant 1, 1, 1 donne la multiplicité de
ces valeurs. Les prochains triples sont les vecteurs propres associés. Pour
afficher seulement un de ces vecteurs propres, disons le premier, et l’appeler
v1 la commande est :
v1: part (ev, 2);
" √ √ √ #
3 33 − 19 3 3 11 − 11
1, − ,−
16 8
De manière similaire, pour afficher les autres vecteurs et attribuer les noms
v2 et v3 les commandes sont :
v2: part (ev, 3);
v3: part (ev, 4);
Et pour avoir les trois en même temps : vall:part(ev,[2,3,4]);.
(%i45) kill(all);
(%o0) done
(%i1) eq1: x^2-2*x+1;
2
(%o1) x - 2 x + 1
(%i2) solve(eq1);
(%o2) [x = 1]
(%i3) multiplicities;
(%o3) [2]
26
(%i4) allroots(eq1);
(%o4) [x = 1.0, x = 1.0]
(%i5) realroots(eq1);
(%o5) [x = 1]
(%i6) realroots(eq1,5e-6);
(%o6) [x = 1]
Vérifions :
(%i11) s1:sol[1];
2
sqrt(b - 4 a c) + b
(%o11) x = - --------------------
27
2 a
(%i12) ver1:subst(s1,f(x));
2 2 2
(sqrt(b - 4 a c) + b) b (sqrt(b - 4 a c) + b)
(%o12) ----------------------- - ------------------------ + c
4 a 2 a
(%i13) expand(ver1);
(%o13) 0
(%i14) ev(sol,a=2,b=6,c=4);
(%o14) [x = - 2, x = - 1]
(%i15) ev(sol,a=2,b=5,c=4);
sqrt(7) %i + 5 sqrt(7) %i - 5
(%o15) [x = - --------------, x = --------------]
4 4
(%i16) f(x):=cos(x/%pi)*(exp(-(x/4)^2))-sin(x^(3/2))-5/4;
x x 2 3/2 - 5
(%o16) f(x) := cos(---) exp(- (-) ) - sin(x ) + ---
%pi 4 4
(%i17) plot2d( f(x),[x,0,5],
[style, [lines,4,1] ],
[xlabel," plot of f(x) "],[ylabel," "],
[gnuplot_preamble, "set nokey; set xzeroaxis lw 2 "],
28
0.5
-0.5
-1
-1.5
-2
-2.5
0 1 2 3 4 5
plot of f(x)
3
Figure 2 – Le graphique de la fonction f (x) = cos(x/π)exp −(x/4)2 −sin x 2 −
5
4
[gnuplot_term,ps],[gnuplot_out_file,"solve_plot.eps"] );
(%o17) solve_plot.eps
(%i18) x1:find_root(f(x),2.4,2.7);
(%o18) 2.541050126730359
(%i19) x2:find_root(f,2.9,3.1);
(%o19) 2.974603407751308
(%i20) x3:find_root(f,2.4,3.1);
29
(%i21) kill(all);
(%o0) done
(%i1) eq1:a*x+b*y=c;
(%o1) b y + a x = c
(%i2) eq2:d*x+e*y=f;
(%o2) e y + d x = f
(%i3) sol:solve([eq1,eq2],[x,y]);
c e - b f c d - a f
(%o3) [[x = - ---------, y = ---------]]
b d - a e b d - a e
(%i4) ev(sol,a=5,b=3,c=4,d=1,e=10,f=2);
34 6
(%o4) [[x = --, y = --]]
47 47
Une autre façon de résoudre ce système est d’abord éliminer une des
variables, disons x, et résoudre après pour y. La commande est
(%i10) eq3: x^2 + y^2 = 1;
2 2
30
(%o10) y + x = 1
(%i11) eq4: x + 3*y = 0;
(%o11) 3 y + x = 0
(%i12) eq_y : eliminate([eq3,eq4],[x]);
2
(%o12) [10 y - 1]
(%i13) sol_y : solve(eq_y,y);
1 1
(%o13) [y = - --------, y = --------]
sqrt(10) sqrt(10)
(%i14) float(sol_y);
(%o14) [y = - 0.31622776601684, y = 0.31622776601684]
31
La commande batch("/path/to/islm_exo.mac") va lire, évaluer et nous
retourner la solution de ce modèle.
6 Graphiques
gilberto urroz’daki orneklere bir goz at ! ! ! !
Pour quelques exemples montrant les opportunités disponible sous
maxima, tapez :
plot2d(sin(x),[x,0,2*\%pi]);
plot2d([sin(x),cos(x)],[x,0,2*\%pi]);
plot2d([sin(x),cos(x),0],[x,0,2*\%pi]);
xx:[10, 20, 30, 40, 50];
yy:[.6, .9, 1.1, 1.3, 1.4];
xy:[[10,.6], [20,.9], [30,1.1], [40,1.3], [50,1.4]];
plot2d([discrete,xx,yy]);
plot2d([discrete, xy], [style, points]);
plot2d([gamma(x),1/gamma(x)],[x,-4.5,5],[y,-10,10],
[gnuplot\_preamble,"set key bottom"]);
plot3d(atan(-x^2+y^3/4),[x,-4,4],[y,-4,4],[grid,50,50]);
plot3d(atan(-x^2+y^3/4),[x,-4,4],[y,-4,4],[grid,50,50],
[gnuplot_pm3d,true]);
plot3d(atan(-x^2+y^3/4),[x,-4,4],[y,-4,4],[grid,50,50],
[gnuplot_pm3d,true],[gnuplot_preamble,"set pm3d at b"]);
plot2d ([parametric, cos(t), sin(t), [t,-%pi,%pi],
[nticks,80]], [x, -4/3, 4/3]);
plot2d ([parametric, cos(t), sin(t), [t, -%pi*2, %pi*2],
[nticks, 8]], [x, -2, 2], [y, -1.5, 1.5]);
plot2d ([x^3+2, [parametric, cos(t), sin(t), [t, -5, 5],
[nticks, 80]]], [x, -3, 3]);
Remarque : Pour indiquer une place spécifique pour le fichier sin.eps, di-
sons c :/work on devrait écrire plutôt “...[gnuplot_out_file,"c :/work/sin.eps"]...”
Par exemple, la commande
plot2d([sin(x),0,0.3],[x,0,2*\%pi],[gnuplot_term,ps],
[gnuplot_out_file,"../comp_eco/sin.eps"]);
32
1
sin(x)
0
0.3
0.5
-0.5
-1
0 1 2 3 4 5 6
x
../comp_eco/sin.eps
crée le graphique 3.
Remarque : parametric plot est le graphique de x, y quand x et y sont
elles-mêmes fonctions d’une variable t.
Il existe un paquetage (package) draw destiné à réaliser des graphiques de
manière plus simple. Il faut d’abord le charger par la commande load(draw) ;
(%i16) load(draw);
(%o16) C:/PROGRA~1/MAXIMA~1.1-G/share/maxima/5.25.1/share/draw/draw.lisp
(%i17) draw2d(/* the rational function */
grid = true,
key = "y = x^2/(x-2)",
yrange = [-10,20],
color = red,
explicit(x^2/(x-2),x,-9,15),
/* asymptotes */
key = "",
line_type = dots,
33
Figure 4 – Un premier graphique avec draw
color = blue,
explicit(x+2,x,-9,15),
nticks = 70,
parametric(2,t,t,-10,20),
/* labels and arrows */
head_length = 0.3,
color = black,
line_type = solid,
vector([5.35,2.45],[-1.53,3.25]),
vector([-1,7.5],[3,0]),
label_alignment = left,
label(["y = x+2",6,2.5]),
label_alignment = right,
label(["x = 2",-1.7,7.5]) );
(%o17) [gr2d(explicit, explicit, parametric, vector, vector, label, label)]
[gr2d(explicit, explicit)]
34
Figure 5 – Un deuxième graphique avec draw
15
10
0
0 5 10 15 20
(%i19) load(draw);
(%o19) C:/PROGRA~1/MAXIMA~1.1-G/share/maxima/5.25.1/share/draw/draw.lisp
(%i20) draw2d(file_name = "util", terminal= eps, key="x*y^2+x*y=100",
implicit(x*y^2+x*y=100,x,0,20,y,0,20),title= "Une fonction implicite");
(%o20) [gr2d(implicit)]
35
7 Différentiation et intégration
7.1 Différenciation simple
Pour différencier une expression par rapport à une / plusieurs variables
la commande est diff(expr,var1,n1,var2,n2,...). Ici, var1 est la variable 1 et
n1 montre que l’expression va être différenciée n1 fois par rapport à var1.
Idem pour var2 et n2.
(%i21) f: x^2*y+3 ;
2
(%o21) x y + 3
(%i22) g(x,y):= x^2*y^2-5 ;
2 2
(%o22) g(x, y) := x y - 5
(%i23) diff(f,x);
(%o23) 2 x y
(%i24) diff(f,x,2);
(%o24) 2 y
(%i25) diff(g(x,y),x);
2
(%o25) 2 x y
(%i26) diff(g(x,y),x,2);
2
(%o26) 2 y
(%i27) kill(all);
(%o0) done
(%i1) e : exp(x*y) + x*x + y = 0;
x y 2
(%o1) %e + y + x = 0
(%i2) diff(e,x);
x y
36
(%o2) y %e + 2 x = 0
(%i3) depends(y,x);
(%o3) [y(x)]
(%i4) diff(e,x);
x y dy dy
(%o4) %e (x -- + y) + -- + 2 x = 0
dx dx
(%i5) solve(diff(e,x),diff(y,x));
x y
dy y %e + 2 x
(%o5) [-- = - -------------]
dx x y
x %e + 1
(%i6) f: sin(x)/x;
sin(x)
(%o6) ------
x
(%i7) df1: diff(f,x);
cos(x) sin(x)
(%o7) ------ - ------
x 2
x
(%i8) df2: diff(f,x,2);
sin(x) 2 sin(x) 2 cos(x)
(%o8) - ------ + -------- - --------
x 3 2
x x
(%i9) plot2d([f,df1,df2,0],[x,-30,30],[gnuplot_term,ps],[gnuplot_out_file,"../comp_e
(%o9) ../comp_eco/plot_1.eps
37
1
sin(x)/x
cos(x)/x-sin(x)/x2
-sin(x)/x+2*sin(x)/x3-2*cos(x)/x2
0
0.5
-0.5
-1
-30 -20 -10 0 10 20 30
x
38
(%i13) cpo3: diff(L,lambda);
(%o13) R - q y - p x
(%i14) sol: solve([cpo1,cpo2,cpo3],[x,y,lambda]);
(%i15) display2d:true;
(%o15) true
(%i16) depends([F, G],[u,v]);
(%o16) [F(u, v), G(u, v)]
(%i17) jacobian([F,G],[u,v]);
[ dF dF ]
[ -- -- ]
[ du dv ]
(%o17) [ ]
[ dG dG ]
[ -- -- ]
[ du dv ]
(%i18) hessian([F],[u,v]);
[ 2 2 ]
[ d F d F ]
[ [---] [-----] ]
[ 2 du dv ]
[ du ]
(%o18) [ ]
[ 2 2 ]
[ d F d F ]
[ [-----] [---] ]
[ du dv 2 ]
[ dv ]
39
(%i19) eq1: x^2*y+y^3-10;
3 2
(%o19) y + x y - 10
(%i20) eq2: (x+y)^2-x*y-20;
2
(%o20) (y + x) - x y - 20
(%i21) jacobian([eq1, eq2],[x,y]);
[ 2 dy 2 dy 2 2 ]
[ 3 y -- + x -- + 2 x y 3 y + x ]
[ dx dx ]
(%o21) [ ]
[ dy dy ]
[ 2 (y + x) (-- + 1) - x -- - y 2 (y + x) - x ]
[ dx dx ]
(%i22) hessian([eq1],[x,y]);
[ 2 2 ]
[ 2 d y 2 d y dy 2 dy dy ]
[ [3 y --- + x --- + 6 y (--) + 4 x -- + 2 y] [6 y -- + 2 x] ]
[ 2 2 dx dx dx ]
(%o22) [ dx dx ]
[ ]
[ dy ]
[ [6 y -- + 2 x] [6 y] ]
[ dx ]
f (n) (a)
T(x) = f (a) + f 0 (a)(x − a) + · · · + (x − a)n
n!
où la vrai valeure est
f 00 (a)
f (x) = f (a) + f 0 (a)(x − a) + (x − a)2 + . . .
2!
√ √
Ex : Quelle est la valeur approximative de 9.1 pour n = 1 ? On a : f (x) = x,
40
a = 9 et h = x − a.
√
f (x) = x ⇒ f (9) = 3
1 1 1
f 0 (x) = √ ⇒ f 0 (9) =
2 x 6
f (a + h) = f (a) + f 0 (a)h
√ 1
9.0 + 0.1 = 3 + 0.1 = 3.01666
6
La valeur exacte est 3.01662.
Ex : Quelle est la valeur approximative de 1/2.1 pour n = 1 ? Soit f (x) = 1/x.
On a f (x) = f (a) + f 0 (a)(x − a) pour n = 1. Mettons a = 2 alors h = x − a =
2.1 − 2 = 0.1.
(%i23) fpprintprec:8;
(%o23) 8
(%i24) display2d:false;
(%o24) false
(%i25) t:9.1^0.5;
(%o25) 3.0166206
(%i26) f:x^0.5;
(%o26) x^0.5
(%i27) t1:taylor (f, x, 9, 1);
41
(%i28) float(ev(t1,x=9.1));
(%o30) 3.0166204
(%i31) t3:taylor (f, x, 9, 3);
(%o32) 3.0166206
(%i33) t4:taylor (f, x, 8, 3);
(%o34) 3.0166567
8 Equations differentielles
Une équation différentielle ordinaire est
42
Prenons le cas le plus simple où cette équation est d’ordre 1
dy
= f (x, y)
dx
La solution générale de cette équation a la forme
y = y(x, c)
dy
= −2xy, y(0) = 1
dx
La solution générale est
2
y(x) = ce−x
Remplaçons la condition y(0) = 1, i.e. x = 0, y = 1.
1 = ce0 ⇒ c = 1
(%o35) [y(x)]
(%i36) de1: diff(y,x)=-2*x*y;
(%o38) [y(x),F(u,v),G(u,v)]
43
(%i39) remove(y,dependency);
(%o39) done
(%i40) dependencies;
(%o40) [F(u,v),G(u,v)]
(%o46) y = %c*%e^-x^2
(%i47) de2: ’diff(y,x,2)+2*y=5*x;
(%o48) y = %k1*sin(sqrt(2)*x)+%k2*cos(sqrt(2)*x)+5*x/2
44
Et si l’on connait les conditions initials (seulement en un point comme x=0)
on peut utiliser les commandes ic1 et ic2 pour obtenir les solutions exactes.
Dans nos exemples, pour l’équation de1, la condition initiale est y(0) = 1.
Pour de2, les conditions initials sont y(0) = 2 et y0 (0) = 2.
(%i49) de1: ’diff(y,x)=-2*x*y;
(%o50) y = %c*%e^-x^2
(%i51) ic1(sol1,x=0,y=1);
(%o51) y = %e^-x^2
(%i52) de2: ’diff(y,x,2)+2*y=5*x;
(%o53) y = %k1*sin(sqrt(2)*x)+%k2*cos(sqrt(2)*x)+5*x/2
(%i54) ic2(sol2,x=0,y=2,’diff(y,x)=2);
(%o54) y = -sin(sqrt(2)*x)/2^(3/2)+2*cos(sqrt(2)*x)+5*x/2
Quand nous connaissons les valeurs de y pour différentes valeurs de x, on
parle des conditions aux limites (“Boundary values”). Dans l’équation de2
on suppose avoir les conditions aux limites suivantes : y(0) = 1 et y(4) = 20.
(%i55) kill(all);
(%o0) done
(%i1) de2: ’diff(y,x,2)+2*y=5*x;
(%o2) y = %k1*sin(sqrt(2)*x)+%k2*cos(sqrt(2)*x)+5*x/2
(%i3) bc2(sol2,x=0,y=1,x=4,y=20);
(%o3) y = -(cos(2^(5/2))-10)*sin(sqrt(2)*x)/sin(2^(5/2))+cos(sqrt(2)*x)+5*x/2
45
Pour résoudre un système d’équations différentielles à coefficients constant
la commande nécessaire est desolve. Remarque : Pour pouvoir utiliser de-
solve on est obligé utiliser diff(y(x), x) au lieu de diff(y, x) ou de ’diff(y, x).
(%i4) linel:80;
(%o4) 80
(%i5) de1:diff(x(t),t)=diff(y(t),t)+sin(t);
!
d d
x (t) = e t
y (t) − y (t) + x (0) ,
dt t=0 dt t=0
!
d d
y (t) = et y (t) − y (t) + cos t + y (0) − 1
dt t=0 dt t=0
(%i8) de1:diff(x(t),t)=diff(y(t),t)+sin(t);
46
(%o10) 1
(%i11) atvalue(y(t),t=0,2);
(%o11) 2
(%i12) atvalue(diff(y(t),t),t=0,3);
(%o12) 3
(%i13) desolve([de1,de2],[x(t),y(t)]);
(%o16) 6.25
(%i17) atvalue(y(t),t=0,5);
(%o17) 5
(%i18) desolve([sde1,sde2],[x(t),y(t)]);
47
5
sqrt(x)
-sqrt(x)
2.5
-2.5
0 4 8 12 16
load("plotdf");
plotdf(x-y^2,[xfun,"sqrt(x);-sqrt(x)"],[trajectory_at,-1,3],
[y,-5,5], [x,-5,15])$
Et pour le système
ẋ = x − 3y
ẏ = −2x + y
x(0) = 6.25 y(0) = 5
on a :
plotdf([x-3*y,-2*x+y],[trajectory_at,6.25,5], [y,-5,5], [x,-5,5]);
Références
[1] Maxima, http://maxima.sourceforge.net/
[2] http://www.csulb.edu/~woollett/
48
5
sqrt(x)
-sqrt(x)
2.5
-2.5
0 4 8 12 16
49