Vous êtes ici : Accueil > Salle du prof > Il est libre Math > Mathématique libre et gratuite (R, Maxima et Gnuplot) en seconde
Publié : 15 août 2006

Mathématique libre et gratuite (R, Maxima et Gnuplot) en seconde

Utiliser des logiciels libres n’est pas chose facile : les documentations sont abondantes (trop) et disséminées sur la toile... sans parler qu’elles sont généralement en anglais. Je vais donc essayer de parcourir les programmes de mathématique avec les logiciels libres (sauf la géométrie pour laquelle il y a déjà abondance d’exemples).

Si, ô lecteur, tu trouves des erreurs ou connais des façons plus simples de pratiquer les calculs ou représentations, n’hésite pas à me les communiquer pour que j’améliore cette fiche :-)

Statistiques avec R

- moyenne de série à partir de moyennes de sous-groupes ;

Voici deux séries de notes obtenues par les élèves des groupes A et B :

Gpe A : 10,12,8,7,15,13,6,18,20,2,10,8.

Gpe B : 8,7,13,11,11,14,5,14,19,8,9.

Quelle est la moyenne de la classe réunissant ces deux groupes ?

> ga<-c(10,12,8,7,15,13,6,18,20,2,10,8)
> gb<-c(8,7,13,11,11,14,5,14,19,8,9)
> mean(ga)
[1] 10.75
> mean(gb)
[1] 10.81818
> ma<-mean(ga)
> mb<-mean(gb)
> lb<-length(gb)
> la<-length(ga)
> weighted.mean(c(ma,mb),c(la,lb))
[1] 10.78261

Les 16 garçons de seconde 1 ont obtenu 12,5 de moyenne au dernier DS et les 18 filles ont obtenu 13,4 de moyenne. Quelle est la moyenne de la classe de seconde 1 ?

> weighted.mean(c(12.5,13.4),c(16,18))
[1] 12.97647

- moyenne pondérée d’une série connaissant les effectifs ;
Voici une distribution de salaires dans une entreprise :

Salaire900110013001500170019002100230025002700290031003300350037003900410043004500
Effectif 12 10 20 18 12 13 5 3 12 5 7 10 0 6 5 0 0 0 1

Calculer le salaire moyen dans cette entreprise.

> salaire<-c(900,1100,1300,1500,1700,1900,2100,2300,2500,
+2700,2900,3100,3300,3500,3700,3900,4100,4300,4500)
> effectif<-c(12,10,20,18,12,13,5,3,12,5,7,10,0,6,5,0,0,0,1)
> weighted.mean(salaire,effectif)
[1] 1986.331

- distribution de fréquence à partir d’une série (valeurs,effectifs) ;

Calculer la distribution de fréquences (arrondir au dix-millième) de cette série.

> frequence<-effectif/sum(effectif)
> round(frequence,d=4) # d c'est l'abréviation de digits
[1] 0.0863 0.0719 0.1439 0.1295 0.0863 0.0935 0.0360 0.0216 0.0863 0.0360 0.0504 0.0719
[13] 0.0000 0.0432 0.0360 0.0000 0.0000 0.0000 0.0072

- [4]moyenne de série à partir d’une distribution de fréquences

Reprendre la distribution de fréquences des salaires de l’exemple précédent et en déduire le salaire moyen. Recommencer avec les fréquences arrondies au dix-millième.

> sum(salaire*frequence)
[1] 1986.331
> sum(salaire*round(frequence,d=4))
[1] 1986.52

- calcul des fréquences cumulées croissantes à partir de la distribution d’une série

Déterminer les fréquences cumulées croissantes de la série précédente.

> cumsum(round(frequence,d=4))
[1] 0.0863 0.1582 0.3021 0.4316 0.5179 0.6114 0.6474 0.6690 0.7553 0.7913 0.8417 0.9136
[13] 0.9136 0.9568 0.9928 0.9928 0.9928 0.9928 1.0000

- médiane et étendue à partir de la série (valeurs,effectifs)

Déterminer la médiane et l’étendue de la série des salaires.

seriesal<-rep(salaire,effectif)
> seriesal
 [1]  900  900  900  900  900  900  900  900  900  900  900  900 1100 1100 1100 1100 1100
