Merge branch 'documentation' into dev
This commit is contained in:
commit
4e4c1a763f
@ -1,123 +0,0 @@
|
|||||||
# Explication sur la logique des classes
|
|
||||||
|
|
||||||
## Les types
|
|
||||||
Ce sont les objects que l'on s'autorise à manipuler dans les expressions.
|
|
||||||
Ces objets doivent pouvoir être afficher en *txt* ou en *tex* avec les méthodes
|
|
||||||
* *__txt__*: affichage en mode text
|
|
||||||
* *__tex__*: affichage pour une compilation latex
|
|
||||||
|
|
||||||
### Operator
|
|
||||||
Cette classe regroupe les operateurs. Que l'on s'autorise à utiliser. On y accède à partir de deux caractérisiques le symbole et l'arité.
|
|
||||||
|
|
||||||
Liste des attributs importants:
|
|
||||||
* arity: nombre d'opérande accepté
|
|
||||||
* priority: où se place l'opérateur dans la règles des priorités parmis les autres opérateurs
|
|
||||||
* isOperator: permet de vérifier que c'est bien un opérateur
|
|
||||||
Liste des méthodes importantes:
|
|
||||||
* *__call__*: Permet d'effectuer le calcul sur deux opérandes
|
|
||||||
* *__txt__*: affichage en mode text
|
|
||||||
* *__tex__*: affichage pour une compilation latex
|
|
||||||
|
|
||||||
### Number
|
|
||||||
Tous les types de "nombres" que l'on va vouloir manipuler. On va essayer de rester le plus proche de la construction mathématiques de ces objets.
|
|
||||||
|
|
||||||
Par défaut, on travaillera avec des anneaux ce qui permettra de construire ensuite le corps des fractions et l'anneau des polynomes (quitte à quotienter) associé.
|
|
||||||
|
|
||||||
Pour définir ces anneaux, il faudra contre avoir les méthodes suivantes:
|
|
||||||
* *__add__*
|
|
||||||
* *__radd__*
|
|
||||||
...
|
|
||||||
|
|
||||||
#### Fractions
|
|
||||||
|
|
||||||
#### Polynomes
|
|
||||||
|
|
||||||
#### Quotient de polynomes (racines)
|
|
||||||
|
|
||||||
## Expression
|
|
||||||
|
|
||||||
## Render
|
|
||||||
|
|
||||||
## Simplify-simplified / compute-child
|
|
||||||
|
|
||||||
Dans cette partie, on va expliquer le fonctionnement des mécanismes de simplification des expressions/objets mathématiques.
|
|
||||||
|
|
||||||
La simplification des expressions se fait avec les deux méthodes suivantes:
|
|
||||||
|
|
||||||
* *simplify()* pour:
|
|
||||||
* un polynôme permet d'accéder à la forme developpée d'un polynôme
|
|
||||||
* une fraction permet d'avoir la fraction irréductible associée
|
|
||||||
* une expression permet de faire tous les calculs possibles de cette expression (à la fin il ne doit y avoir qu'un élément de la liste de tokens)
|
|
||||||
* *compute_exp()* pour:
|
|
||||||
* un polynôme ou une fraction fait la même chose que $simplify$.
|
|
||||||
* une expression fait tous les calculs élémentaires de cette expression.
|
|
||||||
|
|
||||||
Ces deux méthodes fonctionnent ensuite sur le même principe. Elles vont faire le calcul qui leurs est attribué en enregistrant les étapes dans *steps* puis elles retourneront l'objet de fin de calcul à qui sera assigné les *steps* (ce qui nécessitera par exemple de détourner la classe *int*).
|
|
||||||
|
|
||||||
Pour accéder à ces étapes, on utilisera alors la méthode *explain* qui expliqueront les étapes intermédiaires.
|
|
||||||
|
|
||||||
### Tentative d'explications
|
|
||||||
C'est ce que je voudrai donc le render ne sera peut être pas exactement le même.
|
|
||||||
|
|
||||||
Comportement avec les Polynom (ce serait similaire avec les fractions)
|
|
||||||
|
|
||||||
>>> P = Polynom([0,1,2])
|
|
||||||
>>> Q = Polynom([1,1,1])
|
|
||||||
>>> R = P+Q
|
|
||||||
>>> print(R)
|
|
||||||
3x^2 + 2x + 1
|
|
||||||
>>> for i in R.explain():
|
|
||||||
... print(i)
|
|
||||||
2x^2 + x + x^2 + x + 1
|
|
||||||
(2 + 1)x^2 + (1+1)x + 1
|
|
||||||
3x^3 + 2x + 1
|
|
||||||
|
|
||||||
>>> P = Polynom([[1,2], [3,4]])
|
|
||||||
>>> Q = P.simplify()
|
|
||||||
>>> print(Q)
|
|
||||||
7x + 3
|
|
||||||
>>> for i in Q.explain():
|
|
||||||
... print(i)
|
|
||||||
3x + 4x + 1 + 2
|
|
||||||
(3+4)x + (1+2)
|
|
||||||
7x + 3
|
|
||||||
|
|
||||||
Comportement avec les expressions
|
|
||||||
|
|
||||||
>>> e = Expression("1+2*3")
|
|
||||||
>>> e1 = e.compute_exp()
|
|
||||||
>>> e1
|
|
||||||
1 + 6
|
|
||||||
>>> type(e1)
|
|
||||||
Expression
|
|
||||||
>>> for i in e1.explain(): # Peu interessant mais il aurai pu y avoir des calculs de fractions
|
|
||||||
... print(i)
|
|
||||||
1 + 2 * 3
|
|
||||||
1 + 6
|
|
||||||
>>> e2 = e.simplify()
|
|
||||||
>>> e2
|
|
||||||
7
|
|
||||||
>>> type(e2)
|
|
||||||
FakeInt
|
|
||||||
>>> for i in e2.explain():
|
|
||||||
... print(i)
|
|
||||||
1 + 2 * 3
|
|
||||||
1 + 6
|
|
||||||
7
|
|
||||||
>>> f = Expression("4 - 5")
|
|
||||||
>>> g = e + f
|
|
||||||
>>> g # Les deux expressions ont été concaténée mais aucun calcul n'a été fait
|
|
||||||
< Expression [1, 2, 3, '*', '+', 4, 5, '-', '+']>
|
|
||||||
>>> for i in g.explain():
|
|
||||||
... print(i)
|
|
||||||
1 + 2 * 3 + 4 - 5
|
|
||||||
>>> for i in g.simplify().explain():
|
|
||||||
... print(i)
|
|
||||||
1 + 2 \times 3 + 4 - 5
|
|
||||||
1 + 6 + ( -1 )
|
|
||||||
7 + ( -1 )
|
|
||||||
6
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
96
docs/construction.rst
Normal file
96
docs/construction.rst
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
Explication sur la logique des classes
|
||||||
|
======================================
|
||||||
|
|
||||||
|
Les types
|
||||||
|
---------
|
||||||
|
|
||||||
|
Ce sont les objets que l'on s'autorise à manipuler dans les
|
||||||
|
expressions. Ces objets doivent pouvoir être afficher en *txt* ou en
|
||||||
|
*tex* avec les méthodes:
|
||||||
|
|
||||||
|
* __txt__ : affichage en mode text
|
||||||
|
* __tex__ : affichage pour une compilation latex
|
||||||
|
|
||||||
|
Operator
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
Cette classe regroupe les opérateurs. Que l'on s'autorise à utiliser. On
|
||||||
|
y accède à partir de deux caractéristiques le symbole et l'arité.
|
||||||
|
|
||||||
|
Liste des attributs importants:
|
||||||
|
|
||||||
|
* arity: nombre d'opérande accepté
|
||||||
|
* priority: où se place l'opérateur dans la règles des priorités parmi
|
||||||
|
les autres opérateurs
|
||||||
|
* isOperator: permet de vérifier que c'est bien
|
||||||
|
un opérateur
|
||||||
|
|
||||||
|
Liste des méthodes importantes:
|
||||||
|
|
||||||
|
* __call__: Permet d'effectuer le calcul sur deux opérandes
|
||||||
|
* __txt__: affichage en mode texte
|
||||||
|
* __tex__: affichage pour une compilation latex
|
||||||
|
|
||||||
|
Number
|
||||||
|
~~~~~~
|
||||||
|
|
||||||
|
Ce sont tous les types de "nombres" que l'on va vouloir manipuler. On essayera
|
||||||
|
de rester le plus proche de la construction mathématiques de ces objets.
|
||||||
|
|
||||||
|
Par défaut, on travaillera avec des anneaux ce qui permettra de
|
||||||
|
construire ensuite le corps des fractions et l'anneau des polynômes
|
||||||
|
(quitte à quotienter) associé.
|
||||||
|
|
||||||
|
Pour définir ces anneaux, il faudra contre avoir les méthodes suivantes:
|
||||||
|
|
||||||
|
* __add__
|
||||||
|
* __radd__
|
||||||
|
...
|
||||||
|
|
||||||
|
Fractions
|
||||||
|
^^^^^^^^^
|
||||||
|
|
||||||
|
Polynomes
|
||||||
|
^^^^^^^^^
|
||||||
|
|
||||||
|
Quotient de polynomes (racines)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Expression
|
||||||
|
----------
|
||||||
|
|
||||||
|
Render
|
||||||
|
------
|
||||||
|
|
||||||
|
Simplify-simplified / compute-child
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
|
Dans cette partie, on va expliquer le fonctionnement des mécanismes de
|
||||||
|
simplification des expressions/objets mathématiques.
|
||||||
|
|
||||||
|
La simplification des expressions se fait avec les deux méthodes
|
||||||
|
suivantes:
|
||||||
|
|
||||||
|
- *simplify()* pour:
|
||||||
|
|
||||||
|
- un polynôme permet d'accéder à la forme développée d'un polynôme.
|
||||||
|
- une fraction permet d'avoir la fraction irréductible associée.
|
||||||
|
- une expression permet de faire tous les calculs possibles de cette
|
||||||
|
expression (à la fin il ne doit y avoir qu'un élément de la liste
|
||||||
|
de tokens).
|
||||||
|
|
||||||
|
- *compute_exp()* pour:
|
||||||
|
|
||||||
|
- un polynôme ou une fraction fait la même chose que `simplify`.
|
||||||
|
- une expression fait tous les calculs élémentaires de cette
|
||||||
|
expression.
|
||||||
|
|
||||||
|
Ces deux méthodes fonctionnent ensuite sur le même principe. Elles vont
|
||||||
|
faire le calcul qui leurs est attribué en enregistrant les étapes dans
|
||||||
|
*steps* puis elles retourneront l'objet de fin de calcul à qui sera
|
||||||
|
assigné les *steps* (ce qui nécessitera par exemple de détourner la
|
||||||
|
classe *int*).
|
||||||
|
|
||||||
|
Pour accéder à ces étapes, on utilisera alors la méthode *explain* qui
|
||||||
|
expliqueront les étapes intermédiaires.
|
||||||
|
|
@ -1,55 +0,0 @@
|
|||||||
# Les polynômes
|
|
||||||
|
|
||||||
|
|
||||||
## Créer des polynômes
|
|
||||||
|
|
||||||
### Générer un polynôme "fixe"
|
|
||||||
|
|
||||||
### Générer un polynôme aléatoirement
|
|
||||||
|
|
||||||
>>> P = Polynom.random(["{b}", "{a}"]) # Polynom du type ax + b
|
|
||||||
>>> print(P)
|
|
||||||
- 8 x - 3
|
|
||||||
>>> P = Polynom.random(degree = 2)
|
|
||||||
>>> print(P)
|
|
||||||
5 x^{ 2 } + 4 x - 7
|
|
||||||
|
|
||||||
## Manipuler des polynômes
|
|
||||||
|
|
||||||
### Les représentations des polynômes
|
|
||||||
|
|
||||||
>>> P = Polynom([1, 2, 3])
|
|
||||||
>>> print(P)
|
|
||||||
|
|
||||||
### Évaluer des polynômes
|
|
||||||
|
|
||||||
>>> type(P(3))
|
|
||||||
pymath.expression.Expression
|
|
||||||
>>> for i in P(3).simplify():
|
|
||||||
print(i)
|
|
||||||
3 \times 3^{ 2 } + 2 \times 3 + 1
|
|
||||||
3 \times 9 + 6 + 1
|
|
||||||
27 + 6 + 1
|
|
||||||
33 + 1
|
|
||||||
34
|
|
||||||
>>> P(3).simplified()
|
|
||||||
34
|
|
||||||
|
|
||||||
|
|
||||||
### Opération et polynômes
|
|
||||||
|
|
||||||
>>> type(P + 1)
|
|
||||||
list
|
|
||||||
>>> for i in (P+1):
|
|
||||||
print(i)
|
|
||||||
3 x^{ 2 } + 2 x + 1 + 1
|
|
||||||
3 x^{ 2 } + 2 x + 1 + 1
|
|
||||||
3 x^{ 2 } + 2 x + 2
|
|
||||||
>>> Q = Polynom([4, 5, 6])
|
|
||||||
>>> for i in (P+Q):
|
|
||||||
print(i)
|
|
||||||
3 x ^ 2 + 6 x ^ 2 + 2 x + 5 x + 1 + 4
|
|
||||||
( 3 + 6 ) x ^ 2 + ( 2 + 5 ) x + 1 + 4
|
|
||||||
9 x ^ 2 + 7 x + 5
|
|
||||||
|
|
||||||
|
|
165
docs/polynom.rst
Normal file
165
docs/polynom.rst
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
Les polynômes
|
||||||
|
=============
|
||||||
|
|
||||||
|
Créer des polynômes
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Générer un polynôme "fixe"
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> P = Polynom([1,2,3])
|
||||||
|
>>> print(P)
|
||||||
|
3 x ^ 2 + 2 x + 1
|
||||||
|
>>> P = Polynom([1,2,3], letter = 'h')
|
||||||
|
>>> print(P)
|
||||||
|
3 h ^ 2 + 2 h + 1
|
||||||
|
>>> print(P.name)
|
||||||
|
'P'
|
||||||
|
>>> Q = Polynom([1,2,3], name = 'Q')
|
||||||
|
>>> print(Q.name)
|
||||||
|
'Q'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Générer un polynôme aléatoirement
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> P = Polynom.random(["{b}", "{a}"]) # Polynom du type ax + b
|
||||||
|
>>> print(P)
|
||||||
|
- 8 x - 3
|
||||||
|
>>> P = Polynom.random(degree = 2)
|
||||||
|
>>> print(P)
|
||||||
|
5 x^{ 2 } + 4 x - 7
|
||||||
|
|
||||||
|
Manipuler des polynômes
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Les représentations des polynômes
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> P = Polynom([1, 2, 3])
|
||||||
|
>>> print(P)
|
||||||
|
3 x ^ 2 + 2 x + 1
|
||||||
|
|
||||||
|
Évaluer des polynômes
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Les polynômes peuvent se comporter comme des fonctions, on peut les évaluer. Il est possible de les évaluer sur des nombres, des expressions et même des polynômes.
|
||||||
|
|
||||||
|
Évaluer un polynôme avec un entier.
|
||||||
|
.. code-block:: python
|
||||||
|
>>> type(P(3))
|
||||||
|
pymath.expression.Fake_int
|
||||||
|
>>> P(3)
|
||||||
|
34
|
||||||
|
>>> for i in P(3).explain():
|
||||||
|
print(i)
|
||||||
|
3 \times 3^{ 2 } + 2 \times 3 + 1
|
||||||
|
3 \times 9 + 6 + 1
|
||||||
|
27 + 6 + 1
|
||||||
|
33 + 1
|
||||||
|
34
|
||||||
|
>>> hp1 = Expression('h+1')
|
||||||
|
|
||||||
|
|
||||||
|
Évaluer un polynôme avec une expression.
|
||||||
|
.. code-block:: python
|
||||||
|
>>> type(P(hp1))
|
||||||
|
< <class 'pymath.polynomDeg2.Polynom_deg2'> [6, 8, 3]>
|
||||||
|
>>> print(P(hp1))
|
||||||
|
3 h ^ 2 + 8 h + 6
|
||||||
|
>>> for i in P(hp1).explain():
|
||||||
|
... print(i)
|
||||||
|
...
|
||||||
|
3 ( h + 1 )^{ 2 } + 2 ( h + 1 ) + 1
|
||||||
|
3 ( h + 1 ) ( h + 1 ) + 2 h + 2 + 1
|
||||||
|
3 ( h^{ 2 } + ( 1 + 1 ) h + 1 ) + 2 h + 2 + 1
|
||||||
|
3 ( h^{ 2 } + 2 h + 1 ) + 2 h + 2 + 1
|
||||||
|
3 ( h^{ 2 } + 2 h + 1 ) + 2 ( h + 1 ) + 1
|
||||||
|
3 h^{ 2 } + 3 \times 2 h + 3 + 2 h + 2 + 1
|
||||||
|
3 h^{ 2 } + 6 h + 3 + 2 h + 2 + 1
|
||||||
|
3 h^{ 2 } + ( 6 + 2 ) h + 3 + 2 + 1
|
||||||
|
3 h^{ 2 } + 8 h + 5 + 1
|
||||||
|
3 h^{ 2 } + 8 h + 6
|
||||||
|
|
||||||
|
Évaluer un polynôme avec un autre polynôme.
|
||||||
|
.. code-block:: python
|
||||||
|
>>> type(P(P))
|
||||||
|
pymath.polynom.Polynom
|
||||||
|
>>> print(P(P))
|
||||||
|
27 x ^ 4 + 36 x ^ 3 + 36 x ^ 2 + 16 x + 6
|
||||||
|
>>> for i in P(P).explain():
|
||||||
|
... print(i)
|
||||||
|
...
|
||||||
|
3 ( 3 x^{ 2 } + 2 x + 1 )^{ 2 } + 2 ( 3 x^{ 2 } + 2 x + 1 ) + 1
|
||||||
|
3 ( 3 x^{ 2 } + 2 x + 1 ) ( 3 x^{ 2 } + 2 x + 1 ) + 2 \times 3 x^{ 2 } + 2 \times 2 x + 2 + 1
|
||||||
|
3 ( 3 \times 3 x^{ 4 } + ( 2 \times 3 + 3 \times 2 ) x^{ 3 } + ( 3 + 2 \times 2 + 3 ) x^{ 2 } + ( 2 + 2 ) x + 1 ) + 6 x^{ 2 } + 4 x + 2 + 1
|
||||||
|
3 ( 9 x^{ 4 } + ( 6 + 6 ) x^{ 3 } + ( 3 + 4 + 3 ) x^{ 2 } + 4 x + 1 ) + 6 x^{ 2 } + 4 x + 2 + 1
|
||||||
|
3 ( 9 x^{ 4 } + 12 x^{ 3 } + ( 7 + 3 ) x^{ 2 } + 4 x + 1 ) + 6 x^{ 2 } + 4 x + 2 + 1
|
||||||
|
3 ( 9 x^{ 4 } + 12 x^{ 3 } + 10 x^{ 2 } + 4 x + 1 ) + 6 x^{ 2 } + 4 x + 2 + 1
|
||||||
|
3 ( 9 x^{ 4 } + 12 x^{ 3 } + 10 x^{ 2 } + 4 x + 1 ) + 2 ( 3 x^{ 2 } + 2 x + 1 ) + 1
|
||||||
|
3 \times 9 x^{ 4 } + 3 \times 12 x^{ 3 } + 3 \times 10 x^{ 2 } + 3 \times 4 x + 3 + 2 \times 3 x^{ 2 } + 2 \times 2 x + 2 + 1
|
||||||
|
27 x^{ 4 } + 36 x^{ 3 } + 30 x^{ 2 } + 12 x + 3 + 6 x^{ 2 } + 4 x + 2 + 1
|
||||||
|
27 x^{ 4 } + 36 x^{ 3 } + ( 30 + 6 ) x^{ 2 } + ( 12 + 4 ) x + 3 + 2 + 1
|
||||||
|
27 x^{ 4 } + 36 x^{ 3 } + 36 x^{ 2 } + 16 x + 5 + 1
|
||||||
|
27 x^{ 4 } + 36 x^{ 3 } + 36 x^{ 2 } + 16 x + 6
|
||||||
|
|
||||||
|
|
||||||
|
Opération et polynômes
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Les opérations +, -, \* et ^ sont accessibles aux polynômes. Elles renvoient *toujours* un polynôme (même si le résultat est une constante)
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> type(P + 1)
|
||||||
|
pymath.polynomDeg2.Polynom_deg2
|
||||||
|
>>> for i in (P+1).explain():
|
||||||
|
print(i)
|
||||||
|
3 x^{ 2 } + 2 x + 1 + 1
|
||||||
|
3 x^{ 2 } + 2 x + 2
|
||||||
|
>>> Q = Polynom([4, 5, 6])
|
||||||
|
>>> for i in (P+Q).explain():
|
||||||
|
print(i)
|
||||||
|
3 x^{ 2 } + 2 x + 1 + 6 x^{ 2 } + 5 x + 4
|
||||||
|
( 3 + 6 ) x^{ 2 } + ( 2 + 5 ) x + 1 + 4
|
||||||
|
9 x^{ 2 } + 7 x + 5
|
||||||
|
>>> Q = Polynom([0,2,3])
|
||||||
|
>>> print(Q)
|
||||||
|
>>> print(P-Q)
|
||||||
|
1
|
||||||
|
>>> type(P-Q)
|
||||||
|
pymath.polynom.Polynom
|
||||||
|
|
||||||
|
Dérivation
|
||||||
|
~~~~~~~~~~
|
||||||
|
|
||||||
|
Il est possible de dériver les polynômes à partir de la méthode *derivate*. De la même façon que pour les opérations, le polynôme dérivé pour s'expliquer avec la méthode *explain*.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> P1 = P.derivate()
|
||||||
|
>>> print(P1)
|
||||||
|
6 x + 2
|
||||||
|
>>> for i in P1.explain():
|
||||||
|
... print(i)
|
||||||
|
...
|
||||||
|
2 \times 3 x + 1 \times 2
|
||||||
|
6 x + 2
|
||||||
|
>>> print(P1.name)
|
||||||
|
"P'"
|
||||||
|
|
||||||
|
Polynomes du second degré
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Les polynômes du second degré héritent de toutes les méthodes venant de la classe Polynom. Ils ont cependant accès à d'autres méthodes plus spécifiques aux polynômes de ce degré:
|
||||||
|
|
||||||
|
* Accès aux coefficients de façon 'naturelle'
|
||||||
|
* *delta*: discriminant du polynôme.
|
||||||
|
* *alpha*: Abscisse de l'extremum.
|
||||||
|
* *beta*: ordonnée de l'extremum.
|
||||||
|
* *roots*: les racines du polynôme (/!\ utilise *sympy* et ne peux pas expliquer le calcul pour le moment)
|
||||||
|
* *tbl_sgn_header*: en-tête du tableau du tableau de signe écrit pour *TkzTab*
|
||||||
|
* *tbl_sgn*: ligne du tableau de signe pour *TkzTab*
|
||||||
|
* *tbl_variation*: ligne du tableau de variation pour *TkzTab*
|
334
docs/tutorial.rst
Normal file
334
docs/tutorial.rst
Normal file
@ -0,0 +1,334 @@
|
|||||||
|
Utilisation de pyMath
|
||||||
|
=====================
|
||||||
|
|
||||||
|
À quoi sert pyMath?
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
pyMath est un module python qui permet la manipulation d'expressions
|
||||||
|
mathématiques. Voici ce qu'il est capable de faire:
|
||||||
|
|
||||||
|
- *Calculer comme un collégien*: Pour faire de la correction automatisé
|
||||||
|
d'exercice, un logiciel de calcul formel ne suffit pas. Si les étapes
|
||||||
|
de calculs ne sont pas présentes, l'élève ne pourra pas analyser ses
|
||||||
|
erreurs ou s'inspirer de la correction.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> from pymath import Expression
|
||||||
|
>>> ajout_fractions = Expression("2 / 5 + 2 / 3")
|
||||||
|
>>> resultat = ajout_fractions.simplify()
|
||||||
|
>>> print(resultat)
|
||||||
|
\frac{ 16 }{ 15 }
|
||||||
|
>>> for i in resultat.explain():
|
||||||
|
... print(i)
|
||||||
|
...
|
||||||
|
\frac{ 2 }{ 5 } + \frac{ 2 }{ 3 }
|
||||||
|
\frac{ 2 \times 3 }{ 5 \times 3 } + \frac{ 2 \times 5 }{ 3 \times 5 }
|
||||||
|
\frac{ 6 }{ 15 } + \frac{ 10 }{ 15 }
|
||||||
|
\frac{ 6 + 10 }{ 15 }
|
||||||
|
\frac{ 16 }{ 15 }
|
||||||
|
|
||||||
|
|
||||||
|
- *Créer des exercices aléatoirement*: Pour faire des devoirs
|
||||||
|
personnels, des fiches de révisions ou des exercices en classe, un
|
||||||
|
générateur d'expressions est inclus.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> from pymath import Expression
|
||||||
|
>>> ajout_fraction = Expression.random("{a} + {b} / {c}")
|
||||||
|
>>> print(ajout_fraction)
|
||||||
|
2 + \frac{ 3 }{ 5 }
|
||||||
|
|
||||||
|
- *Gérer différents type de données*: Pour le moment, pyMath est
|
||||||
|
capable de gérer les entiers naturels, les rationnels (sous forme de
|
||||||
|
fractions) et les polynômes. L'utilisation des nombres à virgules et
|
||||||
|
des racines devraient être ajoutés dans les prochaines versions.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> from pymath import Fraction
|
||||||
|
>>> une_fraction = Fraction(1,2)
|
||||||
|
>>> print(une_fraction)
|
||||||
|
1 / 2
|
||||||
|
>>> from pymath import Polynom
|
||||||
|
>>> un_polynom = Polynom([1,2,3])
|
||||||
|
>>> print(un_polynom)
|
||||||
|
3 x^{ 2 } + 2 x + 1
|
||||||
|
|
||||||
|
- *Afficher avec deux types de rendus*: Un en mode texte pour
|
||||||
|
l'affichage dans une console. Un deuxième spécialement pour écrire
|
||||||
|
des documents latex.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> from pymath import Expression
|
||||||
|
>>> ajout_fractions = Expression("2 / 5 + 2 / 3")
|
||||||
|
>>> for i in ajout_fractions.simpliy().explain():
|
||||||
|
... print(i)
|
||||||
|
...
|
||||||
|
\frac{ 2 }{ 5 } + \frac{ 2 }{ 3 }
|
||||||
|
\frac{ 2 \times 3 }{ 5 \times 3 } + \frac{ 2 \times 5 }{ 3 \times 5 }
|
||||||
|
\frac{ 6 }{ 15 } + \frac{ 10 }{ 15 }
|
||||||
|
\frac{ 6 + 10 }{ 15 }
|
||||||
|
\frac{ 16 }{ 15 }
|
||||||
|
>>> from pymath import txt
|
||||||
|
>>> with Expression.tmp_render(txt):
|
||||||
|
... for i in ajout_fractions.simpliy().explain():
|
||||||
|
... print(i)
|
||||||
|
...
|
||||||
|
2 / 5 + 2 / 3
|
||||||
|
( 2 * 3 ) / ( 5 * 3 ) + ( 2 * 5 ) / ( 3 * 5 )
|
||||||
|
6 / 15 + 10 / 15
|
||||||
|
( 6 + 10 ) / 15
|
||||||
|
16 / 15
|
||||||
|
|
||||||
|
|
||||||
|
Ce module a pour but d'être un outil pour faciliter la construction
|
||||||
|
d'exercices et leurs correction. Il a pour but d'être le plus simple
|
||||||
|
possible d'utilisation afin que tout le monde avec un minimum de
|
||||||
|
connaissance en programmation puisse créer librement des exercices.
|
||||||
|
|
||||||
|
Calculer comme un collégien.
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
Actuellement le module principal pour faire calculer python comme un
|
||||||
|
collégien est *pymath.expression*.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> from pymath import Expression
|
||||||
|
|
||||||
|
Déclarer une expression
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Un expression peut être initialisée de deux façons différentes: à partir
|
||||||
|
d'une chaine de caractères ou à partir de la liste des termes (en
|
||||||
|
postfix - cette méthode est essentiellement utilisée pour programmer les
|
||||||
|
modules, elle ne sera pas détaillée ici).
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> un_calcul = Expression("1 + 2 * 3")
|
||||||
|
>>> print(un_calcul)
|
||||||
|
1 + 2 \times 3
|
||||||
|
>>> ajout_fractions = Expression("2 / 5 + 2 / 3")
|
||||||
|
>>> print(ajout_fractions)
|
||||||
|
\frac{ 2 }{ 5 } + \frac{ 2 }{ 3 }
|
||||||
|
|
||||||
|
Et si l'on souhaite un rendu plus adapté à la console:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> from pymath import txt
|
||||||
|
>>> Expression.set_render(txt)
|
||||||
|
>>> print(un_calcul)
|
||||||
|
1 + 2 * 3
|
||||||
|
>>> print(ajout_fractions)
|
||||||
|
2 / 5 + 2 / 3
|
||||||
|
|
||||||
|
Simplification des expressions
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Une fois les expressions créées, elles peuvent se réduire en expliquant
|
||||||
|
les étapes et en respectant les règles de priorités. Ces étapes de
|
||||||
|
calcul sont stockés dans l'objet résultat du calcul et sont accéssibles
|
||||||
|
à travers la méthode *explain*. Les exemples suivants seront données
|
||||||
|
avec un rendu texte.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> from pymath import Expression
|
||||||
|
>>> from pymath import txt
|
||||||
|
>>> Expression.set_render(txt)
|
||||||
|
|
||||||
|
>>> exp = Expression("1 + 2 * 3")
|
||||||
|
>>> exp_simplifiee = exp.simplify()
|
||||||
|
>>> print(exp_simplifiee)
|
||||||
|
7
|
||||||
|
>>> for i in exp_simplifiee.explain():
|
||||||
|
... print(i)
|
||||||
|
...
|
||||||
|
1 + 2 * 3
|
||||||
|
1 + 6
|
||||||
|
7
|
||||||
|
|
||||||
|
|
||||||
|
Les opérations autorisées sont les opérations "classique": + - * / ^.
|
||||||
|
L'utilisation des parenthèses est aussi gérée.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> exp = Expression("1 + 2 / 5")
|
||||||
|
>>> for i in exp.simplify().explain():
|
||||||
|
... print(i)
|
||||||
|
...
|
||||||
|
1 + 2 / 5
|
||||||
|
( 1 * 5 ) / ( 1 * 5 ) + ( 2 * 1 ) / ( 5 * 1 )
|
||||||
|
( 5 + 2 ) / 5
|
||||||
|
7 / 5
|
||||||
|
|
||||||
|
>>> exp = Expression("(2 + 4)(3 - 4 * 2)")
|
||||||
|
>>> for i in exp.simplify().explain():
|
||||||
|
... print(i)
|
||||||
|
...
|
||||||
|
( 2 + 4 ) ( 3 - ( 4 * 2 ) )
|
||||||
|
6 * ( 3 - 8 )
|
||||||
|
6 * ( -5 )
|
||||||
|
-30
|
||||||
|
|
||||||
|
Type de variables et opérations
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
On peut vouloir créer directement des objets (fractions ou polynômes)
|
||||||
|
sans passer par le module expression (voir `fraction <fraction.rst>`__
|
||||||
|
et `polynom <polynom.rst>`__ pour plus de details)
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> from pymath import Fraction
|
||||||
|
>>> fraction1 = Fraction(1,2)
|
||||||
|
>>> fraction2 = Fraction(2,3)
|
||||||
|
>>> print(fraction1)
|
||||||
|
1 / 2
|
||||||
|
>>> from pymath import Polynom
|
||||||
|
>>> p = Polynom([1,2,3])
|
||||||
|
>>> print(p)
|
||||||
|
3 x ^ 2 + 2 x + 1
|
||||||
|
>>> q = Polynom([0,0,1])
|
||||||
|
x ^ 2
|
||||||
|
|
||||||
|
On peut effectuer des opérations entre les Expressions.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> fraction_expression = Expression("2 / 3")
|
||||||
|
>>> autre_fraction_expression = Expression("4 / 9")
|
||||||
|
>>> print(fraction_expression + autre_fraction_expression)
|
||||||
|
2 / 3 + 4 / 9
|
||||||
|
|
||||||
|
On remarque qu'un opération sur des expressions, ne fait pas de calculs.
|
||||||
|
Elle ne fait que "concaténer" les listes des tokens.
|
||||||
|
|
||||||
|
À l'inverse, les opérations sur les fractions ou les polynômes renvoient
|
||||||
|
la liste des étapes jusqu'à leur forme simplifiée
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> addition_fraction = fraction1 + fraction2
|
||||||
|
>>> print(addition_fraction)
|
||||||
|
7 / 6
|
||||||
|
>>> for i in addition_fraction.explain():
|
||||||
|
... print(i)
|
||||||
|
...
|
||||||
|
1 * 3 / 2 * 3 + 2 * 2 / 3 * 2
|
||||||
|
( 3 + 4 ) / 6
|
||||||
|
7 / 6
|
||||||
|
>>> r = p + q
|
||||||
|
>>> print(r)
|
||||||
|
4 x ^ 2 + 2 x + 1
|
||||||
|
>>> for i in r.explain():
|
||||||
|
... print(i)
|
||||||
|
...
|
||||||
|
3 x ^ 2 + x ^ 2 + 2 x + 1
|
||||||
|
( 3 + 1 ) x ^ 2 + 2 x + 1
|
||||||
|
4 x ^ 2 + 2 x + 1
|
||||||
|
|
||||||
|
Différents rendus
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Comme dit dans l'introduction, il y a deux types de rendus: un rendu
|
||||||
|
texte (utilisé depuis le début) et un rendu latex.
|
||||||
|
|
||||||
|
Voici un exemple de l'utilisation du rendu latex (par défaut).
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> exp = Expression("1 + 2 / 5")
|
||||||
|
>>> for i in exp.simplify().explain():
|
||||||
|
... print(i)
|
||||||
|
...
|
||||||
|
1 + \frac{ 2 }{ 5 }
|
||||||
|
\frac{ 1 \times 5 }{ 1 \times 5 } + \frac{ 2 \times 1 }{ 5 \times 1 }
|
||||||
|
\frac{ 5 + 2 }{ 5 }
|
||||||
|
\frac{ 7 }{ 5 }
|
||||||
|
|
||||||
|
Pour changer le rendu, on importe le rendu depuis *pymath.render* et on
|
||||||
|
appelle la méthode de classe d'Expression *set_render*.
|
||||||
|
|
||||||
|
Voici un exemple d'utilisation du rendu txt
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> from pymath import txt
|
||||||
|
>>> Expression.set_render(txt)
|
||||||
|
>>> exp = Expression("1 + 2 / 5")
|
||||||
|
>>> for i in exp.simplify().explain():
|
||||||
|
... print(i)
|
||||||
|
...
|
||||||
|
2 / 5 + 2 / 3
|
||||||
|
2 * 3 / 5 * 3 + 2 * 5 / 3 * 5
|
||||||
|
( 6 + 10 ) / 15
|
||||||
|
16 / 15
|
||||||
|
|
||||||
|
Générer des expressions aléatoirement.
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
|
Créer un expression
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Pour créer une expression il faut au moins une chose: la forme de
|
||||||
|
l'expression. Toutes les lettres entre accolades seront remplacées par
|
||||||
|
des valeurs aléatoires (par défaut entre -10 et 10 et non nulles).
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> form = "2* {a} + 3"
|
||||||
|
>>> expression_aleatoire = Expression.random(form)
|
||||||
|
>>> print(expression_aleatoire)
|
||||||
|
'2 \times 9 + 3'
|
||||||
|
>>> print(Expression.random(form,val_min = 30, val_max = 40))
|
||||||
|
'2 \times 31 + 3'
|
||||||
|
|
||||||
|
Créer une expression avec conditions
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Parfois il peut être nécessaire d'imposer des conditions sur les
|
||||||
|
éléments à générer pour créer des exercices spécifiques.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> form = "{a} / {b} + {c} / {d}"
|
||||||
|
>>> conditions = ["abs({b}) != 1", "{d} > 1", "{b} != {d}", "gcd({a},{b}) == 1", "gcd({c},{d}) == 1"]
|
||||||
|
>>> addition_fraction_alea = Expression.random(form, conditions)
|
||||||
|
>>> print(addition_fraction_alea)
|
||||||
|
'\frac{ 4 }{ 5 } + \frac{ 9 }{ 7 }'
|
||||||
|
|
||||||
|
La méthode pour créer les valeurs avec des conditions est la méthode par
|
||||||
|
rejet. Elle n'est pas très efficace et rien n'est encore prévu dans le
|
||||||
|
cas où aucune valeur n'est possible.
|
||||||
|
|
||||||
|
Opérations avec les valeurs générées
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Pour éviter de faire tourner la méthode par rejet trop longtemps, il est
|
||||||
|
possible de faire des calculs avec les valeurs générées.
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> form = "{a} / {b} + {c} / {k*b}"
|
||||||
|
>>> conditions = ["abs({b}) != 1", "{k} > 1", "{b} != {d}", "gcd({a},{b}) == 1", "gcd({c},{k*b}) == 1"]
|
||||||
|
>>> random_frac_add_generator = RdExpression(form, conditions)
|
||||||
|
>>> print(random_frac_add_generator())
|
||||||
|
\frac{ -9 }{ 7 } + \frac{ 1 }{ 28 }
|
||||||
|
|
||||||
|
Rendu des expressions
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
On peut vouloir ne pas passer par la classe Expression pour obtenir
|
||||||
|
notre expression (si l'on veut utiliser la racine carré par exemple, ou
|
||||||
|
pour créer n'importe quoi qui ne fait pas intervenir d'expression).
|
||||||
|
Ainsi pymath ne gère plus le rendu de l'expression ni son calcul.
|
||||||
|
|
||||||
|
La fonction qui permet de faire cela est *random_str*:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
>>> from pymath import random_str
|
||||||
|
>>> form = "{a} / {b} + {c} / {k*b}"
|
||||||
|
>>> conditions = ["abs({b}) != 1", "{d} > 1", "{b} != {d}", "gcd({a},{b}) == 1", "gcd({c},{k*b}) == 1"]
|
||||||
|
>>> str_addition_fraction = random_str(form, conditions)
|
||||||
|
>>> type(str_addition_fraction)
|
||||||
|
str
|
||||||
|
>>> print(str_addition_fraction)
|
||||||
|
-2 / 5 + -8 / 35
|
||||||
|
|
||||||
|
>>> form = "A({a},{b}), B({2*a}, {3*b})"
|
||||||
|
>>> points_alea = random_str(form)
|
||||||
|
>>> points_alea
|
||||||
|
'A(7,5), B(14, 15)'
|
||||||
|
|
||||||
|
On remarque le défaut d'utiliser cette forme, le rendu est moins bien
|
||||||
|
fait (dans l'exemple, il n'y a pas de parenthèses autour du -8).
|
Loading…
Reference in New Issue
Block a user