[18] 1100 1100 1100 1100 1100 1300 1300 1300 1300 1300 1300 1300 1300 1300 1300 1300 1300
[35] 1300 1300 1300 1300 1300 1300 1300 1300 1500 1500 1500 1500 1500 1500 1500 1500 1500
[52] 1500 1500 1500 1500 1500 1500 1500 1500 1500 1700 1700 1700 1700 1700 1700 1700 1700
[69] 1700 1700 1700 1700 1900 1900 1900 1900 1900 1900 1900 1900 1900 1900 1900 1900 1900
[86] 2100 2100 2100 2100 2100 2300 2300 2300 2500 2500 2500 2500 2500 2500 2500 2500 2500
[103] 2500 2500 2500 2700 2700 2700 2700 2700 2900 2900 2900 2900 2900 2900 2900 3100 3100
[120] 3100 3100 3100 3100 3100 3100 3100 3100 3500 3500 3500 3500 3500 3500 3700 3700 3700
[137] 3700 3700 4500
> median(seriesal)
[1] 1700
> range(seriesal)
[1]  900 4500
> max(seriesal)-min(seriesal)
[1] 3600

- regroupement des données brutes en distribution d’effectifs

Reprendre la série brute des salaires pour établir la distribution d’effectifs

> table(seriesal)
seriesal
900 1100 1300 1500 1700 1900 2100 2300 2500 2700 2900 3100 3500 3700 4500
 12   10   20   18   12   13    5    3   12    5    7   10    6    5    1

- regroupement des données brutes en classes d’égale amplitude

Regrouper la série en classes de 1000 euros.

> classes<-c(0,1000,2000,3000,4000,5000)
> regroupsalaires<-cut(seriesal,classes)
> table(regroupsalaires)
regroupsalaires
   (0,1e+03] (1e+03,2e+03] (2e+03,3e+03] (3e+03,4e+03] (4e+03,5e+03]
          12            73            32            21             1

- histogrammes à pas constant

Représenter l’histogramme de la distribution de la série en classes de 1000 euros.

> hist(seriesal,classes,ylim=c(0,80), col = gray(seq(0.4,1.0,length=5)),labels=T,main="Histogramme",ylab="effectifs")
# la série,le vecteur des classes, l'axe vertical, la couleur, les effectifs sur les barres, le titre, les ordonnées

- diagrammes en bâtons

Représenter une série avec en étiquettes des désignations :
- les sports pratiqués : natation, judo, foot et volley,
- le nombre de pratiquants : 40, 60, 120, 42

> sport<-c("natation","judo","foot","volley")
> pratiquants<-c(40,60,120,42)
> plot(pratiquants,type="h",axes=F,col="red",lwd=3,xlab="sport",ylab="nbre d'enfants")
> axis(1,at=1:4,label=sport)
> axis(2)
> box()

- diagrammes à barre, circulaires

On donne la répartition suivante du nombre d’espèces menacées sur Terre :

mammifèresoiseauxinsectesamphibiensreptiles
40 35 19 11 10

Représenter cette répartition sous forme de diagramme en barre puis circulaire.

> barplot(espeffectifs,legend=especes,col = gray(seq(0.4,1.0,length=5)), main="Répartition des espèces menacées")

> especes<-c("mammifères","oiseaux","insectes","amphibiens","reptiles")
> espeffectifs<-c(40,35,19,11,10)
> pie(espeffectifs,especes,col = gray(seq(0.4,1.0,length=5)),main="Répartition des espèces menacées")

- simulations statistiques (effectifs croissants et fluctuations)

Simuler le lancer d’un dé : 100 fois, 1000 fois et enfin 10000 fois. Comparer les fluctuations.

># à taille constante
> t1
a
  1    2    3    4    5    6
0.20 0.11 0.17 0.16 0.18 0.18
> a<-ceiling(6*runif(100)); t1<-table(a)/100 ; t1
a
  1    2    3    4    5    6
0.20 0.14 0.17 0.14 0.17 0.18
> a<-ceiling(6*runif(100)); t2<-table(a)/100 ; t2
a
  1    2    3    4    5    6
0.18 0.22 0.11 0.17 0.12 0.20
> a<-ceiling(6*runif(100)); t3<-table(a)/100 ; t3
a
  1    2    3    4    5    6
0.13 0.15 0.20 0.17 0.22 0.13
> layout(matrix((1:3),1,3))
> barplot(t1,main="100 fois",col=gray(seq(0.4,1.0,length=6)),ylim=c(0,0.25)); barplot(t2,main="100 fois",col=gray(seq(0.4,1.0,length=6)),ylim=c(0,0.25)); barplot(t3,main="100 fois",col=gray(seq(0.4,1.0,length=6)),ylim=c(0,0.25))

># à taille croissante
>  a<-ceiling(6*runif(100)); t1<-table(a)/100 ; t1
a
  1    2    3    4    5    6
0.20 0.11 0.17 0.16 0.18 0.18
>  a<-ceiling(6*runif(1000)); t2<-table(a)/1000 ; t2
a
   1     2     3     4     5     6
0.160 0.160 0.175 0.159 0.162 0.184
>  a<-ceiling(6*runif(10000)); t3<-table(a)/10000 ; t3
a
    1      2      3      4      5      6
0.1673 0.1652 0.1657 0.1736 0.1632 0.1650
> layout(matrix((1:3),1,3))
> barplot(t1,main="100 fois",col=gray(seq(0.4,1.0,length=6)),ylim=c(0,0.2)); barplot(t2,main="1000 fois",col=gray(seq(0.4,1.0,length=6)),ylim=c(0,0.2)); barplot(t3,main="10000 fois",col=gray(seq(0.4,1.0,length=6)),ylim=c(0,0.2))

- analyse de données obtenues par simulation

On lance un dé 400 fois et on relève la fréquence d’apparition du 5. On renouvelle cette expérience 100 fois. Relever la médiane des fréquences ainsi que l’étendue. Recommencer en répétant l’expérience 1000 fois.

># premiers essais avant de construire la fonction
> dqcl<-sample(1:6,400,T)
> dqcl
 [1] 1 5 2 2 4 3 3 4 6 6 5 1 4 2 1 1 3 4 4 3 6 4 5 1 4 4 2 2 6 2 1 5 4 3 2 3 3 5 3 4 5 4 5
[44] 2 4 4 2 3 6 5 1 6 6 5 6 2 2 1 3 6 3 3 4 3 5 5 4 1 6 1 2 6 3 3 3 4 4 3 2 5 1 1 2 2 6 2
[87] 6 3 3 3 4 4 2 4 4 1 5 3 1 6 1 6 6 6 4 5 3 1 1 5 3 4 2 2 1 2 4 6 3 1 5 4 5 1 3 3 4 2 2
[130] 1 1 6 1 3 6 3 2 6 3 3 5 3 4 5 4 1 4 3 3 5 5 6 6 6 1 6 1 6 4 1 5 5 2 5 3 4 6 5 5 3 6 5
[173] 2 4 1 3 1 4 3 5 4 2 4 5 2 6 2 5 6 5 5 5 5 2 3 3 6 5 6 5 3 1 4 1 1 3 3 3 3 1 4 5 4 5 4
[216] 6 1 5 2 1 1 5 5 5 6 2 6 6 1 2 6 2 2 5 6 6 1 2 3 1 4 6 4 1 6 1 2 4 2 5 3 2 3 3 2 1 4 5
[259] 4 5 2 3 4 1 2 3 2 2 1 5 2 4 2 5 6 4 2 5 4 2 4 5 5 4 1 3 5 6 6 6 3 5 4 2 4 6 3 3 3 1 1
[302] 5 5 1 4 6 1 1 4 2 5 4 1 3 5 5 4 6 6 3 3 5 6 5 6 1 4 2 6 2 4 1 5 1 3 1 4 4 3 5 3 6 4 3
[345] 3 5 1 2 3 3 2 2 1 3 1 5 5 5 1 2 4 1 4 2 6 5 6 5 5 5 3 1 6 6 1 3 6 6 2 2 2 6 2 4 3 1 4
[388] 5 4 1 2 2 2 2 4 4 3 2 4 6
> c1<-dqcl[dqcl==5]
> c1
[1] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
[45] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
> f1<-length(c1)/400;f1
[1] 0.1775
># on passe à la fonction
> dechant<-function(taille){echant<-vector();for(i in 1:taille)
+ {dqcl<-sample(1:6,400,T);fi<-length(dqcl[dqcl==5])/400;echant<-c(echant,fi)}
+ }
> dd100<-dechant(100);max(dd100)-min(dd100);median(dd100)
[1] 0.07
[1] 0.16375
> dd1000<-dechant(1000);max(dd1000)-min(dd1000);median(dd1000)
[1] 0.1225
[1] 0.1675

Calcul algébrique et numérique avec Maxima

- bases, simplifications, substitution d’expression, transformations de formules
Écrire $\frac{2}{3}+7$ sous forme fractionnaire «à la française». Comparer $\frac{148}{149}$ et $\frac{149}{148}$.

(C7) 2/3+7;
                                      23
(D7)                                 --
                                        3
(C25) is(148/149<149/148);
(D25)                                TRUE
(C26) is(1/sqrt(3)<5/9);
(D26)                                FALSE

Rappeler les identités remarquables.

(C1) (a+b)^2;
                                               2
(D1)                               (b + a)
(C2) expand(%);
                                   2                  2
(D2)                            b  + 2 a b + a
(C4) expand((a-b)^2);
                                   2                 2
(D4)                            b  - 2 a b + a
(C5) factor(a^2-b^2);
(D5)                           - (b - a) (b + a)

On pose $a=\frac{x}{x^2+x}$ et $b=\frac{y^2+y}{y}$. Simplifier la somme $a+b$.

(C61) a:x/(x^2+x);
                                          x
(D61)                               ------
                                        2
                                      x  + x
(C62) b:(y^2+y)/y;
                                         2
                                       y  + y
(D62)                               ------
                                          y
(C63) ratsimp(a);
                                          1
(D63)                                -----
                                        x + 1
(C64) ratsimp(a+b);
                                     (x + 1) y + x + 2
(D64)                          -----------------
                                            x + 1

(C65) map(ratsimp,a+b);
                                             1
(D65)                            y + ----- + 1
                                          x + 1

On pose $a=3x$ et $b=-5$. Développer les identités remarquables $a^2-b^2$ et $a^2+2ab+b^2$.

(C49) a:3*x;
(D49)                                 3 x
(C50) b:-5;
(D50)                                 - 5
(C51) a^2-b^2;
                                          2
(D51)                              9 x  - 25
(C52) a^2+2*a*b+b^2;
                                      2
(D52)                          9 x  - 30 x + 25
Dans la formule de Bainbridge,

$$ v=\frac{1}{4}L(3f-4)$$

exprimer $f$ en fonction de $v$ et $l$.
(C42) bain:v=1/4*L*(3*f-4);
                                          (3 f - 4) L
(D42)                           v = -----------
                                                4
(C46) solve(bain,f);
                                          4 v + 4 L
(D46)                           [f = ---------]
                                              3 L
Dans la formule du pendule

$$T=2\pi \sqrt{\frac{1}{g}}$$

exprimer $g$ en fonction de $T$ et de $L$.
(C47) pend:T=2*%pi*sqrt(1/g);
                                             2 %PI
(D47)                             T = -------
                                            SQRT(g)
(C48) solve(pend,g);
Is  T  positive or negative?

positive
;
                                                   2
                                           4 %PI
(D48)                            [g = ------]
                                                2
                                              T

Résoudre le système $\left\lbrace\begin{array}{l} 3 x - y = 5\\ 3 y + 2 x = 7\\ \end{array}$ par substitution et détailler les étapes du calcul.

(C54) eq1:3*x-y=5;
(D54)                             3 x - y = 5
(C55) eq2:2*x+3*y=7;
(D55)                            3 y + 2 x = 7
(C56) solve(eq1,y);
(D56)                            [y = 3 x - 5]
# on veut récupérer le membre de droite (2) dans (1) l'expression précédente
(C57) subst(part(%,1,2),y,eq2);
(D57)                           3 (3 x - 5) + 2 x = 7
(C58) solve(%,x);
(D58)                               [x = 2]
(C59) solve(eq1,y),x=2;
(D59)                               [y = 1]

- développements, factorisations

Développer puis réduire l’expression :
$2(x+1)^2-2(1-4x)-4x^2$

(C22) D:2*(x+1)^2-2*(1-4*x)-4*x^2;
                                        2        2
(D22)                   2 (x + 1)  - 4 x  - 2 (1 - 4 x)
(C23) expand(D);
                                            2
(D23)                             12 x - 2 x
(C24) factor(D);
(D24)                            - 2 (x - 6) x

- résolution d’équations

Résoudre les équations suivantes :

D'abord

$$(x+5)(3-8x)=0$$

puis

$$\frac{(x+5)}{3-8x)}=0$$

(C16) A:x+5;
(D16)                                x + 5
(C17) B:3-8*x;
(D17)                               3 - 8 x
(C18) solve(A*B=0,x);
                                         3
(D18)                          [x = -, x = - 5]
                                         8
(C19) solve(A/B=0,x);
(D19)                              [x = - 5]

- résolution de systèmes 2x2 d’équations

Résoudre le système d’équations :

$\left\lbrace\begin{array}{l} 2y+3x=5\\ x - 5 y = - 3\\ \end{array}$

(C1) e1:3*x+2*y=5;
(D1)                            2 y + 3 x = 5
(C2) e2:x-5*y=-3;
(D2)                            x - 5 y = - 3
(C3) linsolve([e1,e2],[x,y]);
                                       19      14
(D3)                          [x = --, y = --]
                                       17      17
# une vérification ?
(C4) e1,part(%,1),part(%,2);
(D4)                                5 = 5
(C5) e2,part(d3,1),part(d3,2);
(D5)                              - 3 = - 3

- détermination de la primalité d’un nombre, décomposition en nombres premiers

(C1) primep(101);
(D1)                                 TRUE
(C2) primep(102);
(D2)                                 FALSE
(C3) factor(524);
                                       2
(D3)                                2  131
(C4) factor(648);
                                        3  4
(D4)                                 2  3

Représentation des fonctions avec GnuPlot

- représentation graphique à partir de l’expression

On demande de représenter les fonctions définies sur [-2 ; 2] par : $f(x)=x^2$, $g(x)=2x-1$ puis celles correspondants aux deux enchaînements possibles : $g$ d'abord puis $f$ ce qui donne $f\left(g(x)\right)$ et $f$ d'abord puis $g$ ce qui donne $g\left(f(x)\right)$.

Le fichier fonction.gnu :

Zip - 954 octets
#  codage latin1
set encoding iso_8859_1
# affichage de décimaux avec séparateur virgule
set decimalsign ','
# le chemin des polices Utopia/Fourier... pour ceux qui l'ont, décommenter et adapter !
# set fontpath "/usr/local/teTeX/share/texmf.gwtex/fonts/type1/adobe/utopia!"
# terminal (=type de fichier de sortie) postscript avec police Utopia
set term postscript eps enhanced monochrom \
"Utopia-Regular" fontfile '/usr/local/teTeX/share/texmf.gwtex/fonts/type1/adobe/utopia/putr8a.pfb' 18
# le fichier de sortie, adapter le chemin
set output "/mon_chemin_a_moi/grafonc.eps"
# définition des fonctions
f(x)=x**2
g(x)=2*x-1
# premier tracé
# plot f(x),g(x),f(g(x)),g(f(x))
# les intervalles de la fenêtre        
set xrange [-2:2] ; set yrange [-2:5]
# le titre
set title "Bibliothèque \nde fonctions \nde référence"
# les étiquettes des axes
set xlabel "abscisses" ; set ylabel "ordonnées"
# on veut les axes sur les zéros et en traits continus
set xzeroaxis 1 ; set yzeroaxis 1
# on veut les graduations sur les axes et non en extérieur
set xtics axis ; set ytics axis
# on affiche la grille
set grid
# on affiche les graduations d'abscisses de -1,5 à 1,5 de 1 en 1
set xtics -1.5,1,1.5
# on affiche les graduations d'ordonnées de 0 à 4 de 1 en 1
set ytics -1,1,4
# on veut deux intervalles mineurs entre graduations d'abscisses
set mxtics 2
# on veut que la grille se crée aussi sur les graduations mineures d'abscisses
set grid mxtics
# on positionne les légendes
set key left Left reverse box 3
# on positionne une étiquette (la numéro 1) A en (-0,95;1,1)
set label 1 "A" at -0.95,1.1 left
# on marque le point (avec un x) sur la courbe en redessinant les courbes
plot f(x),g(x),f(g(x)),g(f(x)),\
'-' notitle with points pt 2 ps 1.5
-1 1
e

permet un travail facile, il suffit après une modification de reécrire dans gnuplot :

> load "/mon_chemin_a_moi/fonction.gnu"

-  représentation graphique à partir de mesures

Un relevé sur terrain sec (circuit d’essai) a délivré les mesures suivantes :

Vitesse en km/h040507090100110130
Distance de freinage en m 0 11 16 32 52 64 80 109

On demande de représenter la distance de freinage en fonction de la vitesse en joignant les points par des segments.

Voici le fichier des données :

Zip - 212 octets
# Distances de freinage
# Vitesse en km/h
# vitesse   distance
0   0
40  11
50  16
70  32
90  52
100 64
110 80
130 109

Puis le fichier de dessin :

Zip - 383 octets
set term postscript eps enhanced monochrom \
"Utopia-Regular" fontfile '/usr/local/teTeX/share/texmf.gwtex/fonts/type1/adobe/utopia/putr8a.pfb' 18
set decimalsign ','
set xlabel "Vitesse en km/h"
set ylabel "Distance de freinage en m"
set data style linespoints
set linestyle=2
set title "Distance de freinage \nen fonction de la vitesse"
set output "/Users/jpg/Desktop/securit.eps"
# adapter à ton cas
plot "/mon_chemin_a_moi/securit.dat" notitle

Reste à exécuter ce dernier :

> load "/mon_chemin_a_moi/freinage.gnu"