From 8fd0223956ee7c5516876a3a746c98aa19369db1 Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 24 May 2018 21:31:24 +0200 Subject: [PATCH 01/26] [exercice.TermeDUneSUite] Nettoyage des import --- src/pyromaths/ex/lycee/TermesSuite.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/pyromaths/ex/lycee/TermesSuite.py b/src/pyromaths/ex/lycee/TermesSuite.py index 07d08f29..97cfd361 100644 --- a/src/pyromaths/ex/lycee/TermesSuite.py +++ b/src/pyromaths/ex/lycee/TermesSuite.py @@ -21,16 +21,12 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # -from pyromaths import ex import functools -from math import sqrt import random -from pyromaths.outils import Priorites3 import textwrap -from pyromaths.classes.Fractions import Fraction -from pyromaths.classes.PolynomesCollege import Polynome, factoriser -from pyromaths.classes.SquareRoot import SquareRoot -from pyromaths.outils.Arithmetique import carrerise, pgcd, valeur_alea + +from pyromaths import ex +from pyromaths.outils.Arithmetique import pgcd FRANCAIS_ORDINAL = { 1: u"premier", From 6453ac68fc607882b039c2ee5371cfb05f6580d5 Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 24 May 2018 21:35:39 +0200 Subject: [PATCH 02/26] [cli] Le tri est fait sans tenir compte de la casse --- src/pyromaths/cli/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pyromaths/cli/__main__.py b/src/pyromaths/cli/__main__.py index 6664387e..584dbc08 100755 --- a/src/pyromaths/cli/__main__.py +++ b/src/pyromaths/cli/__main__.py @@ -148,7 +148,7 @@ def do_generate(options): def do_ls(options): # pylint: disable=unused-argument """Perform the `ls` command.""" tests = TestPerformer() - for name in sorted(tests.iter_names()): + for name in sorted(tests.iter_names(), key=str.lower): print(name) # pylint: disable=superfluous-parens COMMANDS = { From b39a7d7fe450c7253c09a199a832ba78516a7119 Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 24 May 2018 22:46:20 +0200 Subject: [PATCH 03/26] =?UTF-8?q?[exercice]=20Nouvel=20exercice=20:=20D?= =?UTF-8?q?=C3=A9terminer=20un=20=C3=A9tat=20stable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/ex/img/EtatStableSysteme2.png | Bin 0 -> 3546 bytes .../templates/EtatStableSysteme2-answer.tex | 34 ++++++++ .../EtatStableSysteme2-statement.tex | 11 +++ data/ex/tests/EtatStableSysteme2.0.answer | 34 ++++++++ data/ex/tests/EtatStableSysteme2.0.statement | 11 +++ setup.py | 8 +- src/pyromaths/ex/__init__.py | 57 +++++++++++++ src/pyromaths/ex/lycee/matrices.py | 80 ++++++++++++++++++ 8 files changed, 233 insertions(+), 2 deletions(-) create mode 100644 data/ex/img/EtatStableSysteme2.png create mode 100644 data/ex/templates/EtatStableSysteme2-answer.tex create mode 100644 data/ex/templates/EtatStableSysteme2-statement.tex create mode 100644 data/ex/tests/EtatStableSysteme2.0.answer create mode 100644 data/ex/tests/EtatStableSysteme2.0.statement create mode 100644 src/pyromaths/ex/lycee/matrices.py diff --git a/data/ex/img/EtatStableSysteme2.png b/data/ex/img/EtatStableSysteme2.png new file mode 100644 index 0000000000000000000000000000000000000000..3f5a4b2640672901d62cca2503139025996d958b GIT binary patch literal 3546 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.2.2"], + install_requires = COMMON_INSTALL_REQUIRES + ["lxml>=2.2.2"], ) def _mac_opt(): @@ -126,8 +128,9 @@ def _mac_opt(): 'data/images/whatsthis.png']), ('data/templates', glob('data/templates/*.tex')), # ('data/packages', glob('data/packages/*')), - ] + find_data_files('data/ex','data/ex/',['img/*.png']), + ] + find_data_files('data/ex','data/ex/',['img/*.png', 'templates/*.tex']), setup_requires = ['py2app>=0.7.3', 'lxml>=2.2.2'], + install_requires = COMMON_INSTALL_REQUIRES, options = {'py2app': py2app}, ) @@ -161,6 +164,7 @@ def _win_opt(): ) ], setup_requires = ['py2exe'], + install_requires = COMMON_INSTALL_REQUIRES, options = dict(py2exe=dict(compressed = True, optimize = 2, bundle_files = 3, diff --git a/src/pyromaths/ex/__init__.py b/src/pyromaths/ex/__init__.py index 87d0ff28..35ce72c6 100644 --- a/src/pyromaths/ex/__init__.py +++ b/src/pyromaths/ex/__init__.py @@ -7,6 +7,10 @@ import types import sys +import jinja2 + +from pyromaths import Values + class Exercise(object): ''' Base class for all exercise types. ''' @@ -176,3 +180,56 @@ def load_levels(pkg=None, recursive=True): levels[lvl] = sublevels[lvl] return levels + +################################################################################ +# Exercices créés à partir de templates Jinja2 + +TEMPLATEDIR = os.path.join( + Values.data_dir(), + "ex", + "templates", + ) + +class Jinja2Exercice(TexExercise): + """Exercice utilisant un template jinja2.""" + + def __init__(self): + super(Jinja2Exercice, self).__init__() + self.context = {} + + @property + def environment(self): + """Création de l'environnement Jinja2, duquel sera chargé le template.""" + environment = jinja2.Environment( + loader=jinja2.FileSystemLoader(TEMPLATEDIR) + ) + environment.block_start_string = '(*' + environment.block_end_string = '*)' + environment.variable_start_string = '((' + environment.variable_end_string = '))' + environment.comment_start_string = '(% comment %)' + environment.comment_end_string = '(% endcomment %)' + environment.line_comment_prefix = '%!' + environment.trim_blocks = True + environment.lstrip_blocks = True + + return environment + + @property + def statement_name(self): + """Nom du fichier de l'énoncé (sans le répertoire).""" + return os.path.join("{}-statement.tex".format(self.__class__.__name__)) + + @property + def answer_name(self): + """Nom du fichier du corrigé (sans le répertoire).""" + return os.path.join("{}-answer.tex".format(self.__class__.__name__)) + + def tex_statement(self): + """Génération de l'énoncé""" + return [self.environment.get_template(self.statement_name).render(self.context)] + + def tex_answer(self): + """Génération du corrigé""" + return [self.environment.get_template(self.answer_name).render(self.context)] + diff --git a/src/pyromaths/ex/lycee/matrices.py b/src/pyromaths/ex/lycee/matrices.py new file mode 100644 index 00000000..43f4d517 --- /dev/null +++ b/src/pyromaths/ex/lycee/matrices.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +# +# Pyromaths +# +# Un programme en Python qui permet de créer des fiches d'exercices types de +# mathématiques niveau collège ainsi que leur corrigé en LaTeX. +# +# Copyright (C) 2018 -- Louis Paternault (spalax@gresille.org) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +"""Exercice de Terminale ES, spécialité : Déterminer un état stable en utilisant un système.""" +import random + +from pyromaths.outils.decimaux import decimaux +from pyromaths.ex import Jinja2Exercice + +# Liste des coefficients de la diagonale de la matrice de transition qui +# donnent des états stables dont la valeur exacte a au plus trois décimales. +CANDIDATS = [ + [.45, .30], + [.50, .25], + [.55, .20], + [.55, .25], + [.60, .15], + [.65, .10], + [.70, .05], + [.70, .10], + [.70, .50], + [.70, .55], + [.75, .45], + [.80, .40], + [.80, .70], + [.85, .40], + [.85, .55], + [.85, .65], + [.85, .75], + [.90, .30], + [.95, .55], + [.95, .65], + [.95, .80], + [.95, .85], + ] + + +class EtatStableSysteme2(Jinja2Exercice): + + description = u"Recherche d'état stable (avec un système)" + level = u"0.TermES" + + def __init__(self): + super(EtatStableSysteme2, self).__init__() + + ab = random.choice(CANDIDATS) + random.shuffle(ab) + self.context = { + "a": ab[0], + "b": ab[1], + } + + @property + def environment(self): + environment = super(EtatStableSysteme2, self).environment + environment.filters.update({ + 'decimal': decimaux, + }) + return environment From 11a5e288577360dbfffeed111bdd454eb4eaa2c3 Mon Sep 17 00:00:00 2001 From: Louis Date: Sat, 26 May 2018 16:34:20 +0200 Subject: [PATCH 04/26] =?UTF-8?q?[cli]=20G=C3=A9n=C3=A9ration=20d'un=20mod?= =?UTF-8?q?=C3=A8le=20de=20fichier=20TeX?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pyromaths/cli/__main__.py | 13 ++++++ src/pyromaths/cli/dummy.py | 85 +++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 src/pyromaths/cli/dummy.py diff --git a/src/pyromaths/cli/__main__.py b/src/pyromaths/cli/__main__.py index 584dbc08..c9c3f095 100755 --- a/src/pyromaths/cli/__main__.py +++ b/src/pyromaths/cli/__main__.py @@ -110,6 +110,13 @@ def argument_parser(): ) gui.add_argument('args', nargs=argparse.REMAINDER) + # Dummy + dummy = subparsers.add_parser( + 'dummy', + help='Generate a dummy LaTeX file.', + ) + dummy.add_argument('args', nargs=argparse.REMAINDER) + return parser def do_test(options): @@ -123,6 +130,11 @@ def do_gui(options): sys.argv = ["pyromaths"] + sys.argv[2:] pyromaths.main() +def do_dummy(options): + """Action for command line 'dummy'.""" + from . import dummy + dummy.main() + def do_generate(options): """Action for command line 'generate'.""" tests = TestPerformer() @@ -156,6 +168,7 @@ def do_ls(options): # pylint: disable=unused-argument "ls": do_ls, "test": do_test, "gui": do_gui, + "dummy": do_dummy, } def main(): diff --git a/src/pyromaths/cli/dummy.py b/src/pyromaths/cli/dummy.py new file mode 100644 index 00000000..cf63ed3f --- /dev/null +++ b/src/pyromaths/cli/dummy.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2018 -- Louis Paternault (spalax@gresille.org) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +"""Création d'un modèle d'exercice.""" + +import logging +import os +import textwrap + +from pyromaths.Values import CONFIGDIR, DATADIR +from pyromaths.ex import TexExercise +from pyromaths.outils.System import creation + +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s %(message)s', + ) + +class DummyExercise(TexExercise): + """Faux exercice, servant de modèle pour les nouveaux exercices.""" + + def tex_statement(self): + return [textwrap.dedent(ur"""\ + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % DÉBUT DE L'ÉNONCÉ + \exercice + + ÉNONCÉ DE L'EXERCICE + + % FIN DE L'ÉNONCÉ + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + """)] + + def tex_answer(self): + return [textwrap.dedent(ur"""\ + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % DÉBUT DU CORRIGÉ + \exercice* + + CORRIGÉ DE L'EXERCICE + + % FIN DU CORRIGÉ + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + """)] + +PARAMETRES = { + 'nom_fichier': u'exercices', + 'corrige': True, + 'les_fiches': [[u'0.modele', '', [DummyExercise]]], + 'fiche_exo': os.path.join(os.getcwd(), "exercices.tex"), + 'creer_unpdf': True, + 'configdir': CONFIGDIR, + 'niveau': u'Modèle', + 'creer_pdf': True, + 'datadir': DATADIR, + 'chemin_fichier': os.getcwd(), + 'modele': u'pyromaths.tex', + 'titre': u'Modèle', + 'fiche_cor': os.path.join(os.getcwd(), "exercices-corrige.tex"), + 'liste_exos': [DummyExercise()], + } + +def main(): + """Fonction principale.""" + creation(PARAMETRES) + logging.info("Le modèle de document est disponible dans le fichier `exercices.tex`.") + +if __name__ == "__main__": + main() From 36f667393f23b80c2a046f1d2a73c7aba41ed126 Mon Sep 17 00:00:00 2001 From: Louis Date: Sun, 27 May 2018 09:20:32 +0200 Subject: [PATCH 05/26] =?UTF-8?q?Correction=20d'un=20bug=20d=C3=BB=20?= =?UTF-8?q?=C3=A0=20l'import=20pr=C3=A9coce=20de=20pyromaths.Values?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pyromaths/ex/__init__.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pyromaths/ex/__init__.py b/src/pyromaths/ex/__init__.py index 35ce72c6..a50760e9 100644 --- a/src/pyromaths/ex/__init__.py +++ b/src/pyromaths/ex/__init__.py @@ -9,8 +9,6 @@ import jinja2 -from pyromaths import Values - class Exercise(object): ''' Base class for all exercise types. ''' @@ -184,11 +182,13 @@ def load_levels(pkg=None, recursive=True): ################################################################################ # Exercices créés à partir de templates Jinja2 -TEMPLATEDIR = os.path.join( - Values.data_dir(), - "ex", - "templates", - ) +def templatedir(): + from pyromaths import Values + return os.path.join( + Values.data_dir(), + "ex", + "templates", + ) class Jinja2Exercice(TexExercise): """Exercice utilisant un template jinja2.""" @@ -201,7 +201,7 @@ def __init__(self): def environment(self): """Création de l'environnement Jinja2, duquel sera chargé le template.""" environment = jinja2.Environment( - loader=jinja2.FileSystemLoader(TEMPLATEDIR) + loader=jinja2.FileSystemLoader(templatedir()) ) environment.block_start_string = '(*' environment.block_end_string = '*)' From 810d449945885d3ee7d755ae9ea4c2d5bde03cea Mon Sep 17 00:00:00 2001 From: Louis Date: Sun, 27 May 2018 23:24:01 +0200 Subject: [PATCH 06/26] =?UTF-8?q?[WIP]=20Documentation=20pour=20la=20cr?= =?UTF-8?q?=C3=A9ation=20d'exercices?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/source/ecrire.rst | 209 ++++++++++++++++++++++ Doc/source/ecrire/1exercices.pdf | Bin 0 -> 24653 bytes Doc/source/ecrire/1exercices.tex | 149 +++++++++++++++ Doc/source/ecrire/2equation-answer.tex | 11 ++ Doc/source/ecrire/2equation-statement.tex | 3 + Doc/source/ecrire/2equation.pdf | Bin 0 -> 25255 bytes Doc/source/ecrire/2equation.py | 32 ++++ Doc/source/index.rst | 1 + Doc/source/pyromaths.cli.rst | 2 + 9 files changed, 407 insertions(+) create mode 100644 Doc/source/ecrire.rst create mode 100644 Doc/source/ecrire/1exercices.pdf create mode 100644 Doc/source/ecrire/1exercices.tex create mode 100644 Doc/source/ecrire/2equation-answer.tex create mode 100644 Doc/source/ecrire/2equation-statement.tex create mode 100644 Doc/source/ecrire/2equation.pdf create mode 100644 Doc/source/ecrire/2equation.py diff --git a/Doc/source/ecrire.rst b/Doc/source/ecrire.rst new file mode 100644 index 00000000..52a11599 --- /dev/null +++ b/Doc/source/ecrire.rst @@ -0,0 +1,209 @@ +=================================== +Tutoriel : Créer un nouvel exercice +=================================== + +Cette article décrit la procédure pour créer un nouvel exercice pour Pyromaths. Nous prendrons comme exemple la création d'un exercice de résolution d'équations du premier degré du type :math:`ax+b=cx+d` où les nombres :math:`a`, :math:`b`, :math:`c`, :math:`d` sont des entiers relatifs. + +.. note:: + + Certains termes techniques anglais + (comme `template`, `merge`, etc.) + n'ont volontairement pas été traduits. + Cette documentation renvoit à d'autres documentation en anglais, + et pour que la personne lisant ces lignes s'y retrouve d'une documentation à l'autre, + nous avons fait le choix de conserver les termes anglais plutôt que d'utiliser leur équivalent français. + +.. contents:: + :local: + :depth: 1 + +Prérequis +========= + +Loi +--- + +Pyromaths est publié sous licence publique GNU version 3 (`GPLv3 `__). Si vous souhaitez contribuer à Pyromaths en partageant votre exercice, celui-ci devra impérativement être également publié sous cette même licence. + +Connaissances +------------- + +Créer un exercice pour Pyromaths nécessite de savoir utiliser un minimum : + +- LaTeX ; +- Python (version 2) ; +- git. + +Une connaissance de la bibliothèque Python `jinja2 `__ est un plus, mais les bases s'apprennent rapidement et sont décrites plus loins dans ce document. + +Outils +------ + +Tous les outils nécessaires pour créer un exercice sont des dépendances de Pyromaths. `Installez `__, et faites fonctionner Pyromath : les outils nécessaires pour ce tutoriel seront alors disponibles. + +Environnement de travail +======================== + +Commençons par télécharger les sources de Pyromaths, en utilisant le logiciel `git`. Si vous avez un compte `Github `__, utilisez : + +.. code-block:: shell + + $ git clone git@github.com:Pyromaths/pyromaths.git + +Si vous n'avez pas de tel compte, utilisez : + +.. code-block:: shell + + $ git clone https://github.com/Pyromaths/pyromaths.git + +Puis déplacez vous dans le répertoire `pyromaths` ainsi créé. À partir de maintenant, sauf mention contraire, toutes les commandes sont à exécuter depuis ce répertoire. + +Brouillon +========= + +La première étape est d'écrire un exercice en LaTeX, sans passer par Python, sans aléa : juste pour observer le rendu final. Utilisez l'outil :ref:`pyromaths-cli.py `. + +.. code-block:: shell + + utils/pyromaths-cli.py dummy + +Cette commande a pour effet de créer un modèle d'exercice, sous la forme d'un PDF qui est affiché à l'écran, et d'un fichier LaTeX :file:`exercices.tex`. + +Déplacez ce fichier dans un répertoire temporaire, et modifiez-le pour écrire le sujet de votre énoncé, à la place de ``ÉNONCÉ DE L'EXERCICE`` et ``CORRIGÉ DE L'EXERCICE``. Ne vous souciez pas de la manière dont cela sera intégré à Pyromaths ; ne vous souciez pas de la manière dont l'aléa sera intégré : nous verrons cela plus tard. C'est l'occasion de travailler la formulation de l'énoncé et de la solution pour qu'ils soient le plus clair possible. + +Ne modifiez que les lignes qui correspondent à l'énoncé ou au corrigé. En particulier, ne modifiez pas le préambule. + +Ce fichier doit être compilé avec `latex`, puis converti en pdf avec `dvipdf`. À la fin de cette étape, nous obtenons l'énoncé suivant (:download:`tex `, :download:`pdf `). + +.. literalinclude:: ecrire/1exercices.tex + :linenos: + :lineno-start: 115 + :lines: 115-146 + +Première version (sans aléa) +============================ + +Nous allons maintenant intégrer cet exercice à Pyromaths, sans aléa pour le moment. + +Choisissez un identifiant pour votre exercice : un nom composé uniquement de lettres sans accents et de chiffres, sans espaces, comme `ConversionDegresRadians`, `TheoremeDePythagore`, `CoordonneesDuMilieu`, etc. Pour notre exemple, nous choissons `EquationPremierDegre`. + +Code Python +----------- + +Le code Python de l'exercice doit être placé dans un des sous-dossiers de ``src/pyromaths/ex/``. Dans notre cas, ce sera ``src/pyromaths/ex/troisiemes``. Ensuite, modifiez un des fichiers `.py` déjà existant, ou créez-en un nouveau. Gardez une certaine logique : un exercice sur Pythagore a sa place dans le même fichier qu'un autre exercice sur Pythagore ; un exercice de trigonométrie n'a pas sa place dans un fichier ``matrices.py``. Dans notre cas, nous crréons un nouveau fichier contenant le code suivant. + +.. literalinclude:: ecrire/2equation.py + :linenos: + +Modifiez les parties suivantes : + +- ligne 8 : votre nom, et l'année courante ; +- ligne 29 : l'identifiant de l'exercice ; +- ligne 31 : la description de l'exercice ; +- ligne 32 : le niveau de l'exercice (le nombre avant le point sert à trier les niveaux ; celui après le point est le texte qui sera visible à l'utilisateur). + +Code LaTeX +---------- + +Le code LaTeX, quant à lui, doit être placé dans le répertoire ``data/ex/templates``, dans deux fichiers au nom de votre exercices. Reprenez votre fichier :download:`exercices.tex `, et extrayez les lignes correspondant à l'énoncé, que vous écrivez dans le fichier :download:`EquationPremierDegre-statement.tex `, et celles correspondant au corrigé dans le fichier :download:`EquationPremierDegre-answer.tex `. + +L'énoncé est alors dans le fichier :download:`EquationPremierDegre-statement.tex `. + +.. literalinclude:: ecrire/2equation-statement.tex + :linenos: + +Le corrigé est dans le fichier :download:`EquationPremierDegre-answer.tex ` + +.. literalinclude:: ecrire/2equation-answer.tex + :linenos: + +Génération de l'exercice +------------------------ + +Vous pouvez maintenant tester la génération de votre exercice, en exécutant la commande suivante. + +.. code-block:: shell + + utils/pyromaths-cli.py generate EquationPremierDegre + +Vous obtenez alors le fichier :download:`exercice.pdf `. + +Bilan +----- + +Nous avons écrit notre premier exercice, qui est intégré à Pyromaths. Par contre, il n'y a pas d'aléa : les valeurs numériques sont toujours les mêmes. Cela sera résolu dans la partie suivante. + +Ajout du hasard +=============== + +Préambule +--------- + +Dans cette partie, pour générer l'exercice et suivre votre travail, la commande à utiliser est la suivante. + +.. code-block:: shell + + utils/pyromaths-cli.py generate EquationPremierDegre:0 + +Remarquez que par rapport à la commande utilisée dans la partie précédente, un ``:0`` a été ajouté à la fin de la ligne. Il correspond à la graine (`seed`) du générateur pseudo-aléatoire. + +.. note:: + + Un ordinateur ne sait pas générer du hasard. Il faut ruser. + + Dans notre exercice, nous avons besoin de nombres entiers entre 0 et 9. Pour avoir des nombres aléatoires, à chaque fois que nous utilisons un nombre aléatoire, nous prenons une décimale de π : d'abord `1`, puis `4`, puis `1`, puis `5`, et ainsi de suite. Cela à l'aire aléatoire à première vue, mais deux exécutions successives donneront exactement le même exercice. Améliorons cela. + + Nous gardons le même système, mais au lieu de commencer à la première décimale de π, nous utilisons désormais sur l'heure courante : si le programme est lancé à 13h37, nous utilisons alors les décimales de π à partir de la 1337e. Ainsi, deux exécutions successives donneront deux exercices différents. + + C'est mieux. Mais quand nous créerons notre exercices, nous allons générer encore et encore un exercice, et nous aimerions toujours générer le même (cela facilitera le développement, pour ne pas être perturbé par des valeurs numériques qui changent ; pour qu'un bug introduit par une valeur numérique spécifique n'apparaisse et ne disparaisse pas aléatoirement). Du coup, nous imposons le début de la séquence aléatoire : c'est la signification du ``:0`` ajouté à la fin de la ligne de commande. + + C'est un peu plus compliqué en réalité, mais dans les grande lignes, c'est ainsi qu'un ordinateur génère du hasard. Plus d'informations, par exemple, dans l'article de Wikipédia `Pseudorandom generator `__. + +Si nous voulons générer un autre exercice, il suffit de transformer le ``EquationPremierDegre:0`` en ``EquationPremierDegre:1729``, ``EquationPremierDegre:0123456789``, ou n'importe quel nombre de votre choix. + +Code Python +----------- + +TODO + +Code LaTeX +---------- + +TODO + +Débuggage +--------- + +TODO + +- Expliquer comment afficher la source avant compilation + +Gestion des cas particuliers +============================ + +TODO + +- Erreurs (`1x`, `2x+0`, division par 0) + - Prendre en compte les cas particuliers avec jinja2 + - Prendre en compte les cas particuliers en python + - S'arranger pour qu'il n'y ait pas de cas particuliers + +Finalisation +============ + +TODO + +Créer les vignettes +------------------- + +TODO + +Ajouter des tests +----------------- + +TODO + +Publication ! +============= + +TODO diff --git a/Doc/source/ecrire/1exercices.pdf b/Doc/source/ecrire/1exercices.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0969f312b6a91e903ea73d2305085df36ec93ce6 GIT binary patch literal 24653 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

>`MFgVo_rVf3En<*t2T_P{wnjxU2kqbYsU@R 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

{&f35BGQ`V^4d%}QGgsTC5q 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 C7j6*% literal 0 HcmV?d00001 diff --git a/Doc/source/ecrire/2equation.py b/Doc/source/ecrire/2equation.py new file mode 100644 index 00000000..a0e3ac6a --- /dev/null +++ b/Doc/source/ecrire/2equation.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# +# Pyromaths +# +# Un programme en Python qui permet de créer des fiches d'exercices types de +# mathématiques niveau collège ainsi que leur corrigé en LaTeX. +# +# Copyright (C) 2018 -- Jérôme Ortais (jerome.ortais@pyromaths.org) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +"""Équations du premier degré""" + +from pyromaths.ex import Jinja2Exercice + +class EquationPremierDegre(Jinja2Exercice): + + description = u"Résolution d'équations du premier degré à coefficients entiers." + level = u'3.Troisième' diff --git a/Doc/source/index.rst b/Doc/source/index.rst index d1e181d3..b8bd6221 100644 --- a/Doc/source/index.rst +++ b/Doc/source/index.rst @@ -16,6 +16,7 @@ Table des matières :numbered: intro.rst + ecrire pyromaths.api pyromaths.cli diff --git a/Doc/source/pyromaths.cli.rst b/Doc/source/pyromaths.cli.rst index db84076a..caca0c51 100644 --- a/Doc/source/pyromaths.cli.rst +++ b/Doc/source/pyromaths.cli.rst @@ -1,3 +1,5 @@ +.. _pyromaths-cli: + ============================== Interface en ligne de commande ============================== From e3febbd0169c71603981910d73f36772fb3c7ff2 Mon Sep 17 00:00:00 2001 From: Louis Date: Mon, 28 May 2018 07:16:08 +0200 Subject: [PATCH 07/26] [doc] Renommage / Coloration syntaxique --- Doc/source/ecrire.rst | 22 +++++++++++------- .../{1exercices.pdf => 1/exercices.pdf} | Bin .../{1exercices.tex => 1/exercices.tex} | 0 .../EquationPremierDegre-answer.tex} | 0 .../EquationPremierDegre-statement.tex} | 0 .../ecrire/{2equation.py => 2/equation.py} | 0 .../ecrire/{2equation.pdf => 2/exercices.pdf} | Bin 7 files changed, 13 insertions(+), 9 deletions(-) rename Doc/source/ecrire/{1exercices.pdf => 1/exercices.pdf} (100%) rename Doc/source/ecrire/{1exercices.tex => 1/exercices.tex} (100%) rename Doc/source/ecrire/{2equation-answer.tex => 2/EquationPremierDegre-answer.tex} (100%) rename Doc/source/ecrire/{2equation-statement.tex => 2/EquationPremierDegre-statement.tex} (100%) rename Doc/source/ecrire/{2equation.py => 2/equation.py} (100%) rename Doc/source/ecrire/{2equation.pdf => 2/exercices.pdf} (100%) diff --git a/Doc/source/ecrire.rst b/Doc/source/ecrire.rst index 52a11599..d35e4757 100644 --- a/Doc/source/ecrire.rst +++ b/Doc/source/ecrire.rst @@ -73,9 +73,10 @@ Déplacez ce fichier dans un répertoire temporaire, et modifiez-le pour écrire Ne modifiez que les lignes qui correspondent à l'énoncé ou au corrigé. En particulier, ne modifiez pas le préambule. -Ce fichier doit être compilé avec `latex`, puis converti en pdf avec `dvipdf`. À la fin de cette étape, nous obtenons l'énoncé suivant (:download:`tex `, :download:`pdf `). +Ce fichier doit être compilé avec `latex`, puis converti en pdf avec `dvipdf`. À la fin de cette étape, nous obtenons l'énoncé suivant (:download:`tex `, :download:`pdf `). -.. literalinclude:: ecrire/1exercices.tex +.. literalinclude:: ecrire/1/exercices.tex + :language: latex :linenos: :lineno-start: 115 :lines: 115-146 @@ -92,7 +93,8 @@ Code Python Le code Python de l'exercice doit être placé dans un des sous-dossiers de ``src/pyromaths/ex/``. Dans notre cas, ce sera ``src/pyromaths/ex/troisiemes``. Ensuite, modifiez un des fichiers `.py` déjà existant, ou créez-en un nouveau. Gardez une certaine logique : un exercice sur Pythagore a sa place dans le même fichier qu'un autre exercice sur Pythagore ; un exercice de trigonométrie n'a pas sa place dans un fichier ``matrices.py``. Dans notre cas, nous crréons un nouveau fichier contenant le code suivant. -.. literalinclude:: ecrire/2equation.py +.. literalinclude:: ecrire/2/equation.py + :language: python :linenos: Modifiez les parties suivantes : @@ -105,16 +107,18 @@ Modifiez les parties suivantes : Code LaTeX ---------- -Le code LaTeX, quant à lui, doit être placé dans le répertoire ``data/ex/templates``, dans deux fichiers au nom de votre exercices. Reprenez votre fichier :download:`exercices.tex `, et extrayez les lignes correspondant à l'énoncé, que vous écrivez dans le fichier :download:`EquationPremierDegre-statement.tex `, et celles correspondant au corrigé dans le fichier :download:`EquationPremierDegre-answer.tex `. +Le code LaTeX, quant à lui, doit être placé dans le répertoire ``data/ex/templates``, dans deux fichiers au nom de votre exercices. Reprenez votre fichier :download:`exercices.tex `, et extrayez les lignes correspondant à l'énoncé, que vous écrivez dans le fichier :download:`EquationPremierDegre-statement.tex `, et celles correspondant au corrigé dans le fichier :download:`EquationPremierDegre-answer.tex `. -L'énoncé est alors dans le fichier :download:`EquationPremierDegre-statement.tex `. +L'énoncé est alors dans le fichier :download:`EquationPremierDegre-statement.tex `. -.. literalinclude:: ecrire/2equation-statement.tex +.. literalinclude:: ecrire/2/EquationPremierDegre-statement.tex + :language: latex :linenos: -Le corrigé est dans le fichier :download:`EquationPremierDegre-answer.tex ` +Le corrigé est dans le fichier :download:`EquationPremierDegre-answer.tex ` -.. literalinclude:: ecrire/2equation-answer.tex +.. literalinclude:: ecrire/2/EquationPremierDegre-answer.tex + :language: latex :linenos: Génération de l'exercice @@ -126,7 +130,7 @@ Vous pouvez maintenant tester la génération de votre exercice, en exécutant l utils/pyromaths-cli.py generate EquationPremierDegre -Vous obtenez alors le fichier :download:`exercice.pdf `. +Vous obtenez alors le fichier :download:`exercice.pdf `. Bilan ----- diff --git a/Doc/source/ecrire/1exercices.pdf b/Doc/source/ecrire/1/exercices.pdf similarity index 100% rename from Doc/source/ecrire/1exercices.pdf rename to Doc/source/ecrire/1/exercices.pdf diff --git a/Doc/source/ecrire/1exercices.tex b/Doc/source/ecrire/1/exercices.tex similarity index 100% rename from Doc/source/ecrire/1exercices.tex rename to Doc/source/ecrire/1/exercices.tex diff --git a/Doc/source/ecrire/2equation-answer.tex b/Doc/source/ecrire/2/EquationPremierDegre-answer.tex similarity index 100% rename from Doc/source/ecrire/2equation-answer.tex rename to Doc/source/ecrire/2/EquationPremierDegre-answer.tex diff --git a/Doc/source/ecrire/2equation-statement.tex b/Doc/source/ecrire/2/EquationPremierDegre-statement.tex similarity index 100% rename from Doc/source/ecrire/2equation-statement.tex rename to Doc/source/ecrire/2/EquationPremierDegre-statement.tex diff --git a/Doc/source/ecrire/2equation.py b/Doc/source/ecrire/2/equation.py similarity index 100% rename from Doc/source/ecrire/2equation.py rename to Doc/source/ecrire/2/equation.py diff --git a/Doc/source/ecrire/2equation.pdf b/Doc/source/ecrire/2/exercices.pdf similarity index 100% rename from Doc/source/ecrire/2equation.pdf rename to Doc/source/ecrire/2/exercices.pdf From fc549e9189551cd41fb5fcfc78b3ef03101d84a9 Mon Sep 17 00:00:00 2001 From: Louis Date: Mon, 28 May 2018 20:38:21 +0200 Subject: [PATCH 08/26] =?UTF-8?q?[doc]=20Cr=C3=A9ation=20d'un=20exercice?= =?UTF-8?q?=20:=20Partie=202.5=20=C3=A9crite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/source/ecrire.rst | 69 +++++++++++++++--- .../ecrire/3/EquationPremierDegre-answer.tex | 11 +++ .../3/EquationPremierDegre-statement.tex | 4 + Doc/source/ecrire/3/corrige.png | Bin 0 -> 9322 bytes Doc/source/ecrire/3/equation.py | 44 +++++++++++ Doc/source/ecrire/3/exercice.pdf | Bin 0 -> 25362 bytes src/pyromaths/ex/__init__.py | 5 +- 7 files changed, 120 insertions(+), 13 deletions(-) create mode 100644 Doc/source/ecrire/3/EquationPremierDegre-answer.tex create mode 100644 Doc/source/ecrire/3/EquationPremierDegre-statement.tex create mode 100644 Doc/source/ecrire/3/corrige.png create mode 100644 Doc/source/ecrire/3/equation.py create mode 100644 Doc/source/ecrire/3/exercice.pdf diff --git a/Doc/source/ecrire.rst b/Doc/source/ecrire.rst index d35e4757..4a416787 100644 --- a/Doc/source/ecrire.rst +++ b/Doc/source/ecrire.rst @@ -140,16 +140,13 @@ Nous avons écrit notre premier exercice, qui est intégré à Pyromaths. Par co Ajout du hasard =============== -Préambule ---------- - Dans cette partie, pour générer l'exercice et suivre votre travail, la commande à utiliser est la suivante. .. code-block:: shell - utils/pyromaths-cli.py generate EquationPremierDegre:0 + utils/pyromaths-cli.py generate EquationPremierDegre:1 -Remarquez que par rapport à la commande utilisée dans la partie précédente, un ``:0`` a été ajouté à la fin de la ligne. Il correspond à la graine (`seed`) du générateur pseudo-aléatoire. +Remarquez que par rapport à la commande utilisée dans la partie précédente, un ``:1`` a été ajouté à la fin de la ligne. Il correspond à la graine (`seed`) du générateur pseudo-aléatoire. .. note:: @@ -159,28 +156,80 @@ Remarquez que par rapport à la commande utilisée dans la partie précédente, Nous gardons le même système, mais au lieu de commencer à la première décimale de π, nous utilisons désormais sur l'heure courante : si le programme est lancé à 13h37, nous utilisons alors les décimales de π à partir de la 1337e. Ainsi, deux exécutions successives donneront deux exercices différents. - C'est mieux. Mais quand nous créerons notre exercices, nous allons générer encore et encore un exercice, et nous aimerions toujours générer le même (cela facilitera le développement, pour ne pas être perturbé par des valeurs numériques qui changent ; pour qu'un bug introduit par une valeur numérique spécifique n'apparaisse et ne disparaisse pas aléatoirement). Du coup, nous imposons le début de la séquence aléatoire : c'est la signification du ``:0`` ajouté à la fin de la ligne de commande. + C'est mieux. Mais quand nous créerons notre exercices, nous allons générer encore et encore un exercice, et nous aimerions toujours générer le même (cela facilitera le développement, pour ne pas être perturbé par des valeurs numériques qui changent ; pour qu'un bug introduit par une valeur numérique spécifique n'apparaisse et ne disparaisse pas aléatoirement). Du coup, nous imposons le début de la séquence aléatoire : c'est la signification du ``:1`` ajouté à la fin de la ligne de commande. C'est un peu plus compliqué en réalité, mais dans les grande lignes, c'est ainsi qu'un ordinateur génère du hasard. Plus d'informations, par exemple, dans l'article de Wikipédia `Pseudorandom generator `__. -Si nous voulons générer un autre exercice, il suffit de transformer le ``EquationPremierDegre:0`` en ``EquationPremierDegre:1729``, ``EquationPremierDegre:0123456789``, ou n'importe quel nombre de votre choix. +Si nous voulons générer un autre exercice, il suffit de transformer le ``EquationPremierDegre:1`` en ``EquationPremierDegre:1729``, ``EquationPremierDegre:0123456789``, ou n'importe quel nombre de votre choix. Code Python ----------- -TODO +Du côté de Python, il faut tirer au hasard quatre nombres entiers entre -10 et 10 (sauf 0), et les rendre disponible depuis le code LaTeX. Cela se fait avec le contexte. Toutes les variables présentes dans ce dictionnaire seront accessibles depuis le `template` jinja2. + +.. literalinclude:: ecrire/3/equation.py + :linenos: + :lineno-start: 27 + :lines: 27-44 Code LaTeX ---------- -TODO +Du côté de LaTeX, nous allons profiter de la bibliothèque jinja2 pour utiliser les variables rendues disponibles dans le contexte. + +.. note:: + + Cette note se veut une courte introduction à Jinja2. Pour aller plus loins, rendez-vous sur `le site du projet `__. + + Un template jinja2 est du code LaTeX qui sera reproduit tel quel dans le document final, sauf que : + + - les variables peuvent être évaluées avec des doubles parenthèses. Pour insérer la valeur de la variable ``a`` du contexte, il faut utiliser ``(( a ))`` ; + - des structures de contrôle (condition, boucle) peuvent être utilisées entourées par ``(*`` et ``*)``. + +L'énoncé est assez simple : il suffit de faire appel aux variables du contexte. + +.. literalinclude:: ecrire/3/EquationPremierDegre-statement.tex + :linenos: + +Dans ce code, ``(( a ))`` et ``(( c ))`` sont remplacés par les valeurs des variables ``a`` et ``c`` du contexte, et ``(( "%+d"|format(b) ))`` est remplacé par le résultat du code Python ``"%+d" % b``, ce qui a pour effet d'écrire l'entier ``b`` *avec son signe* (qu'il soit positif ou négatif). + +La rédaction du corrigé se fait de la même manière, en remarquant que le code ``(( d - b ))``, par exemple, est remplacé par le résultat du calcul ``d - b``. Notons également l'utilisation de ``(( ((d-b)/(a-c)) | round(2) ))``, qui permet d'arrondir le résultat du calcul ``(d-b)/(a-c)`` à deux chiffres après la virgule. L'ensemble de ces fonctions (``format``, ``round``, etc.), que jinja2 appelle `filters`, est décrit `dans la documentation officielle `__. + +.. literalinclude:: ecrire/3/EquationPremierDegre-answer.tex + :linenos: Débuggage --------- +Durant cette phase, il est probable que le code LaTeX produit soit un peu compliqué, et contienne des erreurs. Il serait alors pratique de pouvoir observer (si ce n'est plus) ce code avant compilation. C'est possible avec l'option ``--pipe`` de :ref:`pyromaths-cli.py `. + +Cette option permet de définir des commandes (du shell) qui seront executées sur le fichier LaTeX, avant sa compilation. Par exemple : + +- ``--pipe cat`` exécute ``cat FICHIER.tex``, et permet d'observer le fichier avant compilation ; +- ``--pipe vim`` exécute ``vim FICHIER.tex``, et permet de modifier le fichier avant compilation ; +- ``--pipe "cp {} draft.tex"`` exécute ``cp FICHIER.tex draft.tex``, et permet d'obtenir une copie du fichier LaTeX, si le problème est trop complexe pour pouvoir être résolu avec les options ci-dessous ; +- et n'importe quelle commande du shell peut-être exécutée, au gré de votre imagination. + +Bilan +----- + +Nous avons produit l'exercice :download:`exercice.pdf `. Il fonctionne, mais il y a un petit problème dans le corrigé : le résultat (arrondi) est écrit à l'anglaise, avec un point au lieu d'une virgule. + +.. image:: ecrire/3/corrige.png + +Cela peut se corriger en utilisant un `filter` personnalisé. + +Utilisation de `filters` personnalisées +======================================= + +Deux problèmes sont visibles dans le corrigé défini précédemment : le nombre à virgule est écrit avec un point et (cela se voit dans certains cas), dans le cas d'un résultat entier, le code produit ``2.0`` plutôt que ``2`` (cela est dû à Python qui manipule des flottants, et écrit donc la première version pour insister sur le type flottant plutôt qu'entier). + +.. currentmodule:: pyromaths.outils.decimaux + +Heureusement, deux fonctions du module :mod:`pyromaths.outils.decimaux` existent dans Pyromaths pour corriger cela : :func:`suppr0` permet de supprimer le `.0` à la fin d'un flottant lorsque c'est utile, et :func:`decimaux` permet de représenter un nombre décimal en respectant les conventions françaises. Encore faut-il que ces fonctions soient accessibles depuis le `template` LaTeX. + TODO -- Expliquer comment afficher la source avant compilation Gestion des cas particuliers ============================ diff --git a/Doc/source/ecrire/3/EquationPremierDegre-answer.tex b/Doc/source/ecrire/3/EquationPremierDegre-answer.tex new file mode 100644 index 00000000..df0f767c --- /dev/null +++ b/Doc/source/ecrire/3/EquationPremierDegre-answer.tex @@ -0,0 +1,11 @@ +\exercice* + +\begin{align*} + (( a )) x (( "%+d"|format(b) )) &= (( c )) x (( "%+d"|format(d) )) \\ + (( a )) x (( "%+d"|format(-c) ))x &= (( d )) (( "%+d"|format(-b) )) \\ + (( a - c )) x &= (( d - b )) \\ + x &= \frac{(( d - b ))}{(( a - c ))} \\ + x &\approx (( ((d-b)/(a-c)) | round(2) )) +\end{align*} + +L'unique solution est $x\approx(( ((d-b)/(a-c)) | round(2) ))$. diff --git a/Doc/source/ecrire/3/EquationPremierDegre-statement.tex b/Doc/source/ecrire/3/EquationPremierDegre-statement.tex new file mode 100644 index 00000000..d4d42f7e --- /dev/null +++ b/Doc/source/ecrire/3/EquationPremierDegre-statement.tex @@ -0,0 +1,4 @@ +\exercice + +Déterminer les solutions de l'équation $(( a )) x (( "%+d"|format(b) ))= (( c )) x (( "%+d"|format(d) ))$. +Si nécessaire, les solutions seront arrondies au centième. diff --git a/Doc/source/ecrire/3/corrige.png b/Doc/source/ecrire/3/corrige.png new file mode 100644 index 0000000000000000000000000000000000000000..455487dc06ce3fe7b78ff486a7a0cf6bb4010a01 GIT binary patch literal 9322 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 literal 0 HcmV?d00001 diff --git a/src/pyromaths/ex/__init__.py b/src/pyromaths/ex/__init__.py index a50760e9..eac00ced 100644 --- a/src/pyromaths/ex/__init__.py +++ b/src/pyromaths/ex/__init__.py @@ -207,9 +207,8 @@ def environment(self): environment.block_end_string = '*)' environment.variable_start_string = '((' environment.variable_end_string = '))' - environment.comment_start_string = '(% comment %)' - environment.comment_end_string = '(% endcomment %)' - environment.line_comment_prefix = '%!' + environment.comment_start_string = '(% ' + environment.comment_end_string = ' %)' environment.trim_blocks = True environment.lstrip_blocks = True From 92139c72e7a7144e17c5c64bddf478a50aefe81f Mon Sep 17 00:00:00 2001 From: Louis Date: Mon, 28 May 2018 20:47:53 +0200 Subject: [PATCH 09/26] [doc] Tutoriel : Brouillon de partie 2.6. --- Doc/source/ecrire.rst | 13 ++++- .../ecrire/4/EquationPremierDegre-answer.tex | 24 +++++++++ .../4/EquationPremierDegre-statement.tex | 4 ++ Doc/source/ecrire/4/equation.py | 54 +++++++++++++++++++ 4 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 Doc/source/ecrire/4/EquationPremierDegre-answer.tex create mode 100644 Doc/source/ecrire/4/EquationPremierDegre-statement.tex create mode 100644 Doc/source/ecrire/4/equation.py diff --git a/Doc/source/ecrire.rst b/Doc/source/ecrire.rst index 4a416787..9eb51186 100644 --- a/Doc/source/ecrire.rst +++ b/Doc/source/ecrire.rst @@ -222,14 +222,23 @@ Cela peut se corriger en utilisant un `filter` personnalisé. Utilisation de `filters` personnalisées ======================================= -Deux problèmes sont visibles dans le corrigé défini précédemment : le nombre à virgule est écrit avec un point et (cela se voit dans certains cas), dans le cas d'un résultat entier, le code produit ``2.0`` plutôt que ``2`` (cela est dû à Python qui manipule des flottants, et écrit donc la première version pour insister sur le type flottant plutôt qu'entier). +Deux problèmes existent dans le corrigé défini précédemment. + +- Le nombre à virgule est écrit avec un point et (cela se voit dans certains cas), dans le cas d'un résultat entier, le code produit ``2.0`` plutôt que ``2`` (cela est dû à Python qui manipule des flottants, et écrit donc la première version pour insister sur le type flottant plutôt qu'entier). +- Le signe utilisé pour donner la solution est :math:`\approx`, que la solution soit exacte ou non. .. currentmodule:: pyromaths.outils.decimaux -Heureusement, deux fonctions du module :mod:`pyromaths.outils.decimaux` existent dans Pyromaths pour corriger cela : :func:`suppr0` permet de supprimer le `.0` à la fin d'un flottant lorsque c'est utile, et :func:`decimaux` permet de représenter un nombre décimal en respectant les conventions françaises. Encore faut-il que ces fonctions soient accessibles depuis le `template` LaTeX. +Heureusement, deux fonctions du module :mod:`pyromaths.outils.decimaux` existent dans Pyromaths pour corriger le premier problème : :func:`suppr0` permet de supprimer le `.0` à la fin d'un flottant lorsque c'est utile, et :func:`decimaux` permet de représenter un nombre décimal en respectant les conventions françaises. Encore faut-il que ces fonctions soient accessibles depuis le `template` LaTeX. TODO +http://jinja.pocoo.org/docs/2.10/api/#custom-filters + +Pour corriger le second, TODO. + +http://jinja.pocoo.org/docs/2.10/api/#custom-tests + Gestion des cas particuliers ============================ diff --git a/Doc/source/ecrire/4/EquationPremierDegre-answer.tex b/Doc/source/ecrire/4/EquationPremierDegre-answer.tex new file mode 100644 index 00000000..ab3374ae --- /dev/null +++ b/Doc/source/ecrire/4/EquationPremierDegre-answer.tex @@ -0,0 +1,24 @@ +\exercice* + +\begin{align*} + (( a )) x (( "%+d"|format(b) )) &= (( c )) x (( "%+d"|format(d) )) \\ + (( a )) x (( "%+d"|format(-c) ))x &= (( d )) (( "%+d"|format(-b) )) \\ + (( a - c )) x &= (( d - b )) \\ + x &= \frac{(( d - b ))}{(( a - c ))} \\ + x & + (* if (d-b)/(a-c) == ((d-b)/(a-c))|int *) + = + (* else *) + \approx + (* endif *) + (( ((d-b)/(a-c)) | round(2) | suppr0 | decimaux )) +\end{align*} + +L'unique solution est +$x +(* if (d-b)/(a-c) == ((d-b)/(a-c))|int *) + = +(* else *) + \approx +(* endif *) +(( ((d-b)/(a-c)) | round(2) | suppr0 | decimaux ))$. diff --git a/Doc/source/ecrire/4/EquationPremierDegre-statement.tex b/Doc/source/ecrire/4/EquationPremierDegre-statement.tex new file mode 100644 index 00000000..d4d42f7e --- /dev/null +++ b/Doc/source/ecrire/4/EquationPremierDegre-statement.tex @@ -0,0 +1,4 @@ +\exercice + +Déterminer les solutions de l'équation $(( a )) x (( "%+d"|format(b) ))= (( c )) x (( "%+d"|format(d) ))$. +Si nécessaire, les solutions seront arrondies au centième. diff --git a/Doc/source/ecrire/4/equation.py b/Doc/source/ecrire/4/equation.py new file mode 100644 index 00000000..679df15c --- /dev/null +++ b/Doc/source/ecrire/4/equation.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# +# Pyromaths +# +# Un programme en Python qui permet de créer des fiches d'exercices types de +# mathématiques niveau collège ainsi que leur corrigé en LaTeX. +# +# Copyright (C) 2018 -- Jérôme Ortais (jerome.ortais@pyromaths.org) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +"""Équations du premier degré""" + +import random + +from pyromaths.ex import Jinja2Exercice +from pyromaths.outils.decimaux import decimaux, suppr0 + +class EquationPremierDegre(Jinja2Exercice): + + description = u"Résolution d'équations du premier degré à coefficients entiers." + level = u'3.Troisième' + + def __init__(self): + super(EquationPremierDegre, self).__init__() + + self.context = { + "a": random.choice([1, -1]) * (random.choice(range(1, 10))), + "b": random.choice([1, -1]) * (random.choice(range(1, 10))), + "c": random.choice([1, -1]) * (random.choice(range(1, 10))), + "d": random.choice([1, -1]) * (random.choice(range(1, 10))), + } + + @property + def environment(self): + environment = super(EquationPremierDegre, self).environment + environment.filters.update({ + 'decimaux': decimaux, + 'suppr0': suppr0, + }) + return environment From 180ca8cd6fa8321aabf614e9ea5e31fb16b51dae Mon Sep 17 00:00:00 2001 From: Louis Date: Mon, 28 May 2018 22:46:45 +0200 Subject: [PATCH 10/26] =?UTF-8?q?[doc]=20Affichage=20de=20=3D=20au=20lieu?= =?UTF-8?q?=20de=20\approx=20si=20la=20solution=20est=20exacte=20(et=20pas?= =?UTF-8?q?=20seulement=20enti=C3=A8re)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/source/ecrire/4/EquationPremierDegre-answer.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/source/ecrire/4/EquationPremierDegre-answer.tex b/Doc/source/ecrire/4/EquationPremierDegre-answer.tex index ab3374ae..86433ef0 100644 --- a/Doc/source/ecrire/4/EquationPremierDegre-answer.tex +++ b/Doc/source/ecrire/4/EquationPremierDegre-answer.tex @@ -6,7 +6,7 @@ (( a - c )) x &= (( d - b )) \\ x &= \frac{(( d - b ))}{(( a - c ))} \\ x & - (* if (d-b)/(a-c) == ((d-b)/(a-c))|int *) + (* if 100*(d-b)/(a-c) == (100*(d-b)/(a-c))|int *) = (* else *) \approx @@ -16,7 +16,7 @@ L'unique solution est $x -(* if (d-b)/(a-c) == ((d-b)/(a-c))|int *) +(* if 100*(d-b)/(a-c) == (100*(d-b)/(a-c))|int *) = (* else *) \approx From 90b5b4e0e626ee349a2960c6a4a4352bae733268 Mon Sep 17 00:00:00 2001 From: Louis Date: Mon, 28 May 2018 22:56:10 +0200 Subject: [PATCH 11/26] [doc] oubli --- Doc/source/ecrire/4/exercice.pdf | Bin 0 -> 25407 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Doc/source/ecrire/4/exercice.pdf diff --git a/Doc/source/ecrire/4/exercice.pdf b/Doc/source/ecrire/4/exercice.pdf new file mode 100644 index 0000000000000000000000000000000000000000..46028d5b8141e7b740874c63b95a186d097d271e GIT binary patch literal 25407 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 literal 0 HcmV?d00001 From 315bf4522c1277d43ae733881e2c5f93f46c51a9 Mon Sep 17 00:00:00 2001 From: Louis Date: Mon, 28 May 2018 23:00:07 +0200 Subject: [PATCH 12/26] =?UTF-8?q?[doc]=20Tutoriel=20:=20Partie=202.7.3=20t?= =?UTF-8?q?ermin=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/source/ecrire.rst | 98 +++++++++++++++++++++++++----- Doc/source/ecrire/5.3/equation.py | 68 +++++++++++++++++++++ Doc/source/ecrire/5/1x.png | Bin 0 -> 2985 bytes 3 files changed, 152 insertions(+), 14 deletions(-) create mode 100644 Doc/source/ecrire/5.3/equation.py create mode 100644 Doc/source/ecrire/5/1x.png diff --git a/Doc/source/ecrire.rst b/Doc/source/ecrire.rst index 9eb51186..e7f45bfa 100644 --- a/Doc/source/ecrire.rst +++ b/Doc/source/ecrire.rst @@ -189,6 +189,7 @@ Du côté de LaTeX, nous allons profiter de la bibliothèque jinja2 pour utilise L'énoncé est assez simple : il suffit de faire appel aux variables du contexte. .. literalinclude:: ecrire/3/EquationPremierDegre-statement.tex + :language: latex :linenos: Dans ce code, ``(( a ))`` et ``(( c ))`` sont remplacés par les valeurs des variables ``a`` et ``c`` du contexte, et ``(( "%+d"|format(b) ))`` est remplacé par le résultat du code Python ``"%+d" % b``, ce qui a pour effet d'écrire l'entier ``b`` *avec son signe* (qu'il soit positif ou négatif). @@ -196,6 +197,7 @@ Dans ce code, ``(( a ))`` et ``(( c ))`` sont remplacés par les valeurs des var La rédaction du corrigé se fait de la même manière, en remarquant que le code ``(( d - b ))``, par exemple, est remplacé par le résultat du calcul ``d - b``. Notons également l'utilisation de ``(( ((d-b)/(a-c)) | round(2) ))``, qui permet d'arrondir le résultat du calcul ``(d-b)/(a-c)`` à deux chiffres après la virgule. L'ensemble de ces fonctions (``format``, ``round``, etc.), que jinja2 appelle `filters`, est décrit `dans la documentation officielle `__. .. literalinclude:: ecrire/3/EquationPremierDegre-answer.tex + :language: latex :linenos: Débuggage @@ -213,42 +215,110 @@ Cette option permet de définir des commandes (du shell) qui seront executées s Bilan ----- -Nous avons produit l'exercice :download:`exercice.pdf `. Il fonctionne, mais il y a un petit problème dans le corrigé : le résultat (arrondi) est écrit à l'anglaise, avec un point au lieu d'une virgule. +Nous avons produit l'exercice :download:`exercice.pdf `. Il fonctionne, mais il y a un petit problème dans le corrigé : le résultat (arrondi) est écrit à l'anglaise, avec un point au lieu d'une virgule. De plus, même dans le cas d'une solution exacte, le signe :math:`\approx` est utilisé. -.. image:: ecrire/3/corrige.png +.. figure:: ecrire/3/corrige.png + :align: center -Cela peut se corriger en utilisant un `filter` personnalisé. +Cela peut se corriger en plongeant un peu plus dans la documentation de jinja2. -Utilisation de `filters` personnalisées -======================================= +Structures de contrôle, et `filters` personnalisés +================================================== Deux problèmes existent dans le corrigé défini précédemment. -- Le nombre à virgule est écrit avec un point et (cela se voit dans certains cas), dans le cas d'un résultat entier, le code produit ``2.0`` plutôt que ``2`` (cela est dû à Python qui manipule des flottants, et écrit donc la première version pour insister sur le type flottant plutôt qu'entier). +- Le nombre à virgule est écrit avec un point et, dans le cas d'un résultat entier (ce qui n'est pas le cas ici), le code produit ``2.0`` plutôt que ``2`` (cela est dû à Python qui manipule des flottants, et écrit donc la première version pour insister sur le type flottant plutôt qu'entier). - Le signe utilisé pour donner la solution est :math:`\approx`, que la solution soit exacte ou non. +`Filters` personnalisés +----------------------- + .. currentmodule:: pyromaths.outils.decimaux Heureusement, deux fonctions du module :mod:`pyromaths.outils.decimaux` existent dans Pyromaths pour corriger le premier problème : :func:`suppr0` permet de supprimer le `.0` à la fin d'un flottant lorsque c'est utile, et :func:`decimaux` permet de représenter un nombre décimal en respectant les conventions françaises. Encore faut-il que ces fonctions soient accessibles depuis le `template` LaTeX. -TODO +Ajoutons la méthode suivante à la classe :class:`~pyromaths.ex.troisiemes.equation.EquationPremierDegre` : + +.. literalinclude:: ecrire/4/equation.py + :linenos: + :lineno-start: 47 + :lines: 47-54 + +Celle-ci a pour effet d'ajouter à l'environnement jinja2 les deux fonctions :func:`suppr0` et :func:`decimaux` comme des `filters`, qui sont alors accessibles depuis le `template`. -http://jinja.pocoo.org/docs/2.10/api/#custom-filters +.. literalinclude:: ecrire/4/EquationPremierDegre-answer.tex + :language: latex + :lineno-start: 14 + :lines: 14 -Pour corriger le second, TODO. +Pour plus d'information sur les `filters` personnalisés, voir `la documentation officielle `__. -http://jinja.pocoo.org/docs/2.10/api/#custom-tests +Structures de contrôles +----------------------- +Pour corriger le second, il suffit de tester si la solution est exacte ou non. Pour cela, nous testons si la solution (multipliée par 100) est égale à la partie entière de la solution, multipliée par 100 elle aussi. + +.. literalinclude:: ecrire/4/EquationPremierDegre-answer.tex + :language: latex + :lineno-start: 9 + :lines: 9-13 + +Pour tester si la solution est exacte, nous aurions aussi pu définir un `test personnalisé `__. + +D'autres structures de contrôle sont disponibles ; elles sont détaillées dans `la documentation officielle `__. + +Bilan +----- + +La source de la correction est maintenant celle-ci. + +.. literalinclude:: ecrire/4/EquationPremierDegre-answer.tex + :linenos: + :language: latex + +Elle produit :download:`ce résultat `. Notre exercice est quasiment terminé, non ? Non ! Car voici… *(musique terrifiante)* les cas particuliers… Gestion des cas particuliers ============================ +Deux cas particuliers posent problème ici. + +- Dans certains cas (par exemple ``utils/pyromaths-cli.py generate EquationPremierDegre:15``, les deux coefficients :math:`a` et :math:`c` de l'équation :math:`ax+b=cx+d` sont égaux, et notre programme, qui suppose qu'il existe une solution unique, essaye de la calculer, et divise par 0. +- Dans d'autres cas (par exemple ``utils/pyromaths-cli.py generate EquationPremierDegre:18``, le programme affiche :math:`1x` (ou :math:`-1x`) alors que :math:`x` (ou :math:`-x`) suffirait, comme dans l'exemple suivant. + +.. figure:: ecrire/5/1x.png + :align: center + +Il y a trois manières de résoudre ces problèmes. Elles ne sont pas exclusives, et il en existe d'autres. + +Prise en compte avec Python +--------------------------- + +TODO + +Prise en compte avec Jinja2 +--------------------------- + TODO -- Erreurs (`1x`, `2x+0`, division par 0) - - Prendre en compte les cas particuliers avec jinja2 - - Prendre en compte les cas particuliers en python - - S'arranger pour qu'il n'y ait pas de cas particuliers +Suppression des cas particuliers +-------------------------------- + +La méthode la plus confortable dans les cas simples est d'exclure les cas particuliers. Pour cela, au lieu d'accepter n'importe quel tirage de nos coefficients, s'ils ne nous conviennent pas, nous recommençons. + +Avec cette méthode, pas besoin de toucher aux `templates` : nous modifions simplement le constructeur de la classe :class:`~pyromaths.ex.troisiemes.equation.EquationPremierDegre`. + +.. literalinclude:: ecrire/5.3/equation.py + :linenos: + :lineno-start: 37 + :lines: 37-59 + +Bilan +----- + +Supprimer les cas particuliers est sans doute le plus confortable pour écrire un exercice. Mais c'est aussi moins riche pour les élèves. + +Il n'y a pas de meilleure solution ici ; faites ce qui vous paraît le moins pire. Finalisation ============ diff --git a/Doc/source/ecrire/5.3/equation.py b/Doc/source/ecrire/5.3/equation.py new file mode 100644 index 00000000..c6a78e26 --- /dev/null +++ b/Doc/source/ecrire/5.3/equation.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +# +# Pyromaths +# +# Un programme en Python qui permet de créer des fiches d'exercices types de +# mathématiques niveau collège ainsi que leur corrigé en LaTeX. +# +# Copyright (C) 2018 -- Jérôme Ortais (jerome.ortais@pyromaths.org) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +"""Équations du premier degré""" + +import random + +from pyromaths.ex import Jinja2Exercice +from pyromaths.outils.decimaux import decimaux, suppr0 + +class EquationPremierDegre(Jinja2Exercice): + + description = u"Résolution d'équations du premier degré à coefficients entiers." + level = u'3.Troisième' + + def __init__(self): + super(EquationPremierDegre, self).__init__() + + while True: + a = random.choice([1, -1]) * (random.choice(range(1, 10))) + b = random.choice([1, -1]) * (random.choice(range(1, 10))) + c = random.choice([1, -1]) * (random.choice(range(1, 10))) + d = random.choice([1, -1]) * (random.choice(range(1, 10))) + + if abs(a-c) == 1: + # 1x ou -1x sera affiché à un moment ou à un autre. Nous excluons ce cas. + continue + if a == c: + # Aucune solution, ou une infinité de solutions. Nous excluons ce cas. + continue + break + + self.context = { + "a": a, + "b": b, + "c": c, + "d": d, + } + + @property + def environment(self): + environment = super(EquationPremierDegre, self).environment + environment.filters.update({ + 'decimaux': decimaux, + 'suppr0': suppr0, + }) + return environment diff --git a/Doc/source/ecrire/5/1x.png b/Doc/source/ecrire/5/1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c70b5c89b0ee28d50b8908eaca3ff3fe1834ddc0 GIT binary patch literal 2985 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 literal 0 HcmV?d00001 From ffc796b0c67fccbe772e534a280ef9b32464f0da Mon Sep 17 00:00:00 2001 From: Louis Date: Tue, 29 May 2018 21:52:40 +0200 Subject: [PATCH 13/26] =?UTF-8?q?[doc]=20Tutoriel=20termin=C3=A9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/source/ecrire.rst | 162 ++++++++++++++---- ...r.tex => EquationPremierDegre2-answer.tex} | 0 ...ex => EquationPremierDegre2-statement.tex} | 0 .../ecrire/2/{equation.py => equation2.py} | 4 +- .../ecrire/2/{exercices.pdf => exercice.pdf} | Bin 25255 -> 25255 bytes ...r.tex => EquationPremierDegre3-answer.tex} | 0 ...ex => EquationPremierDegre3-statement.tex} | 0 Doc/source/ecrire/3/corrige.png | Bin 9322 -> 8735 bytes .../ecrire/3/{equation.py => equation3.py} | 14 +- Doc/source/ecrire/3/exercice.pdf | Bin 25362 -> 25580 bytes ...r.tex => EquationPremierDegre4-answer.tex} | 0 ...ex => EquationPremierDegre4-statement.tex} | 0 .../ecrire/4/{equation.py => equation4.py} | 16 +- Doc/source/ecrire/4/exercice.pdf | Bin 25407 -> 25403 bytes .../5.1/EquationPremierDegre51-answer.tex | 7 + .../5.1/EquationPremierDegre51-statement.tex | 4 + Doc/source/ecrire/5.1/equation51.py | 80 +++++++++ .../5.2/EquationPremierDegre52-answer.tex | 41 +++++ .../5.2/EquationPremierDegre52-statement.tex | 4 + Doc/source/ecrire/5.2/equation52.py | 54 ++++++ .../5.3/EquationPremierDegre53-answer.tex | 24 +++ .../5.3/EquationPremierDegre53-statement.tex | 4 + .../ecrire/5.3/{equation.py => equation53.py} | 16 +- Doc/source/ecrire/5/1x.png | Bin 2985 -> 7780 bytes 24 files changed, 371 insertions(+), 59 deletions(-) rename Doc/source/ecrire/2/{EquationPremierDegre-answer.tex => EquationPremierDegre2-answer.tex} (100%) rename Doc/source/ecrire/2/{EquationPremierDegre-statement.tex => EquationPremierDegre2-statement.tex} (100%) rename Doc/source/ecrire/2/{equation.py => equation2.py} (90%) rename Doc/source/ecrire/2/{exercices.pdf => exercice.pdf} (97%) rename Doc/source/ecrire/3/{EquationPremierDegre-answer.tex => EquationPremierDegre3-answer.tex} (100%) rename Doc/source/ecrire/3/{EquationPremierDegre-statement.tex => EquationPremierDegre3-statement.tex} (100%) rename Doc/source/ecrire/3/{equation.py => equation3.py} (72%) rename Doc/source/ecrire/4/{EquationPremierDegre-answer.tex => EquationPremierDegre4-answer.tex} (100%) rename Doc/source/ecrire/4/{EquationPremierDegre-statement.tex => EquationPremierDegre4-statement.tex} (100%) rename Doc/source/ecrire/4/{equation.py => equation4.py} (73%) create mode 100644 Doc/source/ecrire/5.1/EquationPremierDegre51-answer.tex create mode 100644 Doc/source/ecrire/5.1/EquationPremierDegre51-statement.tex create mode 100644 Doc/source/ecrire/5.1/equation51.py create mode 100644 Doc/source/ecrire/5.2/EquationPremierDegre52-answer.tex create mode 100644 Doc/source/ecrire/5.2/EquationPremierDegre52-statement.tex create mode 100644 Doc/source/ecrire/5.2/equation52.py create mode 100644 Doc/source/ecrire/5.3/EquationPremierDegre53-answer.tex create mode 100644 Doc/source/ecrire/5.3/EquationPremierDegre53-statement.tex rename Doc/source/ecrire/5.3/{equation.py => equation53.py} (77%) diff --git a/Doc/source/ecrire.rst b/Doc/source/ecrire.rst index e7f45bfa..a46c44d2 100644 --- a/Doc/source/ecrire.rst +++ b/Doc/source/ecrire.rst @@ -13,6 +13,13 @@ Cette article décrit la procédure pour créer un nouvel exercice pour Pyromath et pour que la personne lisant ces lignes s'y retrouve d'une documentation à l'autre, nous avons fait le choix de conserver les termes anglais plutôt que d'utiliser leur équivalent français. +.. note:: + + Cette documentation a été écrite en se mettant à la place d'une personne utilisant GNU/Linux. + Il est également possible d'écrire un nouvel exercice depusi Windows ou MacOS, + mais certaines commandes décrites dans ce document changent un peu. + À vous de les adapter. + .. contents:: :local: :depth: 1 @@ -58,6 +65,19 @@ Si vous n'avez pas de tel compte, utilisez : Puis déplacez vous dans le répertoire `pyromaths` ainsi créé. À partir de maintenant, sauf mention contraire, toutes les commandes sont à exécuter depuis ce répertoire. +La version de développement de Pyromaths se trouve dans la branche `develop` : + +.. code-block:: shell + + $ git checkout develop + +Il sera plus confortable, pour vous comme pour nous, que vous travailliez dans une branche séparée, par exemple `EquationPremierDegre` : + +.. code-block:: shell + + $ git branch EquationPremierDegre + $ git checkout EquationPremierDegre + Brouillon ========= @@ -65,7 +85,7 @@ La première étape est d'écrire un exercice en LaTeX, sans passer par Python, .. code-block:: shell - utils/pyromaths-cli.py dummy + $ utils/pyromaths-cli.py dummy Cette commande a pour effet de créer un modèle d'exercice, sous la forme d'un PDF qui est affiché à l'écran, et d'un fichier LaTeX :file:`exercices.tex`. @@ -86,15 +106,14 @@ Première version (sans aléa) Nous allons maintenant intégrer cet exercice à Pyromaths, sans aléa pour le moment. -Choisissez un identifiant pour votre exercice : un nom composé uniquement de lettres sans accents et de chiffres, sans espaces, comme `ConversionDegresRadians`, `TheoremeDePythagore`, `CoordonneesDuMilieu`, etc. Pour notre exemple, nous choissons `EquationPremierDegre`. +Choisissez un identifiant pour votre exercice : un nom composé uniquement de lettres sans accents et de chiffres, sans espaces, comme `ConversionDegresRadians`, `TheoremeDePythagore`, `CoordonneesDuMilieu`, etc. Pour notre exemple, nous choissons `EquationPremierDegre` (qui sera décliné en `EquationPremierDegre2`, `EquationPremierDegre3`, etc. au fil de ce tutoriel). Code Python ----------- Le code Python de l'exercice doit être placé dans un des sous-dossiers de ``src/pyromaths/ex/``. Dans notre cas, ce sera ``src/pyromaths/ex/troisiemes``. Ensuite, modifiez un des fichiers `.py` déjà existant, ou créez-en un nouveau. Gardez une certaine logique : un exercice sur Pythagore a sa place dans le même fichier qu'un autre exercice sur Pythagore ; un exercice de trigonométrie n'a pas sa place dans un fichier ``matrices.py``. Dans notre cas, nous crréons un nouveau fichier contenant le code suivant. -.. literalinclude:: ecrire/2/equation.py - :language: python +.. literalinclude:: ecrire/2/equation2.py :linenos: Modifiez les parties suivantes : @@ -107,17 +126,17 @@ Modifiez les parties suivantes : Code LaTeX ---------- -Le code LaTeX, quant à lui, doit être placé dans le répertoire ``data/ex/templates``, dans deux fichiers au nom de votre exercices. Reprenez votre fichier :download:`exercices.tex `, et extrayez les lignes correspondant à l'énoncé, que vous écrivez dans le fichier :download:`EquationPremierDegre-statement.tex `, et celles correspondant au corrigé dans le fichier :download:`EquationPremierDegre-answer.tex `. +Le code LaTeX, quant à lui, doit être placé dans le répertoire ``data/ex/templates``, dans deux fichiers au nom de votre exercices. Reprenez votre fichier :download:`exercices.tex `, et extrayez les lignes correspondant à l'énoncé, que vous écrivez dans le fichier :download:`EquationPremierDegre2-statement.tex `, et celles correspondant au corrigé dans le fichier :download:`EquationPremierDegre2-answer.tex `. -L'énoncé est alors dans le fichier :download:`EquationPremierDegre-statement.tex `. +L'énoncé est alors dans le fichier :download:`EquationPremierDegre2-statement.tex `. -.. literalinclude:: ecrire/2/EquationPremierDegre-statement.tex +.. literalinclude:: ecrire/2/EquationPremierDegre2-statement.tex :language: latex :linenos: -Le corrigé est dans le fichier :download:`EquationPremierDegre-answer.tex ` +Le corrigé est dans le fichier :download:`EquationPremierDegre2-answer.tex ` -.. literalinclude:: ecrire/2/EquationPremierDegre-answer.tex +.. literalinclude:: ecrire/2/EquationPremierDegre2-answer.tex :language: latex :linenos: @@ -128,9 +147,9 @@ Vous pouvez maintenant tester la génération de votre exercice, en exécutant l .. code-block:: shell - utils/pyromaths-cli.py generate EquationPremierDegre + $ utils/pyromaths-cli.py generate EquationPremierDegre2 -Vous obtenez alors le fichier :download:`exercice.pdf `. +Vous obtenez alors le fichier :download:`exercice.pdf `. Bilan ----- @@ -144,9 +163,9 @@ Dans cette partie, pour générer l'exercice et suivre votre travail, la command .. code-block:: shell - utils/pyromaths-cli.py generate EquationPremierDegre:1 + $ utils/pyromaths-cli.py generate EquationPremierDegre3:33 -Remarquez que par rapport à la commande utilisée dans la partie précédente, un ``:1`` a été ajouté à la fin de la ligne. Il correspond à la graine (`seed`) du générateur pseudo-aléatoire. +Remarquez que par rapport à la commande utilisée dans la partie précédente, un ``:33`` a été ajouté à la fin de la ligne. Il correspond à la graine (`seed`) du générateur pseudo-aléatoire. .. note:: @@ -156,18 +175,18 @@ Remarquez que par rapport à la commande utilisée dans la partie précédente, Nous gardons le même système, mais au lieu de commencer à la première décimale de π, nous utilisons désormais sur l'heure courante : si le programme est lancé à 13h37, nous utilisons alors les décimales de π à partir de la 1337e. Ainsi, deux exécutions successives donneront deux exercices différents. - C'est mieux. Mais quand nous créerons notre exercices, nous allons générer encore et encore un exercice, et nous aimerions toujours générer le même (cela facilitera le développement, pour ne pas être perturbé par des valeurs numériques qui changent ; pour qu'un bug introduit par une valeur numérique spécifique n'apparaisse et ne disparaisse pas aléatoirement). Du coup, nous imposons le début de la séquence aléatoire : c'est la signification du ``:1`` ajouté à la fin de la ligne de commande. + C'est mieux. Mais quand nous créerons notre exercices, nous allons générer encore et encore un exercice, et nous aimerions toujours générer le même (cela facilitera le développement, pour ne pas être perturbé par des valeurs numériques qui changent ; pour qu'un bug introduit par une valeur numérique spécifique n'apparaisse et ne disparaisse pas aléatoirement). Du coup, nous imposons le début de la séquence aléatoire : c'est la signification du ``:33`` ajouté à la fin de la ligne de commande. C'est un peu plus compliqué en réalité, mais dans les grande lignes, c'est ainsi qu'un ordinateur génère du hasard. Plus d'informations, par exemple, dans l'article de Wikipédia `Pseudorandom generator `__. -Si nous voulons générer un autre exercice, il suffit de transformer le ``EquationPremierDegre:1`` en ``EquationPremierDegre:1729``, ``EquationPremierDegre:0123456789``, ou n'importe quel nombre de votre choix. +Si nous voulons générer un autre exercice, il suffit de transformer le ``EquationPremierDegre3:33`` en ``EquationPremierDegre3:1729``, ``EquationPremierDegre3:0123456789``, ou n'importe quel nombre de votre choix. Code Python ----------- -Du côté de Python, il faut tirer au hasard quatre nombres entiers entre -10 et 10 (sauf 0), et les rendre disponible depuis le code LaTeX. Cela se fait avec le contexte. Toutes les variables présentes dans ce dictionnaire seront accessibles depuis le `template` jinja2. +Du côté de Python, il faut tirer au hasard quatre nombres entiers entre -10 et 10 (sauf 0 et 1, qui sont des cas particuliers), et les rendre disponible depuis le code LaTeX. Cela se fait avec le contexte. Toutes les variables présentes dans ce dictionnaire seront accessibles depuis le `template` jinja2. -.. literalinclude:: ecrire/3/equation.py +.. literalinclude:: ecrire/3/equation3.py :linenos: :lineno-start: 27 :lines: 27-44 @@ -186,9 +205,16 @@ Du côté de LaTeX, nous allons profiter de la bibliothèque jinja2 pour utilise - les variables peuvent être évaluées avec des doubles parenthèses. Pour insérer la valeur de la variable ``a`` du contexte, il faut utiliser ``(( a ))`` ; - des structures de contrôle (condition, boucle) peuvent être utilisées entourées par ``(*`` et ``*)``. + Notons que les chaînes définissant ces blocs ont été modifiées par rapport aux chaînes initiales, car trop proches de la syntaxe LaTeX. Ceci est documenté sur `le site officiel `__, et mis en œuvre dans la classe :class:`pyromaths.ex.Jinja2Exercice`. + + .. literalinclude:: ../../src/pyromaths/ex/__init__.py + :linenos: + :lineno-start: 200 + :lines: 200-215 + L'énoncé est assez simple : il suffit de faire appel aux variables du contexte. -.. literalinclude:: ecrire/3/EquationPremierDegre-statement.tex +.. literalinclude:: ecrire/3/EquationPremierDegre3-statement.tex :language: latex :linenos: @@ -196,7 +222,7 @@ Dans ce code, ``(( a ))`` et ``(( c ))`` sont remplacés par les valeurs des var La rédaction du corrigé se fait de la même manière, en remarquant que le code ``(( d - b ))``, par exemple, est remplacé par le résultat du calcul ``d - b``. Notons également l'utilisation de ``(( ((d-b)/(a-c)) | round(2) ))``, qui permet d'arrondir le résultat du calcul ``(d-b)/(a-c)`` à deux chiffres après la virgule. L'ensemble de ces fonctions (``format``, ``round``, etc.), que jinja2 appelle `filters`, est décrit `dans la documentation officielle `__. -.. literalinclude:: ecrire/3/EquationPremierDegre-answer.tex +.. literalinclude:: ecrire/3/EquationPremierDegre3-answer.tex :language: latex :linenos: @@ -237,16 +263,16 @@ Deux problèmes existent dans le corrigé défini précédemment. Heureusement, deux fonctions du module :mod:`pyromaths.outils.decimaux` existent dans Pyromaths pour corriger le premier problème : :func:`suppr0` permet de supprimer le `.0` à la fin d'un flottant lorsque c'est utile, et :func:`decimaux` permet de représenter un nombre décimal en respectant les conventions françaises. Encore faut-il que ces fonctions soient accessibles depuis le `template` LaTeX. -Ajoutons la méthode suivante à la classe :class:`~pyromaths.ex.troisiemes.equation.EquationPremierDegre` : +Ajoutons la méthode suivante à la classe :class:`~pyromaths.ex.troisiemes.equation.EquationPremierDegre4` : -.. literalinclude:: ecrire/4/equation.py +.. literalinclude:: ecrire/4/equation4.py :linenos: :lineno-start: 47 :lines: 47-54 Celle-ci a pour effet d'ajouter à l'environnement jinja2 les deux fonctions :func:`suppr0` et :func:`decimaux` comme des `filters`, qui sont alors accessibles depuis le `template`. -.. literalinclude:: ecrire/4/EquationPremierDegre-answer.tex +.. literalinclude:: ecrire/4/EquationPremierDegre4-answer.tex :language: latex :lineno-start: 14 :lines: 14 @@ -258,7 +284,7 @@ Structures de contrôles Pour corriger le second, il suffit de tester si la solution est exacte ou non. Pour cela, nous testons si la solution (multipliée par 100) est égale à la partie entière de la solution, multipliée par 100 elle aussi. -.. literalinclude:: ecrire/4/EquationPremierDegre-answer.tex +.. literalinclude:: ecrire/4/EquationPremierDegre4-answer.tex :language: latex :lineno-start: 9 :lines: 9-13 @@ -272,7 +298,7 @@ Bilan La source de la correction est maintenant celle-ci. -.. literalinclude:: ecrire/4/EquationPremierDegre-answer.tex +.. literalinclude:: ecrire/4/EquationPremierDegre4-answer.tex :linenos: :language: latex @@ -283,8 +309,8 @@ Gestion des cas particuliers Deux cas particuliers posent problème ici. -- Dans certains cas (par exemple ``utils/pyromaths-cli.py generate EquationPremierDegre:15``, les deux coefficients :math:`a` et :math:`c` de l'équation :math:`ax+b=cx+d` sont égaux, et notre programme, qui suppose qu'il existe une solution unique, essaye de la calculer, et divise par 0. -- Dans d'autres cas (par exemple ``utils/pyromaths-cli.py generate EquationPremierDegre:18``, le programme affiche :math:`1x` (ou :math:`-1x`) alors que :math:`x` (ou :math:`-x`) suffirait, comme dans l'exemple suivant. +- Dans certains cas (par exemple ``utils/pyromaths-cli.py generate EquationPremierDegre4:15``, les deux coefficients :math:`a` et :math:`c` de l'équation :math:`ax+b=cx+d` sont égaux, et notre programme, qui suppose qu'il existe une solution unique, essaye de la calculer, et divise par 0. +- Dans d'autres cas (par exemple ``utils/pyromaths-cli.py generate EquationPremierDegre4:17``, le programme affiche :math:`1x` (ou :math:`-1x`) alors que :math:`x` (ou :math:`-x`) suffirait, comme dans l'exemple suivant. .. figure:: ecrire/5/1x.png :align: center @@ -294,21 +320,46 @@ Il y a trois manières de résoudre ces problèmes. Elles ne sont pas exclusives Prise en compte avec Python --------------------------- -TODO +Dans ce cas-là, la résolution se fait en Python. Le code LaTeX est donc réduit au minimum. + +.. literalinclude:: ecrire/5.1/EquationPremierDegre51-answer.tex + :linenos: + :language: latex + +C'est en Python, en revanche, que tous les cas particuliers sont traités. Nous avons donc ajouté deux variables au contexte : ``calculs`` contenant la liste des étapes de calcul, et ``conclusion`` contenant la phrase de conclusion. + +.. literalinclude:: ecrire/5.1/equation51.py + :linenos: + :lineno-start: 32 + :lines: 32-80 + +Le code est plus complet, mais plus difficile à lire. Prise en compte avec Jinja2 --------------------------- -TODO +Puisque les cas particuliers sont traités avec Jinja2, le code Python est réduit au minimum (il n'a pas été modifié depuis la version précédente). + +.. literalinclude:: ecrire/5.2/equation52.py + :linenos: + :lineno-start: 32 + :lines: 32-54 + +Le code LaTeX, en revanche, est plus fourni. + +.. literalinclude:: ecrire/5.2/EquationPremierDegre52-answer.tex + :language: latex + +Encore une fois, le code est plus complet, mais plus difficile à lire. Suppression des cas particuliers -------------------------------- La méthode la plus confortable dans les cas simples est d'exclure les cas particuliers. Pour cela, au lieu d'accepter n'importe quel tirage de nos coefficients, s'ils ne nous conviennent pas, nous recommençons. -Avec cette méthode, pas besoin de toucher aux `templates` : nous modifions simplement le constructeur de la classe :class:`~pyromaths.ex.troisiemes.equation.EquationPremierDegre`. +Avec cette méthode, pas besoin de toucher aux `templates` : nous modifions simplement le constructeur de la classe :class:`~pyromaths.ex.troisiemes.equation.EquationPremierDegre53`. -.. literalinclude:: ecrire/5.3/equation.py +.. literalinclude:: ecrire/5.3/equation53.py :linenos: :lineno-start: 37 :lines: 37-59 @@ -323,19 +374,62 @@ Il n'y a pas de meilleure solution ici ; faites ce qui vous paraît le moins pir Finalisation ============ -TODO +L'exercice est bientôt prêt à être publié. Créer les vignettes ------------------- -TODO +Si vous lancez la version graphique de Pyromaths, vous remarquez que l'aperçu de votre exercice n'est pas disponible ; il manquera aussi sur la `version en ligne `__. C'est normal : il n'a pas encore été généré. Corrigez cela avec la commande suivante. + +.. code-block:: shell + + $ utils/creer-vignettes.py + +Cette commande détecte les vignettes manquantes (ou celles pour lesquelles l'exercice a été modifié), et les génère. Ajouter des tests ----------------- -TODO +Dans quelques mois ou années, quelqu'un (peut-être vous) voudrait modifier quelque chose de Pyromaths, en se demandant si cela va « casser » un exercice. Pour être sûr que votre exercice soit préservé, il serait sage de le tester. L'ajout d'un test se fait avec la commande suivante. + +.. code-block:: shell + + $ utils/pyromaths-cli.py test create EquationPremierDegre + +Cette commande va générer un exercice, l'afficher (dans un lecteur de pdf externe), et vous demander confirmation. Si l'exercice est correct, validez, et cet exercice sera ajouté aux tests. + +Si vous voulez ajouter un exercice particulier (car vous savez qu'il correspond à un cas très particulier), ajouter ce numéro d'exercice à votre commande (1729 ici). + +.. code-block:: shell + + $ utils/pyromaths-cli.py test create EquationPremierDegre:1729 + +Plus tard, pour vérifier que votre exercice n'a pas été modifier, vérifiez les tests en utilisant ce même programme. + +.. code-block:: shell + + $ utils/pyromaths-cli.py test check Publication ! ============= -TODO +Ajout des fichiers créés ou modifiés +------------------------------------ + +Utilisez ``git add`` pour ajouter les fichiers créés ou modifiés. À priori, cela concerne au moins : + +- un fichier python contenant la classe de votre exercice (dans un des dossiers ``src/pyromaths/ex/*``) ; +- deux fichiers de template LaTeX (dans le dossier ``data/ex/templates``) ; +- la vignette, et le fichier ``md5sum.json`` (dans le dossier ``data/ex/img``) ; +- les fichiers de test (dans le dossier ``data/ex/tests``) ; +- et peut-être d'autre, selon votre travail. + +Proposition de l'exercice +------------------------- + +Il ne reste qu'à nous proposer votre exercice, de préférence en utilisant une *pull request* sur Github, à défaut en prenant contact avec nous sur `le forum `__. + +Conclusion +========== + +Merci de contribuer à Pyromaths ! diff --git a/Doc/source/ecrire/2/EquationPremierDegre-answer.tex b/Doc/source/ecrire/2/EquationPremierDegre2-answer.tex similarity index 100% rename from Doc/source/ecrire/2/EquationPremierDegre-answer.tex rename to Doc/source/ecrire/2/EquationPremierDegre2-answer.tex diff --git a/Doc/source/ecrire/2/EquationPremierDegre-statement.tex b/Doc/source/ecrire/2/EquationPremierDegre2-statement.tex similarity index 100% rename from Doc/source/ecrire/2/EquationPremierDegre-statement.tex rename to Doc/source/ecrire/2/EquationPremierDegre2-statement.tex diff --git a/Doc/source/ecrire/2/equation.py b/Doc/source/ecrire/2/equation2.py similarity index 90% rename from Doc/source/ecrire/2/equation.py rename to Doc/source/ecrire/2/equation2.py index a0e3ac6a..3a6c9785 100644 --- a/Doc/source/ecrire/2/equation.py +++ b/Doc/source/ecrire/2/equation2.py @@ -5,7 +5,7 @@ # Un programme en Python qui permet de créer des fiches d'exercices types de # mathématiques niveau collège ainsi que leur corrigé en LaTeX. # -# Copyright (C) 2018 -- Jérôme Ortais (jerome.ortais@pyromaths.org) +# Copyright (C) 2018 -- Louis Paternault (spalax+python@gresille.org) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -26,7 +26,7 @@ from pyromaths.ex import Jinja2Exercice -class EquationPremierDegre(Jinja2Exercice): +class EquationPremierDegre2(Jinja2Exercice): description = u"Résolution d'équations du premier degré à coefficients entiers." level = u'3.Troisième' diff --git a/Doc/source/ecrire/2/exercices.pdf b/Doc/source/ecrire/2/exercice.pdf similarity index 97% rename from Doc/source/ecrire/2/exercices.pdf rename to Doc/source/ecrire/2/exercice.pdf index 84eb4456da8f7fea59457248a9389dfaff214f69..e1d5e7ce0b2f90bb018784cef1462a99bdb44e81 100644 GIT binary patch delta 254 zcmZ2}lyUh{#tqLyc#TZWlao>n({wG9ERrV|hD%JA3um7!9J(H>49Dd6q1IfMAw~vP z#+FuwmXl4w43W9{VO?1DxnYRfV2FTi-h4CsB@?@)k%6%#(Daj0(lGYs*HLloPNs&I q7UqVgPHvXQP8M#4u1=QbCMM>lZjR<|7Dg^+7Irp-R7~zpk^uk(?@8_e delta 254 zcmZ2}lyUh{#tqLyc+C>c6I0TXEOads4N@l;hD%JA3um7!9J(H>49Dd6q1IgHAx6el z24+?!=95jr43W9{VO?1DxnYRfV2FTi-h4CsB@?^3k+Fdp(Daj0(lGYs*HLloPHt|- qrf!Dj&Sp-I=BCcZZsvvtZq9DzPHv87ZZ57Sj&?SLR7~zpk^um>4oigq diff --git a/Doc/source/ecrire/3/EquationPremierDegre-answer.tex b/Doc/source/ecrire/3/EquationPremierDegre3-answer.tex similarity index 100% rename from Doc/source/ecrire/3/EquationPremierDegre-answer.tex rename to Doc/source/ecrire/3/EquationPremierDegre3-answer.tex diff --git a/Doc/source/ecrire/3/EquationPremierDegre-statement.tex b/Doc/source/ecrire/3/EquationPremierDegre3-statement.tex similarity index 100% rename from Doc/source/ecrire/3/EquationPremierDegre-statement.tex rename to Doc/source/ecrire/3/EquationPremierDegre3-statement.tex diff --git a/Doc/source/ecrire/3/corrige.png b/Doc/source/ecrire/3/corrige.png index 455487dc06ce3fe7b78ff486a7a0cf6bb4010a01..4ac176f27570fc65b24490009000708095f2d9ce 100644 GIT binary patch literal 8735 zcmb_?cR1DW|NlYRn`A`D$jIJOLPkcBJws$>WN+EYEGuMW%Q$84Es<=;CR>QIGk(wW z{k%Wl>+`*S-#>nT{I1gJdL6I(+^_q7-jDS>5s%aqi12Cg5eNj4lA@djybi(73NAMM zo9R4t3@_Mb$_jFb3-q7N#{4&M1muu5Z*TG31tIHfVd`S>l+oSV#fniuN%fIVAn{cMf)Sx4cTdw}ax2}_ z@a^b%_uY18CP~ih@a)VuuF&Y01Tv;;qb$`8d3n_hldgpy`=+w9N53_2+)S*ce5EYU z#2Wv~ikTDnH9OC1{0!AD3CVXCW0>wJFdIWj)}qD*k|s>c2Mmw8N@ zUdP6g=H%tcu)T4$x?EgT6q}qJUQrFmT6Q@TBjWc;SToZKa;-42SUmX`9VBKFxhBn(!X(J?V37@0de zJ8t%oB_+2oGSkwoZE#jpJ``#lAJ?IN@ixE{aon{o9WrfzV2sBBCmtZ z!WW{S@F>{k!>;?SX*^dk_$x=z6-5{J@+GEWqn8%DeRg83vGGrt|q3elq&{wAjSg!u38| zGTpd=MILc!I8Rk}uE`ezA&^42`aL7ekf*yf2#4Ra?UG8G7_#$#ijs1EXQ5qDO)WG% zot}zYH&ZBGg-zDOLyVk)!qmp5$n7{vufmFqnVET@-rb?{tE!UHJsBBHue~)46B84J zw3nAesZl*P7Z+FGdntnwXND^Ophk?$(o*7lwR9N`4RZAJxVyWnqzK%zzjw&*XOTT-8fhK6tvG<0;2-Q22%galGvKNX-E9UrG4i<4u{a$4-- zs0l!P86Qvj`t>X2bdYhQ7a8JYYVJJGvB7GPIrn)-rS15a{(iMALjwZ?+B-gC7@2=o zzf+K@Yim>0*42p=wkz{C$_Wb#b542hZ)k1I)K|+eU}0f>s;bg<+!Eq2Nl{)}Sh&|6 zO-~VRz$tq7ZU*c(V&Y2y@BPm`@rj6X&;A|`w*+E^G{6S3 zr>MxAcSo}#mKGOf@7=pcNlmS2hD=7pW@Kax)#+$!w_kOlf$Vt=6#AO`K%vqAi3#Q%6VP;oUPKjLgEv z`5KCfxW32BNlzUd9wMx^r)yOwvz{}k+8=zu?fL#a1~KsJ3fBndPG5@PrGQXE8ky12 z(Y9kaZUVx>tcbU%sa!6hDJe8s+S(%G+9F3y7w6uX(mXsoZNp^?YR{~!ZsM-5X82PL zU7@6WWNONEg^EhU%}qp4Uq3!2C53N|_65{EQ-%r~MZb=w=A&l6vrA0Y`hLnX8r6oi zhCJa0CMFrLU%$R7DEL`xnT4HQ6nVHloR5cyqUM*$I;(y@lilcjIHY6ZdtV?$1$Jj; zaKzH+zT&O^IQiGq7>J{}i}U=%;^gFHT!hE@@v7<5rz~mJpFaoH*Gu-NONQm-u%M=< zun?PDTc&n)+&SJyHT*=qC9qKg!+$Rl{@x41HeDOYQdCmHK(Mf~VjxOQnu+P?=n|BF zL`O&CuWCGgjDdKZuNKnO)Z{qZ(QyfYr#0?|!lb63az);Bx}m;PbqhZ?Rhk3b^h*gaPXz9*K__CMv5=i2AD#`HEe7+*VotMa&vQE z_EON(t6ulrBfE@^U6j@yF2^h&B$T6^#Dllm-rf!;60g+A;HyJ_<>Tt<7pwhb2sp~3 zw~XrEA_ky<4YZ;^)d}sTBa!^9EG)RIhno|!z#BPNjXeT4e*V1jyC_xRajKNS3l`?= z$w~cp{N|y2x~i(Gu$U#KF!3=G8HmXfkQJ=&F-UF?qGqSxHO zjR;@+<$ocG!AL8hGBz+e}I}c(VT!4}pFVUG6-N$9b`VffyK>yiG?k z76wVYCOj3^zn6N1tcO_0BjoU9hAMnqo4(i;PRGZSn>M*EeIeuI;-Y98u|MtfP+l%5 z>h=EB$UaTo*w7Gs852QCNtsjeFO0b@AY(HRaImzw`Elnb_QQt{L+VAz;tYB6(I2I& ze_0x;CNDf3HzDYO5tEjd*5G8NZO@l4in{NN>)lEi3sOZLI7eE$y5tLj0P=kgXWYM4 zAxlf6?;Ooz2>?k;`0oDbeAz-9oTGHSfm@jCY~r=f+PY12P15Z(BDS(pczI=|NGrOi z?#r_CWW9TtOq1W)$>2hJm{yf+`fdC5H>Hd$acpJp;M~q{&(yEYHQ!ZHQF*62wPTB` zMbS3~P!&^CBL-XR;pN55%S!_I)(t=WPrr~-)6!;VW@h%7-B(j1-rL&?=Cv8U$CGq} zi;KYb?}0rs>fPHi;w`PxyyfXe@2k$W*A5O2zV#ak_YA9x3{%nKDH&*LYn!3UO=A^V zsPFjH?A$sRo%0E*cmHJuw2i8=rvpthg6Y0J-5SrT?6^L}8j{d-IO|Q~=jUfLCr-11 zq|(4@zBreBKHGo?oc5Ylxaj_2BnTkF4~rE?L@3Y2&(9y}q%@S(L#E;fc{~@W+7h%M98MA+1{O5Q6xrmls z{|`6*$M2wT{70|-bK`#u{@)_*-=B!S(NiUuB~H<0h|$y2Q$nw-sECs^PHiMNI~&uv zHf?kmm(04*eR^ib>EhgXZ*34OG&HpBSjzk0$jbtp$4i zS!qR~sF~w%ftqW)_KU{kVE;nxr>abM=36C(#X+@vw*1x>O)tr3@s$$Mvefg2i7Iko zb8~uq-}7vL9Qk}k0vHJA&&s!;kdVvrF$^WbrgslYjnvi2jD7dD8je>|b!(kjwLj_x z*40UD&Ndp@hKl)}idpuj6+TXX^Y(4<($dqK+FHETP$Ig}mKN!fk?xrpdNwvT|5^cN zGD1SaN5;nee(6>36{WoPT0ZK14o0)|69E6U(c-I!fN;kj9eA3WnonTDYZIT@1q1{b z-}IC}X?^Kd_Rz&eh)pdm{PVN#8=9+2tE*T6FMryan+GK)Q_^APSvqCLx{Y40^(3T)ny;p+ z9n1kyZs8Xe72*GCzVM5DbAHG7`nqdfI_=tc+4WhkpSNzG?G2+9uv*3)A{-nXDh=-|E-QUBIXO8( zsg@vZsYRcswbf$b5I_t zrT3q2qUt6lb9S|8`~nMrViEypW$22z9#cK*RXn_T2~7sccm40k$jYL@4bd`P`{Eyu zaj>Nr3EqhuQRjcrU#4Zni;l-{r& z7+xir@7{tBC_BLZCw6wP-@T*N)Y1}m`pm!%*cy?Y%^coo77{{ekK%xWEG#Tso2o7= zFZyDor%3pxpyh7-e`DkS3SR)2edcT|Mue5Q$_pQbvOdc`S+~&@Fv^wnv&~n|s&e5- zOJK9QaVe1}ly%rug2hr+A#_s0b%QdLm>yq2p_^)WLtl(b)k+!n;~1(4!-!D%K)23~ zp5BHF2nmFUP3~x=qxQQyGr~lHqqGLXnUSVF4882}JRy@q=r;yZn95y*xhKqjP71q~ zRM6NIH@54!x`~xyOWe4mZQB;lPm8aVnpK65k57sHTu+Y%pMb#W*R0e+T3lS*kf`jG zWSZ8qutgi`8B$$)q}D$-7-Ury6%~0971dTLTgUOSk9r>}jJIg|@z+ir z4Wq1iE@>Osr_Fr?U3T@FC*DfJa?sEBY zZT)c0U%}V6QHH&vyL%CEOJcIq9#a zzdT%WQ!+Nm1EOvrXlWcF_Yw>T8jZtaV!}WU!YGnsm)+%+ zON|tQCx<#JhjU?nN++$!F^fx{^L@aQ*|-Tl8tr8%TInXVRg$idx34ju(q8^g#{6IC zxX`|0Pas{SprmA(>?r)nPJt*N2M3<1sVO+_w&OpmKtxE;!6jS1?~;V6(r`hJ3iFs=jVt3|FfSaj?T_9-``6iZALjuM$lzHHZ~U9^K?E# z{FCiC>zBU14tRVrIy!>+GLOr~#>QfvzjMYmSg0cTLERG*?R?pxC^T|%bL#@fO^NyV z0Soy;`iD}|=txs0>-6U{bsRO0_wV07f|CeQ4o2qB;6*cCMTt(^vc^!}=2LPQQJ!KRW%Iz?Cdy9q;&& zYoUgkD!$)wq3tq&7!DXAbV9;#+asV@r>qTFp?INY$=Nf1+r7huJI19i)cbJT^h+$0 z$Ig6U+cDrnds`bO8mR%Kz*@(F@p5qZMNHCt1wN~w;N~S9oc69RY{6&!9g)0E;rZ{q zUMbulD6}2YLeCH63io{3IL&_uqyM3ATrOR!4-DzBQZzPZ$j;8*`4P#>%*Pi?)Fxvl z6lgAbTYrbnN?(SX>cW+M5k+(=XZByo)_+Q@_~=$79Rrcav4OHs$Mf*W$RIi9KuykN z6p<0N-)NdCs?z-5TJ6}M;b$lI>{y63FZ?I;hC+0~^cX7_SFw^8Tr_2plJoVI0^Kve zun;&jq=7=A=HcY<2@1-3de(lW=K!5QIyu$}ihTVUP+5E8Ed$M!Gsw(#0e}B|c{*Nd zn^|ISbd8=K>9(bxkU>Jt7ofn3UW=5eIvDNAWQDbzi`y0h(T~N&5PKs-L&Kdh0|!%3 z?QK;&;O$oiTgzkh%^-QxpBP&<&C%ch4EA986kEqL2{ZlQiWtN=LjpI8JiU#rEz*()aEQF1X&HU0*FcF=|&CRxc7y6?lB7H_dK?*1yc`(I@mM>p$|5c?dbYUSK1(BaW z3%YGhhJeq-Uj?W3Jpop2QU;{h=H@0TR3tAiuLv$d#9%O-9&>mK^a-a6f_-a)x*sgo z;XRMz{vJoIibq7$8GwOxi43Y4sjjQ2Vq4?5fC>5qOF=;akO51l)UXwjnF&54%JY(R zsv7rS48|S{mv4LQNH3foY)wsw-BvK8cH5%l(Oy70l3K_WuqSwT2 z&30=~fB*S|H18$`?!pik7mw{-{ua9W`|uEAAxS>BOZ(P{ zeP8QoCa|EKf&y3Y33+6vnDbKj115|Xi1EJ4uZqWS%g7xaOgT8sw_q67x!_q_TOXbO z{k01LQc>S$m?XD;1up2gfc$)R5jzy3P_rnOjge8>dKM0(h*M8rUmqzw{fwPdt_BA> z(LkYe-(N?@y2L<%;5+2;7}ZfmL`3lM^SA!})m$dzYhl3(QGnCdq%a!Bl$4Yl-P}UM z!f>h_=Ay6rpOSHDe+&o={Eg!aZ@pnpsI3);$4f0iCpl~?$pPRWj!sUp>+0SqloHP- zTvvwt?(BCjubiBwhK3Bd2Temm6<1eRc=;&w(9=`=Y`6QmYJXB<;!u)_pOWp^$1GqC zwPj%lDilHSX^LH?qLK%h$@vGw_04N{|MUq~*iVU=xkPp!MC5RWHw6X;eq}t#%gclO zwhM4-VQVW&HB}@FSPQ5EE&9>52o9sr=ic|}>4qLjMHo9EBqZdk*UHk;&1;ep63hYu z@fnEC$#sUWFV~9AMvJsS4skY}Y;cK5Nc^Z>ec#^X`!~2&`QAMYwKTCTpS9?se#VH&`@k@YO&Bm z7-gkDJ#ymnGxLGWd%B;V;-N!yz)mqq$#!5u1_lOQq*=(&DMUzU9%hVF41NJ=*v|g` zmFN#2J~$oim?8oo)}Hk}G$N#z(9D_zXR#7jZ0<;Urj0$A)Vn+|Jp8y0GZ`EPkjQZr{1Q7sh#l*yfk^e9Q8xb5Fj6ldo(T2>=KY5#! zM35CtLlv)_`oF#S6@SeSG935C6wC#I%8ILtMn^>|x*JHH)@Z*OB%*?KZF zlaX7u98pc?+lm5#3!(ku(e7f&*Te4X{w{?FT*YOj=;XqE))VLM#i`)I z=0p%EV&T-;xw-3ZZf>wiodmoM0g!`L*o?&kj)2Waetp05*x|2YvY)BuD3pH(&cUH7f%*AcebParFFmxWY%Z#JIq#8DO zs9T(brjyy*+08F520XBK#<-U<^f->EmH z6@q5<_#9GFMku`n;O>95A+TosFMOw=gh8Bu2Wo{(nv8}9=Bw7y*?Ac%vBvw5M?*t{ z&;Q&9&I0CP|= zn;9A(5E~FsaX)(Z43Hb1w-wCr4q)jb`b2|MD_~4Rt5L{(RDV}lJnP`nDMf#h8B%xa zSY7tUXxq?G{K59jRMEGjJI6~Dzjt@ZqRq|B3c!H1A)A};dU|*~f=&$?S-O;W;(N~( znh*gf2U*B^+jc>0$vZTkiI9;&`(oJt{LgiO)yF^IK}(~aS(5OvUw*RvX2!p0sN%2iGs zSy(uzb}@3bJJ|`fEwURj{HrypLjzV@Q(yl9e9*OP*C3yer6ePRoSI1EoiS&^5FCtP z^IAi-IiEj7&=DDe){8u7*}d=n=Z}{|ZNV?wXdJ}cJy!%x%K7tXJwIazB0Y!&Uh){$ zNP{lR0f?VLS@rew6!x&3E-ZqyfiO&7F(W0VFt!VNFGqI)PGAx{fByWneVLyh2KRp` zDtb_28yXx8{VNR*8wqG+)z#5*aBw{MX<}p)1h?ur;EitKBR6?Oxy!nS-2MBlkUXiYtD{fbm4>%rtCA#P6%M*i+MOGt#Ym4`Gw1@e z3=dNzBqZG8c~oJ8%wl~R6r^>vwCls**qHVaw7IUMJ4eG^U0rPu6fYp{9URIIgdb~Y z>~v5(oCkcMJO>e%=Zy0TxQqrivorgCB%}lp5SXvg+*3*`6F|K z0zqE&)w&X-^$QX8(etsLn$6d!m09}+Yi;G522>8#zRmoNUi&s?nTaC9Rz9lU-rl#N z)tM}8o45nL4Om98o8MBQ-3m$B0stWBRarALW^|51N0-VbnWCJlK}|y=Jf(MQB0Dhh zDlccFcaitZ7^*@%wZNviZr?Xq!Sk71We7`BZz|zrd3m{|&U29ES0wHLxT8BJeO*&C zqURLrC&CzCkc%5)66e(D5B~cwfPjNpmKE zIk>^YLoDgOEeBB|Ei`J%LBgZ+Q!^xWhR<(2h_p!oW?>i~=sH2rMu(;_ zXa_OFx`Rq0jqLn3W;>LlL@nmXc<{@>?=pO00K*&oU4S_fK|#T{iHR^%f@Pr!e~A9R z86N^1;Ns$1jpc!jR-G<@ZuHH{h@t~J$kBo9R5yxWLni>;q-Typ*Ek*?9vIG=7pug1 zYUxEnF%W%0?wPmqR9HwT7?dQMYoL#2-X2QCsbfI*{sGW~qmxr>0+-It&$4E--o#rV zG1|vX{G-6XH0%v2BM>)k+<5!;Eu)kaJv_k9;bB-*6cJjHB2ImwXny@DQUL-dBU@fweQa#}enLA3S&b+fK=WGoA<1(IUsgxYwWQinw3p7WjJL2A76Wz dOu4{XjM)2-6iF`t-`hYa-B*(!u^bMC$8Ip;q2F9HuUv-j-%zH9wzO_aK-90?%}A%Y+z3i2|V@OuNkxA1Y{r)#Qw z3jD&gP?D2D&M;r^8*>ui5dvpm4FT~gRwrFPA8TVIJp$&JdMl!2L3PvWX_C{87i=uU$<%%>V zE12~XGw?zp%UKoMXk^GQ-7p_`F~2WIwteldu({SAQt6NSNjSN<vMciCb=3*BM^FHk3qt;xzrFTwGk-D$YU?wJ@kAk(Csm!j#U%&MtL!dg8J? za$C>9pmlKYA}1%Oypoc%qa)`{)whwibc@YqI}>+LpIX}6$4pI`xh?d!yq`TeJ}z~h zmg-Iwr6MII?O7ukMxm&hj<;eo{PD%s?K9%Of7isp!FgX(b0s)9cwsPytm^TPkV<=0 zhD~3Z*V)OwX+D`*=(*zoImYRcBEyBrCJ9moF?>%?&*|D{v_iiU)Wlm*rh(6REZfbd znuC!bSo$yR?aViBoG&t{Y;6w4o?c();@F>R!KM>_g0r@^#(L|Pw4@}KvWiOhBD}eB znizGFVfB63g_YISa4SY}zsO9vIA%V+i}a!%U*0%tZ& ze3oX^>R9z>xS3E~lKhWN;o;$qy7xxI3r8z+Q_`5#^y z7#OJW+GIAUv^&qp$Vg1hEAvQq++GvK`}Da!oIW}xW_o!!W?|tG(tN9=Aw>V9H4`uI zRu)m|L_~i|N(xR8$L-sTuyA(s8myN-sI%tg=SN3IZf$LS9UC*8Ri{PH4|TH(2FVqRD5K}1OSwYT@V z3^VzS8#m&m(%(-s`d&oPRSs`@SH(n6hi6g~5~Tf)_KGTv)Ya9CP{nnObsUxp$@F)9 zUP?(xJ(}-LZMB3S_CwMKb295lL`1|zgpinc$TlEcN)j87^g8l;W=8sGe?14b<^jBt z0BPKx@MRapLTJSO?!Xr1DYIO^K7`i){Y1F7zWyRYBkI9HFYcGz+S;0H+3~!!JV!N^ z8BSKxbSi@NUL*6qhL_hJho3d^4Gj(WNReKd)M`~yVj{s9H65LD)7h!$$=;X~zt@IY z`bl!~mC&)0<)0cTk7~zpMI_g>DWD?Y#OK_-P&~4mS(*2Y3eAeAl2+FE0ni40-y61J) z;4zEp+pEY>k)cq2Ztew!B*mFY2oz_neOW)dSW`tuwqS zvFK_iE}YT+y=B7E;#KxU#c7qcp`n)?92^Tv!v#K-39nx1*f+${i{3|aJ=Z7LPx`)n zOYeCjH2CVap?tb}?v6CdikO~H7u~+f&SjZJvSWJI+6crY7Km2-OWuoz@ z7F`k}zFKTte>p8J4Z5JUgE25x*VJFT#N&geZPBKxk`guops1L2W?b(fiz+rAuF72I z-Q}@Xdd1NqH0c)#_r@$DVlX4PDO*U>(Aa2hZT%EFWajs`1b9Q4B5%j>y7Nfs$B&_U z9G5w9?iSS4=q0NiSfFKg3l=dq;#gl%Q8D5g$0%|6wCV6ybV9;KsH-8eF#Xl^M}yfU z$W;l6rV&?IQ2({Pq%Yq^s06u4TXPdpi9v;E;CQL)nsJCI)$C@ z-^Wc!PJWS^n%bE@`{Sd{;&Mq-HUO}lm>gx4%tJ>Fy5uusS$FZ&Ook+heJ5f^Mp%73zvERb?Gkeypgt9woyp_Q`heCJq0i3yr%YhFaR% zS>=VrT~|b`3ByAs{P&HgEvyU-Xd1hT2{#g0)L6N>)$yY$D+SyazsnwIMC9eMIZS>s zPCnc2lVCwGSAm6v#c$S(nEwDE$s12`C*UR@5M6JOM!t4-M&Ex<$7ZxzOgg&WbfzjJ zLqx@S9eHSBA!TA>!VhHvlza`@nTeCITUo|q^t-xayD`=BdwyPyIbQxo^V6!5F0!jj zcKg$xBU=9)tc}+%0`<1WN!p#h&o1`hcj%%r^DZtGR@T1)|1ylP7L~bdibWB-EV}{@V9^=wW?aaeNz~H>amI*2*$>%*xOtj%-Mlz z`71FovGk+L8$lI(5BDGvThk;2HN5tc?LnAJNfm(cxqE=n>Bq-@spx@<+wi7>P7{UY zMn`+A+Mn9JJ@k!V@wj!vV@AvNIZJ_DGbs6t!(2tSgm2DAdk#SBSUNg72J=OyyRWi| zs18|KSuvUf3g+CobI$X<^q5!duTRPW44OGQJ_l?yplbP`$p%^@jL~aBDo=}9NQep) zhWp;Yi#>M@(^VRDFCcch7W?$vT=p(HjH!!%D7kTA=|;0kR$(FWUEe(!6B7oX-K87H zOOHC9)7SVP30~$jiqtO9*(~V3)7&#`8h8@k->?2w*!BKw=PqnSFy$?sg=2-5D|j^o z<25eW(9fZbjdu_CRt@LPIW4)Yg0eK(UMk**qqBbnyl-x4`59~EgIpZLi*FAba!Rdj z|7^{AtvBw2%qyFVE7{=wr^3SszJE%;SnTe$Ppz8?0-YYvMtRB?H4^rlY8!A1Pg4Z6KL7diXS69$0yv&2 z;oHW+rX`0#1wM0pu7)UUy!?ygW}2dOEtRiHfu*B%K`{ zcu-^r5-*R#$H({b)hodTk*1?H(Z}O;lpn2oLc+sk6B>nul2Ad^(@bvf#QnLU>BGXq zTgJv{H8eC1mI_M3wp+h`mH+yX*KHL|3EC61$5W~F<_`)9OYWkl`%PyAXMu-1wt9w! zmRrBSk%;6zsig}%-o!Jgb|m5A;!6Cy+rCm?g$ioCA|oS1GT^MBKp-V8O-@h$40HhUR#n|k;xsO`Xd}EMB4W||R`_dAPtm?Zykb^lZ0wi#YjUMFeGCm- zoww}fZ*g&T{B=V~9rdEZVeB%1kk--9eC>j%rKM<>nRX^&VQPC+aT|1Wf4NoH{dLSW zxCB+!J((qJ{rq|0qm3G7>j2sB1RUS_IX)hroQxkB82Iw#%jR$22=>>;L!Uh(Q3UdI zaw^#)EH~mr)rtH1`c^y|kXjbYQG3@8P2#*V%2QKcZ{J{HhmwyUMNJxO%1%eXz8e~%MK~nPRFrWLb z{RqeLpZRx@F);=10q7V0s9gawKT;zlP?LWC{^pL3q{xMsw$XY|E=BfF4 z7G)~X4d1@y>G(1+G2s&s4ETzIgyuGH#i0}Ty8=~|Py$_&#^&bt7E<@%pC z?f^?lNt{KyUaG33b)M_byStS^(qkh4Qlv^sT?X5NZj?K^W}@o zojZ4?+Mm%Lz`B%ybAsK%rKYC-+SMg}?;diUg5VP2`P0K?uGlL)879@4KyzMOzX=G5 zh|JB+gF(4W&-J{)983E$1;qh|rjsEx{pvMBB$;-=&DOG3!p#!e? zwV$=2v9ZK(JUzXLo4R*#*-`PLfEl2q-o=?}%YVhn|FOycf|Z2|*gxqy69qeXi+j8| zXbT!R?dfn&gw0*qb~9BHq-vhTHho|V5Yph zr^v|Gm2Cz+YUvH+18uOt@ATj$%BpAQLS6BbtY`Wnl>J6Z*iSt$M&ng-!L{SE6b|Lb>_BV z)%(D+(~X^-p*jZtuH|y7JI(Hiw;Z~^=b<}mXv*pP40WnLb(DWvFf>V`CTr~K9MLYW z;8Du4yETJO9y8CKzkTxh^=m?1UEM_KNA5KBupM($WytERB5l1}el~CMvqt)-ycIhI z#S#6(e?JYpsIuM?iU$Z-yq)ccp*Z`e2T3dcA0nGNv?`p{G<{iKQ)rt^?TZ)NXp~=; z)Mlm9wGc?O3YPZI_Ppis!KONUVrgY%TeixZ3p6x#m&TgxhS|mZ4la-}hy~^3uvm8| zo4X|nPzRo)U6Ex?Ivn?$+)Vpw(u>&NO0pxivcl@Ia-sH}#wLEm`LBQX1>5KAa}M|P z^sshz+OfwNzH_<|i~X2?C{f9w7>*k6{KdN`#UQn8z*$)fOI*nTlHp-cWulV6)ADjO zJey4fizmo}?#xOP_pkerlsK$&IjJmZj!y4Et(GO*t%5wvA+kZ#zWSS7xc^sT^bxnY zZ8e#x+YA3S9;ai+o#y+>>FQ?a3R|O}&s~C^QBqY~`jI~V0+toykbo{W{&3A8v~NB~ zkYVD7+1XiqQqudfvggSN2cys4mIgb!h_=r+-(UF>boBLq*qj2S{^By2{xxQvutTw#i$f< zJnLBMP^v@rin5<3FL}hnbS!~uXq>oSzjd#SQ1dL)5 z5TJyWk+ZdB1Fz9tA_h0?+4E;FgExg3luJkyK_F!xtg$q6{8b(va)+@hStBDlFwUhu zyLP0!u&~&srl#HRBp7Ep;vzKj!oa`^I-tWqTr$vQ3k8fhJroxgmzpK{Z)LL8%zcU@ zC`dp+kSy*m0^wQVZoO?g|8z8+%02c(W?o(jaMqF*7R(Vzn=GX~BL0W`bKNPS5I3}p zkEh~=!5%+*_m1(41y4psh8K78!~wI;wa(5?Dah_#BqUrDn_F3lg>-FWiksBgRoB2E z`togq=8+K{ua(2y*M~MXmQWcR zdwcD$lgmaoA!lnkJ-h{167lve9i&+^l_(R8onM=5A}iA)hTy^c6s*XweV*Zn-^RO( zf;@Rz(XgWT($()J?Q2HKgn%Oj8plGoeRdv!#%$O_+XLx)9j#WI+u9Pu%ZGJ#Dqg>F z!^KOunJek%Pb0|US_TInIFO6g8gXh3dx3j134GVJpm))}CFK0U?*z55#diUR1Qumi zAlXb7cD*^_x2-Z=J6xb^`S~fyambc%sS7jn%48GcSe3))6h505DJfAPTg@Tgq)CDZ zjU-z&H5$Yt1e0c)zuI1O&9ZM7nl^n>ICR}#GsZA7CK`l-b>3Ofz^r+DJFZ2U-i-z* z0$?XRP}$yG^J-=@6(IVa2?;&$^lU9J=LIV{1FP0bdrw9N=lJA=$K{ud+wuqrq=E}S zYh4p|<{?}`f+{Nb8@78zF}_M&{lebbI1va4bMbJg;8amhW-+n1`_81LF8TTSA#dK$ zK6Y@>(9{e8Glz5jd<$F$MU>1cuVNO3>s&W^wk$I_AY^d$gbxw8J83^ZF-QuYR!;^P z&iGjI>KCc4*iid?F2^HdKoBEiV~`M7kgR(7_*ncXw;C z?chKHp*AD{*TBRTYX050NJOHZ&dy$lTe+H`vD({kwD4$i`*|qh;qyHh_nF&@JHAqsSzVFYwv) zhC#FqT~1C-oyXJs55;HuA^`NO^mPi!Jgxk<^M(cngoEIE#liI7S!3zP5tq z1Dlb*zpBli$lg-uvA3eX^0W3LGPSS}S!UVsYiqWvb-T8<7N3~-Qnu62nqb%tYgZ!b zk?k^CsH91Pg&w2^X3G z-~j8O9;fenmQvZnZxj!$tT5FG%C}^L&F}cYC6<~G_et$>?YcYoU6p*{$)79UUuU0y z+?M9JjLKgCl|~RHa}Ka;qFxwA6BxMuXJh}1UHxAr*nhgxe>nn19eYyWk9vu9i;W~b zJOsOYdL(7M4tLmaiLV6dns{f8G}zkOva++cZcKkRU6TCdwnza%9G;DhjdC(~@V>~k z?cd)nrmkB-OsrGD;0Zn+Jjn=cm#Q;%4>nH!C9fLI(nDFPH7L1u#x&s`2>FBWh^(AVw#>FyqI|syd7gy7l z&6$qP)#^!RQBgxLN3eDa=*nAgwFp>{Y11Cj$NXrPQiwfqNoa8F?d`pMeKU1SOlanf zn*#1)x+6N8Fm$awrxyY)Qn-suG-SPW;5s4zdQy{^m>>VFA-5kXf5OZ3-5hS%nq_=Jr_~<7k zC7~uGa&Njbe&EzAMc(;sMRA|Nltz-{GByI^03O#l<-|87Kpr%-f{!1)b~W>dVoG(?)C+wUJlPz1;R5|c1XX@w?-3kT%Q zZWpDZAjd!$I8Z28n0as*R$+*^budSb9Cll$$Uu@a>F*s_H`7CTKpKAq9LjwlnKF=i zH8nM6hdYaQM2Dx+|Gw1Cgml0WXJ=rqRSl3U*oTpxh-lYHW!;VF_`*o%4U9Y8E^EZg2=K3n9F6V84Ctu z6hHx#RZ1L}3&MnekM8>H^n0Ogzoy4YuB@y)+Met2xxL*ZG})i4kr}oKM(v5S^M!0w zk)a&SI9~qsmz0c5)5#t!3B8C`)-zx{4QJ<4?h}|>4TPL0ij2ezUOt`d8PeQwey_T$ z#d-;7Oco*oh)UiFIcY+(D*%*@pMnkP2i+6C*cLo$S;lw zNzUDa*S&|%sPo>wc^(Hx9U_k+Z-`wKVH-Ao;Hl*T7P#n)xOVgqW`#&l zK>5y};u8+iAE25}!x;k(u)cl! zR!LfKY-IETasZgnR0@raSaG-suMb%@9>(TX@eB+F`X|4Bjo~H)GcNS<@@k%#U_ipo z#JkXF8W6Z2ZTjxRI2QPt+i5}!q+fU1UBhH9HZ}#zd#cbho6l+u{*lP+p6cKRZQ$zP zod7njoEwKMdZgHRtO5INQc})#!_vg&PVIhiX67{pi2$SJV?~sEU2Sc;Ro5%_c~}-qSd~H3b6Og;HwXXBOM$0UnpF9aM;w*8OY-?@BL?O6wvXxLBmi_M~xrKyuy^T=2 zOMKbr_UppJ`VMEIAt7$)37Zoj{f+JIi`hg(L;@y(2M058JXW2T;MOqe{F>bJFA0 z5Vz#|^93^C1`@L-b{d#RMMr=4x$(WXSJf(_>+gBIy6wlgd%5+N{yn?TX#@zN2y33q zMt8DA7BABQv;kf~el0cq2P$!DZ*|PB`s`qHCNeG#57}89gc-pG7K4~q5HQX)78X3- z6y;e9*+-9ZOD{@{RoAskaa_&>Cxu{Qa|qdnmztQCwS}?;Y-um5oS>>2`xF%vS~?SN zVIe#`JRo}z0st_;-Ow-xBV492#ZDAL;W>=NN^>@~UvIz$4@`K5` zyt1+k*d!QaM1VB}eamomvK~lIK@kE9DBpNwc$hMRjPd>(K?i3T`a{-*0}TL7A0mIf zHBRC*5&|$FG)&wHbAMPiLa?YX&wBCpZ7fVDFava$DP7?ky ziU;Fo5LMV4JM9i@I9S@5n`L6F!xl!$;JhmULA1FZrhjjQqU z@6}m1;6n!HUn0rvlFG`8tvZW;9Sp4R z-bxE7Ondqiu`!cOqwoL*2-t6=DBp*n7@Si9(w@F?Ymln|?uyFF*U8Ap8c}SCig^tU zM$01Xw{As6=DvR)1i4YB2Sc8g;*;8jiFQn3&1i4V>z8n*(O)z^Ea}>tXbOA>P7}x} zBO?TahkU#0%>)gYQD^1k6s!h9rf}ot&5-j7s^R>3qIMG;t|8NF z3fCzfqbmpi@G*h=!LSuq1J&BaWS&!;{}!MBHsJW5S;@aWk+vJi5@q$?DJsL`1qS`cL<$|#8zC5YaW=psZ!3xY(6 zPDJm||Nig0?>^pI@BY?0=lssM_SyT}-`@M2wN6qO{#rMFf-0upP}7xNh4$C2_o#=< z&)u3<2d50w+2x7&wV$j}xkqJKvf18lz6Ll0oiW{$v#S-VD0Pbw^F#ZuYz6JEw4{Ya zB9q^rHA~%Dlv@q-yBU7y(U|r!IOBM37Kmv=5C>c@7fI|po++>+gXG31*pZ=ijy+O? z-R0JS0nwl)rW8!Mw|&PC;=$I#jj_}Cp`p_qXLMKhIh(kBJgpbyqGjEAko!@TTzZI% zd)puvz&Ecs{QPvI4~&fh*RS4C8%dt({H#3c++5ZRA|N6%VrDHX+{hQA*CeS4^#kkmMNgTl5`s}Io$2b=cET^mwp$;0fld+DlYL0LLaHTibz@ykTq zpbuJ2sg>)G@d}2ohlW3(=wS2?wih|ILdCv&kva_Nj}%cYan0ME-`zQBZO&bg@uec) z_tMgy1u1DB4<*SM#?DV~%D1@R7Kry|B|v+3oBaXVTrcTZuC^1MXC|{e<$fUv>3ky# zG>%~?Mq&h!TTXc%8snyf?1KGErByG&)R3LsQto@b6H-A&tpe1BwmwF!iG#hcxocAM z;i#Lkd#qJ9KEnA->TvZqevcPDqa=1uQI5u9BKI_V=Szdkea!AnAG~v6CCiQeWujEM zKW!C~vrvR1H+_9(&~}%!nD5(at6xoZsP2<%#g3RUsX_h6(zK`5)I`U6Ep$JyJhQ3U zxEp*08EX8J5eZzm#pbMBmbtZd#r>qew8r`U?lkxHFx99qAl=8N8SXbfC$b#;EW~bR zs3n-+i=d(ARAf2KcI;b{U%hA z$Zu~PoKfVH65HC0LPNRfhwAZ?vueN1CdWaE8x=2PK3&&EKYr&Z5>1P0sto}!A4;(4 zJ@VNVd?qrCd%Cul@PV3e-t$y=ZrJEp zXOUSaj?R5k_R)}^ZojN&G{!+rr_uSL8{ctVXAte@jqF*-wD1-r>X z<4~qC_k7Co`d;qx)}Niq>5l^i=XjRI@B!P0HlAJ{wpK3W7duxJnp}z-$oqCAO%7yQk52dcAe9-5WW(E@F9r(1|Jk(-+RPM$C!28wX&H&34ozE7(i%VX= z4)FF)QX##Y7yG(v!CtP(d1j|opKE32z%O_tGsyLHuZ-ffwrSbnpn^;8bNSH#;_ipB zS@DZ;`IS;Ol_y)NlY9)I%syBsJ{}CJLt%CW1Rf34$(4@+J~G*<*_UL)XS^&PHrkst z1s=b0D9#f3#{PK_y}kN*i7eo&{tf^#uwId1KbU`PQ95cV7$e-k6qeCf*|>eZ!{KSY z#43oMSkQ>?iN(k7#0gDX1aO-!FxF)uFUUc(^<}x4s*bkUM zSd+AVc{1l$0iJ-0SXu-V=~CTF{Q@oh2{|WwGC+-uK_H$SKS4i~*YX(ga%WY-)?vbCQUntTJ> zYRvhOB0Y(=Vf_@{FL2;IFCi~ea)?1~*bXW53O5Oj-0EgPdsqsPc)F6{la(B%^VnsF zw#9FcFOx<&@kj7MNJ8M1P zHLXTitwLq3;+8%mF3Tt|Ven+Ml0cGiyU@jRecl>?tDb>R5)*^bt6#mfO)!G%B)3?U z#c!?~kL$Y%H0h|N-chqc|0=x&Sl~8y+N$I~lAIM-$gFLi``ETO(E)k0@1#hl`b$97 z=8&lpr>%TU_NOzJr0AyJ3`rOsKUNmdb<4ggx*!rA@+7Z3gAL*=#R$p@w;!V!+p%nWD8Wn;}SEg%UFd5||@!YU_EK>vZeoGisNPfcc; z5Fi`;V@qOHEbuOypEPB3q4QR%%ND*Z%<*;DQAuth#Y((&rmEKRBpRa!Q2mJ=^u0ZJ zDjQoH8nTN{GGA+*>gTo|sJOMldcy9_K$rbCeagU%60YkgswTPxS6CDV5M*ghF#&x* zR7_H1$FwW8dT~xHY9;Ee(va?PHsplNT{>j4TJ3yT%Fg?~;_XO8il*tuX7?ml4O4RMulS|3(+^9l~$^=>)`!$^zlr!0Dd%7n2GNICG~ zRsN()q}WV=I5vTf9s3JVfV~E=!miU_$3_DfuqZkSY%hQv`-aX08%uA6wFmHG2^biz zX)EgMDBZ)dGq~}>fI#m5>-Zb}>s(dL@Bo1QBhrR#5mK!>x^ae&?G+KmUK6UrR^L#q zA{6e%#~z3Y|F=^?@mep^t$8!LqXdeEIoibQ<~HWAJG#EqGPJpqwv;?_T_o-#rB{ zT>(lR#U}luEk}2JKYzTlHZh;>E$(dTg$gU}lZTE(6hsWPOm{vAu#(Yx^(kB1bkJ&{ z80>SlMa})p3s{G3e)VT;pZP65%G6)Hce-+KYO`skWq*vIZ{Yb( zvzQ>>+#!KiMO{sv#y9bAPChw}qpf$b4zfP8v*aP77NGDYegG^BlJ-_FhHP?Xht*bF3i*ZXe<* z_O_D%>+QVOiUPWrz1zBb!HHZG$H!&6TQwG&RpXeL&A`a>kkx)F%JwyS>}XzI!MZlh zE_r-Z?Cx`ZvHM5wVpe+_D42p4f4AgfArUTJwU(PG*;L72k%!ikKpJOI?KRVw(snpX z6Xfbl4=2oho0duir^p2nRDCG0L{t=gTm0tLN6uGKcd&=CEJ$S!;QoF60n{DL!g!`_ zY}?p#&*f-XY-lafA#TY&kob%+QR~F->)=PMAe&%(dQ*ByU-|vD>TifnkEb5JTA$(y zJO9{Y!&xbrM`IILOA|hFKV`2L#C`jfM){6IPvKF9{5vU1LO#b&#nB~`VG7pBFIzl3Z1JQLQ3>t5J7QyAeXrk|>IE zgGFULx2zE|np-9(m7MVs$>&+x*tdebJNP++x2jcc`3SnT zwcv7nG_XOnpYc)8gkQd`R_V*?FdfccT+$tU4NN^7Odm3(ZlMv4AK35BJNX#;` zq|IPf90|iH)@DtrwxCG^kR0(|eGe&{-Vrz>XX_~H)4uO;EppGQE-nkUq?(==C>5|m z$Qm^jn#Dw9#BYkqBJoJ$wfIQYejy^>)lb%V;lBN`4+-^apN@^rHjz|0a?gP=_h%x!16M3F_n;{LAjo@%_C5RFn@XpR946+c@i-AyU6THdNQ;3~SCal%pzO{UR0yJG5AmO;Z{xsBRW1L=j9MeJAQ!0MB$Fiv?u$!aHl&@Q1kvs&n$)4EVswl zMx5D=`X`#da)K14{L*p9nnPnhHGN9=-E=dKQw7Dp1ZAvc7`G5=*n{fuEXbZY4CZfi z>EIlMz6(HJeizq9;<}Ykb$^-kk;n+sOu7koyncpAfi51kncIy%pT^8crS55aGBH_#RvvpI96mh4e*S%Zc(Y-7)14U+huiYvuYc20OSN*hJk1)@_7T02X_1Qk5$(c5b#~&VeYPI>Y_>;eJE8ErFWN55 zmr%Qrub08*uJ8bNkA4#%^sCZZD0d^zx{b!`KVUD#rX%za3x{WAK8?vMQ7qY4J9(a- zD8z!`QbKn<;Rctlfos;$hqJcOW<_btFAkxea1PqwK%am%Kjz190$9ur>lc~b^TbWW z*7VI2ztL^tW&z_Yg*KC|Yc`th4LJblxnu;r{7Gp>RSdBBaig>qAW4GX*Xq&v=BLAS zD$;{=gz!_H==(g{=D*hBU>NVh$L06WyLj(FOTU=-D%xsJ98?SxS~sx)Q2DnpMIY7l zpJf+1L7P|5(qW_Ep16jtmkV*Bnx~jGHS<$N!w|SGu<>V>CI=#{VoR2Nup8GF_s+@Z z3%N|4Sm6_i8;=RrMUCV`=4unl^%mxbK(b_7R+*ohmB`IrG}pWto71i|E;$fhRPCxb znLCWrZA|_n6~#BYX1t!XWca-b6E{8add;Y&sCQfbaDttntN&HCdZ~CmK9t1NKkeJu z65TYr;8alPo#~x$8j{?o@Iajj-SNIL+0z--$rD>@^U>zz=!E#P?C_G4a{+j_%uD+> zn{tA$DTrJ@NA>x?)nMBxVK_a)q~*w*%c`6o7M*8QFUKMLM4CMrw1W4FFba>^Iq@;1 zK@m_o#s@X!(U@c3;I;r4fp*op0=@ zK6qoWuM9l+T@HsioI`GL)ZCI0Nrq^BQy`4nln zu9vI(CTCw=IWs-p@6&3i`O-Z=x%DdkyNFj(`J^J_x9Mwmu|gD)U#Mj&IZclFi`?VQ z`Dz+}dkyq#X7Qps(lbDDyJ{f}U>}Z!w`M%Ys2s;?4k0o#1vAayDhx-u|D2U=bfuKV z9qqQq*@c7}%V(K-I^62?V(bK(gkFBE;h=#Y?6wDwYj)~tt8IdjLGfrZdtS}RdXPnX zw{Tu)lr4X@>zb_)3G|FU#HCS2Mepc#bFUgN0dqr4DSTLOdTF? zmaE50xoqMcpA^^#&@pmoUtlf%_Zmf0ys%BQU9Rs|KzyNX z1;vXmc{PDtM4|JIZ#X36X?9wXX2%s2LZYTW#i~0-iRk!43_7@W$TK=AT)rAmj(c-Q zQn%(;bhcHfLp4S)>)~QY3)Z@$<_Q{3Ki{UFntRnVu5^5d>j#TtgAZGTJyE3^eX@)O zEMtN@pCzWkPAo_hQp}^;zFDoHC(;s_?|W!yXnB~L8TgU8YM>v{>4+CrF>D={v@~}j zksF@@yle7$djwo5om1EdtjcpFawOXJE)bKaSN&id>-oZK z<5yUHhvIszD&11I^G>L~Qeo^l0ucI8*KPm9RH`HaSCe66o8519GS4UrA4`EZc>7`6 znGav5%p|c!?rWOu)AWaR`uOfYFjNS+`6lI@$1_n!5ksr|fiY~Y;^f9=O}4xoW%BL_ z@3tHlSe}Bi2fg_GIF!woZce+W7INC$i+xX9DFI3I{eHX1g{jKuxBuPEf|m2QM6)3Y zzef+q0>8^Q--=Ze^~_lEjV?6U#*;pn!>_*4J>zxUJ?SvDZ67-lzNnMct`uDIDIk;N z{q36x30#;ATv~P={@26)*w;&)GYNb-<$JA#;sE5-f*7*OU=w+4j;E#Nq+%cThDWfR z_MXPkl6}y+(PLj<|Avy(6H3FigAW6^?YUX!c@J|YN1~V*v7z0y71rcJ@xhqXk72)d zZ1m;cTgKeBv?`O-VwHgqbxZ_F$W6IcPnsp?Zc@c4ovk2oc4?(=(B^;SBEmERf$ zv4UEI!Qx1il(jerWCsxkUMz7t8x+FY79k~N1qNfi4eI_gLtR5nF&Y=0Y_emfJ6c>V{j-EaR~## zrC?Xt!9iD^g@C|+VVM6V3kZBw76=6LcN+gozANcmNQ$@`1agHS5CVn$TXKKJzgRG- zD?vaoF#L)`80f0qh2g(B{M#Q?>L1x%-2AKNARs~tbV)5B6a$4`kqe20UzQaJ1tKq( z35bA6U9p3}z*mAmV6ZC~81i?Fi~Rq^5D2*_=w*f%w672ZgAi97LJ*+KoeG3VL9b#+ z;J=siZ~Y<2DSAnP~ft7#?3P8AuGFTa? x0==jLPzeE424C#JVA)&$uZ0=8tSq^wmz9T?uZOK2IT#87!pQ{$RCH9y{|g3h{wn|g delta 6736 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 BP-XxC delta 7250 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 b0&s9Nuy=H|H!%f3;Sd-Mz`-G{ECcu-C(36y diff --git a/Doc/source/ecrire/5.1/EquationPremierDegre51-answer.tex b/Doc/source/ecrire/5.1/EquationPremierDegre51-answer.tex new file mode 100644 index 00000000..e5bdf2bb --- /dev/null +++ b/Doc/source/ecrire/5.1/EquationPremierDegre51-answer.tex @@ -0,0 +1,7 @@ +\exercice* + +\begin{align*} + (( calculs|join("\n") )) +\end{align*} + +(( conclusion )) diff --git a/Doc/source/ecrire/5.1/EquationPremierDegre51-statement.tex b/Doc/source/ecrire/5.1/EquationPremierDegre51-statement.tex new file mode 100644 index 00000000..d4d42f7e --- /dev/null +++ b/Doc/source/ecrire/5.1/EquationPremierDegre51-statement.tex @@ -0,0 +1,4 @@ +\exercice + +Déterminer les solutions de l'équation $(( a )) x (( "%+d"|format(b) ))= (( c )) x (( "%+d"|format(d) ))$. +Si nécessaire, les solutions seront arrondies au centième. diff --git a/Doc/source/ecrire/5.1/equation51.py b/Doc/source/ecrire/5.1/equation51.py new file mode 100644 index 00000000..6c98331c --- /dev/null +++ b/Doc/source/ecrire/5.1/equation51.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +# +# Pyromaths +# +# Un programme en Python qui permet de créer des fiches d'exercices types de +# mathématiques niveau collège ainsi que leur corrigé en LaTeX. +# +# Copyright (C) 2018 -- Louis Paternault (spalax+python@gresille.org) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +"""Équations du premier degré""" + +import random + +from pyromaths.ex import Jinja2Exercice +from pyromaths.outils.decimaux import decimaux, suppr0 + +class EquationPremierDegre51(Jinja2Exercice): + + description = u"Résolution d'équations du premier degré à coefficients entiers." + level = u'3.Troisième' + + def __init__(self): + super(EquationPremierDegre51, self).__init__() + + a = random.choice([1, -1]) * random.randint(2, 9) + b = random.choice([1, -1]) * random.randint(2, 9) + c = random.choice([1, -1]) * random.randint(2, 9) + d = random.choice([1, -1]) * random.randint(2, 9) + + calculs = [ + r"{a}x{b:+d} &= {c}x{d:+d}\\".format(a=a, b=b, c=c, d=d), + r"{a}x{c:+d}x &= {d}{b:+d}\\".format(a=a, b=-b, c=-c, d=d), + ] + if a-c == 0: + calculs.append(r"0 &= {}\\".format(d-b)) + if d == b: + conclusion = u"Puisque $0=0$ est toujours vrai, alors l'équation a une infinité de solutions : tous les nombres réels sont des solutions." + else: + conclusion = u"Puisque $0={}$ est toujours faux, alors l'équation n'a aucune solution.".format(d-b) + elif a-c == -1: + calculs.append(r"-x &= {}\\".format(d-b)) + calculs.append(r"(-1)\times -x&= (-1)\times {}\\".format(d-b)) + calculs.append(r"x&={}\\".format(b-d)) + conclusion = r"L'unique solution est $x = {}$.".format(b-d) + elif a-c == 1: + calculs.append(r"x &= {}\\".format(d-b)) + conclusion = r"L'unique solution est $x = {}$.".format(d-b) + else: + calculs.append(r"{}x &= {}\\".format(a-c, d-b)) + calculs.append(r"x&=\frac{{ {} }}{{ {} }}\\".format(d-b, a-c)) + solution = decimaux(suppr0(round(float(d-b)/float(a-c), 2))) + if 100*(float(d-b)/float(a-c)) == int(100 * float(d-b)/float(a-c)): + calculs.append(r"x&={}\\".format(solution)) + conclusion = r"L'unique solution est $x = {}$.".format(solution) + else: + calculs.append(r"x&\approx{}\\".format(solution)) + conclusion = r"L'unique solution est $x \approx {}$.".format(solution) + self.context = { + "a": a, + "b": b, + "c": c, + "d": d, + "calculs": calculs, + "conclusion": conclusion, + } diff --git a/Doc/source/ecrire/5.2/EquationPremierDegre52-answer.tex b/Doc/source/ecrire/5.2/EquationPremierDegre52-answer.tex new file mode 100644 index 00000000..97229cf8 --- /dev/null +++ b/Doc/source/ecrire/5.2/EquationPremierDegre52-answer.tex @@ -0,0 +1,41 @@ +\exercice* + +\begin{align*} + (( a )) x (( "%+d"|format(b) )) &= (( c )) x (( "%+d"|format(d) )) \\ + (( a )) x (( "%+d"|format(-c) ))x &= (( d )) (( "%+d"|format(-b) )) \\ + (* if a == c *) + 0 &= (( d - b )) \\ + (* else *) + (* if a - c == 1 *) + % Rien + (* elif a - c == -1 *) + -x &= (( d - b )) \\ + -1 \times -x &= -1 \times (( d - b )) \\ + (* else *) + (( a - c )) x &= (( d - b )) \\ + x &= \frac{(( d - b ))}{(( a - c ))} \\ + (* endif *) + x & + (* if 100*(d-b)/(a-c) == (100*(d-b)/(a-c))|int *) + = + (* else *) + \approx + (* endif *) + (( ((d-b)/(a-c)) | round(2) | suppr0 | decimaux )) + (* endif *) +\end{align*} + +(* if a == c and b == d *) + Puisque $0=0$ est toujours vrai, l'équation a une infinité de solutions : tous les nombres réels. +(* elif a == c and b != d *) + Puisque $0=((d - b))$ est toujours faux, l'équation n'a pas de solutions. +(* else *) + L'unique solution est + $x + (* if 100*(d-b)/(a-c) == (100*(d-b)/(a-c))|int *) + = + (* else *) + \approx + (* endif *) + (( ((d-b)/(a-c)) | round(2) | suppr0 | decimaux ))$. +(* endif *) diff --git a/Doc/source/ecrire/5.2/EquationPremierDegre52-statement.tex b/Doc/source/ecrire/5.2/EquationPremierDegre52-statement.tex new file mode 100644 index 00000000..d4d42f7e --- /dev/null +++ b/Doc/source/ecrire/5.2/EquationPremierDegre52-statement.tex @@ -0,0 +1,4 @@ +\exercice + +Déterminer les solutions de l'équation $(( a )) x (( "%+d"|format(b) ))= (( c )) x (( "%+d"|format(d) ))$. +Si nécessaire, les solutions seront arrondies au centième. diff --git a/Doc/source/ecrire/5.2/equation52.py b/Doc/source/ecrire/5.2/equation52.py new file mode 100644 index 00000000..4676b285 --- /dev/null +++ b/Doc/source/ecrire/5.2/equation52.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# +# Pyromaths +# +# Un programme en Python qui permet de créer des fiches d'exercices types de +# mathématiques niveau collège ainsi que leur corrigé en LaTeX. +# +# Copyright (C) 2018 -- Louis Paternault (spalax+python@gresille.org) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +"""Équations du premier degré""" + +import random + +from pyromaths.ex import Jinja2Exercice +from pyromaths.outils.decimaux import decimaux, suppr0 + +class EquationPremierDegre52(Jinja2Exercice): + + description = u"Résolution d'équations du premier degré à coefficients entiers." + level = u'3.Troisième' + + def __init__(self): + super(EquationPremierDegre52, self).__init__() + + self.context = { + "a": random.choice([1, -1]) * random.randint(2, 9), + "b": random.choice([1, -1]) * random.randint(2, 9), + "c": random.choice([1, -1]) * random.randint(2, 9), + "d": random.choice([1, -1]) * random.randint(2, 9), + } + + @property + def environment(self): + environment = super(EquationPremierDegre52, self).environment + environment.filters.update({ + 'decimaux': decimaux, + 'suppr0': suppr0, + }) + return environment diff --git a/Doc/source/ecrire/5.3/EquationPremierDegre53-answer.tex b/Doc/source/ecrire/5.3/EquationPremierDegre53-answer.tex new file mode 100644 index 00000000..86433ef0 --- /dev/null +++ b/Doc/source/ecrire/5.3/EquationPremierDegre53-answer.tex @@ -0,0 +1,24 @@ +\exercice* + +\begin{align*} + (( a )) x (( "%+d"|format(b) )) &= (( c )) x (( "%+d"|format(d) )) \\ + (( a )) x (( "%+d"|format(-c) ))x &= (( d )) (( "%+d"|format(-b) )) \\ + (( a - c )) x &= (( d - b )) \\ + x &= \frac{(( d - b ))}{(( a - c ))} \\ + x & + (* if 100*(d-b)/(a-c) == (100*(d-b)/(a-c))|int *) + = + (* else *) + \approx + (* endif *) + (( ((d-b)/(a-c)) | round(2) | suppr0 | decimaux )) +\end{align*} + +L'unique solution est +$x +(* if 100*(d-b)/(a-c) == (100*(d-b)/(a-c))|int *) + = +(* else *) + \approx +(* endif *) +(( ((d-b)/(a-c)) | round(2) | suppr0 | decimaux ))$. diff --git a/Doc/source/ecrire/5.3/EquationPremierDegre53-statement.tex b/Doc/source/ecrire/5.3/EquationPremierDegre53-statement.tex new file mode 100644 index 00000000..d4d42f7e --- /dev/null +++ b/Doc/source/ecrire/5.3/EquationPremierDegre53-statement.tex @@ -0,0 +1,4 @@ +\exercice + +Déterminer les solutions de l'équation $(( a )) x (( "%+d"|format(b) ))= (( c )) x (( "%+d"|format(d) ))$. +Si nécessaire, les solutions seront arrondies au centième. diff --git a/Doc/source/ecrire/5.3/equation.py b/Doc/source/ecrire/5.3/equation53.py similarity index 77% rename from Doc/source/ecrire/5.3/equation.py rename to Doc/source/ecrire/5.3/equation53.py index c6a78e26..3429ad64 100644 --- a/Doc/source/ecrire/5.3/equation.py +++ b/Doc/source/ecrire/5.3/equation53.py @@ -5,7 +5,7 @@ # Un programme en Python qui permet de créer des fiches d'exercices types de # mathématiques niveau collège ainsi que leur corrigé en LaTeX. # -# Copyright (C) 2018 -- Jérôme Ortais (jerome.ortais@pyromaths.org) +# Copyright (C) 2018 -- Louis Paternault (spalax+python@gresille.org) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -29,19 +29,19 @@ from pyromaths.ex import Jinja2Exercice from pyromaths.outils.decimaux import decimaux, suppr0 -class EquationPremierDegre(Jinja2Exercice): +class EquationPremierDegre53(Jinja2Exercice): description = u"Résolution d'équations du premier degré à coefficients entiers." level = u'3.Troisième' def __init__(self): - super(EquationPremierDegre, self).__init__() + super(EquationPremierDegre53, self).__init__() while True: - a = random.choice([1, -1]) * (random.choice(range(1, 10))) - b = random.choice([1, -1]) * (random.choice(range(1, 10))) - c = random.choice([1, -1]) * (random.choice(range(1, 10))) - d = random.choice([1, -1]) * (random.choice(range(1, 10))) + a = random.choice([1, -1]) * random.randint(2, 9) + b = random.choice([1, -1]) * random.randint(2, 9) + c = random.choice([1, -1]) * random.randint(2, 9) + d = random.choice([1, -1]) * random.randint(2, 9) if abs(a-c) == 1: # 1x ou -1x sera affiché à un moment ou à un autre. Nous excluons ce cas. @@ -60,7 +60,7 @@ def __init__(self): @property def environment(self): - environment = super(EquationPremierDegre, self).environment + environment = super(EquationPremierDegre53, self).environment environment.filters.update({ 'decimaux': decimaux, 'suppr0': suppr0, diff --git a/Doc/source/ecrire/5/1x.png b/Doc/source/ecrire/5/1x.png index c70b5c89b0ee28d50b8908eaca3ff3fe1834ddc0..ae1a518da9208def1fbc2eeed9e7672cd0dc3861 100644 GIT binary patch literal 7780 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 O7ojMtCQ~Y98uTBv`pu{S literal 2985 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 From 8efae8fda1a02a454a15f32b273bd79fbfca53c8 Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 30 May 2018 10:38:49 +0200 Subject: [PATCH 14/26] =?UTF-8?q?[ex.EtastStableSysteme2]=20Utilisation=20?= =?UTF-8?q?de=20la=20commande=20LaTeX=20`\numprint{}`=20plut=C3=B4t=20que?= =?UTF-8?q?=20de=20la=20fonction=20python=20`decimaux()`.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/EtatStableSysteme2-answer.tex | 28 +++++++++---------- .../EtatStableSysteme2-statement.tex | 4 +-- data/ex/tests/EtatStableSysteme2.0.answer | 28 +++++++++---------- data/ex/tests/EtatStableSysteme2.0.statement | 4 +-- src/pyromaths/ex/lycee/matrices.py | 9 ------ 5 files changed, 32 insertions(+), 41 deletions(-) diff --git a/data/ex/templates/EtatStableSysteme2-answer.tex b/data/ex/templates/EtatStableSysteme2-answer.tex index e83179e2..520c4f35 100644 --- a/data/ex/templates/EtatStableSysteme2-answer.tex +++ b/data/ex/templates/EtatStableSysteme2-answer.tex @@ -4,31 +4,31 @@ \begin{align*} P\times M &= \begin{pmatrix}x&y\end{pmatrix}\times \begin{pmatrix} -(( a | decimal )) & (( (1-a) | decimal )) \\ -(( (1-b) | decimal )) & (( b | decimal )) \\ + \numprint{(( a ))} & \numprint{(( 1-a ))} \\ + \numprint{(( 1-b ))} & \numprint{(( b ))} \\ \end{pmatrix}\\ &= \begin{pmatrix} -(( a | decimal )) x + (( (1-b) | decimal )) y & (( (1-a) | decimal )) x + (( b | decimal )) y + \numprint{(( a ))} x + \numprint{(( 1-b ))} y & \numprint{(( 1-a ))} x + \numprint{(( b ))} y \end{pmatrix} \end{align*} -Or $\begin{pmatrix}x&y\end{pmatrix}=P=P\times M$, donc les coefficients des matrices sont deux à deux égaux, donc $x=(( a | decimal )) x + (( (1-b) | decimal )) y$. +Or $\begin{pmatrix}x&y\end{pmatrix}=P=P\times M$, donc les coefficients des matrices sont deux à deux égaux, donc $x=\numprint{(( a ))} x + \numprint{(( 1-b ))} y$. D'autre part, puisque $P$ est un état probabiliste, alors $x+y=1$, donc $y=1-x$. Donc, en remplaçant $y$ par $1-x$ dans l'équation précédente, on obtient : \begin{align*} -x &= (( a | decimal )) x + (( (1-b) | decimal )) (1-x) \\ -x &= (( a | decimal )) x + (( (1-b) | decimal )) - (( (1-b) | decimal ))x\\ -x-(( a | decimal )) x +(( (1-b) | decimal ))x &= (( (1-b) | decimal ))\\ -(1-(( a | decimal ))+(( (1-b) | decimal )))x &= (( (1-b) | decimal ))\\ -(( (2-a-b) | decimal )) x &= (( (1-b) | decimal ))\\ -x &= \frac{(( (1-b) | decimal ))}{(( (2-a-b) | decimal ))}\\ -x &= (( ((1-b)/(2-a-b)) | decimal )) + x &= \numprint{(( a ))} x + \numprint{(( 1-b ))} (1-x) \\ + x &= \numprint{(( a ))} x + \numprint{(( 1-b ))} - \numprint{(( 1-b ))}x\\ + x-\numprint{(( a ))} x +\numprint{(( 1-b ))}x &= \numprint{(( 1-b ))}\\ + (1-\numprint{(( a ))}+\numprint{(( 1-b ))})x &= \numprint{(( 1-b ))}\\ + \numprint{(( 2-a-b ))} x &= \numprint{(( 1-b ))}\\ + x &= \frac{\numprint{(( 1-b ))}}{\numprint{(( 2-a-b ))}}\\ +x &= \numprint{(( ((1-b)/(2-a-b)) ))} \end{align*} -Enfin, puisque $y=1-x$, alors $y=1-(( ((1-b)/(2-a-b)) | decimal ))=(( ((1-a)/(2-a-b)) | decimal ))$. +Enfin, puisque $y=1-x$, alors $y=1-\numprint{(( ((1-b)/(2-a-b)) ))}=\numprint{(( ((1-a)/(2-a-b)) ))}$. L'unique état stable de ce graphe est donc $\begin{pmatrix} -(( ((1-b)/(2-a-b)) | decimal )) & -(( ((1-a)/(2-a-b)) | decimal )) +\numprint{(( ((1-b)/(2-a-b)) ))} & +\numprint{(( ((1-a)/(2-a-b)) ))} \end{pmatrix}$. diff --git a/data/ex/templates/EtatStableSysteme2-statement.tex b/data/ex/templates/EtatStableSysteme2-statement.tex index 7590c27e..6b8f2f41 100644 --- a/data/ex/templates/EtatStableSysteme2-statement.tex +++ b/data/ex/templates/EtatStableSysteme2-statement.tex @@ -3,8 +3,8 @@ \[ M=\begin{pmatrix} -(( a | decimal )) & (( (1-a) | decimal )) \\ -(( (1-b) | decimal )) & (( b | decimal )) \\ + \numprint{(( a ))} & \numprint{(( 1-a ))} \\ + \numprint{(( 1-b ))} & \numprint{(( b ))} \\ \end{pmatrix} \] diff --git a/data/ex/tests/EtatStableSysteme2.0.answer b/data/ex/tests/EtatStableSysteme2.0.answer index deb8dbcb..08de5eaa 100644 --- a/data/ex/tests/EtatStableSysteme2.0.answer +++ b/data/ex/tests/EtatStableSysteme2.0.answer @@ -4,31 +4,31 @@ Puisque $P$ est l'état stable, alors $P=P\times M$. \begin{align*} P\times M &= \begin{pmatrix}x&y\end{pmatrix}\times \begin{pmatrix} -0,95 & 0,05 \\ -0,45 & 0,55 \\ + \numprint{0.95} & \numprint{0.05} \\ + \numprint{0.45} & \numprint{0.55} \\ \end{pmatrix}\\ &= \begin{pmatrix} -0,95 x + 0,45 y & 0,05 x + 0,55 y + \numprint{0.95} x + \numprint{0.45} y & \numprint{0.05} x + \numprint{0.55} y \end{pmatrix} \end{align*} -Or $\begin{pmatrix}x&y\end{pmatrix}=P=P\times M$, donc les coefficients des matrices sont deux à deux égaux, donc $x=0,95 x + 0,45 y$. +Or $\begin{pmatrix}x&y\end{pmatrix}=P=P\times M$, donc les coefficients des matrices sont deux à deux égaux, donc $x=\numprint{0.95} x + \numprint{0.45} y$. D'autre part, puisque $P$ est un état probabiliste, alors $x+y=1$, donc $y=1-x$. Donc, en remplaçant $y$ par $1-x$ dans l'équation précédente, on obtient : \begin{align*} -x &= 0,95 x + 0,45 (1-x) \\ -x &= 0,95 x + 0,45 - 0,45x\\ -x-0,95 x +0,45x &= 0,45\\ -(1-0,95+0,45)x &= 0,45\\ -0,5 x &= 0,45\\ -x &= \frac{0,45}{0,5}\\ -x &= 0,9 + x &= \numprint{0.95} x + \numprint{0.45} (1-x) \\ + x &= \numprint{0.95} x + \numprint{0.45} - \numprint{0.45}x\\ + x-\numprint{0.95} x +\numprint{0.45}x &= \numprint{0.45}\\ + (1-\numprint{0.95}+\numprint{0.45})x &= \numprint{0.45}\\ + \numprint{0.5} x &= \numprint{0.45}\\ + x &= \frac{\numprint{0.45}}{\numprint{0.5}}\\ +x &= \numprint{0.9} \end{align*} -Enfin, puisque $y=1-x$, alors $y=1-0,9=0,1$. +Enfin, puisque $y=1-x$, alors $y=1-\numprint{0.9}=\numprint{0.1}$. L'unique état stable de ce graphe est donc $\begin{pmatrix} -0,9 & -0,1 +\numprint{0.9} & +\numprint{0.1} \end{pmatrix}$. \ No newline at end of file diff --git a/data/ex/tests/EtatStableSysteme2.0.statement b/data/ex/tests/EtatStableSysteme2.0.statement index 1695b76f..b77a24c2 100644 --- a/data/ex/tests/EtatStableSysteme2.0.statement +++ b/data/ex/tests/EtatStableSysteme2.0.statement @@ -3,8 +3,8 @@ On considère un graphe probabiliste d'ordre 2, dont la matrice de transition es \[ M=\begin{pmatrix} -0,95 & 0,05 \\ -0,45 & 0,55 \\ + \numprint{0.95} & \numprint{0.05} \\ + \numprint{0.45} & \numprint{0.55} \\ \end{pmatrix} \] diff --git a/src/pyromaths/ex/lycee/matrices.py b/src/pyromaths/ex/lycee/matrices.py index 43f4d517..b3a4848e 100644 --- a/src/pyromaths/ex/lycee/matrices.py +++ b/src/pyromaths/ex/lycee/matrices.py @@ -25,7 +25,6 @@ """Exercice de Terminale ES, spécialité : Déterminer un état stable en utilisant un système.""" import random -from pyromaths.outils.decimaux import decimaux from pyromaths.ex import Jinja2Exercice # Liste des coefficients de la diagonale de la matrice de transition qui @@ -70,11 +69,3 @@ def __init__(self): "a": ab[0], "b": ab[1], } - - @property - def environment(self): - environment = super(EtatStableSysteme2, self).environment - environment.filters.update({ - 'decimal': decimaux, - }) - return environment From 8796c5c7893f5d8c0d1aa0176f5f23a6beb1014d Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 30 May 2018 11:12:00 +0200 Subject: [PATCH 15/26] =?UTF-8?q?[doc]=20Utilisation=20de=20la=20commande?= =?UTF-8?q?=20LaTeX=20`\numprint{}`=20plut=C3=B4t=20que=20de=20la=20comman?= =?UTF-8?q?de=20Python=20`decimaux()`.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/source/ecrire.rst | 20 +++++++++--------- .../ecrire/3/EquationPremierDegre3-answer.tex | 4 ++-- Doc/source/ecrire/3/corrige.png | Bin 8735 -> 8623 bytes Doc/source/ecrire/3/exercice.pdf | Bin 25580 -> 25488 bytes .../ecrire/4/EquationPremierDegre4-answer.tex | 4 ++-- Doc/source/ecrire/4/equation4.py | 3 +-- Doc/source/ecrire/5.1/equation51.py | 12 +++++------ .../5.2/EquationPremierDegre52-answer.tex | 4 ++-- Doc/source/ecrire/5.2/equation52.py | 3 +-- .../5.3/EquationPremierDegre53-answer.tex | 4 ++-- Doc/source/ecrire/5.3/equation53.py | 3 +-- 11 files changed, 27 insertions(+), 30 deletions(-) diff --git a/Doc/source/ecrire.rst b/Doc/source/ecrire.rst index a46c44d2..3d06ba83 100644 --- a/Doc/source/ecrire.rst +++ b/Doc/source/ecrire.rst @@ -163,9 +163,9 @@ Dans cette partie, pour générer l'exercice et suivre votre travail, la command .. code-block:: shell - $ utils/pyromaths-cli.py generate EquationPremierDegre3:33 + $ utils/pyromaths-cli.py generate EquationPremierDegre3:2 -Remarquez que par rapport à la commande utilisée dans la partie précédente, un ``:33`` a été ajouté à la fin de la ligne. Il correspond à la graine (`seed`) du générateur pseudo-aléatoire. +Remarquez que par rapport à la commande utilisée dans la partie précédente, un ``:2`` a été ajouté à la fin de la ligne. Il correspond à la graine (`seed`) du générateur pseudo-aléatoire. .. note:: @@ -175,11 +175,11 @@ Remarquez que par rapport à la commande utilisée dans la partie précédente, Nous gardons le même système, mais au lieu de commencer à la première décimale de π, nous utilisons désormais sur l'heure courante : si le programme est lancé à 13h37, nous utilisons alors les décimales de π à partir de la 1337e. Ainsi, deux exécutions successives donneront deux exercices différents. - C'est mieux. Mais quand nous créerons notre exercices, nous allons générer encore et encore un exercice, et nous aimerions toujours générer le même (cela facilitera le développement, pour ne pas être perturbé par des valeurs numériques qui changent ; pour qu'un bug introduit par une valeur numérique spécifique n'apparaisse et ne disparaisse pas aléatoirement). Du coup, nous imposons le début de la séquence aléatoire : c'est la signification du ``:33`` ajouté à la fin de la ligne de commande. + C'est mieux. Mais quand nous créerons notre exercices, nous allons générer encore et encore un exercice, et nous aimerions toujours générer le même (cela facilitera le développement, pour ne pas être perturbé par des valeurs numériques qui changent ; pour qu'un bug introduit par une valeur numérique spécifique n'apparaisse et ne disparaisse pas aléatoirement). Du coup, nous imposons le début de la séquence aléatoire : c'est la signification du ``:2`` ajouté à la fin de la ligne de commande. C'est un peu plus compliqué en réalité, mais dans les grande lignes, c'est ainsi qu'un ordinateur génère du hasard. Plus d'informations, par exemple, dans l'article de Wikipédia `Pseudorandom generator `__. -Si nous voulons générer un autre exercice, il suffit de transformer le ``EquationPremierDegre3:33`` en ``EquationPremierDegre3:1729``, ``EquationPremierDegre3:0123456789``, ou n'importe quel nombre de votre choix. +Si nous voulons générer un autre exercice, il suffit de transformer le ``EquationPremierDegre3:2`` en ``EquationPremierDegre3:1729``, ``EquationPremierDegre3:0123456789``, ou n'importe quel nombre de votre choix. Code Python ----------- @@ -241,7 +241,7 @@ Cette option permet de définir des commandes (du shell) qui seront executées s Bilan ----- -Nous avons produit l'exercice :download:`exercice.pdf `. Il fonctionne, mais il y a un petit problème dans le corrigé : le résultat (arrondi) est écrit à l'anglaise, avec un point au lieu d'une virgule. De plus, même dans le cas d'une solution exacte, le signe :math:`\approx` est utilisé. +Nous avons produit l'exercice :download:`exercice.pdf `. Il fonctionne, mais il y a deux problèmes dans le corrigé : d'une part, alors que la solution est exacte, le signe :math:`\approx` est utilisé ; d'autre part, bien que la solution soit entière, le code a produit ``3,0`` plutôt que ``3``. .. figure:: ecrire/3/corrige.png :align: center @@ -253,7 +253,7 @@ Structures de contrôle, et `filters` personnalisés Deux problèmes existent dans le corrigé défini précédemment. -- Le nombre à virgule est écrit avec un point et, dans le cas d'un résultat entier (ce qui n'est pas le cas ici), le code produit ``2.0`` plutôt que ``2`` (cela est dû à Python qui manipule des flottants, et écrit donc la première version pour insister sur le type flottant plutôt qu'entier). +- Le code produit ``3,0`` plutôt que ``3`` (cela est dû à Python qui manipule des flottants, et écrit donc la première version pour insister sur le type flottant plutôt qu'entier). - Le signe utilisé pour donner la solution est :math:`\approx`, que la solution soit exacte ou non. `Filters` personnalisés @@ -261,16 +261,16 @@ Deux problèmes existent dans le corrigé défini précédemment. .. currentmodule:: pyromaths.outils.decimaux -Heureusement, deux fonctions du module :mod:`pyromaths.outils.decimaux` existent dans Pyromaths pour corriger le premier problème : :func:`suppr0` permet de supprimer le `.0` à la fin d'un flottant lorsque c'est utile, et :func:`decimaux` permet de représenter un nombre décimal en respectant les conventions françaises. Encore faut-il que ces fonctions soient accessibles depuis le `template` LaTeX. +Heureusement, une fonction du module :mod:`pyromaths.outils.decimaux` existe pour corriger le premier problème : :func:`suppr0` permet de supprimer le `.0` à la fin d'un flottant lorsque c'est utile. Encore faut-il que cette fonction soit accessible depuis le `template` LaTeX. Ajoutons la méthode suivante à la classe :class:`~pyromaths.ex.troisiemes.equation.EquationPremierDegre4` : .. literalinclude:: ecrire/4/equation4.py :linenos: :lineno-start: 47 - :lines: 47-54 + :lines: 47-53 -Celle-ci a pour effet d'ajouter à l'environnement jinja2 les deux fonctions :func:`suppr0` et :func:`decimaux` comme des `filters`, qui sont alors accessibles depuis le `template`. +Celle-ci a pour effet d'ajouter à l'environnement jinja2 la fonction :func:`suppr0` comme un `filter`, qui est alors accessible depuis le `template`. .. literalinclude:: ecrire/4/EquationPremierDegre4-answer.tex :language: latex @@ -343,7 +343,7 @@ Puisque les cas particuliers sont traités avec Jinja2, le code Python est rédu .. literalinclude:: ecrire/5.2/equation52.py :linenos: :lineno-start: 32 - :lines: 32-54 + :lines: 32-53 Le code LaTeX, en revanche, est plus fourni. diff --git a/Doc/source/ecrire/3/EquationPremierDegre3-answer.tex b/Doc/source/ecrire/3/EquationPremierDegre3-answer.tex index df0f767c..cbd1becd 100644 --- a/Doc/source/ecrire/3/EquationPremierDegre3-answer.tex +++ b/Doc/source/ecrire/3/EquationPremierDegre3-answer.tex @@ -5,7 +5,7 @@ (( a )) x (( "%+d"|format(-c) ))x &= (( d )) (( "%+d"|format(-b) )) \\ (( a - c )) x &= (( d - b )) \\ x &= \frac{(( d - b ))}{(( a - c ))} \\ - x &\approx (( ((d-b)/(a-c)) | round(2) )) + x &\approx \numprint{(( ((d-b)/(a-c)) | round(2) ))} \end{align*} -L'unique solution est $x\approx(( ((d-b)/(a-c)) | round(2) ))$. +L'unique solution est $x\approx\numprint{(( ((d-b)/(a-c)) | round(2) ))}$. diff --git a/Doc/source/ecrire/3/corrige.png b/Doc/source/ecrire/3/corrige.png index 4ac176f27570fc65b24490009000708095f2d9ce..5b4689b227835d1e61cb85a18629200468b57601 100644 GIT binary patch literal 8623 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 Date: Tue, 12 Jun 2018 22:14:59 +0200 Subject: [PATCH 16/26] =?UTF-8?q?Nouvel=20exercice=20:=20Bilan=20des=20tri?= =?UTF-8?q?n=C3=B4mes.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La fonction pyromaths.outils.jinja2.facteur a été enrichie. La documentation a été modifiée en conséquence. --- Doc/source/ecrire.rst | 183 ++++++++---- .../ecrire/4/EquationPremierDegre4-answer.tex | 4 +- Doc/source/ecrire/4/equation4.py | 9 - Doc/source/ecrire/4/exercice.pdf | Bin 25403 -> 25270 bytes Doc/source/ecrire/5/1x.png | Bin 7780 -> 0 bytes .../EquationPremierDegre5-answer.tex} | 4 +- .../EquationPremierDegre5-statement.tex} | 0 Doc/source/ecrire/5/equation5.py | 53 ++++ Doc/source/ecrire/5/exercice.pdf | Bin 0 -> 24809 bytes .../EquationPremierDegre61-answer.tex} | 0 .../EquationPremierDegre61-statement.tex} | 0 .../{5.1/equation51.py => 6.1/equation61.py} | 16 +- .../EquationPremierDegre62-answer.tex} | 4 +- .../EquationPremierDegre62-statement.tex} | 0 .../{5.2/equation52.py => 6.2/equation62.py} | 10 +- .../6.3/EquationPremierDegre63-answer.tex | 24 ++ .../6.3/EquationPremierDegre63-statement.tex | 4 + .../{5.3/equation53.py => 6.3/equation63.py} | 10 +- Doc/source/ecrire/6/1x.png | Bin 0 -> 14259 bytes Doc/source/ecrire/install.sh | 20 ++ Doc/source/pyromaths.exemples.rst | 129 +++++++++ Doc/source/pyromaths.outils.jinja2.rst | 9 + Doc/source/pyromaths.outils.rst | 1 + data/ex/img/BilanTrinomeSansDiscriminant.png | Bin 0 -> 12670 bytes data/ex/img/md5sum.json | 1 + .../BilanTrinomeSansDiscriminant-answer.tex | 137 +++++++++ ...BilanTrinomeSansDiscriminant-statement.tex | 26 ++ .../BilanTrinomeSansDiscriminant.0.answer | 122 ++++++++ .../BilanTrinomeSansDiscriminant.0.statement | 26 ++ .../BilanTrinomeSansDiscriminant.1.answer | 122 ++++++++ .../BilanTrinomeSansDiscriminant.1.statement | 26 ++ src/pyromaths/ex/lycee/seconddegre.py | 88 ++++++ src/pyromaths/outils/jinja2.py | 263 ++++++++++++++++++ 33 files changed, 1199 insertions(+), 92 deletions(-) delete mode 100644 Doc/source/ecrire/5/1x.png rename Doc/source/ecrire/{5.3/EquationPremierDegre53-answer.tex => 5/EquationPremierDegre5-answer.tex} (82%) rename Doc/source/ecrire/{5.1/EquationPremierDegre51-statement.tex => 5/EquationPremierDegre5-statement.tex} (100%) create mode 100644 Doc/source/ecrire/5/equation5.py create mode 100644 Doc/source/ecrire/5/exercice.pdf rename Doc/source/ecrire/{5.1/EquationPremierDegre51-answer.tex => 6.1/EquationPremierDegre61-answer.tex} (100%) rename Doc/source/ecrire/{5.2/EquationPremierDegre52-statement.tex => 6.1/EquationPremierDegre61-statement.tex} (100%) rename Doc/source/ecrire/{5.1/equation51.py => 6.1/equation61.py} (85%) rename Doc/source/ecrire/{5.2/EquationPremierDegre52-answer.tex => 6.2/EquationPremierDegre62-answer.tex} (90%) rename Doc/source/ecrire/{5.3/EquationPremierDegre53-statement.tex => 6.2/EquationPremierDegre62-statement.tex} (100%) rename Doc/source/ecrire/{5.2/equation52.py => 6.2/equation62.py} (87%) create mode 100644 Doc/source/ecrire/6.3/EquationPremierDegre63-answer.tex create mode 100644 Doc/source/ecrire/6.3/EquationPremierDegre63-statement.tex rename Doc/source/ecrire/{5.3/equation53.py => 6.3/equation63.py} (89%) create mode 100644 Doc/source/ecrire/6/1x.png create mode 100755 Doc/source/ecrire/install.sh create mode 100644 Doc/source/pyromaths.outils.jinja2.rst create mode 100644 data/ex/img/BilanTrinomeSansDiscriminant.png create mode 100644 data/ex/templates/BilanTrinomeSansDiscriminant-answer.tex create mode 100644 data/ex/templates/BilanTrinomeSansDiscriminant-statement.tex create mode 100644 data/ex/tests/BilanTrinomeSansDiscriminant.0.answer create mode 100644 data/ex/tests/BilanTrinomeSansDiscriminant.0.statement create mode 100644 data/ex/tests/BilanTrinomeSansDiscriminant.1.answer create mode 100644 data/ex/tests/BilanTrinomeSansDiscriminant.1.statement create mode 100644 src/pyromaths/ex/lycee/seconddegre.py create mode 100644 src/pyromaths/outils/jinja2.py diff --git a/Doc/source/ecrire.rst b/Doc/source/ecrire.rst index 3d06ba83..565d1b13 100644 --- a/Doc/source/ecrire.rst +++ b/Doc/source/ecrire.rst @@ -1,3 +1,5 @@ +.. _ecrire: + =================================== Tutoriel : Créer un nouvel exercice =================================== @@ -24,6 +26,24 @@ Cette article décrit la procédure pour créer un nouvel exercice pour Pyromath :local: :depth: 1 +Préambule +========= + +Les personnes pressées peuvent jeter un œil à deux exercices implémentés dans Pyromaths : + +- un exemple simple (avec très peu de cas particuliers) : la recherche d'état stable. + + - :download:`code Python <../../src/pyromaths/ex/lycee/matrices.py>` + - :download:`template de l'énoncé <../../data/ex/templates/EtatStableSysteme2-statement.tex>` + - :download:`template de la solution <../../data/ex/templates/EtatStableSysteme2-answer.tex>` + +- un exemple plus complexe (avec cas particuliers) : bilan sur les polynômes du second degré en seconde. + + - :download:`code Python <../../src/pyromaths/ex/lycee/seconddegre.py>` ; + - :download:`template de l'énoncé <../../data/ex/templates/BilanTrinomeSansDiscriminant-statement.tex>` ; + - :download:`template de la solution <../../data/ex/templates/BilanTrinomeSansDiscriminant-answer.tex>`. + + Prérequis ========= @@ -37,7 +57,7 @@ Connaissances Créer un exercice pour Pyromaths nécessite de savoir utiliser un minimum : -- LaTeX ; +- :math:`LaTeX` ; - Python (version 2) ; - git. @@ -46,7 +66,7 @@ Une connaissance de la bibliothèque Python `jinja2 `__ Outils ------ -Tous les outils nécessaires pour créer un exercice sont des dépendances de Pyromaths. `Installez `__, et faites fonctionner Pyromath : les outils nécessaires pour ce tutoriel seront alors disponibles. +À part `git `__, tous les outils nécessaires pour créer un exercice sont des dépendances de Pyromaths. `Installez `__, et faites fonctionner Pyromath : les outils nécessaires pour ce tutoriel seront alors disponibles. Environnement de travail ======================== @@ -81,19 +101,19 @@ Il sera plus confortable, pour vous comme pour nous, que vous travailliez dans u Brouillon ========= -La première étape est d'écrire un exercice en LaTeX, sans passer par Python, sans aléa : juste pour observer le rendu final. Utilisez l'outil :ref:`pyromaths-cli.py `. +La première étape est d'écrire un exercice en :math:`LaTeX`, sans passer par Python, sans aléa : juste pour observer le rendu final. Utilisez l'outil :ref:`pyromaths-cli.py `. .. code-block:: shell $ utils/pyromaths-cli.py dummy -Cette commande a pour effet de créer un modèle d'exercice, sous la forme d'un PDF qui est affiché à l'écran, et d'un fichier LaTeX :file:`exercices.tex`. +Cette commande a pour effet de créer un modèle d'exercice, sous la forme d'un PDF qui est affiché à l'écran, et d'un fichier :math:`LaTeX` :file:`exercices.tex`. Déplacez ce fichier dans un répertoire temporaire, et modifiez-le pour écrire le sujet de votre énoncé, à la place de ``ÉNONCÉ DE L'EXERCICE`` et ``CORRIGÉ DE L'EXERCICE``. Ne vous souciez pas de la manière dont cela sera intégré à Pyromaths ; ne vous souciez pas de la manière dont l'aléa sera intégré : nous verrons cela plus tard. C'est l'occasion de travailler la formulation de l'énoncé et de la solution pour qu'ils soient le plus clair possible. Ne modifiez que les lignes qui correspondent à l'énoncé ou au corrigé. En particulier, ne modifiez pas le préambule. -Ce fichier doit être compilé avec `latex`, puis converti en pdf avec `dvipdf`. À la fin de cette étape, nous obtenons l'énoncé suivant (:download:`tex `, :download:`pdf `). +Ce fichier doit être compilé avec ``latex``, puis converti en pdf avec ``dvipdf``. À la fin de cette étape, nous obtenons l'énoncé suivant (:download:`tex `, :download:`pdf `). .. literalinclude:: ecrire/1/exercices.tex :language: latex @@ -123,10 +143,10 @@ Modifiez les parties suivantes : - ligne 31 : la description de l'exercice ; - ligne 32 : le niveau de l'exercice (le nombre avant le point sert à trier les niveaux ; celui après le point est le texte qui sera visible à l'utilisateur). -Code LaTeX ----------- +Code :math:`LaTeX` +------------------ -Le code LaTeX, quant à lui, doit être placé dans le répertoire ``data/ex/templates``, dans deux fichiers au nom de votre exercices. Reprenez votre fichier :download:`exercices.tex `, et extrayez les lignes correspondant à l'énoncé, que vous écrivez dans le fichier :download:`EquationPremierDegre2-statement.tex `, et celles correspondant au corrigé dans le fichier :download:`EquationPremierDegre2-answer.tex `. +Le code :math:`LaTeX`, quant à lui, doit être placé dans le répertoire ``data/ex/templates``, dans deux fichiers au nom de votre exercices. Reprenez votre fichier :download:`exercices.tex `, et extrayez les lignes correspondant à l'énoncé, que vous écrivez dans le fichier :download:`EquationPremierDegre2-statement.tex `, et celles correspondant au corrigé dans le fichier :download:`EquationPremierDegre2-answer.tex `. L'énoncé est alors dans le fichier :download:`EquationPremierDegre2-statement.tex `. @@ -184,28 +204,28 @@ Si nous voulons générer un autre exercice, il suffit de transformer le ``Equat Code Python ----------- -Du côté de Python, il faut tirer au hasard quatre nombres entiers entre -10 et 10 (sauf 0 et 1, qui sont des cas particuliers), et les rendre disponible depuis le code LaTeX. Cela se fait avec le contexte. Toutes les variables présentes dans ce dictionnaire seront accessibles depuis le `template` jinja2. +Du côté de Python, il faut tirer au hasard quatre nombres entiers entre -10 et 10 (sauf 0 et 1, qui sont des cas particuliers), et les rendre disponible depuis le code :math:`LaTeX`. Cela se fait avec le contexte. Toutes les variables présentes dans ce dictionnaire seront accessibles depuis le `template` jinja2. .. literalinclude:: ecrire/3/equation3.py :linenos: :lineno-start: 27 :lines: 27-44 -Code LaTeX ----------- +Code :math:`LaTeX` +------------------ -Du côté de LaTeX, nous allons profiter de la bibliothèque jinja2 pour utiliser les variables rendues disponibles dans le contexte. +Du côté de :math:`LaTeX`, nous allons profiter de la bibliothèque jinja2 pour utiliser les variables rendues disponibles dans le contexte. .. note:: Cette note se veut une courte introduction à Jinja2. Pour aller plus loins, rendez-vous sur `le site du projet `__. - Un template jinja2 est du code LaTeX qui sera reproduit tel quel dans le document final, sauf que : + Un template jinja2 est du code :math:`LaTeX` qui sera reproduit tel quel dans le document final, sauf que : - les variables peuvent être évaluées avec des doubles parenthèses. Pour insérer la valeur de la variable ``a`` du contexte, il faut utiliser ``(( a ))`` ; - des structures de contrôle (condition, boucle) peuvent être utilisées entourées par ``(*`` et ``*)``. - Notons que les chaînes définissant ces blocs ont été modifiées par rapport aux chaînes initiales, car trop proches de la syntaxe LaTeX. Ceci est documenté sur `le site officiel `__, et mis en œuvre dans la classe :class:`pyromaths.ex.Jinja2Exercice`. + Notons que les chaînes définissant ces blocs ont été modifiées par rapport aux chaînes initiales, car trop proches de la syntaxe :math:`LaTeX`. Ceci est documenté sur `le site officiel `__, et mis en œuvre dans la classe :class:`pyromaths.ex.Jinja2Exercice`. .. literalinclude:: ../../src/pyromaths/ex/__init__.py :linenos: @@ -229,106 +249,151 @@ La rédaction du corrigé se fait de la même manière, en remarquant que le cod Débuggage --------- -Durant cette phase, il est probable que le code LaTeX produit soit un peu compliqué, et contienne des erreurs. Il serait alors pratique de pouvoir observer (si ce n'est plus) ce code avant compilation. C'est possible avec l'option ``--pipe`` de :ref:`pyromaths-cli.py `. +Durant cette phase, il est probable que le code :math:`LaTeX` produit soit un peu compliqué, et contienne des erreurs. Il serait alors pratique de pouvoir observer (si ce n'est plus) ce code avant compilation. C'est possible avec l'option ``--pipe`` de :ref:`pyromaths-cli.py `. -Cette option permet de définir des commandes (du shell) qui seront executées sur le fichier LaTeX, avant sa compilation. Par exemple : +Cette option permet de définir des commandes (du shell) qui seront executées sur le fichier :math:`LaTeX`, avant sa compilation. Par exemple : - ``--pipe cat`` exécute ``cat FICHIER.tex``, et permet d'observer le fichier avant compilation ; - ``--pipe vim`` exécute ``vim FICHIER.tex``, et permet de modifier le fichier avant compilation ; -- ``--pipe "cp {} draft.tex"`` exécute ``cp FICHIER.tex draft.tex``, et permet d'obtenir une copie du fichier LaTeX, si le problème est trop complexe pour pouvoir être résolu avec les options ci-dessous ; +- ``--pipe "cp {} draft.tex"`` exécute ``cp FICHIER.tex draft.tex``, et permet d'obtenir une copie du fichier :math:`LaTeX`, si le problème est trop complexe pour pouvoir être résolu avec les options ci-dessous ; - et n'importe quelle commande du shell peut-être exécutée, au gré de votre imagination. Bilan ----- -Nous avons produit l'exercice :download:`exercice.pdf `. Il fonctionne, mais il y a deux problèmes dans le corrigé : d'une part, alors que la solution est exacte, le signe :math:`\approx` est utilisé ; d'autre part, bien que la solution soit entière, le code a produit ``3,0`` plutôt que ``3``. +Nous avons produit l'exercice :download:`exercice.pdf `. Il fonctionne, mais il y a trois problèmes dans le corrigé : premièrement, alors que la solution est exacte, le signe :math:`\approx` est utilisé ; ensuite, bien que la solution soit entière, le code a produit ``3,0`` plutôt que ``3`` ; enfin, un troisième problème n'apparaît pas ici, mais sera expliqué et résolu plus loin dans ce document. .. figure:: ecrire/3/corrige.png :align: center -Cela peut se corriger en plongeant un peu plus dans la documentation de jinja2. +.. _ecrire-facteur: + +Structures de contrôle +====================== + +Dans la correction de l'exercice, le signe utilisé pour donner la solution est :math:`\approx`, que la solution soit exacte ou non. Cela peut être corrigé avec une structure de contrôle. + +Structures de contrôles +----------------------- + +Pour corriger le second, il suffit de tester si la solution est exacte ou non. Pour cela, nous testons si la solution (multipliée par 100) est égale à la partie entière de la solution, multipliée par 100 elle aussi. + +.. literalinclude:: ecrire/4/EquationPremierDegre4-answer.tex + :language: latex + :lineno-start: 9 + :lines: 9-13 + +Pour tester si la solution est exacte, nous aurions aussi pu définir un `test personnalisé `__. + +D'autres structures de contrôle sont disponibles ; elles sont détaillées dans `la documentation officielle `__. + +Bilan +----- + +La source de la correction est maintenant celle-ci. + +.. literalinclude:: ecrire/4/EquationPremierDegre4-answer.tex + :linenos: + :language: latex + +Elle produit :download:`ce résultat `. Reste à traiter le problème de l'affichage des nombres entiers (``3,0`` au lieu de ``3``). + +Affichage des nombres, et `filters` personnalisés +================================================= + +Problème +-------- -Structures de contrôle, et `filters` personnalisés -================================================== +Afficher un nombre n'est pas aussi simple qu'il n'y paraît. Dans notre exemple, le code produit ``3,0`` plutôt que ``3``, à cause de Python qui manipule des flottants, et écrit donc la première version pour insister sur le type flottant plutôt qu'entier. Mais il y a bien pire. -Deux problèmes existent dans le corrigé défini précédemment. +Supposons par exemple que nous voulons afficher l'équation de la droite d'équation :math:`y=ax+b`, où :math:`a` et :math:`b` sont des nombres entiers. A priori, utiliser ``y=\numprint{(( a ))}x+\numprint{(( b ))}`` dans notre template devrait faire l'affaire, non ? Non. Plusieurs problèmes peuvent se poser. -- Le code produit ``3,0`` plutôt que ``3`` (cela est dû à Python qui manipule des flottants, et écrit donc la première version pour insister sur le type flottant plutôt qu'entier). -- Le signe utilisé pour donner la solution est :math:`\approx`, que la solution soit exacte ou non. +- Si :math:`a=0` et :math:`b=2`, nous obtenons ``y=0x+2`` au lieu de ``y=2``. +- Si :math:`a=1` et :math:`b=2`, nous obtenons ``y=1x+2`` au lieu de ``y=x+2``. +- Si :math:`a=-1` et :math:`b=2`, nous obtenons ``y=-1x+2`` au lieu de ``y=-x+2``. +- Si :math:`a=2` et :math:`b=0`, nous obtenons ``y=2x+0`` au lieu de ``y=2x``. +- Si :math:`a=2` et :math:`b=-2`, nous obtenons ``y=2x+-2`` au lieu de ``y=2x-2``. +- Si :math:`a=0` et :math:`b=0`, nous obtenons ``y=0x+0`` au lieu de ``y=0``. + +Cela fait beaucoup de cas à traiter. Tous (sauf le dernier) peuvent être résolu en utilisant le *filter* :func:`pyromaths.outils.jinja2.facteur`. `Filters` personnalisés ----------------------- -.. currentmodule:: pyromaths.outils.decimaux +Un `filter` est une fonction qui peut être transmise au template afin d'être appelée depuis le template. Ils sont décrits sur `la documentation officielle `__. + +.. currentmodule:: pyromaths.outils.jinja2 -Heureusement, une fonction du module :mod:`pyromaths.outils.decimaux` existe pour corriger le premier problème : :func:`suppr0` permet de supprimer le `.0` à la fin d'un flottant lorsque c'est utile. Encore faut-il que cette fonction soit accessible depuis le `template` LaTeX. +Une fonction du module :mod:`pyromaths.outils.jinja2` existe pour corriger les problèmes cités plus haut : :func:`facteur` permet de formatter correctement les facteurs dans une expression. Encore faut-il que cette fonction soit accessible depuis le `template` :math:`LaTeX`. Ajoutons la méthode suivante à la classe :class:`~pyromaths.ex.troisiemes.equation.EquationPremierDegre4` : -.. literalinclude:: ecrire/4/equation4.py +.. literalinclude:: ecrire/5/equation5.py :linenos: :lineno-start: 47 :lines: 47-53 -Celle-ci a pour effet d'ajouter à l'environnement jinja2 la fonction :func:`suppr0` comme un `filter`, qui est alors accessible depuis le `template`. +Celle-ci a pour effet d'ajouter à l'environnement jinja2 la fonction :func:`facteur` comme un `filter`, qui est alors accessible depuis le `template`. Dans cette ligne, le nombre :math:`\frac{d-b}{a-c}` est arrondi à deux décimales après la virgule, et affiché en respectant les règles françaises (notamment avec une virgule comme séparateur décimal). -.. literalinclude:: ecrire/4/EquationPremierDegre4-answer.tex +.. literalinclude:: ecrire/5/EquationPremierDegre5-answer.tex :language: latex :lineno-start: 14 :lines: 14 -Pour plus d'information sur les `filters` personnalisés, voir `la documentation officielle `__. +Un `filter` n'est rien d'autre qu'une fonction python. D'autres `filters` peuvent donc être définis et utilisés à votre convenance. -Structures de contrôles ------------------------ +.. note:: -Pour corriger le second, il suffit de tester si la solution est exacte ou non. Pour cela, nous testons si la solution (multipliée par 100) est égale à la partie entière de la solution, multipliée par 100 elle aussi. + Pour revenir au problème du début de cette partie, afficher l'équation d'une droite peut se faire en utilisant le code suivant, qui prend en charge tous les cas particuliers décrits plus haut. -.. literalinclude:: ecrire/4/EquationPremierDegre4-answer.tex - :language: latex - :lineno-start: 9 - :lines: 9-13 + .. code-block:: latex -Pour tester si la solution est exacte, nous aurions aussi pu définir un `test personnalisé `__. + (* if a == 0 and b == 0 *) + y = 0 + (* else *) + y = (( a|facteur("*x") )) (( b|facteur("*so") )) + (* endif *) -D'autres structures de contrôle sont disponibles ; elles sont détaillées dans `la documentation officielle `__. + - Si :math:`a=2` et :math:`b=3`, le code :math:`\LaTeX` produit est ``y=2x+3``. + - Si :math:`a=0` et :math:`b=0`, le test ``if`` permet d'afficher la bonne équation. + - Si :math:`a=0` l'option ``"*x"`` permet de ne rien afficher. + - Si :math:`a=1` l'option ``"*x"`` permet d'afficher ``x`` plutôt que ``1x``. + - Si :math:`a=-1` l'option ``"*x"`` permet d'afficher ``x`` plutôt que ``-1x``. + - Si :math:`b=0`, l'option ``"*so"`` n'affiche pas l'ordonnée à l'origine. + - Si :math:`b=-2`, le signe négatif est correctement affiché. + + Des exemples d'utilisation de cette fonction sont fournis avec :func:`sa documentation `. Bilan ----- -La source de la correction est maintenant celle-ci. - -.. literalinclude:: ecrire/4/EquationPremierDegre4-answer.tex - :linenos: - :language: latex - -Elle produit :download:`ce résultat `. Notre exercice est quasiment terminé, non ? Non ! Car voici… *(musique terrifiante)* les cas particuliers… +Nous obtenons :download:`cet exercice `. Il est quasiment terminé, non ? Non ! Car voici… *(musique terrifiante)* les cas particuliers… Gestion des cas particuliers ============================ -Deux cas particuliers posent problème ici. +Deux problèmes subsistent. - Dans certains cas (par exemple ``utils/pyromaths-cli.py generate EquationPremierDegre4:15``, les deux coefficients :math:`a` et :math:`c` de l'équation :math:`ax+b=cx+d` sont égaux, et notre programme, qui suppose qu'il existe une solution unique, essaye de la calculer, et divise par 0. -- Dans d'autres cas (par exemple ``utils/pyromaths-cli.py generate EquationPremierDegre4:17``, le programme affiche :math:`1x` (ou :math:`-1x`) alors que :math:`x` (ou :math:`-x`) suffirait, comme dans l'exemple suivant. +- Lorsque nous arrivons (par exemple) à l'équation ``2x=6``, l'étape suivante est de diviser les deux membres par deux. Mais cette étape est inutile lorsque, par hasard, ``x`` est multiplié par 1, comme dans l'exemple suivant. -.. figure:: ecrire/5/1x.png - :align: center + .. figure:: ecrire/6/1x.png + :align: center Il y a trois manières de résoudre ces problèmes. Elles ne sont pas exclusives, et il en existe d'autres. Prise en compte avec Python --------------------------- -Dans ce cas-là, la résolution se fait en Python. Le code LaTeX est donc réduit au minimum. +Dans ce cas-là, la résolution se fait en Python. Le code :math:`LaTeX` est donc réduit au minimum. -.. literalinclude:: ecrire/5.1/EquationPremierDegre51-answer.tex +.. literalinclude:: ecrire/6.1/EquationPremierDegre61-answer.tex :linenos: :language: latex C'est en Python, en revanche, que tous les cas particuliers sont traités. Nous avons donc ajouté deux variables au contexte : ``calculs`` contenant la liste des étapes de calcul, et ``conclusion`` contenant la phrase de conclusion. -.. literalinclude:: ecrire/5.1/equation51.py +.. literalinclude:: ecrire/6.1/equation61.py :linenos: :lineno-start: 32 :lines: 32-80 @@ -340,14 +405,14 @@ Prise en compte avec Jinja2 Puisque les cas particuliers sont traités avec Jinja2, le code Python est réduit au minimum (il n'a pas été modifié depuis la version précédente). -.. literalinclude:: ecrire/5.2/equation52.py +.. literalinclude:: ecrire/6.2/equation62.py :linenos: :lineno-start: 32 :lines: 32-53 -Le code LaTeX, en revanche, est plus fourni. +Le code :math:`LaTeX`, en revanche, est plus fourni. -.. literalinclude:: ecrire/5.2/EquationPremierDegre52-answer.tex +.. literalinclude:: ecrire/6.2/EquationPremierDegre62-answer.tex :language: latex Encore une fois, le code est plus complet, mais plus difficile à lire. @@ -357,9 +422,9 @@ Suppression des cas particuliers La méthode la plus confortable dans les cas simples est d'exclure les cas particuliers. Pour cela, au lieu d'accepter n'importe quel tirage de nos coefficients, s'ils ne nous conviennent pas, nous recommençons. -Avec cette méthode, pas besoin de toucher aux `templates` : nous modifions simplement le constructeur de la classe :class:`~pyromaths.ex.troisiemes.equation.EquationPremierDegre53`. +Avec cette méthode, pas besoin de toucher aux `templates` : nous modifions simplement le constructeur de la classe :class:`~pyromaths.ex.troisiemes.equation.EquationPremierDegre63`. -.. literalinclude:: ecrire/5.3/equation53.py +.. literalinclude:: ecrire/6.3/equation63.py :linenos: :lineno-start: 37 :lines: 37-59 @@ -419,7 +484,7 @@ Ajout des fichiers créés ou modifiés Utilisez ``git add`` pour ajouter les fichiers créés ou modifiés. À priori, cela concerne au moins : - un fichier python contenant la classe de votre exercice (dans un des dossiers ``src/pyromaths/ex/*``) ; -- deux fichiers de template LaTeX (dans le dossier ``data/ex/templates``) ; +- deux fichiers de template :math:`LaTeX` (dans le dossier ``data/ex/templates``) ; - la vignette, et le fichier ``md5sum.json`` (dans le dossier ``data/ex/img``) ; - les fichiers de test (dans le dossier ``data/ex/tests``) ; - et peut-être d'autre, selon votre travail. diff --git a/Doc/source/ecrire/4/EquationPremierDegre4-answer.tex b/Doc/source/ecrire/4/EquationPremierDegre4-answer.tex index c6f2840f..0b692f6c 100644 --- a/Doc/source/ecrire/4/EquationPremierDegre4-answer.tex +++ b/Doc/source/ecrire/4/EquationPremierDegre4-answer.tex @@ -11,7 +11,7 @@ (* else *) \approx (* endif *) - \numprint{(( ((d-b)/(a-c)) | round(2) | suppr0 ))} + \numprint{(( ((d-b)/(a-c)) | round(2) ))} \end{align*} L'unique solution est @@ -21,4 +21,4 @@ (* else *) \approx (* endif *) -\numprint{(( ((d-b)/(a-c)) | round(2) | suppr0 ))}$. +\numprint{(( ((d-b)/(a-c)) | round(2) ))}$. diff --git a/Doc/source/ecrire/4/equation4.py b/Doc/source/ecrire/4/equation4.py index b9e33fbc..3c6cc24f 100644 --- a/Doc/source/ecrire/4/equation4.py +++ b/Doc/source/ecrire/4/equation4.py @@ -27,7 +27,6 @@ import random from pyromaths.ex import Jinja2Exercice -from pyromaths.outils.decimaux import suppr0 class EquationPremierDegre4(Jinja2Exercice): @@ -43,11 +42,3 @@ def __init__(self): "c": random.choice([1, -1]) * random.randint(2, 9), "d": random.choice([1, -1]) * random.randint(2, 9), } - - @property - def environment(self): - environment = super(EquationPremierDegre4, self).environment - environment.filters.update({ - 'suppr0': suppr0, - }) - return environment diff --git a/Doc/source/ecrire/4/exercice.pdf b/Doc/source/ecrire/4/exercice.pdf index 9623f952ce9d50f87a999891053eeae58b5a1f83..a541a6e73b3b5b76c1b258b9354197cd5fb66756 100644 GIT binary patch delta 6753 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 O7ojMtCQ~Y98uTBv`pu{S diff --git a/Doc/source/ecrire/5.3/EquationPremierDegre53-answer.tex b/Doc/source/ecrire/5/EquationPremierDegre5-answer.tex similarity index 82% rename from Doc/source/ecrire/5.3/EquationPremierDegre53-answer.tex rename to Doc/source/ecrire/5/EquationPremierDegre5-answer.tex index c6f2840f..71a9a679 100644 --- a/Doc/source/ecrire/5.3/EquationPremierDegre53-answer.tex +++ b/Doc/source/ecrire/5/EquationPremierDegre5-answer.tex @@ -11,7 +11,7 @@ (* else *) \approx (* endif *) - \numprint{(( ((d-b)/(a-c)) | round(2) | suppr0 ))} + (( ((d-b)/(a-c))|facteur("2") )) \end{align*} L'unique solution est @@ -21,4 +21,4 @@ (* else *) \approx (* endif *) -\numprint{(( ((d-b)/(a-c)) | round(2) | suppr0 ))}$. +(( ((d-b)/(a-c))|facteur("2") ))$. diff --git a/Doc/source/ecrire/5.1/EquationPremierDegre51-statement.tex b/Doc/source/ecrire/5/EquationPremierDegre5-statement.tex similarity index 100% rename from Doc/source/ecrire/5.1/EquationPremierDegre51-statement.tex rename to Doc/source/ecrire/5/EquationPremierDegre5-statement.tex diff --git a/Doc/source/ecrire/5/equation5.py b/Doc/source/ecrire/5/equation5.py new file mode 100644 index 00000000..cd81ead4 --- /dev/null +++ b/Doc/source/ecrire/5/equation5.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# +# Pyromaths +# +# Un programme en Python qui permet de créer des fiches d'exercices types de +# mathématiques niveau collège ainsi que leur corrigé en LaTeX. +# +# Copyright (C) 2018 -- Louis Paternault (spalax+python@gresille.org) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +"""Équations du premier degré""" + +import random + +from pyromaths.ex import Jinja2Exercice +from pyromaths.outils.jinja2 import facteur + +class EquationPremierDegre5(Jinja2Exercice): + + description = u"Résolution d'équations du premier degré à coefficients entiers." + level = u'3.Troisième' + + def __init__(self): + super(EquationPremierDegre5, self).__init__() + + self.context = { + "a": random.choice([1, -1]) * random.randint(2, 9), + "b": random.choice([1, -1]) * random.randint(2, 9), + "c": random.choice([1, -1]) * random.randint(2, 9), + "d": random.choice([1, -1]) * random.randint(2, 9), + } + + @property + def environment(self): + environment = super(EquationPremierDegre5, self).environment + environment.filters.update({ + 'facteur': facteur, + }) + return environment diff --git a/Doc/source/ecrire/5/exercice.pdf b/Doc/source/ecrire/5/exercice.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cec2e1623617fea11a36a3a68c6cc0ba97cd1fcb GIT binary patch literal 24809 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 literal 0 HcmV?d00001 diff --git a/Doc/source/ecrire/5.1/EquationPremierDegre51-answer.tex b/Doc/source/ecrire/6.1/EquationPremierDegre61-answer.tex similarity index 100% rename from Doc/source/ecrire/5.1/EquationPremierDegre51-answer.tex rename to Doc/source/ecrire/6.1/EquationPremierDegre61-answer.tex diff --git a/Doc/source/ecrire/5.2/EquationPremierDegre52-statement.tex b/Doc/source/ecrire/6.1/EquationPremierDegre61-statement.tex similarity index 100% rename from Doc/source/ecrire/5.2/EquationPremierDegre52-statement.tex rename to Doc/source/ecrire/6.1/EquationPremierDegre61-statement.tex diff --git a/Doc/source/ecrire/5.1/equation51.py b/Doc/source/ecrire/6.1/equation61.py similarity index 85% rename from Doc/source/ecrire/5.1/equation51.py rename to Doc/source/ecrire/6.1/equation61.py index e42836e9..5764dbf5 100644 --- a/Doc/source/ecrire/5.1/equation51.py +++ b/Doc/source/ecrire/6.1/equation61.py @@ -27,15 +27,15 @@ import random from pyromaths.ex import Jinja2Exercice -from pyromaths.outils.decimaux import suppr0 +from pyromaths.outils.jinja2 import facteur -class EquationPremierDegre51(Jinja2Exercice): +class EquationPremierDegre61(Jinja2Exercice): description = u"Résolution d'équations du premier degré à coefficients entiers." level = u'3.Troisième' def __init__(self): - super(EquationPremierDegre51, self).__init__() + super(EquationPremierDegre61, self).__init__() a = random.choice([1, -1]) * random.randint(2, 9) b = random.choice([1, -1]) * random.randint(2, 9) @@ -63,13 +63,13 @@ def __init__(self): else: calculs.append(r"{}x &= {}\\".format(a-c, d-b)) calculs.append(r"x&=\frac{{ {} }}{{ {} }}\\".format(d-b, a-c)) - solution = suppr0(round(float(d-b)/float(a-c), 2)) + solution = facteur(float(d-b)/float(a-c), "2") if 100*(float(d-b)/float(a-c)) == int(100 * float(d-b)/float(a-c)): - calculs.append(r"x&=\numprint{{{}}}\\".format(solution)) - conclusion = r"L'unique solution est $x = \numprint{{{}}}$.".format(solution) + calculs.append(r"x&={}\\".format(solution)) + conclusion = r"L'unique solution est $x = {}$.".format(solution) else: - calculs.append(r"x&\approx\numprint{{{}}}\\".format(solution)) - conclusion = r"L'unique solution est $x \approx \numprint{{{}}}$.".format(solution) + calculs.append(r"x&\approx{}\\".format(solution)) + conclusion = r"L'unique solution est $x \approx {}$.".format(solution) self.context = { "a": a, "b": b, diff --git a/Doc/source/ecrire/5.2/EquationPremierDegre52-answer.tex b/Doc/source/ecrire/6.2/EquationPremierDegre62-answer.tex similarity index 90% rename from Doc/source/ecrire/5.2/EquationPremierDegre52-answer.tex rename to Doc/source/ecrire/6.2/EquationPremierDegre62-answer.tex index 3d8855d5..34f4a942 100644 --- a/Doc/source/ecrire/5.2/EquationPremierDegre52-answer.tex +++ b/Doc/source/ecrire/6.2/EquationPremierDegre62-answer.tex @@ -21,7 +21,7 @@ (* else *) \approx (* endif *) - \numprint{(( ((d-b)/(a-c)) | round(2) | suppr0 ))} + (( ((d-b)/(a-c)) | facteur("2") )) (* endif *) \end{align*} @@ -37,5 +37,5 @@ (* else *) \approx (* endif *) - \numprint{(( ((d-b)/(a-c)) | round(2) | suppr0 ))}$. + (( ((d-b)/(a-c)) | facteur("2") ))$. (* endif *) diff --git a/Doc/source/ecrire/5.3/EquationPremierDegre53-statement.tex b/Doc/source/ecrire/6.2/EquationPremierDegre62-statement.tex similarity index 100% rename from Doc/source/ecrire/5.3/EquationPremierDegre53-statement.tex rename to Doc/source/ecrire/6.2/EquationPremierDegre62-statement.tex diff --git a/Doc/source/ecrire/5.2/equation52.py b/Doc/source/ecrire/6.2/equation62.py similarity index 87% rename from Doc/source/ecrire/5.2/equation52.py rename to Doc/source/ecrire/6.2/equation62.py index 1cffb654..e84c5804 100644 --- a/Doc/source/ecrire/5.2/equation52.py +++ b/Doc/source/ecrire/6.2/equation62.py @@ -27,15 +27,15 @@ import random from pyromaths.ex import Jinja2Exercice -from pyromaths.outils.decimaux import suppr0 +from pyromaths.outils.jinja2 import facteur -class EquationPremierDegre52(Jinja2Exercice): +class EquationPremierDegre62(Jinja2Exercice): description = u"Résolution d'équations du premier degré à coefficients entiers." level = u'3.Troisième' def __init__(self): - super(EquationPremierDegre52, self).__init__() + super(EquationPremierDegre62, self).__init__() self.context = { "a": random.choice([1, -1]) * random.randint(2, 9), @@ -46,8 +46,8 @@ def __init__(self): @property def environment(self): - environment = super(EquationPremierDegre52, self).environment + environment = super(EquationPremierDegre62, self).environment environment.filters.update({ - 'suppr0': suppr0, + 'facteur': facteur, }) return environment diff --git a/Doc/source/ecrire/6.3/EquationPremierDegre63-answer.tex b/Doc/source/ecrire/6.3/EquationPremierDegre63-answer.tex new file mode 100644 index 00000000..4567e22f --- /dev/null +++ b/Doc/source/ecrire/6.3/EquationPremierDegre63-answer.tex @@ -0,0 +1,24 @@ +\exercice* + +\begin{align*} + (( a )) x (( "%+d"|format(b) )) &= (( c )) x (( "%+d"|format(d) )) \\ + (( a )) x (( "%+d"|format(-c) ))x &= (( d )) (( "%+d"|format(-b) )) \\ + (( a - c )) x &= (( d - b )) \\ + x &= \frac{(( d - b ))}{(( a - c ))} \\ + x & + (* if 100*(d-b)/(a-c) == (100*(d-b)/(a-c))|int *) + = + (* else *) + \approx + (* endif *) + (( ((d-b)/(a-c)) | facteur("2") )) +\end{align*} + +L'unique solution est +$x +(* if 100*(d-b)/(a-c) == (100*(d-b)/(a-c))|int *) + = +(* else *) + \approx +(* endif *) +(( ((d-b)/(a-c)) | facteur("2") ))$. diff --git a/Doc/source/ecrire/6.3/EquationPremierDegre63-statement.tex b/Doc/source/ecrire/6.3/EquationPremierDegre63-statement.tex new file mode 100644 index 00000000..d4d42f7e --- /dev/null +++ b/Doc/source/ecrire/6.3/EquationPremierDegre63-statement.tex @@ -0,0 +1,4 @@ +\exercice + +Déterminer les solutions de l'équation $(( a )) x (( "%+d"|format(b) ))= (( c )) x (( "%+d"|format(d) ))$. +Si nécessaire, les solutions seront arrondies au centième. diff --git a/Doc/source/ecrire/5.3/equation53.py b/Doc/source/ecrire/6.3/equation63.py similarity index 89% rename from Doc/source/ecrire/5.3/equation53.py rename to Doc/source/ecrire/6.3/equation63.py index ea7a1f2a..c2cbe271 100644 --- a/Doc/source/ecrire/5.3/equation53.py +++ b/Doc/source/ecrire/6.3/equation63.py @@ -27,15 +27,15 @@ import random from pyromaths.ex import Jinja2Exercice -from pyromaths.outils.decimaux import suppr0 +from pyromaths.outils.jinja2 import facteur -class EquationPremierDegre53(Jinja2Exercice): +class EquationPremierDegre63(Jinja2Exercice): description = u"Résolution d'équations du premier degré à coefficients entiers." level = u'3.Troisième' def __init__(self): - super(EquationPremierDegre53, self).__init__() + super(EquationPremierDegre63, self).__init__() while True: a = random.choice([1, -1]) * random.randint(2, 9) @@ -60,8 +60,8 @@ def __init__(self): @property def environment(self): - environment = super(EquationPremierDegre53, self).environment + environment = super(EquationPremierDegre63, self).environment environment.filters.update({ - 'suppr0': suppr0, + 'facteur': facteur, }) return environment diff --git a/Doc/source/ecrire/6/1x.png b/Doc/source/ecrire/6/1x.png new file mode 100644 index 0000000000000000000000000000000000000000..21edf26822f53209bad668c335b48c1d4b3cf90d GIT binary patch literal 14259 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 OA@b5HQdJTrpZ*_#v}kew literal 0 HcmV?d00001 diff --git a/Doc/source/ecrire/install.sh b/Doc/source/ecrire/install.sh new file mode 100755 index 00000000..dc9d51a3 --- /dev/null +++ b/Doc/source/ecrire/install.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Installe les exercices de tests pour qu'ils puissent être compilés + +DOCDIR=$(pwd)/$(dirname $0) +ROOT=$DOCDIR/../../.. +TEMPLATEDIR=$ROOT/data/ex/templates +EXERCICEDIR=$ROOT/src/pyromaths/ex/troisiemes + +cd $TEMPLATEDIR +for template in $DOCDIR/*/*tex +do + ln $template +done + +cd $EXERCICEDIR +for exercice in $DOCDIR/*/*py +do + ln $exercice +done diff --git a/Doc/source/pyromaths.exemples.rst b/Doc/source/pyromaths.exemples.rst index 8b54255b..842449b8 100644 --- a/Doc/source/pyromaths.exemples.rst +++ b/Doc/source/pyromaths.exemples.rst @@ -1064,6 +1064,135 @@ Calculs avec étapes >>> plotify('Polynome([[Fraction(-5, 192), 4], [Fraction(2, 96), 3], [Fraction(41, 48), 2], [Fraction(-7, 12), 1], [-4, 0]], "x", False)') -5/192*x^4+2/96*x^3+41/48*x^2-7/12*x^1-4 +Jinja2 +------ + +:ref:`Ce module ` fournit des outils à utiliser avec les templates `jinja2 `__ (voir le :ref:`tutoriel de création d'exercices ` pour plus d'informations). + +.. currentmodule:: pyromaths.outils.jinja2 + +.. testsetup:: jinja2 + + from pyromaths.outils.jinja2 import * + +* Affichage de facteurs + + + - Cas de base + + .. doctest:: jinja2 + + >>> facteur(2) + '\\numprint{2}' + >>> facteur(2.0) + '\\numprint{2}' + >>> facteur(2.3) + '\\numprint{2.3}' + + - Arrondi + + .. doctest:: jinja2 + + >>> facteur(12345.6789, arrondi=None) + '\\numprint{12345.6789}' + >>> facteur(12345.6789, arrondi=0) + '\\numprint{12346}' + >>> facteur(12345.6789, arrondi=2) + '\\numprint{12345.68}' + >>> facteur(.6789, arrondi=0) + '\\numprint{1}' + >>> facteur(.6789, arrondi=2) + '\\numprint{0.68}' + + - Affichage (ou non) des zéros à la fin du nombre + + .. doctest:: jinja2 + + >>> facteur(12345.6789, arrondi=None, zero=True) + '\\numprint{12345.6789}' + >>> facteur(12345, arrondi=2, zero=True) + '\\numprint{12345.00}' + >>> facteur(12345, arrondi=2, zero=False) + '\\numprint{12345}' + >>> facteur(12345.7, arrondi=2, zero=True) + '\\numprint{12345.70}' + >>> facteur(12345.7, arrondi=2, zero=False) + '\\numprint{12345.7}' + + - Ajout de parenthèses si le nombre est négatif + + .. doctest:: jinja2 + + >>> facteur(-2, parentheses=True) + '\\left(\\numprint{-2}\\right)' + >>> facteur(2, parentheses=True) + '\\numprint{2}' + + - Affichage du signe `+` + + .. doctest:: jinja2 + + >>> facteur(-2, signe=True) + '\\numprint{-2}' + >>> facteur(2, signe=True) + '\\numprint{+2}' + >>> facteur(2, signe=False) + '\\numprint{2}' + + - Si le signe est une opération (et non pas un opérateur unaire, l'afficher à l'extérieur de ``\numprint{}``. + + .. doctest:: jinja2 + + >>> facteur(-2, operation=False) + '\\numprint{-2}' + >>> facteur(2, signe=True, operation=False) + '\\numprint{+2}' + >>> facteur(-2, operation=True) + '-\\numprint{2}' + >>> facteur(2, signe=True, operation=True) + '+\\numprint{2}' + + - Ne pas afficher un produit par 1 ; seulement le signe avec -1 ; ou rien avec 0. + + .. doctest:: jinja2 + + >>> facteur(1, produit=True, variable="x") + '+x' + >>> facteur(-1, produit=True, variable="x") + '-x' + >>> facteur(0, produit=True, variable="x") + '' + + - Variable + + .. doctest:: jinja2 + + >>> facteur(2, variable='x') + '\\numprint{2}x' + >>> facteur(-1, produit=True, variable='x') + '-x' + + - Version courte des arguments + + .. doctest:: jinja2 + + >>> facteur(-2, court="2zXo") + '-\\numprint{2.00}x^2' + >>> facteur(-2, court="2zXp") + '\\left(\\numprint{-2.00}x^2\\right)' + >>> facteur(-2, court="2zY") + '\\numprint{-2.00}y^2' + >>> facteur(-1, court="y*") + '-y' + >>> facteur(1, court="p*x") + 'x' + >>> facteur(-1, court="p*x") + '\\left(-x\\right)' + >>> facteur(-2, court="p*x") + '\\left(\\numprint{-2}x\\right)' + >>> facteur(2, court="p*x") + '\\numprint{2}x' + .. TODO:: Liste des fichiers dans lesquels aller chercher des classes et fonctions à documenter. diff --git a/Doc/source/pyromaths.outils.jinja2.rst b/Doc/source/pyromaths.outils.jinja2.rst new file mode 100644 index 00000000..81f26e68 --- /dev/null +++ b/Doc/source/pyromaths.outils.jinja2.rst @@ -0,0 +1,9 @@ +.. _pyromaths.outils.jinja2: + +:mod:`jinja2` --- Utilitaires à utiliser avec les *templates* jinja2 +==================================================================== + +.. automodule:: pyromaths.outils.jinja2 + :members: + :special-members: + :undoc-members: diff --git a/Doc/source/pyromaths.outils.rst b/Doc/source/pyromaths.outils.rst index d4cbea12..48088b5b 100644 --- a/Doc/source/pyromaths.outils.rst +++ b/Doc/source/pyromaths.outils.rst @@ -7,5 +7,6 @@ Les outils de Pyromaths pyromaths.outils.Affichage.rst pyromaths.outils.Arithmetique.rst pyromaths.outils.Conversions.rst + pyromaths.outils.jinja2.rst pyromaths.outils.Priorites3.rst diff --git a/data/ex/img/BilanTrinomeSansDiscriminant.png b/data/ex/img/BilanTrinomeSansDiscriminant.png new file mode 100644 index 0000000000000000000000000000000000000000..6353bbcec33133fc9b0214f9ce24044d6a4fe368 GIT binary patch literal 12670 zcmY+rWmFtp(6&p01t+*eLU4D24HDcT5S#$PEqKtu-CcvbySoN=cL^?o4mN%AyyyGY zc~AYQ?mxYD-?jGYs=lgrn2M4#1}X_E92^{mtjrfRIJh^!zx(BP@c;ZQgrw=;<-3Z) zS4rT14E8_v@;~2EP4i69a_VzY6HR$*hI)E> z+S=M`YirBO%JTE`Gcqy~5)vXJBEVp7C%3~$B6iUYrQd+m;M45ibyU4 z2gg1x`$g>Quhnz%i1@;i$vo!wUpC({t^z;`-y7lTi_Nr+tPQ~p>(Mlkj|ehU9pbax za4eQx@Gqr0&Z-l+tvQxRmmRPV=Tb-j#DZkcpeuD?Q~jIkp>m~&6nz4;_1dT?o38dA zI@87vYpIfIltz&Nu_zxL8=mGACRV(+f-asBuDE(Vs(w4-tjiiNjXOn?7=E3^clE+u zBQ8>VN@ZbQ%RXC-Jua3V(zToyD5uPg7psOWR{h?^%J8yfdhY6WCpT5wN(08ivz!SF ztdBn+3Sedha?UpJRG8Z`<#;-8AXE_X1iKOGwZ84J(>}js#p#)QbjfKPWI`T{T3 zU}>pdOOUf+m4Ruz^gw})9n3-WW4@1#8LMka!CqFbpeY2MBU@_Y7Z*zmC;I4yaL3r_ zdIPteIfiX6v=e-`T)Fl^?(yd-QE+*wp+0W1{WuI}E1uWwo>3Vi$sauBbl$xw^g43l>=k9oS#{tEE?D!IkoPc_7Sb)761v?g#Bw$sa`-qqn&k z=)|+#9VB1N6la;#BtPt*zk(yIaqDj3@dlR>HCs(Ia((~C- zIH#WZqHU9(SYad+hS?5RWBEpjJOeLheG4zgfE;5hP)`(pvm2k*zNa~XXI5(0J- z;Pq{KC1+xITrPFxzEnGF(=s7`Be&dg{aeC0 zlQv?z9+0MDT-^Ay9Zb|ctL$)PT9C&T-IbW0~%jyKe$78;h;uVGkER#jPvvSjx(i7EM?_%w#*=uhb{ zQ^^zmWaUlaO4zzh8HzXyCRRoQl`ma5IT5n0l6`p7X&cm#v%GV5M6L)DUP1C9mc|by znUCC-OwIGSFEdH4`3d#4K|QVx5(sgXZh|%_c^H4%=0o%shH1}Z4ZZy_Q)EJ|G8mK~ zAJ9Yu^Pg8pSrUGWcmJsUVZdqH{D~%h^ps?|E&T5Q^2A8?d|t|5C*jZ0mbwwcfa=+_14HTJNC!BZw3r;g94VT;`F?NuQNN`bXzZd~{E zI^>+`^K#fI-^CZc*WnIK`0Kxg`Nf-YI>m%w z5@eM-g3UWTcnH10n66^7?`Y*QyX(3z8brl}d__QiCTOSrD}0M`+jW`24YRKIRzNm) z@ruZn4{{e?NpzjTu20EdlT-e+>kg+Zf?IVy+y}*E6q3GqB2OtwMaAtz`}FIXxX#Vk z2Bm`duP$!VF^!Y|@PbzF&;DcT@CXtvuZju_e~hsEo25-}UVHoUGCD9NB)iBRll;qC zjFnn8U2IPY-F9Z73Fo5v18)@P3V-Bg`E|bIyp<77Kym#f^{YGjB9@|c)*kcfH5BFZ zgj18gn6`R}Hv@(*y?JIi##cxlP3X(zuD49tNCzg((j>p(6B9&wjMsBFDqvLgoZI=> zt~WGLv!_kDNt^SNz9}qQhxi~T@Lrtf0Tlc(d8K71Nsxj{c{P?sfbxXpV8S(w1 zHd_D8MH4+*sICq{_Q$@j!yH{=AE0uiX2TOK<3x?&BsU-MB2;t2i6ZJi3WnK${m3rX z<5o~2duDfQJy1Vk)%Lk7h8^L)++H&TRcn75O*dFVT~Itmr`(E|F>Fwr?(6!Bq7)4q z&qPUSQdym*#<6%}9wRlmmey&CV|%~>!dcn%*5ol+6G@%MkFnf)$xhwBhkgR^?Kp|q z{W88SW?vMaP$lnGZ78C&+Jo;o9|A+8ZPcUOu?E%VHPrs!X)IU-)NAiU zhqiX#*7zTQ)>M{v*cBx{i9nI93uWU?|M$creqnyTjYqcYdCdd#ZO%0pOe(D(s@DSC zFIN%MhzC)?L1y!1vdZmP+b03JH3`@${~f#Ra5HJ$C^*AiugrLa<30U}*vR)G-ajkI zuiY+10b)OWe=AvPg>J7c+tdzqgv76vsIp@nT*Kc2(LRoRINUYDP%Sro=DO(=R z2J3vg2pyRnR=;3ws!cvk+Q*nky!ktBjekAFT}f_E_C#ng^<{!R~BYQ5|jGP10v$w|yCTt%>|hSmW_ zT$4eUTm&zFZSV(#pVs73r&eQmz8I=aJd*wTJ8hgMrl4^ItjDRWAe8LJ&df415LNyn zithZIQl2~;C2ajqO2gr)1WrpNEEvNyQ>Un6A=pC#Sb_KDx#;V=XaB{sYdq?wxQr2u z?Z9mdz^fF*-vS^Mr*zxy)9mdoQm%l^1|>=&hC1I ziS`-l?vHH$mL2W{g2qfYfpMgeYEt<#=J1+qdpMAxmaxgm6e-B*73>GR@=f~*Un01k zQ_7|m@GY}Z?RYW(~JP{;6LZhjjkh;@iU zsQ-EctlcoD+^%F>#*4=mEey*kj>Hr}@Heg=l`!WDj)Q%?*M&-oH-W)yUs;O=3wTK1Rv$i^uJPbL|x%MyOK* z>Di>aqKt*!8nu?3b_0p!YuxC^&l(fFZ-5Ns*X(cw2K`TOiLEs;;-upa2rNz1TF*r+ zFts}yH0z*dn^)CeK7&S=Dt*+LH9keHvSalHyb~8jb28cLI;~*ubZ=x6-D}R@Q0F_4 zlG_Hq6Y}VyskPegUY^S{&nH9yv2z+`=|rstZ6XU|9ZY9cxo4Ug&u*)APo8tSo$5?( zKI20TRjd>~3>Z9uv{L%joX72ir`Blf_*C`dShT-pMDGc(N+voVK4x#~Zz;UN5H3W- zf|rMA(H9xKL*Bl9R=+Iw|==oM0hf5<4liDui5?GxjXjvXMpjybn-)h z)O#BE$FMBPH|NQR0%F3fg%!W)+gxzp8r0r%a zdr#_glukZJMT@)BYmM|M3CJV9c(G5Gj8g|fvYseSbZ@~@9J4XE;E#mGFzN1$^LfC1 z7WiJ4L#7O)lt(|RU6y{0Q4Lc90iKn4Zb^y0(SO6#G`Z;en`kZ@0X{&bsy~ql4bKZqZuwzQ&*6? zLR=x|+-{$H`gzYi_Ti_O&~>vUOKtZv&g6?_cZL)|4JUN161N{h9p(3!E}`-)*f zSb?U2k6k+PemIE2qdwy=cZUKC3L7KKOeghJ11`}|waoS_VGLB#OA~sjKE@Os5UG`b zpfdc;rfQtOoZl*YG}i!WK!Rgcdd76=nc16wG+~#`+a!P>*)Z$Qz_*~uM-!qY1o`6{ zT35|L;xgh9S|GofrK|yq;2(4d#LpDV-%@; z!M;5VoD5l{!qg-eI6IHP1-ED{R#+gebIxIQs>vM_sMld=%M_1r31vFKhz(i#%eUXi z^j;ixN8uD6;Pkl%CTddr>_x7u?bM4%sQ2^#xGns)Cc$|Ukp`dZvYRVE%r6hsDbT4Z zrQf6LwTAVa?i?R(#8Y6+8}t|Fw?9*IZ$1ZkOt?H9sbsQES!5!yrerP9>9}(?SEG zP#S-vW_*Jga@nzv8|Nbq)l&Y7xY<=eoqx_AYh)1`t3Ox$+l6{KrEAAOtjlu76b?r& zXAMqnCoU1A;sD)|Mw+=j922$2S{4<{bPIJdW^wIL+>xF$Zf$C30R|}|`4?H0>z;WP zY}z*7$%P`&RrkJMrmVbS2k|X6F5dfQvhK`<{`stJV=7-0BHfSBpYaG1xte()XQ-`q zr8$8;-~xHm?)AINCZos);2U$&_QXA}&=okoHZ$Z{8{xPkRNz+=ZClZhvX!E@fth`N z6^4(CH)q0}5A!0_R86**YUl5VzpQ3B{>m&QE^qJ@uLLk%-CT1wk9M=sfYFKY>k^jf zK{`@zbz_M8g92?9cQQh~Q|x6+l@;r27%fPVs#3HeQfu6yUV?~@+$jbHyE*l)LU#QY z?=d;zCf@PMCgNVUe^GHoR+6Q;h2#r*Yim3P+pNM=cx8E5u3|ezSRvVA?LSS#*wmst zae8M83zF4*5zeJ1;)HHXufZ>1&$XJp=T|XJ7tgP!2*$mTg+q%WQ>$QGdh`3E9S0>v zo#l7g<@<*EBkKpT`l|gp=D%kV$Zi<}8!dycpkcAC(S)k@QM?f(Fk7QedApIO%xr_3L& z6j3ck#F6vNoPjn7JKs$o-wN~KFWk0Zd}JW^vSGB`Z0J#V0LibDo4O4~?Yh^#TgbIS zaWFhR9%oCvwm(4hd#dSxjhWH6s5~TWcJ;KgIfIxznO&PID9tZ^o4b1-P5quWnZlHB zks%d0uB;pkgvFqSd*G(RIZQE)FcorOhLujJY!LyA!svJhxOGDMM4dL)(Z3OmyT=gGJ00}^A$+v0zb6?fYg$3=? zCin03LizO{wX0VGSp|lF;9MDVjxnaV*j#bl7jg`XATYiD@Nz&W>Lk^2Hag^9sY$~d z7g9}O4!Ji8$o8mrZ+|?hWLnL-YObBBsMj$;?*1NjyuND_HfYWUSE!*CU$+_P6+#?* z+_>zBmZ0&$`j;HXFwe=44)hh#w*f78HvM_>WQg^_YElX@?y=Xpc@nB0oQ%E2B3q_T z7!)eicx#DTQT>!wxI1DIBrxEOV`FJ(bIi*YJu`4;3n$B;g?u_X9>J{7!|L1L>dg*c z5?vdD28}{6{bY5?Zmv%TQtFyswu~ZA*oeF@TmwZbk}1B4t?rhmL`^T~F4ji($ibN( zlJ|NSQUs^<$FJ_-x4_OlS0%pd=QX2yV-V6K*ZbBb7vK?wOIotPliVDm3wgcHymG#r$@7Dq~Q3Z>W18^)8*@1?G2^Hcy>r-%9{?LhZFW^`K`npIv-OyCGqf&j?U2gtnI%5 z@&{J5N2p`5?LnLK-Sx|kb#N$jQZHE*YJ#aH3?vO%#|nC=@jvXTcu&W zf{Xyl`&{i^$@WXQY8Y5Wl}!3A5wIXoIolLPzX$%7d5jl>{;Aa{iSWED=miV`=2YS! zUzUb~wM(aqPTC(qUJfT8H{AT&f$Ua+Zv}iH2X0J4@2<~6P++Et(fMTuwuQJA2~a|T z&uqK~6z~5(y3@6XaK+}`wq4#Y2!P(PY%X6;Wt^Sd8~{eAkn6Zd)154U5}})U-%PKS zSmfKCin~7HhmQJ`SZLmVA}HYaS4!H+Gp7xf1BV;ZAmWiY|n_u(L@D&n4z-%x>cRsJ}qq0Em~NO@)2L5*{}8 zV1^Psm$1S5UTBjTrPv+~(B1G~r~(LV(`RcB$T&k?OQ>n|Azu?KS~) zF?T!xev?_M>(A5ZGalSdKmMu2LHk7B>9+KAdD>SGWHTfmizuI6CEjeOK=vAzU{gyW z|Kf~&s+l7~8dyi@-qrc;*A?K@roS&8(NguK|9|VD|0*NC4B(V5A>?SFNZ9RZ!1Q?M zIUt+z{%1HYsplqg5^N4JC-lRwN!ymHP%j6Io7Z?l2V?5l$~EO|yNfmNHCN)Km1?9b z)7&Mg9Q#;xxUY1)z5UgG^?uw>bN#}9NKK$c>8}F7a~V~WyE`e#qpQJDm6FYLVk4(K z{SzfUD$*&o!3$~FG|mjpzDka;q0VL4y}r8! zc!QWIFbFr$H%(C${xUg!gTDPM3mYRZ!lbpdXBGER&9RK~>wCG(yd&_UZRd16jK3-T32|R8LMh%>3OE*M zzQe~&h>q=#XU_fA*igBdD2o=Sqn0`1X1j*!oR7)oc!7d%>%fL3nbXh~R4sX0^tE=e zsO~AE6NGSc-?WFgB}Md*EOG=L^S>9qqJ78$&M8bWBN}?!XO7lwJiz<0zWfJ z5igI}*19EEkVz#?+)l}_vz2)r_aN8|*4kvK+}!-#4ln-VqRgde3@s(3$e%4k_jU?( z?|W?j{!gPtK@I(emF06P506%X3HJ(aH}o0z1zD8Rj7!u(OMWy_2jMF8AN3pb6H=zJbGG3#F{B|{ib>~l{zV_J z-xe+Fp7y0wL- zwYP4|KT9VkL-&E=tL%&1KLpS9SvYM0#zE3{&URYLl`LojH`pqy0(#~Y&s#nWus%qvEl{3e1)d?=dUCk>`tc}0ic&KBy$r+u0l(FpFOOSbhAto}my;sNW10t|;>8@F}YH7=81#SKOIiyaGQHc?fu9zTG* zgK(u*0-h-9W7J0C-x2V~oyMhLzIBHSt7mK-dx-$UpNXQ8I()wRD>G53;z2VF`>ruj zVo9%qOf!hxB%6=G=Q|MeH-Ru|=dUSR(zGRY>{I^p59BW~(CAJIC{{NCa(ALZ%jCdh zzl{ky(?Lc6vU-W+YE}x{^4)urUOSo>Qt_rm|pVNUvJ{Q#snjJpMVt@o86NcEbS@pK#QRqV<|{U zZi_uRg%w7=Mm~4g40fZ{6pp8p%N+Wi-j|4X}bxm(hik67@<_+_>|uSHpE^>SFATgS#wpd+S!bZ z+Ief0`1XpP`LX%geCV`L~LejaUsz~HA^9#65S}N8%{{nFgSRzh3OH6{7JVYtALc<)!St8 zjU%3WGX;dzvZZF}>meIn*&;-)Pg$kUp-PCWFx(1gVFpOW0X(koVlMAhI&k8~rjI}k z4{i^@%{2z-W5U|a@LcjZdB4NNzAH7_-crglO=a>r0D@fy@$`=xIJFN8s!*sEJM3_bE z)y%L}+xCseYbS|YH-IC#r93T|tsZL1X8*Jt`PL9t=Z;v=1?$yhao9uVekmQa>fIbF ze1G{GO&Qr7^N^-g!MLXcuPef3cdfIB6#->jgO)hv5rk+aK=snr%*?xez4vnvAH_!e@Hx9|r*_X{3u)c8)%iB`GA} zuLD!PJ|5(+!N~HQ75&|7hg-@0@oa_^k1>Z{x3+J?8RUYEh}Ik>5}f^=EI0$PIO5{a zP;(powhcqWuqZ7I?Twm^bI1uq$V||+TMReTjA4VpGny!@!o%xVGxR+^~0S! zrXP7fR+Y!3MOAShFLrOsg3Y@UUlYYuAjXqmhs{HqQc-$vv9#Jrbd^2o;T)=!ORq0c zN2;|0!prw8Q9du!+Iu=+E-Apk_d+;fU#AM_TbFa4ubglHL4PJEhweqJHMXM4Awu)0v>~7>g=Voi> zV6Qr-sV5K&X4y23ve#bbHlhPahn z=z+-yE|-H7Vr^FXa?WK$WKI7B?`!&JW`tA9Xh+UZF3p;8o-#~YmVbcE1uxcwc_!M4 zS(Jd&EvPo zJ9qZByog$SuaV@hrJUItSq9wSq6;En#;D{&II1kqZ}*t3i-=`52F6jNJ|R#iL7Y7I zz}=taP2TB#GkyawNHdRC2`bH6{gd$s5cg&!Gl_L`6pkri zvLyCW+b+=LqM=N!QKFza)bk^)!tYVa^*@p~26h_T6 zc02X35E^%0ySbna;N}%vuP>2=Y0uQY0_3!Z*sH-EAiSg5_C>TCi|X$XVD(C{zi-)60l&(g2G&VPldOpRr4xzt92iC_; zD&zZZm-poV(i)-xl9ufU9HMz1;PH&K)Ij*9R462S4mqe>=OinoSG`9!75nh<-U+54xQAP5Ls zr1wWowvnC=GFO^u(wG1*bKi)ct%p=Q`+vZu=DJkNh5Cc2PD#MV+mO(Y9%zmE63udASa)gh%VU>`^8p{PS$ z`L2+S-VjEDQO7E@rH2;8NH=D4Z-Q#}dwKtyTO6@9O7qmyTh5?x2s)UFm}DLJXSi)N zmS;aW=)L(Lxecq%21|_zL+rUu$(yYdZW2Prt66qed+A&Vs=h zgl(d*DDfxSVxi;HM{2%L=xEF0??|!(LmPiQJUL6h*8F_!%u!)Y6^kcgXA_MIYE7yb zD8H+6&q*7<==dyofe)W9YGn0K0P{-Lq<+Z2E7-oF7Y|y^q*+SVT^;iCGclL9=K}80 z0C*!+ZfcoNb0V)_G~<6yn?McFe7g?;+`RBVDH3kP5PU^f!-BW18X#f zaFponaEx@LPu0GQ=V5cOIRK)l-i|(%_7rDh{e}H+E^erG&APM1n%1Ss_e1HiU*3Y)|;}d$YW3ZZbS@?w=r#|mug6}ld!Ze?$VN&nTVKtK<&ZOOyL`YZe}dhQX6Vpd#EkS{9HZ0^ma)$b8W zoticCZD7r`+$j|7 ze)34Z0}p_>hBwdSU9Dyo@xKX08O+yVywSf3bqRuo+)y^m`>T6l-^%NC1l3p-92otf zGs^@Fe|z{$q4anHpoaJ9`EJ?CF(s812x8ucVt0dxShyDV$3I~bri@QDvOHdA5cp~( z?KIJnXF1c?|5l9JVS5HtTLpF!cl6HN1z6^B{kxOB4d1}pfb0wB!@_85mNU*dC_ZTq zn}k?Z*5?1W9oXQOIM2IL#*+d;lU!fA&!OD2xO|w~rIm$DNl7_w> zVo5RC!Y+b2UU`^isytsI@88*?CABn4#ef>$o%l^sX2`}hJu{SfBeB@tDeE(t>fQmI zf1Tic6=WlC62cPu{rV-~K>e~loHr0U8{*X0QdP;@i@lG!s3Ntdh3XsepY{y(R9(wo zXV9+PL^8y8Q%4&!cVs&v4CSm(N*Jj${8=8QzmhotyDE{aAF?HK~rw8;89_ji3$ z2LztaIJjG*mDe%Q2ZhFB?wE$%C#(*3VKI-4j~CmUB#Y?~z?MKZT9$Y9ac3KBo^_h! z@Wfr`w`0{q-}kAsc&1Y^Ux61h|G`RO$iq^YCoD-?usE|4Lqf0}!}n^L@}ln|;yc&f z6&zGq`0y(!+nfOpYS2SbT$fHn*Ivat8JIPIUh*{Z?#GI;*trfbENv*NN+n$&u* z4RE_Lu!`$6A-Z07TXRbhb0)@>>8m#ley@wywh8qF=i#Ye8Qp$VNzFD>cj#w+MXvQ?YV zQB+Ee9ptr44yXo=X$i#@d^;fA2Y;B9e=;vS=3teqj;9Jf_S1}78&SRnZUM(Rfd2__ zg#K8G%wGG4RVHYaZZJ)Svk()ni1V@iltiYN5gB|;DkM))ENb4ofTmZQrc87g3xyt60>JXYySp#fu4R=hSDfg_{)e)ey}`fshDq{}#v zCOU}(#n7+)G&iPhK%MUGblkXZ3LC53p3Qwi9~JwPhcx8JnvHSBSo2*Yrq$~es@M(& zfBLD8b26915nDZqxKPa^$ow6Fym_>^wOg>8w>vQS5~3Zr!Sk^~yne#vR<*S$#Ar+{ zXkl_(Hx0w*ESZW~dcZqvZOb7!knWxblh`wQeWOP5UN3mfx^$9R)Xpzcr>uTV&9Lo< z=GLWbN+VnD**(1Uo5%^ut2=4@C->ondaY^v-yny|7|q7vf2f6jUXk302HhSE4cD4u$8HZ+&N@`x3XEg7G;i+%!nP| z!MP^g(Y&pVQKNG)y|)isaSGsIs;0Vrbw}ZV`qHX+nDBd%Lu#{p{r<>QkE$zh<`RzN zpinVKC5Gz-nS(7N>Gm zZ}uwXFQkj|hWqW}wTUqVFOSK#-!QJ|o_^?oLzgsu+oOdPdaWf||6YItUTpLX4GosN zIRGsA$H;>DKgjSeZhKFAKjV(u-wHAxeE@1Dvd+ L(w8dn@BaS}Yi-s& literal 0 HcmV?d00001 diff --git a/data/ex/img/md5sum.json b/data/ex/img/md5sum.json index ab6601f4..3814c571 100644 --- a/data/ex/img/md5sum.json +++ b/data/ex/img/md5sum.json @@ -1,6 +1,7 @@ { "Arithmetique": "36c89ba9c16cbb81ced232cb1351cf2f", "ArrondirNombreDecimal": "08996c503f0247ecb648384bb7b2e107", + "BilanTrinomeSansDiscriminant": "e657e58f9faf4fd3c7d1ac4aa85ee21a", "CalculMental": "4901e9079081b9e8d7144e68471245f9", "ClasserNombres": "8585b809a4a76662119cc707e07e7ea5", "ConstruireZigZag": "70d954ff1917c2325c7361b48d33d159", diff --git a/data/ex/templates/BilanTrinomeSansDiscriminant-answer.tex b/data/ex/templates/BilanTrinomeSansDiscriminant-answer.tex new file mode 100644 index 00000000..86438043 --- /dev/null +++ b/data/ex/templates/BilanTrinomeSansDiscriminant-answer.tex @@ -0,0 +1,137 @@ +\exercice* + +On considère le trinôme du second degré $f: x\mapsto (( a|facteur )) x^2 (( b|facteur("so*x") )) (( c|facteur("so") ))$. + +\begin{enumerate} +\item +\begin{enumerate} + \item Soit $x\in\mathbb{R}$. Alors : + \begin{align*} + (( a|facteur )) \left( x (( -x1|facteur("so") )) \right) \left( x (( -x2|facteur("so") )) \right) + &= (( a|facteur )) \left(x\times x (( -x1|facteur("so") ))\times x (( -x2|facteur("so") ))\times x (( -x1|facteur("so") ))\times (( -x2|facteur("p") )) \right) \\ + &= (( a|facteur )) \left(x^2 (( (-x1-x2)|facteur("so*x") )) (( (x1*x2)|facteur("so*") ))\right) \\ + &= (( a|facteur )) x^2 (( a|facteur("so") ))\times(( (-x1-x2)|facteur("p") ))x (( a|facteur("so") ))\times(( (x1*x2)|facteur("p") )) \\ + &= (( a|facteur )) x^2 (( b|facteur("so*x") )) (( c|facteur("so") ))\\ + &= f(x) + \end{align*} + \item Soit $x\in\mathbb{R}$. Alors : + \begin{align*} + (( a|facteur ))\left( x (( -alpha|facteur("so") )) \right)^2 (( beta|facteur("so") )) + &= (( a|facteur ))\left( x^2 (( (-signealpha*2)|facteur("so") ))\times (( absalpha|facteur )) \times x + (( absalpha|facteur ))^2\right) (( beta|facteur("so") ))\\ + &= (( a|facteur ))\left( x^2 (( (-alpha*2)|facteur("so") ))x + (( (absalpha**2)|facteur ))\right) (( beta|facteur("so") ))\\ + &= (( a|facteur ))x^2 (( a|facteur("so") ))\times (( (-alpha*2)|facteur("px") )) (( a|facteur("so") ))\times (( (absalpha**2)|facteur )) (( beta|facteur("so") ))\\ + &= (( a|facteur ))x^2 (( b|facteur("so*x") )) (( (a*absalpha**2)|facteur("so") )) (( beta|facteur("so") ))\\ + &= (( a|facteur ))x^2 (( b|facteur("so*x") )) (( c|facteur("so") ))\\ + &= f(x) + \end{align*} +\end{enumerate} +\item Résoudre les équations suivantes en choisissant la forme appropriée de $f$. +\begin{enumerate} +\item En prenant la forme factorisée, l'équation $f(x)=0$ est équivalente à l'équation produit nul $(( a|facteur ))(x (( -x1|facteur("so") )) )(x (( -x2|facteur("so") )) ) = 0$. Donc : +\begin{align*} +x (( -x1|facteur("so") ))=0 &\text{ ou } x (( -x2|facteur("so") ))=0 \\ +x=(( x1|facteur )) &\text{ ou } x=(( x2|facteur )) +\end{align*} +Il y a donc deux solutions : $(( x1|facteur ))$ et $(( x2|facteur ))$. +\item $f(x)=(( c|facteur ))$ On remarque que la forme développée contient la constante $(( c|facteur ))$ : celles-ci devraient donc s'annuler, pour simplifier notre résolution. +\begin{align*} +f(x) &= (( c|facteur )) \\ +(( a|facteur ))x^2 (( b|facteur("so*x") )) (( c|facteur("so") )) &= (( c|facteur )) \\ +(( a|facteur ))x^2 (( b|facteur("so*x") )) (( c|facteur("so") )) (( -c|facteur("so") )) &= (( c|facteur )) (( -c|facteur("so") )) \\ +(( a|facteur ))x^2 (( b|facteur("so*x") )) &= 0 \\ +\end{align*} +Nous pouvons maintenant factoriser le membre de gauche par $x$, ce qui nous donnera une équation produit nul. +\begin{align*} +(( a|facteur ))x^2 (( b|facteur("so*x") )) &= 0 \\ +(( a|facteur ))x\times x (( b|facteur("so") ))\times x &= 0 \\ +x\left( (( a|facteur ))x (( b|facteur("so") )) \right) &= 0 \\ +\end{align*} +\begin{align*} +x =0 &\text{ ou } (( a|facteur ))x (( b|facteur("so") ))=0 \\ +x =0 &\text{ ou } (( a|facteur ))x =(( -b|facteur )) \\ +x =0 &\text{ ou } x = \frac{(( -b|facteur ))}{(( a|facteur ))} \\ +x =0 &\text{ ou } x = (( -(b/a)|facteur )) \\ +\end{align*} +Il y a donc deux solutions : $x=0$ et $x=(( -(b/a)|facteur ))$. +\item $f(x)=(( beta|facteur ))$ On remarque que la forme canonique contient la constante $(( beta|facteur ))$ : en l'utilisant, elles devraient se simplifier. +\begin{align*} +f(x) &= (( beta|facteur)) \\ +(( a|facteur )) \left( x (( -alpha|facteur("so") )) \right)^2 (( beta|facteur("so") )) &= (( beta|facteur ))\\ +(( a|facteur )) \left( x (( -alpha|facteur("so") )) \right)^2 (( beta|facteur("so") )) (( -beta|facteur("so") )) &= (( beta|facteur )) (( -beta|facteur("so") ))\\ +(( a|facteur )) \left( x (( -alpha|facteur("so") )) \right)^2 &= 0\\ +\left( x (( -alpha|facteur("so") )) \right)^2 &= 0\\ +\end{align*} +Or $0$ est le seul nombre dont le carré est nul, donc l'équation précédente est équivalente à : +\begin{align*} +x (( -alpha|facteur("so") )) &= 0\\ +x &= (( alpha|facteur )) \\ +\end{align*} +Il y a donc une unique solution $x=(( alpha|facteur ))$. +\end{enumerate} +\item +\begin{enumerate} +\item \emph{Dresser le tableau de variations de $f$.} Dans la forme développée, le coefficient devant le $x^2$ est +(* if a > 0 *) positif (* else *) négatif (* endif *), +donc la fonction est +(* if a > 0 *) décroissante puis croissante (* else *) croissante puis décroissante (* endif *). +De plus, l'absisse du sommet est $-\frac{(( b|facteur ))}{2\times(( a|facteur("p") ))}$, soit $(( alpha|facteur ))$, et +$f( (( alpha|facteur )) )=(( a|facteur ))\times(( alpha|facteur("p") ))^2 (( b|facteur("so") ))\times (( alpha|facteur("p") )) (( c|facteur("so") ))=(( beta|facteur ))$. +Le tableau de variations est donc : +\begin{center} + \begin{tikzpicture} + \tkzTabInit[espcl=2.5] + {$x$/1, $f\,(x)$/1.5} + {$-\infty$, $(( alpha|facteur ))$, $+\infty$} + (* if a > 0 *) + \tkzTabVar{+/, -/$(( beta|facteur ))$/, +/} + (* else *) + \tkzTabVar{-/, +/$(( beta|facteur ))$/, -/} + (* endif *) + \end{tikzpicture} +\end{center} +\item \emph{Dresser le tableau de signes de $f$.} Construisons un tableau de signes en utilisant la forme factorisée $f(x)=(( a|facteur )) \left(x (( -x1|facteur("so") ))\right) \left(x (( -x2|facteur("so") ))\right)$. + +\begin{itemize} +\item Le premier facteur $x (( -x1|facteur("so") ))$ est une fonction affine, de coefficient directeur $a=1$ positif, et d'ordonnée à l'origine $b=(( -x1|facteur ))$. Elle est donc négative, puis positive, et change de signe en $-\frac{b}{a}=-\frac{(( -x1|facteur ))}{1}=(( x1|facteur ))$. +\item Le second facteur $x (( -x2|facteur("so") ))$ est aussi une fonction affine, de coefficient directeur $a=1$ positif, et d'ordonnée à l'origine $b=(( -x2|facteur ))$. Elle est donc négative, puis positive, et change de signe en $-\frac{b}{a}=-\frac{(( -x2|facteur ))}{1}=(( x2|facteur ))$. +\end{itemize} +\begin{center} + \begin{tikzpicture} + \tkzTabInit[lgt=4, espcl=2.5] + { + $x$/1, + $(( a|facteur ))$/1, + $x (( -x1|facteur("so") ))$/1, + $x (( -x2|facteur("so") ))$/1, + $f(x)=(( a|facteur ))\left( x (( -x1|facteur("so") )) \right) \left( x (( -x2|facteur("so") )) \right)$/1.5 + } + {$-\infty$, $(( (x1, x2)|min|facteur ))$, $(( (x1, x2)|max|facteur ))$, $+\infty$} + \tkzTabLine{, (( a|signe )), t, (( a|signe )), t, (( a|signe ))} + (* if x1 < x2 *) + \tkzTabLine{, -, z, +, t, +} + \tkzTabLine{, -, t, -, z, +} + (* else *) + \tkzTabLine{, -, t, -, z, +} + \tkzTabLine{, -, z, +, t, +} + (* endif *) + \tkzTabLine{, (( a|signe )), z, (( -a|signe )), z, (( a|signe ))} + \end{tikzpicture} +\end{center} +\end{enumerate} +\item Répondre aux questions suivantes en utilisant le tableau de signes ou de variations. +\begin{enumerate} +\item \emph{Résoudre $f(x)\geq0$.} En regardant la dernière ligne du tableau de signes, on observe que $f$ est positive sur +(* if a > 0 *) les premier et dernier intervalles (* else *) l'intervalle central (* endif *). +Les solutions sont donc : +(* if a > 0 *) + \[x\in\left]-\infty; (( (x1, x2)|min|facteur ))\right] \cup \left[ (( (x1, x2)|max|facteur )); +\infty\right[\] +(* else *) + \[ x\in\left[ (( (x1, x2)|min|facteur )) ; (( (x1, x2)|max|facteur )) \right] \] +(* endif *) +\item \emph{Quel est l'extremum de $f$ ? Est-ce un maximum ou un minimum ? Pour quelle valeur de $x$ est-il atteint ?} On lit sur le tableau de variations que la plus +(* if a > 0 *) petite (* else *) grande (* endif *) +valeur prise par $f$ est $(( beta|facteur ))$. Le +(* if a > 0 *) minimum (* else *) maximum (* endif *) +de $f$ est donc $(( beta|facteur ))$, et il est atteint pour $x=(( alpha|facteur ))$. +\end{enumerate} +\end{enumerate} diff --git a/data/ex/templates/BilanTrinomeSansDiscriminant-statement.tex b/data/ex/templates/BilanTrinomeSansDiscriminant-statement.tex new file mode 100644 index 00000000..2aa63bb2 --- /dev/null +++ b/data/ex/templates/BilanTrinomeSansDiscriminant-statement.tex @@ -0,0 +1,26 @@ +\exercice +On considère le trinôme du second degré $f: x\mapsto (( a|facteur )) x^2 (( b|facteur("*x") )) (( c|facteur("so") ))$. + +\begin{enumerate} +\item +\begin{enumerate} + \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f(x)=(( a|facteur )) \left( x (( -x1|facteur("so") )) \right) \left( x (( -x2|facteur("so") )) \right) $. + \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f(x)=(( a|facteur ))\left( x (( -alpha|facteur("so") )) \right)^2 (( beta|facteur("so") ))$. +\end{enumerate} +\item Résoudre les équations suivantes en choisissant la forme appropriée de $f$. +\begin{enumerate} +\item $f(x)=0$ +\item $f(x)=(( c|facteur ))$ +\item $f(x)=(( beta|facteur ))$ +\end{enumerate} +\item +\begin{enumerate} +\item Dresser le tableau de variations de $f$. +\item Dresser le tableau de signes de $f$. +\end{enumerate} +\item Répondre aux questions suivantes en utilisant le tableau de signes ou de variations. +\begin{enumerate} +\item Résoudre $f(x)\geq0$. +\item Quel est l'extremum de $f$ ? Est-ce un maximum ou un minimum ? Pour quelle valeur de $x$ est-il atteint ? +\end{enumerate} +\end{enumerate} diff --git a/data/ex/tests/BilanTrinomeSansDiscriminant.0.answer b/data/ex/tests/BilanTrinomeSansDiscriminant.0.answer new file mode 100644 index 00000000..abb8f207 --- /dev/null +++ b/data/ex/tests/BilanTrinomeSansDiscriminant.0.answer @@ -0,0 +1,122 @@ +\exercice* + +On considère le trinôme du second degré $f: x\mapsto \numprint{2} x^2 -\numprint{4}x -\numprint{70}$. + +\begin{enumerate} +\item +\begin{enumerate} + \item Soit $x\in\mathbb{R}$. Alors : + \begin{align*} + \numprint{2} \left( x +\numprint{5} \right) \left( x -\numprint{7} \right) + &= \numprint{2} \left(x\times x +\numprint{5}\times x -\numprint{7}\times x +\numprint{5}\times \left(\numprint{-7}\right) \right) \\ + &= \numprint{2} \left(x^2 -\numprint{2}x -\numprint{35}\right) \\ + &= \numprint{2} x^2 +\numprint{2}\times\left(\numprint{-2}\right)x +\numprint{2}\times\left(\numprint{-35}\right) \\ + &= \numprint{2} x^2 -\numprint{4}x -\numprint{70}\\ + &= f(x) + \end{align*} + \item Soit $x\in\mathbb{R}$. Alors : + \begin{align*} + \numprint{2}\left( x -\numprint{1} \right)^2 -\numprint{72} + &= \numprint{2}\left( x^2 -\numprint{2}\times \numprint{1} \times x + \numprint{1}^2\right) -\numprint{72}\\ + &= \numprint{2}\left( x^2 -\numprint{2}x + \numprint{1}\right) -\numprint{72}\\ + &= \numprint{2}x^2 +\numprint{2}\times \left(\numprint{-2}x\right) +\numprint{2}\times \numprint{1} -\numprint{72}\\ + &= \numprint{2}x^2 -\numprint{4}x +\numprint{2} -\numprint{72}\\ + &= \numprint{2}x^2 -\numprint{4}x -\numprint{70}\\ + &= f(x) + \end{align*} +\end{enumerate} +\item Résoudre les équations suivantes en choisissant la forme appropriée de $f$. +\begin{enumerate} +\item En prenant la forme factorisée, l'équation $f(x)=0$ est équivalente à l'équation produit nul $\numprint{2}(x +\numprint{5} )(x -\numprint{7} ) = 0$. Donc : +\begin{align*} +x +\numprint{5}=0 &\text{ ou } x -\numprint{7}=0 \\ +x=\numprint{-5} &\text{ ou } x=\numprint{7} +\end{align*} +Il y a donc deux solutions : $\numprint{-5}$ et $\numprint{7}$. +\item $f(x)=\numprint{-70}$ On remarque que la forme développée contient la constante $\numprint{-70}$ : celles-ci devraient donc s'annuler, pour simplifier notre résolution. +\begin{align*} +f(x) &= \numprint{-70} \\ +\numprint{2}x^2 -\numprint{4}x -\numprint{70} &= \numprint{-70} \\ +\numprint{2}x^2 -\numprint{4}x -\numprint{70} +\numprint{70} &= \numprint{-70} +\numprint{70} \\ +\numprint{2}x^2 -\numprint{4}x &= 0 \\ +\end{align*} +Nous pouvons maintenant factoriser le membre de gauche par $x$, ce qui nous donnera une équation produit nul. +\begin{align*} +\numprint{2}x^2 -\numprint{4}x &= 0 \\ +\numprint{2}x\times x -\numprint{4}\times x &= 0 \\ +x\left( \numprint{2}x -\numprint{4} \right) &= 0 \\ +\end{align*} +\begin{align*} +x =0 &\text{ ou } \numprint{2}x -\numprint{4}=0 \\ +x =0 &\text{ ou } \numprint{2}x =\numprint{4} \\ +x =0 &\text{ ou } x = \frac{\numprint{4}}{\numprint{2}} \\ +x =0 &\text{ ou } x = \numprint{2} \\ +\end{align*} +Il y a donc deux solutions : $x=0$ et $x=\numprint{2}$. +\item $f(x)=\numprint{-72}$ On remarque que la forme canonique contient la constante $\numprint{-72}$ : en l'utilisant, elles devraient se simplifier. +\begin{align*} +f(x) &= \numprint{-72} \\ +\numprint{2} \left( x -\numprint{1} \right)^2 -\numprint{72} &= \numprint{-72}\\ +\numprint{2} \left( x -\numprint{1} \right)^2 -\numprint{72} +\numprint{72} &= \numprint{-72} +\numprint{72}\\ +\numprint{2} \left( x -\numprint{1} \right)^2 &= 0\\ +\left( x -\numprint{1} \right)^2 &= 0\\ +\end{align*} +Or $0$ est le seul nombre dont le carré est nul, donc l'équation précédente est équivalente à : +\begin{align*} +x -\numprint{1} &= 0\\ +x &= \numprint{1} \\ +\end{align*} +Il y a donc une unique solution $x=\numprint{1}$. +\end{enumerate} +\item +\begin{enumerate} +\item \emph{Dresser le tableau de variations de $f$.} Dans la forme développée, le coefficient devant le $x^2$ est + positif , +donc la fonction est + décroissante puis croissante . +De plus, l'absisse du sommet est $-\frac{\numprint{-4}}{2\times\numprint{2}}$, soit $\numprint{1}$, et +$f( \numprint{1} )=\numprint{2}\times\numprint{1}^2 -\numprint{4}\times \numprint{1} -\numprint{70}=\numprint{-72}$. +Le tableau de variations est donc : +\begin{center} + \begin{tikzpicture} + \tkzTabInit[espcl=2.5] + {$x$/1, $f\,(x)$/1.5} + {$-\infty$, $\numprint{1}$, $+\infty$} + \tkzTabVar{+/, -/$\numprint{-72}$/, +/} + \end{tikzpicture} +\end{center} +\item \emph{Dresser le tableau de signes de $f$.} Construisons un tableau de signes en utilisant la forme factorisée $f(x)=\numprint{2} \left(x +\numprint{5}\right) \left(x -\numprint{7}\right)$. + +\begin{itemize} +\item Le premier facteur $x +\numprint{5}$ est une fonction affine, de coefficient directeur $a=1$ positif, et d'ordonnée à l'origine $b=\numprint{5}$. Elle est donc négative, puis positive, et change de signe en $-\frac{b}{a}=-\frac{\numprint{5}}{1}=\numprint{-5}$. +\item Le second facteur $x -\numprint{7}$ est aussi une fonction affine, de coefficient directeur $a=1$ positif, et d'ordonnée à l'origine $b=\numprint{-7}$. Elle est donc négative, puis positive, et change de signe en $-\frac{b}{a}=-\frac{\numprint{-7}}{1}=\numprint{7}$. +\end{itemize} +\begin{center} + \begin{tikzpicture} + \tkzTabInit[lgt=4, espcl=2.5] + { + $x$/1, + $\numprint{2}$/1, + $x +\numprint{5}$/1, + $x -\numprint{7}$/1, + $f(x)=\numprint{2}\left( x +\numprint{5} \right) \left( x -\numprint{7} \right)$/1.5 + } + {$-\infty$, $\numprint{-5}$, $\numprint{7}$, $+\infty$} + \tkzTabLine{, +, t, +, t, +} + \tkzTabLine{, -, z, +, t, +} + \tkzTabLine{, -, t, -, z, +} + \tkzTabLine{, +, z, -, z, +} + \end{tikzpicture} +\end{center} +\end{enumerate} +\item Répondre aux questions suivantes en utilisant le tableau de signes ou de variations. +\begin{enumerate} +\item \emph{Résoudre $f(x)\geq0$.} En regardant la dernière ligne du tableau de signes, on observe que $f$ est positive sur + les premier et dernier intervalles . +Les solutions sont donc : + \[x\in\left]-\infty; \numprint{-5}\right] \cup \left[ \numprint{7}; +\infty\right[\] +\item \emph{Quel est l'extremum de $f$ ? Est-ce un maximum ou un minimum ? Pour quelle valeur de $x$ est-il atteint ?} On lit sur le tableau de variations que la plus + petite valeur prise par $f$ est $\numprint{-72}$. Le + minimum de $f$ est donc $\numprint{-72}$, et il est atteint pour $x=\numprint{1}$. +\end{enumerate} +\end{enumerate} \ No newline at end of file diff --git a/data/ex/tests/BilanTrinomeSansDiscriminant.0.statement b/data/ex/tests/BilanTrinomeSansDiscriminant.0.statement new file mode 100644 index 00000000..ec5cadf8 --- /dev/null +++ b/data/ex/tests/BilanTrinomeSansDiscriminant.0.statement @@ -0,0 +1,26 @@ +\exercice +On considère le trinôme du second degré $f: x\mapsto \numprint{2} x^2 \numprint{-4}x -\numprint{70}$. + +\begin{enumerate} +\item +\begin{enumerate} + \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f(x)=\numprint{2} \left( x +\numprint{5} \right) \left( x -\numprint{7} \right) $. + \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f(x)=\numprint{2}\left( x -\numprint{1} \right)^2 -\numprint{72}$. +\end{enumerate} +\item Résoudre les équations suivantes en choisissant la forme appropriée de $f$. +\begin{enumerate} +\item $f(x)=0$ +\item $f(x)=\numprint{-70}$ +\item $f(x)=\numprint{-72}$ +\end{enumerate} +\item +\begin{enumerate} +\item Dresser le tableau de variations de $f$. +\item Dresser le tableau de signes de $f$. +\end{enumerate} +\item Répondre aux questions suivantes en utilisant le tableau de signes ou de variations. +\begin{enumerate} +\item Résoudre $f(x)\geq0$. +\item Quel est l'extremum de $f$ ? Est-ce un maximum ou un minimum ? Pour quelle valeur de $x$ est-il atteint ? +\end{enumerate} +\end{enumerate} \ No newline at end of file diff --git a/data/ex/tests/BilanTrinomeSansDiscriminant.1.answer b/data/ex/tests/BilanTrinomeSansDiscriminant.1.answer new file mode 100644 index 00000000..a3a366ae --- /dev/null +++ b/data/ex/tests/BilanTrinomeSansDiscriminant.1.answer @@ -0,0 +1,122 @@ +\exercice* + +On considère le trinôme du second degré $f: x\mapsto \numprint{-2} x^2 -\numprint{6}x +\numprint{80}$. + +\begin{enumerate} +\item +\begin{enumerate} + \item Soit $x\in\mathbb{R}$. Alors : + \begin{align*} + \numprint{-2} \left( x -\numprint{5} \right) \left( x +\numprint{8} \right) + &= \numprint{-2} \left(x\times x -\numprint{5}\times x +\numprint{8}\times x -\numprint{5}\times \numprint{8} \right) \\ + &= \numprint{-2} \left(x^2 +\numprint{3}x -\numprint{40}\right) \\ + &= \numprint{-2} x^2 -\numprint{2}\times\numprint{3}x -\numprint{2}\times\left(\numprint{-40}\right) \\ + &= \numprint{-2} x^2 -\numprint{6}x +\numprint{80}\\ + &= f(x) + \end{align*} + \item Soit $x\in\mathbb{R}$. Alors : + \begin{align*} + \numprint{-2}\left( x +\numprint{1.5} \right)^2 +\numprint{84.5} + &= \numprint{-2}\left( x^2 +\numprint{2}\times \numprint{1.5} \times x + \numprint{1.5}^2\right) +\numprint{84.5}\\ + &= \numprint{-2}\left( x^2 +\numprint{3}x + \numprint{2.25}\right) +\numprint{84.5}\\ + &= \numprint{-2}x^2 -\numprint{2}\times \numprint{3}x -\numprint{2}\times \numprint{2.25} +\numprint{84.5}\\ + &= \numprint{-2}x^2 -\numprint{6}x -\numprint{4.5} +\numprint{84.5}\\ + &= \numprint{-2}x^2 -\numprint{6}x +\numprint{80}\\ + &= f(x) + \end{align*} +\end{enumerate} +\item Résoudre les équations suivantes en choisissant la forme appropriée de $f$. +\begin{enumerate} +\item En prenant la forme factorisée, l'équation $f(x)=0$ est équivalente à l'équation produit nul $\numprint{-2}(x -\numprint{5} )(x +\numprint{8} ) = 0$. Donc : +\begin{align*} +x -\numprint{5}=0 &\text{ ou } x +\numprint{8}=0 \\ +x=\numprint{5} &\text{ ou } x=\numprint{-8} +\end{align*} +Il y a donc deux solutions : $\numprint{5}$ et $\numprint{-8}$. +\item $f(x)=\numprint{80}$ On remarque que la forme développée contient la constante $\numprint{80}$ : celles-ci devraient donc s'annuler, pour simplifier notre résolution. +\begin{align*} +f(x) &= \numprint{80} \\ +\numprint{-2}x^2 -\numprint{6}x +\numprint{80} &= \numprint{80} \\ +\numprint{-2}x^2 -\numprint{6}x +\numprint{80} -\numprint{80} &= \numprint{80} -\numprint{80} \\ +\numprint{-2}x^2 -\numprint{6}x &= 0 \\ +\end{align*} +Nous pouvons maintenant factoriser le membre de gauche par $x$, ce qui nous donnera une équation produit nul. +\begin{align*} +\numprint{-2}x^2 -\numprint{6}x &= 0 \\ +\numprint{-2}x\times x -\numprint{6}\times x &= 0 \\ +x\left( \numprint{-2}x -\numprint{6} \right) &= 0 \\ +\end{align*} +\begin{align*} +x =0 &\text{ ou } \numprint{-2}x -\numprint{6}=0 \\ +x =0 &\text{ ou } \numprint{-2}x =\numprint{6} \\ +x =0 &\text{ ou } x = \frac{\numprint{6}}{\numprint{-2}} \\ +x =0 &\text{ ou } x = \numprint{-3} \\ +\end{align*} +Il y a donc deux solutions : $x=0$ et $x=\numprint{-3}$. +\item $f(x)=\numprint{84.5}$ On remarque que la forme canonique contient la constante $\numprint{84.5}$ : en l'utilisant, elles devraient se simplifier. +\begin{align*} +f(x) &= \numprint{84.5} \\ +\numprint{-2} \left( x +\numprint{1.5} \right)^2 +\numprint{84.5} &= \numprint{84.5}\\ +\numprint{-2} \left( x +\numprint{1.5} \right)^2 +\numprint{84.5} -\numprint{84.5} &= \numprint{84.5} -\numprint{84.5}\\ +\numprint{-2} \left( x +\numprint{1.5} \right)^2 &= 0\\ +\left( x +\numprint{1.5} \right)^2 &= 0\\ +\end{align*} +Or $0$ est le seul nombre dont le carré est nul, donc l'équation précédente est équivalente à : +\begin{align*} +x +\numprint{1.5} &= 0\\ +x &= \numprint{-1.5} \\ +\end{align*} +Il y a donc une unique solution $x=\numprint{-1.5}$. +\end{enumerate} +\item +\begin{enumerate} +\item \emph{Dresser le tableau de variations de $f$.} Dans la forme développée, le coefficient devant le $x^2$ est + négatif , +donc la fonction est + croissante puis décroissante . +De plus, l'absisse du sommet est $-\frac{\numprint{-6}}{2\times\left(\numprint{-2}\right)}$, soit $\numprint{-1.5}$, et +$f( \numprint{-1.5} )=\numprint{-2}\times\left(\numprint{-1.5}\right)^2 -\numprint{6}\times \left(\numprint{-1.5}\right) +\numprint{80}=\numprint{84.5}$. +Le tableau de variations est donc : +\begin{center} + \begin{tikzpicture} + \tkzTabInit[espcl=2.5] + {$x$/1, $f\,(x)$/1.5} + {$-\infty$, $\numprint{-1.5}$, $+\infty$} + \tkzTabVar{-/, +/$\numprint{84.5}$/, -/} + \end{tikzpicture} +\end{center} +\item \emph{Dresser le tableau de signes de $f$.} Construisons un tableau de signes en utilisant la forme factorisée $f(x)=\numprint{-2} \left(x -\numprint{5}\right) \left(x +\numprint{8}\right)$. + +\begin{itemize} +\item Le premier facteur $x -\numprint{5}$ est une fonction affine, de coefficient directeur $a=1$ positif, et d'ordonnée à l'origine $b=\numprint{-5}$. Elle est donc négative, puis positive, et change de signe en $-\frac{b}{a}=-\frac{\numprint{-5}}{1}=\numprint{5}$. +\item Le second facteur $x +\numprint{8}$ est aussi une fonction affine, de coefficient directeur $a=1$ positif, et d'ordonnée à l'origine $b=\numprint{8}$. Elle est donc négative, puis positive, et change de signe en $-\frac{b}{a}=-\frac{\numprint{8}}{1}=\numprint{-8}$. +\end{itemize} +\begin{center} + \begin{tikzpicture} + \tkzTabInit[lgt=4, espcl=2.5] + { + $x$/1, + $\numprint{-2}$/1, + $x -\numprint{5}$/1, + $x +\numprint{8}$/1, + $f(x)=\numprint{-2}\left( x -\numprint{5} \right) \left( x +\numprint{8} \right)$/1.5 + } + {$-\infty$, $\numprint{-8}$, $\numprint{5}$, $+\infty$} + \tkzTabLine{, -, t, -, t, -} + \tkzTabLine{, -, t, -, z, +} + \tkzTabLine{, -, z, +, t, +} + \tkzTabLine{, -, z, +, z, -} + \end{tikzpicture} +\end{center} +\end{enumerate} +\item Répondre aux questions suivantes en utilisant le tableau de signes ou de variations. +\begin{enumerate} +\item \emph{Résoudre $f(x)\geq0$.} En regardant la dernière ligne du tableau de signes, on observe que $f$ est positive sur + l'intervalle central . +Les solutions sont donc : + \[ x\in\left[ \numprint{-8} ; \numprint{5} \right] \] +\item \emph{Quel est l'extremum de $f$ ? Est-ce un maximum ou un minimum ? Pour quelle valeur de $x$ est-il atteint ?} On lit sur le tableau de variations que la plus + grande valeur prise par $f$ est $\numprint{84.5}$. Le + maximum de $f$ est donc $\numprint{84.5}$, et il est atteint pour $x=\numprint{-1.5}$. +\end{enumerate} +\end{enumerate} \ No newline at end of file diff --git a/data/ex/tests/BilanTrinomeSansDiscriminant.1.statement b/data/ex/tests/BilanTrinomeSansDiscriminant.1.statement new file mode 100644 index 00000000..1593295b --- /dev/null +++ b/data/ex/tests/BilanTrinomeSansDiscriminant.1.statement @@ -0,0 +1,26 @@ +\exercice +On considère le trinôme du second degré $f: x\mapsto \numprint{-2} x^2 \numprint{-6}x +\numprint{80}$. + +\begin{enumerate} +\item +\begin{enumerate} + \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f(x)=\numprint{-2} \left( x -\numprint{5} \right) \left( x +\numprint{8} \right) $. + \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f(x)=\numprint{-2}\left( x +\numprint{1.5} \right)^2 +\numprint{84.5}$. +\end{enumerate} +\item Résoudre les équations suivantes en choisissant la forme appropriée de $f$. +\begin{enumerate} +\item $f(x)=0$ +\item $f(x)=\numprint{80}$ +\item $f(x)=\numprint{84.5}$ +\end{enumerate} +\item +\begin{enumerate} +\item Dresser le tableau de variations de $f$. +\item Dresser le tableau de signes de $f$. +\end{enumerate} +\item Répondre aux questions suivantes en utilisant le tableau de signes ou de variations. +\begin{enumerate} +\item Résoudre $f(x)\geq0$. +\item Quel est l'extremum de $f$ ? Est-ce un maximum ou un minimum ? Pour quelle valeur de $x$ est-il atteint ? +\end{enumerate} +\end{enumerate} \ No newline at end of file diff --git a/src/pyromaths/ex/lycee/seconddegre.py b/src/pyromaths/ex/lycee/seconddegre.py new file mode 100644 index 00000000..d9605bb2 --- /dev/null +++ b/src/pyromaths/ex/lycee/seconddegre.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +# +# Pyromaths +# +# Un programme en Python qui permet de créer des fiches d'exercices types de +# mathématiques niveau collège ainsi que leur corrigé en LaTeX. +# +# Copyright (C) 2018 -- Louis Paternault (spalax@gresille.org) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +"""Exercice de seconde : Chapitre Second degré.""" + +import random + +from pyromaths.ex import Jinja2Exercice +from pyromaths.outils.jinja2 import facteur + +def signe(nombre): + """Renvoit une chaîne contenant le signe de l'argument.""" + if nombre < 0: + return "-" + return "+" + +class BilanTrinomeSansDiscriminant(Jinja2Exercice): + + description = u"Bilan sur les trinômes" + level = u"2.Seconde" + + def __init__(self): + super(BilanTrinomeSansDiscriminant, self).__init__() + + while True: + a = float(random.choice([-1, 1]) * random.choice([0.5, 2])) + x1 = float(random.choice([-1, 1]) * random.randint(2, 15)) + x2 = float(random.choice([-1, 1]) * random.randint(2, 15)) + + b = -a * (x1 + x2) + c = a * x1 * x2 + + alpha = -b/(2*a) + beta = a * (alpha**2) + b * alpha + c + + if alpha == 0 or beta == 0: + continue + if b == 0 or c == 0: + continue + if beta == c: + continue + + break + + self.context = { + "a": a, + "b": b, + "c": c, + "x1": x1, + "x2": x2, + "alpha": alpha, + "absalpha": abs(alpha), # Valeur absolue de alpha + "signealpha": alpha/abs(alpha), # Signe de alpha (qui est non nul) + "beta": beta, + } + + @property + def environment(self): + environment = super(BilanTrinomeSansDiscriminant, self).environment + environment.filters.update({ + 'facteur': facteur, + 'min': min, + 'max': max, + 'abs': abs, + 'signe': signe, + }) + return environment diff --git a/src/pyromaths/outils/jinja2.py b/src/pyromaths/outils/jinja2.py new file mode 100644 index 00000000..eaf5a8b9 --- /dev/null +++ b/src/pyromaths/outils/jinja2.py @@ -0,0 +1,263 @@ +# -*- coding: utf-8 -*- + +# Pyromaths +# +# Un programme en Python qui permet de créer des fiches d'exercices types de +# mathématiques niveau collège ainsi que leur corrigé en LaTeX. +# +# Copyright (C) 2018 -- Louis Paternault (spalax@gresille.org) +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +"""Outils à utiliser avec les exercices utilisant Jinja2. +""" + +import math + +def facteur(nombre, court="", + parentheses=False, + zero=False, + arrondi=None, + signe=False, + operation=False, + produit=False, + variable="", + ): + r"""Renvoit le code :math:`\LaTeX` correspondant au nombre, dans un ``\\numprint{}``, en gérant de nombreux cas particuliers. + + Les cas d'utilisation de cette fonction sont détaillés dans le :ref:`tutoriel pour écrire un nouvel exercice `. + + En utilisant les arguments, cette fonction permet de prendre en compte les arrondis, et de nombreux cas particuliers (dans chaque cas, c'est le 3 qui est destiné à être rendu par cette fonction. + + - ajout de parenthèses uniquement si nécessaire (produit `2×3` et `2×(-3)` plutôt que `2×-3` ou `2×(3)`) ; + - ajout du signe, même s'il est positif (produit `1+3x` et `1-3x` plutôt que `1 3x` ou `1+-3x`) ; + - n'affiche pas le nombre 1, et seulement le signe de -1 (produit `x` et `-x` plutôt que `1x` et `-1x`) ; + - n'affiche pas l'opérande nulle d'un produit (produit `2` plutôt que `2+0x`) ; + - etc. + + Le séparateur décimal est le point, mais celui-ci sera converti en une virgule par ``\\numprint{}``. + + :param float nombre: Nombre à formatter. + :param str court: Version courte des arguments (voir plus loin). + :param boolean parentheses: Encadre le nombre avec des parenthèses, s'il est négatif (utile pour produire `2×(-3)` plutôt que `2×3`). + :param int arrondi: Arrondi le nombre. L'argument est le nombre de chiffres après la virgule à utiliser. Mettre cet argument à ``None`` pour ne pas arrondir. + :param boolean zero: Ajoute des zéros à la fin du nombre pour avoir autant de chiffres que défini par `arrondi` (par exemple, avec cette option et un arrondi au centième, `2` devient `2.00`). + :param boolean signe: Produit le signe, même si le nombre est positif (produit alors un +). + :param boolean operation: Indique que le signe plus ou moins est une opération (comme `2-3`) et non pas un opérateur unaire (comme `2×(-3)`). Cela a pour effet d'espacer un peu le signe du nombre. + :param boolean produit: Le facteur est une opérande d'un produit : le nombre 1 ne doit pas être affiché ; du nombre -1, on ne conserve que le signe ; rien n'est affiché si le nombre est 0 (pour produire `x`, `-x` ou rien plutôt que `1x`, `-1x`, `0x`). + :param str variable: Seconde opérande du produit. Doit être du code :math:`LaTeX` valide. + :return: Le nombre, formatté comme du code :math:`LaTeX`. + :rtype: str + + :Dépendances entre arguments: + + - Le comportement n'est pas défini si les arguments ``operation`` et ``parentheses`` sont utilisées en même temps. + + :Version courte des arguments: + + Pour que les arguments soient moins verbeux, il est possible d'utiliser la version courte des arguments. Par exemple, ``facteur(2, produit=True, parentheses=True, arrondi=3)`` peut s'écrire comme ``facteur(2, '*p3')``. + + Cet argument est une chaîne de caractères, chaque caractère « activant » une option longue. Par exemple ``*p3`` active les options ``produit``, ``parentheses`` et ``arrondi=3``. L'ordre des caractères n'a aucune importance. Plusieurs comportement sont non-définis : + + - présence de caractères ne correspondant à aucun argument ; + - utilisation conjointe des arguments courts et longs ; + - utilisation de plusieurs chiffres (pour l'argument ``arrondi``). + + Les arguments sont : + + - ``p``: ``parentheses`` ; + - ``z``: ``zero`` ; + - ``s``: ``signe`` ; + - ``o``: ``operation`` ; + - ``*``: ``produit`` ; + - chiffres ``0`` à ``9``: ``arrondi`` à l'entier correspondant ; + - ``x``, ``X``, ``y``, ``Y``: Raccourcis pour (respectivement) ``variable="x"``, ``variable="x^2"``, ``variable="y"``, ``variable="y^2"``. + + :Exemples: + + Cas de base + >>> facteur(2) + '\\numprint{2}' + >>> facteur(2.0) + '\\numprint{2}' + >>> facteur(2.3) + '\\numprint{2.3}' + + Arrondi + >>> facteur(12345.6789, arrondi=None) + '\\numprint{12345.6789}' + >>> facteur(12345.6789, arrondi=0) + '\\numprint{12346}' + >>> facteur(12345.6789, arrondi=2) + '\\numprint{12345.68}' + >>> facteur(.6789, arrondi=0) + '\\numprint{1}' + >>> facteur(.6789, arrondi=2) + '\\numprint{0.68}' + + Zéro + >>> facteur(12345.6789, arrondi=None, zero=True) + '\\numprint{12345.6789}' + >>> facteur(12345, arrondi=2, zero=True) + '\\numprint{12345.00}' + >>> facteur(12345, arrondi=2, zero=False) + '\\numprint{12345}' + >>> facteur(12345.7, arrondi=2, zero=True) + '\\numprint{12345.70}' + >>> facteur(12345.7, arrondi=2, zero=False) + '\\numprint{12345.7}' + + Parenthèse + >>> facteur(-2, parentheses=True) + '\\left(\\numprint{-2}\\right)' + >>> facteur(2, parentheses=True) + '\\numprint{2}' + + Signe + >>> facteur(-2, signe=True) + '\\numprint{-2}' + >>> facteur(2, signe=True) + '\\numprint{+2}' + >>> facteur(2, signe=False) + '\\numprint{2}' + + Opération + >>> facteur(-2, operation=False) + '\\numprint{-2}' + >>> facteur(2, signe=True, operation=False) + '\\numprint{+2}' + >>> facteur(-2, operation=True) + '-\\numprint{2}' + >>> facteur(2, signe=True, operation=True) + '+\\numprint{2}' + + Produit + >>> facteur(1, produit=True, variable="x") + 'x' + >>> facteur(-1, produit=True, variable="x") + '-x' + >>> facteur(0, produit=True, variable="x") + '' + + Variable + >>> facteur(2, variable='x') + '\\numprint{2}x' + >>> facteur(-1, produit=True, variable='x') + '-x' + + Version courte des arguments + >>> facteur(-2, court="2zXo") + '-\\numprint{2.00}x^2' + >>> facteur(-2, court="2zXp") + '\\left(\\numprint{-2.00}x^2\\right)' + >>> facteur(-2, court="2zY") + '\\numprint{-2.00}y^2' + >>> facteur(-1, court="y*") + '-y' + >>> facteur(1, court="p*x") + 'x' + >>> facteur(-1, court="p*x") + '\\left(-x\\right)' + >>> facteur(-2, court="p*x") + '\\left(\\numprint{-2}x\\right)' + >>> facteur(2, court="p*x") + '\\numprint{2}x' + >>> facteur(1, court="s*x") + '+x' + + """ + + # Format court des arguments + if "p" in court: + parentheses = True + if "z" in court: + zero = True + if "s" in court: + signe = True + if "o" in court: + operation = True + if "*" in court: + produit = True + if "x" in court: + variable = "x" + if "y" in court: + variable = "y" + if "X" in court: + variable = "x^2" + if "Y" in court: + variable = "y^2" + for entier in range(10): + if str(entier) in court: + arrondi = entier + + # Cas particuliers : produit + if produit: + if nombre == 1: + if operation or signe: + return "+{}".format(variable) + return variable + if nombre == -1: + if operation: + return "-{}".format(variable) + if parentheses: + return r"\left(-{}\right)".format(variable) + return "-{}".format(variable) + if nombre == 0: + return "" + + # Division du nombre en signe et valeur absolue + absolu = abs(nombre) + if signe and nombre >= 0: + plusoumoins = '+' + elif nombre < 0: + plusoumoins = '-' + else: + plusoumoins = '' + + # Conversion du nombre en prenant compte de l'arrondi et des zéros + # Je n'ai pas réussi à faire ça uniquement à coup de + # str.format(). Je serai ravi si quelqu'un me prouvait que + # c'est possible ! + if arrondi is None: + if math.trunc(absolu) == absolu: + strabsolu = str(int(absolu)) + else: + strabsolu = str(absolu) + elif arrondi == 0: + strabsolu = "{:g}".format(round(absolu)) + else: + entier = math.trunc(absolu) + decimal = str(round(absolu - entier, arrondi))[2:] + if zero: + strabsolu = "{}.{:0<{arrondi}}".format(entier, decimal, arrondi=arrondi) + elif entier == absolu: + strabsolu = str(entier) + else: + strabsolu = "{}.{}".format(entier, decimal) + + # Ajout éventuel des parenthèses + if parentheses and nombre < 0: + formatter = r"\left(\numprint{{{signe}{absolu}}}{variable}\right)" + elif operation: + formatter = r"{signe}\numprint{{{absolu}}}{variable}" + else: + formatter = r"\numprint{{{signe}{absolu}}}{variable}" + + # Enfin ! + return formatter.format( + signe=plusoumoins, + absolu=strabsolu, + variable=variable, + ) From 7477519de7abe122ca5c60bdbb7f0b4fc43e2ca7 Mon Sep 17 00:00:00 2001 From: Louis Date: Tue, 12 Jun 2018 22:31:03 +0200 Subject: [PATCH 17/26] =?UTF-8?q?[exercice]=20Utilisation=20du=20`filter`?= =?UTF-8?q?=20facteur()=20pour=20l'exercice=20sur=20les=20=C3=A9tats=20sta?= =?UTF-8?q?bles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/ex/img/EtatStableSysteme2.png | Bin 3546 -> 3676 bytes data/ex/img/md5sum.json | 1 + .../templates/EtatStableSysteme2-answer.tex | 28 +++++++++--------- .../EtatStableSysteme2-statement.tex | 4 +-- data/ex/tests/EtatStableSysteme2.0.answer | 2 +- src/pyromaths/ex/lycee/matrices.py | 9 ++++++ 6 files changed, 27 insertions(+), 17 deletions(-) diff --git a/data/ex/img/EtatStableSysteme2.png b/data/ex/img/EtatStableSysteme2.png index 3f5a4b2640672901d62cca2503139025996d958b..15189cc291f0ad92757f4a6d557f8b74eac2da5f 100644 GIT binary patch literal 3676 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 R_5b@eYO5PSYEVLuSmyLaCIRgMHeGEe4 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 FV1m6Ky6XS{ diff --git a/data/ex/img/md5sum.json b/data/ex/img/md5sum.json index 3814c571..e63e5051 100644 --- a/data/ex/img/md5sum.json +++ b/data/ex/img/md5sum.json @@ -10,6 +10,7 @@ "Droites": "25d39b1644c2ac6eb069c7d01f3bfdca", "EcrireNombreLettre": "fdc2fe3da7b2f17c85fcc7126deb100d", "EcritureFractionnaire": "ef797cc813006127ea3685130d39691c", + "EtatStableSysteme2": "c28bc307317dca72f2c4bad4d1f134ba", "Fd1Tangentes": "10ed3a781b3ee3ee8480ed73db2e90c9", "FractionPartage": "d798dc7ffae542cb6881fd5da25958bb", "MesureAngles": "d5422b7c1b3a0820ab656ac4dc5dba8b", diff --git a/data/ex/templates/EtatStableSysteme2-answer.tex b/data/ex/templates/EtatStableSysteme2-answer.tex index 520c4f35..8480cb22 100644 --- a/data/ex/templates/EtatStableSysteme2-answer.tex +++ b/data/ex/templates/EtatStableSysteme2-answer.tex @@ -4,31 +4,31 @@ \begin{align*} P\times M &= \begin{pmatrix}x&y\end{pmatrix}\times \begin{pmatrix} - \numprint{(( a ))} & \numprint{(( 1-a ))} \\ - \numprint{(( 1-b ))} & \numprint{(( b ))} \\ + (( a|facteur )) & (( (1-a)|facteur )) \\ + (( (1-b)|facteur )) & (( b|facteur )) \\ \end{pmatrix}\\ &= \begin{pmatrix} - \numprint{(( a ))} x + \numprint{(( 1-b ))} y & \numprint{(( 1-a ))} x + \numprint{(( b ))} y + (( a|facteur )) x + (( (1-b)|facteur )) y & (( (1-a)|facteur )) x + (( b|facteur )) y \end{pmatrix} \end{align*} -Or $\begin{pmatrix}x&y\end{pmatrix}=P=P\times M$, donc les coefficients des matrices sont deux à deux égaux, donc $x=\numprint{(( a ))} x + \numprint{(( 1-b ))} y$. +Or $\begin{pmatrix}x&y\end{pmatrix}=P=P\times M$, donc les coefficients des matrices sont deux à deux égaux, donc $x=(( a )) x + (( 1-b )) y$. D'autre part, puisque $P$ est un état probabiliste, alors $x+y=1$, donc $y=1-x$. Donc, en remplaçant $y$ par $1-x$ dans l'équation précédente, on obtient : \begin{align*} - x &= \numprint{(( a ))} x + \numprint{(( 1-b ))} (1-x) \\ - x &= \numprint{(( a ))} x + \numprint{(( 1-b ))} - \numprint{(( 1-b ))}x\\ - x-\numprint{(( a ))} x +\numprint{(( 1-b ))}x &= \numprint{(( 1-b ))}\\ - (1-\numprint{(( a ))}+\numprint{(( 1-b ))})x &= \numprint{(( 1-b ))}\\ - \numprint{(( 2-a-b ))} x &= \numprint{(( 1-b ))}\\ - x &= \frac{\numprint{(( 1-b ))}}{\numprint{(( 2-a-b ))}}\\ -x &= \numprint{(( ((1-b)/(2-a-b)) ))} + x &= (( a|facteur )) x + (( (1-b)|facteur )) (1-x) \\ + x &= (( a|facteur )) x + (( (1-b)|facteur )) - (( (1-b)|facteur ))x\\ + x-(( a|facteur )) x +(( (1-b)|facteur ))x &= (( (1-b)|facteur ))\\ + (1-(( a|facteur ))+(( (1-b)|facteur )))x &= (( (1-b)|facteur ))\\ + (( (2-a-b)|facteur )) x &= (( (1-b)|facteur ))\\ + x &= \frac{(( (1-b)|facteur ))}{(( (2-a-b)|facteur ))}\\ +x &= (( ((1-b)/(2-a-b))|facteur )) \end{align*} -Enfin, puisque $y=1-x$, alors $y=1-\numprint{(( ((1-b)/(2-a-b)) ))}=\numprint{(( ((1-a)/(2-a-b)) ))}$. +Enfin, puisque $y=1-x$, alors $y=1-(( ((1-b)/(2-a-b))|facteur ))=(( ((1-a)/(2-a-b))|facteur ))$. L'unique état stable de ce graphe est donc $\begin{pmatrix} -\numprint{(( ((1-b)/(2-a-b)) ))} & -\numprint{(( ((1-a)/(2-a-b)) ))} +(( ((1-b)/(2-a-b))|facteur )) & +(( ((1-a)/(2-a-b))|facteur )) \end{pmatrix}$. diff --git a/data/ex/templates/EtatStableSysteme2-statement.tex b/data/ex/templates/EtatStableSysteme2-statement.tex index 6b8f2f41..bbc64cb5 100644 --- a/data/ex/templates/EtatStableSysteme2-statement.tex +++ b/data/ex/templates/EtatStableSysteme2-statement.tex @@ -3,8 +3,8 @@ \[ M=\begin{pmatrix} - \numprint{(( a ))} & \numprint{(( 1-a ))} \\ - \numprint{(( 1-b ))} & \numprint{(( b ))} \\ + (( a|facteur )) & (( (1-a)|facteur )) \\ + (( (1-b)|facteur )) & (( b|facteur )) \\ \end{pmatrix} \] diff --git a/data/ex/tests/EtatStableSysteme2.0.answer b/data/ex/tests/EtatStableSysteme2.0.answer index 08de5eaa..f2fa1c55 100644 --- a/data/ex/tests/EtatStableSysteme2.0.answer +++ b/data/ex/tests/EtatStableSysteme2.0.answer @@ -12,7 +12,7 @@ Puisque $P$ est l'état stable, alors $P=P\times M$. \end{pmatrix} \end{align*} -Or $\begin{pmatrix}x&y\end{pmatrix}=P=P\times M$, donc les coefficients des matrices sont deux à deux égaux, donc $x=\numprint{0.95} x + \numprint{0.45} y$. +Or $\begin{pmatrix}x&y\end{pmatrix}=P=P\times M$, donc les coefficients des matrices sont deux à deux égaux, donc $x=0.95 x + 0.45 y$. D'autre part, puisque $P$ est un état probabiliste, alors $x+y=1$, donc $y=1-x$. Donc, en remplaçant $y$ par $1-x$ dans l'équation précédente, on obtient : diff --git a/src/pyromaths/ex/lycee/matrices.py b/src/pyromaths/ex/lycee/matrices.py index b3a4848e..36b1ab78 100644 --- a/src/pyromaths/ex/lycee/matrices.py +++ b/src/pyromaths/ex/lycee/matrices.py @@ -26,6 +26,7 @@ import random from pyromaths.ex import Jinja2Exercice +from pyromaths.outils.jinja2 import facteur # Liste des coefficients de la diagonale de la matrice de transition qui # donnent des états stables dont la valeur exacte a au plus trois décimales. @@ -69,3 +70,11 @@ def __init__(self): "a": ab[0], "b": ab[1], } + + @property + def environment(self): + environment = super(EtatStableSysteme2, self).environment + environment.filters.update({ + 'facteur': facteur, + }) + return environment From a1eb4a2d0936d994a3c78053638b16384234411d Mon Sep 17 00:00:00 2001 From: Louis Date: Tue, 12 Jun 2018 22:31:27 +0200 Subject: [PATCH 18/26] =?UTF-8?q?Correction=20d'un=20probl=C3=A8me=20d'uni?= =?UTF-8?q?code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pyromaths/outils/TexFiles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pyromaths/outils/TexFiles.py b/src/pyromaths/outils/TexFiles.py index 2dac38f6..b49f7887 100644 --- a/src/pyromaths/outils/TexFiles.py +++ b/src/pyromaths/outils/TexFiles.py @@ -44,7 +44,7 @@ def mise_en_forme(file): cline = cline.strip() indent = trouve_indentation(cline, indent, lline) if indent < 0: - print _("problème") + print _(u"problème") if cline: chaine, indent = traite_chaine(cline, indent) new_tex.extend(chaine) From 128076b37ef43cfa4fecb8fffd1574d2e05169ef Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 13 Jun 2018 00:09:53 +0200 Subject: [PATCH 19/26] =?UTF-8?q?Nouvel=20exercice=20:=20R=C3=A9solution?= =?UTF-8?q?=20de=20syst=C3=A8mes=20utilisant=20les=20matrices?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/source/pyromaths.exemples.rst | 6 ++ data/ex/img/InterpolationMatrices.png | Bin 0 -> 12551 bytes data/ex/img/md5sum.json | 1 + .../InterpolationMatrices-answer.tex | 61 ++++++++++++++++++ .../InterpolationMatrices-statement.tex | 23 +++++++ data/ex/tests/InterpolationMatrices.0.answer | 60 +++++++++++++++++ .../tests/InterpolationMatrices.0.statement | 23 +++++++ src/pyromaths/ex/lycee/matrices.py | 58 ++++++++++++++++- src/pyromaths/outils/jinja2.py | 31 +++++++++ 9 files changed, 262 insertions(+), 1 deletion(-) create mode 100644 data/ex/img/InterpolationMatrices.png create mode 100644 data/ex/templates/InterpolationMatrices-answer.tex create mode 100644 data/ex/templates/InterpolationMatrices-statement.tex create mode 100644 data/ex/tests/InterpolationMatrices.0.answer create mode 100644 data/ex/tests/InterpolationMatrices.0.statement diff --git a/Doc/source/pyromaths.exemples.rst b/Doc/source/pyromaths.exemples.rst index 842449b8..2b469fb6 100644 --- a/Doc/source/pyromaths.exemples.rst +++ b/Doc/source/pyromaths.exemples.rst @@ -1193,6 +1193,12 @@ Jinja2 >>> facteur(2, court="p*x") '\\numprint{2}x' +* Affichage de matrices + + .. doctest:: jinja2 + >>> matrice([[1, 2], [3, 4]]) + u'\\begin{pmatrix}\\numprint{1} & \\numprint{2}\\\\\\numprint{3} & \\numprint{4}\\\\\\end{pmatrix}' + .. TODO:: Liste des fichiers dans lesquels aller chercher des classes et fonctions à documenter. diff --git a/data/ex/img/InterpolationMatrices.png b/data/ex/img/InterpolationMatrices.png new file mode 100644 index 0000000000000000000000000000000000000000..cb648f80a06f910e937e4aeff980c0d58fc58d36 GIT binary patch literal 12551 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 Y_pwbZ@T>9u{WgG;ky4bb5jP6{FWm|te*gdg literal 0 HcmV?d00001 diff --git a/data/ex/img/md5sum.json b/data/ex/img/md5sum.json index e63e5051..3e00a828 100644 --- a/data/ex/img/md5sum.json +++ b/data/ex/img/md5sum.json @@ -13,6 +13,7 @@ "EtatStableSysteme2": "c28bc307317dca72f2c4bad4d1f134ba", "Fd1Tangentes": "10ed3a781b3ee3ee8480ed73db2e90c9", "FractionPartage": "d798dc7ffae542cb6881fd5da25958bb", + "InterpolationMatrices": "2a209226153e27a847a9ecbf3ee7b223", "MesureAngles": "d5422b7c1b3a0820ab656ac4dc5dba8b", "Operations": "e6fa199addd2b8b0805dc02079628521", "Perpendiculaires": "80dc4d19e3f46d4b2e420dfbea25fa05", diff --git a/data/ex/templates/InterpolationMatrices-answer.tex b/data/ex/templates/InterpolationMatrices-answer.tex new file mode 100644 index 00000000..83b2fde2 --- /dev/null +++ b/data/ex/templates/InterpolationMatrices-answer.tex @@ -0,0 +1,61 @@ +\begin{enumerate} + + \item + \begin{enumerate} + \item + \begin{itemize} + \item Puisque $A( (( X[0]|facteur )) ; (( Y[0]|facteur )) )$ est sur la courbe de $f$, alors $f( (( X[0]|facteur )) )=(( Y[0]|facteur ))$, soit + $a \times (( X[0]|facteur ))^2+b\times (( X[0]|facteur ))+c=(( Y[0]|facteur ))$, + c'est-à-dire $(( (X[0]**2)|facteur ))a + (( X[0]|facteur ))b + c = (( Y[0]|facteur ))$. + \item De même, puisque $B( (( X[1]|facteur )) ; (( Y[1]|facteur )) )$ est sur la courbe de $f$, alors $f( (( X[1]|facteur )) )=(( Y[1]|facteur ))$, soit + $a \times (( X[1]|facteur ))^2+b\times (( X[1]|facteur ))+c=(( Y[1]|facteur ))$, + c'est-à-dire $(( (X[1]**2)|facteur ))a + (( X[1]|facteur ))b + c = (( Y[1]|facteur ))$. + \item Enfin, puisque $C( (( X[2]|facteur )) ; (( Y[2]|facteur )) )$ est sur la courbe de $f$, alors $f( (( X[2]|facteur )) )=(( Y[2]|facteur ))$, soit + $a \times (( X[2]|facteur ))^2+b\times (( X[2]|facteur ))+c=(( Y[2]|facteur ))$, + c'est-à-dire $(( (X[2]**2)|facteur ))a + (( X[2]|facteur ))b + c = (( Y[2]|facteur ))$. + \end{itemize} + + On en déduit le système suivant : + \[ \left\{\begin{array}{rcl} + (( (X[0]**2)|facteur ))a + (( X[0]|facteur ))b + c &=& (( Y[0]|facteur )) \\ + (( (X[1]**2)|facteur ))a + (( X[1]|facteur ))b + c &=& (( Y[1]|facteur )) \\ + (( (X[2]**2)|facteur ))a + (( X[2]|facteur ))b + c &=& (( Y[2]|facteur )) \\ + \end{array}\right.\] + \item + +\begin{align*} + \left\{\begin{array}{rcl} + (( (X[0]**2)|facteur ))a + (( X[0]|facteur ))b + c &=& (( Y[0]|facteur )) \\ + (( (X[1]**2)|facteur ))a + (( X[1]|facteur ))b + c &=& (( Y[1]|facteur )) \\ + (( (X[2]**2)|facteur ))a + (( X[2]|facteur ))b + c &=& (( Y[2]|facteur )) \\ + \end{array}\right. +&\iff +\begin{pmatrix} +(( (X[0]**2)|facteur ))a + (( X[0]|facteur ))b + c \\ +(( (X[1]**2)|facteur ))a + (( X[1]|facteur ))b + c \\ +(( (X[2]**2)|facteur ))a + (( X[2]|facteur ))b + c \\ +\end{pmatrix} = (( Y|zip|matrice ))\\ +&\iff +(( M|matrice)) \times (( [["a"], ["b"], ["c"]]|matrice )) = (( Y|zip|matrice )) \\ +&\iff M X=R +\end{align*} + + Avec : $M= (( M|matrice ))$, $X= (( [["a"], ["b"], ["c"]]|matrice ))$ et $R= (( Y|zip|matrice ))$. + \end{enumerate} + \item + Comme $M$ est inversible, et que $MX = R$, alors $X = M^{-1}\times R$. À la calculatrice, on obtient +$M^{-1}\times R=(( M|matrice ))^{-1}\times ((Y|zip|matrice)) = (( A|zip|matrice ))$. + + Ainsi, $a=(( A[0]|facteur ))$, $b=(( A[1]|facteur ))$, et $c=(( A[2]|facteur ))$. + \item +En utilisant les valeurs de $a$, $b$, et $c$ calculées précédemment, nous connaissons l'expression de la fonction : $f(x) = (( A[0]|facteur ))x^2 + (( A[1]|facteur))x + (( A[2]|facteur ))$. + +Nous pouvons maintenant calculer l'image de $(( x|facteur ))$ par cette fonction : +\begin{align*} +f( (( x|facteur )) ) +&= (( A[0]|facteur )) \times (( x|facteur ))^2 + (( A[1]|facteur )) \times (( x|facteur)) + (( A[2]|facteur ))\\ +&= (( (A[0]*x**2+A[1]*x+A[2])|facteur )) +\end{align*} +Donc $f( (( x|facteur )) ) = (( (A[0]*x**2+A[1]*x+A[2])|facteur ))$. +\end{enumerate} + diff --git a/data/ex/templates/InterpolationMatrices-statement.tex b/data/ex/templates/InterpolationMatrices-statement.tex new file mode 100644 index 00000000..92897c30 --- /dev/null +++ b/data/ex/templates/InterpolationMatrices-statement.tex @@ -0,0 +1,23 @@ +Dans un repère orthonormé, on cherche à déterminer l'équation d'une fonction dont la courbe passe par les points +$A( (( X[0]|facteur )) ; (( Y[0]|facteur )) )$, +$B( (( X[1]|facteur )) ; (( Y[1]|facteur )) )$ et +$C( (( X[2]|facteur )) ; (( Y[2]|facteur )) )$. + +On cherche un trinôme du second degré, c'est-à-dire une fonction $f$ définie sur $]-\infty ; +\infty[$ par $f(x) = ax^2 + bx + c$ où $a$, $b$ et $c$ sont trois nombres réels, que l'on cherche à déterminer. + + \begin{enumerate} + \item + \begin{enumerate} + \item À partir des données de l'énoncé, écrire un système d'équations traduisant cette situation. + \item En déduire que le système précédent est équivalent à : $MX = R$ avec + + $M = (( M|matrice ))$, $X= (( [["a"], ["b"], ["c"]]|matrice ))$ et $R$ une matrice colonne que l'on précisera. + \end{enumerate} + \end{enumerate} + \begin{enumerate} + \setcounter{enumi}{1} + \item On admet que la matrice $M$ est inversible. + Déterminer les valeurs des cœfficients $a$, $b$ et $c$, en détaillant les calculs. + \item Quelle est la valeur de $f( (( x|facteur )) )$ ? + + \end{enumerate} diff --git a/data/ex/tests/InterpolationMatrices.0.answer b/data/ex/tests/InterpolationMatrices.0.answer new file mode 100644 index 00000000..7a8087dd --- /dev/null +++ b/data/ex/tests/InterpolationMatrices.0.answer @@ -0,0 +1,60 @@ +\begin{enumerate} + + \item + \begin{enumerate} + \item + \begin{itemize} + \item Puisque $A( \numprint{4} ; \numprint{-75} )$ est sur la courbe de $f$, alors $f( \numprint{4} )=\numprint{-75}$, soit + $a \times \numprint{4}^2+b\times \numprint{4}+c=\numprint{-75}$, + c'est-à-dire $\numprint{16}a + \numprint{4}b + c = \numprint{-75}$. + \item De même, puisque $B( \numprint{5} ; \numprint{-126} )$ est sur la courbe de $f$, alors $f( \numprint{5} )=\numprint{-126}$, soit + $a \times \numprint{5}^2+b\times \numprint{5}+c=\numprint{-126}$, + c'est-à-dire $\numprint{25}a + \numprint{5}b + c = \numprint{-126}$. + \item Enfin, puisque $C( \numprint{6} ; \numprint{-191} )$ est sur la courbe de $f$, alors $f( \numprint{6} )=\numprint{-191}$, soit + $a \times \numprint{6}^2+b\times \numprint{6}+c=\numprint{-191}$, + c'est-à-dire $\numprint{36}a + \numprint{6}b + c = \numprint{-191}$. + \end{itemize} + + On en déduit le système suivant : + \[ \left\{\begin{array}{rcl} + \numprint{16}a + \numprint{4}b + c &=& \numprint{-75} \\ + \numprint{25}a + \numprint{5}b + c &=& \numprint{-126} \\ + \numprint{36}a + \numprint{6}b + c &=& \numprint{-191} \\ + \end{array}\right.\] + \item + +\begin{align*} + \left\{\begin{array}{rcl} + \numprint{16}a + \numprint{4}b + c &=& \numprint{-75} \\ + \numprint{25}a + \numprint{5}b + c &=& \numprint{-126} \\ + \numprint{36}a + \numprint{6}b + c &=& \numprint{-191} \\ + \end{array}\right. +&\iff +\begin{pmatrix} +\numprint{16}a + \numprint{4}b + c \\ +\numprint{25}a + \numprint{5}b + c \\ +\numprint{36}a + \numprint{6}b + c \\ +\end{pmatrix} = \begin{pmatrix}\numprint{-75}\\\numprint{-126}\\\numprint{-191}\\\end{pmatrix}\\ +&\iff +\begin{pmatrix}\numprint{16} & \numprint{4} & \numprint{1}\\\numprint{25} & \numprint{5} & \numprint{1}\\\numprint{36} & \numprint{6} & \numprint{1}\\\end{pmatrix} \times \begin{pmatrix}a\\b\\c\\\end{pmatrix} = \begin{pmatrix}\numprint{-75}\\\numprint{-126}\\\numprint{-191}\\\end{pmatrix} \\ +&\iff M X=R +\end{align*} + + Avec : $M= \begin{pmatrix}\numprint{16} & \numprint{4} & \numprint{1}\\\numprint{25} & \numprint{5} & \numprint{1}\\\numprint{36} & \numprint{6} & \numprint{1}\\\end{pmatrix}$, $X= \begin{pmatrix}a\\b\\c\\\end{pmatrix}$ et $R= \begin{pmatrix}\numprint{-75}\\\numprint{-126}\\\numprint{-191}\\\end{pmatrix}$. + \end{enumerate} + \item + Comme $M$ est inversible, et que $MX = R$, alors $X = M^{-1}\times R$. À la calculatrice, on obtient +$M^{-1}\times R=\begin{pmatrix}\numprint{16} & \numprint{4} & \numprint{1}\\\numprint{25} & \numprint{5} & \numprint{1}\\\numprint{36} & \numprint{6} & \numprint{1}\\\end{pmatrix}^{-1}\times \begin{pmatrix}\numprint{-75}\\\numprint{-126}\\\numprint{-191}\\\end{pmatrix} = \begin{pmatrix}\numprint{-7}\\\numprint{12}\\\numprint{-11}\\\end{pmatrix}$. + + Ainsi, $a=\numprint{-7}$, $b=\numprint{12}$, et $c=\numprint{-11}$. + \item +En utilisant les valeurs de $a$, $b$, et $c$ calculées précédemment, nous connaissons l'expression de la fonction : $f(x) = \numprint{-7}x^2 + \numprint{12}x + \numprint{-11}$. + +Nous pouvons maintenant calculer l'image de $\numprint{17}$ par cette fonction : +\begin{align*} +f( \numprint{17} ) +&= \numprint{-7} \times \numprint{17}^2 + \numprint{12} \times \numprint{17} + \numprint{-11}\\ +&= \numprint{-1830} +\end{align*} +Donc $f( \numprint{17} ) = \numprint{-1830}$. +\end{enumerate} diff --git a/data/ex/tests/InterpolationMatrices.0.statement b/data/ex/tests/InterpolationMatrices.0.statement new file mode 100644 index 00000000..4d7f4d48 --- /dev/null +++ b/data/ex/tests/InterpolationMatrices.0.statement @@ -0,0 +1,23 @@ +Dans un repère orthonormé, on cherche à déterminer l'équation d'une fonction dont la courbe passe par les points +$A( \numprint{4} ; \numprint{-75} )$, +$B( \numprint{5} ; \numprint{-126} )$ et +$C( \numprint{6} ; \numprint{-191} )$. + +On cherche un trinôme du second degré, c'est-à-dire une fonction $f$ définie sur $]-\infty ; +\infty[$ par $f(x) = ax^2 + bx + c$ où $a$, $b$ et $c$ sont trois nombres réels, que l'on cherche à déterminer. + + \begin{enumerate} + \item + \begin{enumerate} + \item À partir des données de l'énoncé, écrire un système d'équations traduisant cette situation. + \item En déduire que le système précédent est équivalent à : $MX = R$ avec + + $M = \begin{pmatrix}\numprint{16} & \numprint{4} & \numprint{1}\\\numprint{25} & \numprint{5} & \numprint{1}\\\numprint{36} & \numprint{6} & \numprint{1}\\\end{pmatrix}$, $X= \begin{pmatrix}a\\b\\c\\\end{pmatrix}$ et $R$ une matrice colonne que l'on précisera. + \end{enumerate} + \end{enumerate} + \begin{enumerate} + \setcounter{enumi}{1} + \item On admet que la matrice $M$ est inversible. + Déterminer les valeurs des cœfficients $a$, $b$ et $c$, en détaillant les calculs. + \item Quelle est la valeur de $f( \numprint{17} )$ ? + + \end{enumerate} \ No newline at end of file diff --git a/src/pyromaths/ex/lycee/matrices.py b/src/pyromaths/ex/lycee/matrices.py index 36b1ab78..f8d0c064 100644 --- a/src/pyromaths/ex/lycee/matrices.py +++ b/src/pyromaths/ex/lycee/matrices.py @@ -26,7 +26,7 @@ import random from pyromaths.ex import Jinja2Exercice -from pyromaths.outils.jinja2 import facteur +from pyromaths.outils.jinja2 import facteur, matrice # Liste des coefficients de la diagonale de la matrice de transition qui # donnent des états stables dont la valeur exacte a au plus trois décimales. @@ -78,3 +78,59 @@ def environment(self): 'facteur': facteur, }) return environment + +class InterpolationMatrices(Jinja2Exercice): + # Plus ou moins inspiré du sujet de bac ES Amérique du Nord, juin 2015. + + description = u"Interpolation polynomiale en utilisant des matrices" + level = u"0.TermES" + + def __init__(self): + super(InterpolationMatrices, self).__init__() + + X = [None, None, None] + while len(set(X)) != 3: + X = sorted([ + random.randint(2, 9), + random.randint(2, 9), + random.randint(2, 9), + ]) + + a = b = c = 0 + while len(set([a, b, c])) != 3: + a = random.choice([1, -1]) * random.randint(2, 19) + b = random.choice([1, -1]) * random.randint(2, 19) + c = random.choice([1, -1]) * random.randint(2, 19) + if random.randint(0, 1) == 1: + a = float(a) / 10 + b = float(b) / 10 + c = float(c) / 10 + + M = [ + [X[0]**2, X[0], 1], + [X[1]**2, X[1], 1], + [X[2]**2, X[2], 1], + ] + Y = [ + a * X[0]**2 + b * X[0] + c, + a * X[1]**2 + b * X[1] + c, + a * X[2]**2 + b * X[2] + c, + ] + + self.context = { + "X": X, + "Y": Y, + "A": [a, b, c], + "M": M, + "x": random.randint(10, 19), + } + + @property + def environment(self): + environment = super(InterpolationMatrices, self).environment + environment.filters.update({ + 'facteur': facteur, + 'matrice': matrice, + 'zip': zip, + }) + return environment diff --git a/src/pyromaths/outils/jinja2.py b/src/pyromaths/outils/jinja2.py index eaf5a8b9..93f45e2c 100644 --- a/src/pyromaths/outils/jinja2.py +++ b/src/pyromaths/outils/jinja2.py @@ -25,6 +25,7 @@ """ import math +import numbers def facteur(nombre, court="", parentheses=False, @@ -261,3 +262,33 @@ def facteur(nombre, court="", absolu=strabsolu, variable=variable, ) + +def iter_facteurs(liste, short): + """Applique :func:`facteur` à une liste de nombres. + + - Les éléments peuvent être des nombres, ou pas (auquel cas la fonction :func:`str` est appliquée). + - L'argument ``short`` est transmis à :func:`facteur`. + """ + for element in liste: + if isinstance(element, numbers.Number): + yield facteur(element, short) + else: + yield str(element) + +def matrice(listes, short=""): + r"""Renvoit le code LaTeX d'une matrice. + + - La matrice est sous la forme d'une liste de lignes (où chaque ligne est une liste de coefficients). + - L'argument ``short`` est transmis à :func:`facteur`. + + >>> matrice([[1, 2], [3, 4]]) + u'\\begin{pmatrix}\\numprint{1} & \\numprint{2}\\\\\\numprint{3} & \\numprint{4}\\\\\\end{pmatrix}' + """ + text = u"" + text += r"\begin{pmatrix}" + for ligne in listes: + text += " & ".join(iter_facteurs(ligne, short)) + text += r"\\" + text += r"\end{pmatrix}" + + return text From 9e965f7414375d4bf6c8a784fc2bcaee7a8d956c Mon Sep 17 00:00:00 2001 From: Louis Date: Wed, 13 Jun 2018 07:58:53 +0200 Subject: [PATCH 20/26] [exercice] Ajout du signe + --- data/ex/templates/BilanTrinomeSansDiscriminant-statement.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/ex/templates/BilanTrinomeSansDiscriminant-statement.tex b/data/ex/templates/BilanTrinomeSansDiscriminant-statement.tex index 2aa63bb2..7005bc03 100644 --- a/data/ex/templates/BilanTrinomeSansDiscriminant-statement.tex +++ b/data/ex/templates/BilanTrinomeSansDiscriminant-statement.tex @@ -1,5 +1,5 @@ \exercice -On considère le trinôme du second degré $f: x\mapsto (( a|facteur )) x^2 (( b|facteur("*x") )) (( c|facteur("so") ))$. +On considère le trinôme du second degré $f: x\mapsto (( a|facteur )) x^2 (( b|facteur("*sox") )) (( c|facteur("so") ))$. \begin{enumerate} \item From 5a031f829b20e9e6e1b81c4ace0d390b90604b4f Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 14 Jun 2018 21:08:10 +0200 Subject: [PATCH 21/26] =?UTF-8?q?[NEWS]=20Ajout=20des=20changements=20depu?= =?UTF-8?q?is=20la=20derni=C3=A8re=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NEWS | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/NEWS b/NEWS index 302c40cc..f2a57293 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,13 @@ +Version XX.XX +* Nouvel exercice niveau terminale ES (spécialité) : Déterminer l'état stable d'un graphe probabiliste (en utilisant un système d'équations). +* Nouvel exercice niveau terminale ES (spécialité) : Résoudre un système d'équations en utilisant les matrices. +* Nouvel exercice niveau seconde : Bilan sur les trinômes. +* Création d'une nouvelle classe d'exercices (rétro-compatible), pour faciliter l'écriture d'exercices en utilisant le moteur de templates jinja2. +* Documentation : Ajout d'une page d'exemples. +* Documentation : Ajout d'un tutoriel pour la création de nouveaux exercices. +* Mise à jour de `cree-vignettes.py` (utilisé pour créer les vignettes des exercices). +* Nettoyage du code ; petites corrections de bug ; améliorations diverses. + Version 18.05 * L'outils `testexo.py` a été renommé en `pyromaths.cli`. * C'est désormais une interface en ligne de commandes à Pyromaths From 0f21e4d2afd7d071f0bda9fc239786f66e09ce7c Mon Sep 17 00:00:00 2001 From: jortais Date: Sat, 16 Jun 2018 11:57:43 +0200 Subject: [PATCH 22/26] =?UTF-8?q?Relecture=20des=20exercices=20propos?= =?UTF-8?q?=C3=A9s=20par=20Louis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NEWS | 2 +- .../BilanTrinomeSansDiscriminant-answer.tex | 72 +++++++++---------- ...BilanTrinomeSansDiscriminant-statement.tex | 14 ++-- .../templates/EtatStableSysteme2-answer.tex | 14 ++-- .../InterpolationMatrices-answer.tex | 47 ++++++------ .../InterpolationMatrices-statement.tex | 14 ++-- data/templates/evaluation.tex | 2 + data/templates/pyromaths.tex | 2 + locale/ca@valencia/LC_MESSAGES/pyromaths.po | 2 +- locale/en/LC_MESSAGES/pyromaths.po | 2 +- locale/es/LC_MESSAGES/pyromaths.po | 2 +- locale/pl/LC_MESSAGES/pyromaths.po | 2 +- locale/pyromaths.pot | 2 +- src/pyromaths/ex/lycee/ExoPolynome.py | 2 +- src/pyromaths/ex/lycee/matrices.py | 4 +- src/pyromaths/outils/jinja2.py | 25 +++++-- 16 files changed, 115 insertions(+), 93 deletions(-) diff --git a/NEWS b/NEWS index f2a57293..8c006f59 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -Version XX.XX +Version 18.06 * Nouvel exercice niveau terminale ES (spécialité) : Déterminer l'état stable d'un graphe probabiliste (en utilisant un système d'équations). * Nouvel exercice niveau terminale ES (spécialité) : Résoudre un système d'équations en utilisant les matrices. * Nouvel exercice niveau seconde : Bilan sur les trinômes. diff --git a/data/ex/templates/BilanTrinomeSansDiscriminant-answer.tex b/data/ex/templates/BilanTrinomeSansDiscriminant-answer.tex index 86438043..0b63c318 100644 --- a/data/ex/templates/BilanTrinomeSansDiscriminant-answer.tex +++ b/data/ex/templates/BilanTrinomeSansDiscriminant-answer.tex @@ -1,64 +1,64 @@ \exercice* -On considère le trinôme du second degré $f: x\mapsto (( a|facteur )) x^2 (( b|facteur("so*x") )) (( c|facteur("so") ))$. +On considère le trinôme du second degré $f: x\mapsto (( a|facteur("X") )) (( b|facteur("so*x") )) (( c|facteur("so") ))$. \begin{enumerate} \item \begin{enumerate} \item Soit $x\in\mathbb{R}$. Alors : \begin{align*} - (( a|facteur )) \left( x (( -x1|facteur("so") )) \right) \left( x (( -x2|facteur("so") )) \right) - &= (( a|facteur )) \left(x\times x (( -x1|facteur("so") ))\times x (( -x2|facteur("so") ))\times x (( -x1|facteur("so") ))\times (( -x2|facteur("p") )) \right) \\ - &= (( a|facteur )) \left(x^2 (( (-x1-x2)|facteur("so*x") )) (( (x1*x2)|facteur("so*") ))\right) \\ - &= (( a|facteur )) x^2 (( a|facteur("so") ))\times(( (-x1-x2)|facteur("p") ))x (( a|facteur("so") ))\times(( (x1*x2)|facteur("p") )) \\ - &= (( a|facteur )) x^2 (( b|facteur("so*x") )) (( c|facteur("so") ))\\ - &= f(x) + (( a|facteur )) \,\left( x (( -x1|facteur("so") )) \right) \, \left( x (( -x2|facteur("so") )) \right) + &= (( a|facteur )) \,\left(x\times x (( -x1|facteur("so") ))\times x (( -x2|facteur("so") ))\times x (( -x1|facteur("so") ))\times (( -x2|facteur("p") )) \right) \\ + &= (( a|facteur )) \,\left(x^2 (( (-x1-x2)|facteur("so*x") )) (( (x1*x2)|facteur("so*") ))\right) \\ + &= (( a|facteur("X") )) (( a|facteur("so") ))\times(( (-x1-x2)|facteur("px") )) (( a|facteur("so") ))\times(( (x1*x2)|facteur("p") )) \\ + &= (( a|facteur("X") )) (( b|facteur("so*x") )) (( c|facteur("so") ))\\ + &= f\,(x) \end{align*} \item Soit $x\in\mathbb{R}$. Alors : \begin{align*} - (( a|facteur ))\left( x (( -alpha|facteur("so") )) \right)^2 (( beta|facteur("so") )) - &= (( a|facteur ))\left( x^2 (( (-signealpha*2)|facteur("so") ))\times (( absalpha|facteur )) \times x + (( absalpha|facteur ))^2\right) (( beta|facteur("so") ))\\ - &= (( a|facteur ))\left( x^2 (( (-alpha*2)|facteur("so") ))x + (( (absalpha**2)|facteur ))\right) (( beta|facteur("so") ))\\ - &= (( a|facteur ))x^2 (( a|facteur("so") ))\times (( (-alpha*2)|facteur("px") )) (( a|facteur("so") ))\times (( (absalpha**2)|facteur )) (( beta|facteur("so") ))\\ - &= (( a|facteur ))x^2 (( b|facteur("so*x") )) (( (a*absalpha**2)|facteur("so") )) (( beta|facteur("so") ))\\ - &= (( a|facteur ))x^2 (( b|facteur("so*x") )) (( c|facteur("so") ))\\ - &= f(x) + (( a|facteur ))\,\left( x (( -alpha|facteur("so") )) \right)^2 (( beta|facteur("so") )) + &= (( a|facteur ))\,\left( x^2 (( (-signealpha*2)|facteur("so") ))\times (( absalpha|facteur )) \times x + (( absalpha|facteur ))^2\right) (( beta|facteur("so") ))\\ + &= (( a|facteur ))\,\left( x^2 (( (-alpha*2)|facteur("sox") )) + (( (absalpha**2)|facteur ))\right) (( beta|facteur("so") ))\\ + &= (( a|facteur("X") )) (( a|facteur("so") ))\times (( (-alpha*2)|facteur("px") )) (( a|facteur("so") ))\times (( (absalpha**2)|facteur )) (( beta|facteur("so") ))\\ + &= (( a|facteur("X") )) (( b|facteur("so*x") )) (( (a*absalpha**2)|facteur("so") )) (( beta|facteur("so") ))\\ + &= (( a|facteur("X") )) (( b|facteur("so*x") )) (( c|facteur("so") ))\\ + &= f\,(x) \end{align*} \end{enumerate} \item Résoudre les équations suivantes en choisissant la forme appropriée de $f$. \begin{enumerate} -\item En prenant la forme factorisée, l'équation $f(x)=0$ est équivalente à l'équation produit nul $(( a|facteur ))(x (( -x1|facteur("so") )) )(x (( -x2|facteur("so") )) ) = 0$. Donc : +\item En prenant la forme factorisée, l'équation $f\,(x)=0$ est équivalente à l'équation produit nul $(( a|facteur ))\,(x (( -x1|facteur("so") )) )\,(x (( -x2|facteur("so") )) ) = 0$. Donc : \begin{align*} x (( -x1|facteur("so") ))=0 &\text{ ou } x (( -x2|facteur("so") ))=0 \\ x=(( x1|facteur )) &\text{ ou } x=(( x2|facteur )) \end{align*} Il y a donc deux solutions : $(( x1|facteur ))$ et $(( x2|facteur ))$. -\item $f(x)=(( c|facteur ))$ On remarque que la forme développée contient la constante $(( c|facteur ))$ : celles-ci devraient donc s'annuler, pour simplifier notre résolution. +\item $f\,(x)=(( c|facteur ))$ On remarque que la forme développée contient la constante $(( c|facteur ))$ : celles-ci devraient donc s'annuler, pour simplifier notre résolution. \begin{align*} -f(x) &= (( c|facteur )) \\ -(( a|facteur ))x^2 (( b|facteur("so*x") )) (( c|facteur("so") )) &= (( c|facteur )) \\ -(( a|facteur ))x^2 (( b|facteur("so*x") )) (( c|facteur("so") )) (( -c|facteur("so") )) &= (( c|facteur )) (( -c|facteur("so") )) \\ -(( a|facteur ))x^2 (( b|facteur("so*x") )) &= 0 \\ +f\,(x) &= (( c|facteur )) \\ +(( a|facteur("X") )) (( b|facteur("so*x") )) (( c|facteur("so") )) &= (( c|facteur )) \\ +(( a|facteur("X") )) (( b|facteur("so*x") )) (( c|facteur("so") )) (( -c|facteur("so") )) &= (( c|facteur )) (( -c|facteur("so") )) \\ +(( a|facteur("X") )) (( b|facteur("so*x") )) &= 0 \\ \end{align*} Nous pouvons maintenant factoriser le membre de gauche par $x$, ce qui nous donnera une équation produit nul. \begin{align*} -(( a|facteur ))x^2 (( b|facteur("so*x") )) &= 0 \\ -(( a|facteur ))x\times x (( b|facteur("so") ))\times x &= 0 \\ -x\left( (( a|facteur ))x (( b|facteur("so") )) \right) &= 0 \\ +(( a|facteur("X") )) (( b|facteur("so*x") )) &= 0 \\ +(( a|facteur("x") ))\times x (( b|facteur("so") ))\times x &= 0 \\ +x\,\left( (( a|facteur("x") )) (( b|facteur("so") )) \right) &= 0 \\ \end{align*} \begin{align*} -x =0 &\text{ ou } (( a|facteur ))x (( b|facteur("so") ))=0 \\ -x =0 &\text{ ou } (( a|facteur ))x =(( -b|facteur )) \\ +x =0 &\text{ ou } (( a|facteur("x") )) (( b|facteur("so") ))=0 \\ +x =0 &\text{ ou } (( a|facteur("x") )) =(( -b|facteur )) \\ x =0 &\text{ ou } x = \frac{(( -b|facteur ))}{(( a|facteur ))} \\ x =0 &\text{ ou } x = (( -(b/a)|facteur )) \\ \end{align*} Il y a donc deux solutions : $x=0$ et $x=(( -(b/a)|facteur ))$. -\item $f(x)=(( beta|facteur ))$ On remarque que la forme canonique contient la constante $(( beta|facteur ))$ : en l'utilisant, elles devraient se simplifier. +\item $f\,(x)=(( beta|facteur ))$ On remarque que la forme canonique contient la constante $(( beta|facteur ))$ : en l'utilisant, elles devraient se simplifier. \begin{align*} -f(x) &= (( beta|facteur)) \\ -(( a|facteur )) \left( x (( -alpha|facteur("so") )) \right)^2 (( beta|facteur("so") )) &= (( beta|facteur ))\\ -(( a|facteur )) \left( x (( -alpha|facteur("so") )) \right)^2 (( beta|facteur("so") )) (( -beta|facteur("so") )) &= (( beta|facteur )) (( -beta|facteur("so") ))\\ -(( a|facteur )) \left( x (( -alpha|facteur("so") )) \right)^2 &= 0\\ +f\,(x) &= (( beta|facteur)) \\ +(( a|facteur )) \,\left( x (( -alpha|facteur("so") )) \right)^2 (( beta|facteur("so") )) &= (( beta|facteur ))\\ +(( a|facteur )) \,\left( x (( -alpha|facteur("so") )) \right)^2 (( beta|facteur("so") )) (( -beta|facteur("so") )) &= (( beta|facteur )) (( -beta|facteur("so") ))\\ +(( a|facteur )) \,\left( x (( -alpha|facteur("so") )) \right)^2 &= 0\\ \left( x (( -alpha|facteur("so") )) \right)^2 &= 0\\ \end{align*} Or $0$ est le seul nombre dont le carré est nul, donc l'équation précédente est équivalente à : @@ -75,7 +75,7 @@ donc la fonction est (* if a > 0 *) décroissante puis croissante (* else *) croissante puis décroissante (* endif *). De plus, l'absisse du sommet est $-\frac{(( b|facteur ))}{2\times(( a|facteur("p") ))}$, soit $(( alpha|facteur ))$, et -$f( (( alpha|facteur )) )=(( a|facteur ))\times(( alpha|facteur("p") ))^2 (( b|facteur("so") ))\times (( alpha|facteur("p") )) (( c|facteur("so") ))=(( beta|facteur ))$. +$f\,( (( alpha|facteur )) )=(( a|facteur ))\times(( alpha|facteur("p") ))^2 (( b|facteur("so") ))\times (( alpha|facteur("p") )) (( c|facteur("so") ))=(( beta|facteur ))$. Le tableau de variations est donc : \begin{center} \begin{tikzpicture} @@ -89,7 +89,7 @@ (* endif *) \end{tikzpicture} \end{center} -\item \emph{Dresser le tableau de signes de $f$.} Construisons un tableau de signes en utilisant la forme factorisée $f(x)=(( a|facteur )) \left(x (( -x1|facteur("so") ))\right) \left(x (( -x2|facteur("so") ))\right)$. +\item \emph{Dresser le tableau de signes de $f$.} Construisons un tableau de signes en utilisant la forme factorisée $f\,(x)=(( a|facteur )) \,\left(x (( -x1|facteur("so") ))\right) \, \left(x (( -x2|facteur("so") ))\right)$. \begin{itemize} \item Le premier facteur $x (( -x1|facteur("so") ))$ est une fonction affine, de coefficient directeur $a=1$ positif, et d'ordonnée à l'origine $b=(( -x1|facteur ))$. Elle est donc négative, puis positive, et change de signe en $-\frac{b}{a}=-\frac{(( -x1|facteur ))}{1}=(( x1|facteur ))$. @@ -103,7 +103,7 @@ $(( a|facteur ))$/1, $x (( -x1|facteur("so") ))$/1, $x (( -x2|facteur("so") ))$/1, - $f(x)=(( a|facteur ))\left( x (( -x1|facteur("so") )) \right) \left( x (( -x2|facteur("so") )) \right)$/1.5 + $f\,(x)=(( a|facteur ))\,\left( x (( -x1|facteur("so") )) \right)\,\left( x (( -x2|facteur("so") )) \right)$/1.5 } {$-\infty$, $(( (x1, x2)|min|facteur ))$, $(( (x1, x2)|max|facteur ))$, $+\infty$} \tkzTabLine{, (( a|signe )), t, (( a|signe )), t, (( a|signe ))} @@ -120,13 +120,13 @@ \end{enumerate} \item Répondre aux questions suivantes en utilisant le tableau de signes ou de variations. \begin{enumerate} -\item \emph{Résoudre $f(x)\geq0$.} En regardant la dernière ligne du tableau de signes, on observe que $f$ est positive sur +\item \emph{Résoudre $f\,(x)\geqslant0$.} En regardant la dernière ligne du tableau de signes, on observe que $f$ est positive sur (* if a > 0 *) les premier et dernier intervalles (* else *) l'intervalle central (* endif *). Les solutions sont donc : (* if a > 0 *) - \[x\in\left]-\infty; (( (x1, x2)|min|facteur ))\right] \cup \left[ (( (x1, x2)|max|facteur )); +\infty\right[\] + \[ x\in\interval[open left, scaled]{-\infty; (( (x1, x2)|min|facteur ))} \cup \interval[open right, scaled]{(( (x1, x2)|max|facteur ))}{+\infty} \] (* else *) - \[ x\in\left[ (( (x1, x2)|min|facteur )) ; (( (x1, x2)|max|facteur )) \right] \] + \[ x\in\interval[scaled]{(( (x1, x2)|min|facteur ))}{(( (x1, x2)|max|facteur ))} \] (* endif *) \item \emph{Quel est l'extremum de $f$ ? Est-ce un maximum ou un minimum ? Pour quelle valeur de $x$ est-il atteint ?} On lit sur le tableau de variations que la plus (* if a > 0 *) petite (* else *) grande (* endif *) diff --git a/data/ex/templates/BilanTrinomeSansDiscriminant-statement.tex b/data/ex/templates/BilanTrinomeSansDiscriminant-statement.tex index 7005bc03..bde9bfe4 100644 --- a/data/ex/templates/BilanTrinomeSansDiscriminant-statement.tex +++ b/data/ex/templates/BilanTrinomeSansDiscriminant-statement.tex @@ -1,17 +1,17 @@ \exercice -On considère le trinôme du second degré $f: x\mapsto (( a|facteur )) x^2 (( b|facteur("*sox") )) (( c|facteur("so") ))$. +On considère le trinôme du second degré $f: x\mapsto (( a|facteur("X") )) (( b|facteur("*sox") )) (( c|facteur("so") ))$. \begin{enumerate} \item \begin{enumerate} - \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f(x)=(( a|facteur )) \left( x (( -x1|facteur("so") )) \right) \left( x (( -x2|facteur("so") )) \right) $. - \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f(x)=(( a|facteur ))\left( x (( -alpha|facteur("so") )) \right)^2 (( beta|facteur("so") ))$. + \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f\,(x)=(( a|facteur )) \,\left( x (( -x1|facteur("so") )) \right) \, \left( x (( -x2|facteur("so") )) \right) $. + \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f\,(x)=(( a|facteur )) \,\left( x (( -alpha|facteur("so") )) \right)^2 (( beta|facteur("so") ))$. \end{enumerate} \item Résoudre les équations suivantes en choisissant la forme appropriée de $f$. \begin{enumerate} -\item $f(x)=0$ -\item $f(x)=(( c|facteur ))$ -\item $f(x)=(( beta|facteur ))$ +\item $f\,(x)=0$ +\item $f\,(x)=(( c|facteur ))$ +\item $f\,(x)=(( beta|facteur ))$ \end{enumerate} \item \begin{enumerate} @@ -20,7 +20,7 @@ \end{enumerate} \item Répondre aux questions suivantes en utilisant le tableau de signes ou de variations. \begin{enumerate} -\item Résoudre $f(x)\geq0$. +\item Résoudre $f(x)\geqslant0$. \item Quel est l'extremum de $f$ ? Est-ce un maximum ou un minimum ? Pour quelle valeur de $x$ est-il atteint ? \end{enumerate} \end{enumerate} diff --git a/data/ex/templates/EtatStableSysteme2-answer.tex b/data/ex/templates/EtatStableSysteme2-answer.tex index 8480cb22..9f16e33f 100644 --- a/data/ex/templates/EtatStableSysteme2-answer.tex +++ b/data/ex/templates/EtatStableSysteme2-answer.tex @@ -8,20 +8,20 @@ (( (1-b)|facteur )) & (( b|facteur )) \\ \end{pmatrix}\\ &= \begin{pmatrix} - (( a|facteur )) x + (( (1-b)|facteur )) y & (( (1-a)|facteur )) x + (( b|facteur )) y + (( a|facteur("x") )) + (( (1-b)|facteur("y") )) & (( (1-a)|facteur("x") )) + (( b|facteur("y") )) \end{pmatrix} \end{align*} -Or $\begin{pmatrix}x&y\end{pmatrix}=P=P\times M$, donc les coefficients des matrices sont deux à deux égaux, donc $x=(( a )) x + (( 1-b )) y$. +Or $\begin{pmatrix}x&y\end{pmatrix}=P=P\times M$, donc les coefficients des matrices sont deux à deux égaux, donc $x=(( a|facteur("x") )) + (( (1-b)|facteur("y") ))$. D'autre part, puisque $P$ est un état probabiliste, alors $x+y=1$, donc $y=1-x$. Donc, en remplaçant $y$ par $1-x$ dans l'équation précédente, on obtient : \begin{align*} - x &= (( a|facteur )) x + (( (1-b)|facteur )) (1-x) \\ - x &= (( a|facteur )) x + (( (1-b)|facteur )) - (( (1-b)|facteur ))x\\ - x-(( a|facteur )) x +(( (1-b)|facteur ))x &= (( (1-b)|facteur ))\\ - (1-(( a|facteur ))+(( (1-b)|facteur )))x &= (( (1-b)|facteur ))\\ - (( (2-a-b)|facteur )) x &= (( (1-b)|facteur ))\\ + x &= (( a|facteur("x") )) + (( (1-b)|facteur ))\,(1-x) \\ + x &= (( a|facteur("x") )) + (( (1-b)|facteur )) - (( (1-b)|facteur("x") ))\\ + x-(( a|facteur("x") )) +(( (1-b)|facteur("x") )) &= (( (1-b)|facteur ))\\ + (1-(( a|facteur ))+(( (1-b)|facteur ))) \,x &= (( (1-b)|facteur ))\\ + (( (2-a-b)|facteur("x") )) &= (( (1-b)|facteur ))\\ x &= \frac{(( (1-b)|facteur ))}{(( (2-a-b)|facteur ))}\\ x &= (( ((1-b)/(2-a-b))|facteur )) \end{align*} diff --git a/data/ex/templates/InterpolationMatrices-answer.tex b/data/ex/templates/InterpolationMatrices-answer.tex index 83b2fde2..dd044364 100644 --- a/data/ex/templates/InterpolationMatrices-answer.tex +++ b/data/ex/templates/InterpolationMatrices-answer.tex @@ -1,61 +1,64 @@ +\exercice* \begin{enumerate} \item \begin{enumerate} \item \begin{itemize} - \item Puisque $A( (( X[0]|facteur )) ; (( Y[0]|facteur )) )$ est sur la courbe de $f$, alors $f( (( X[0]|facteur )) )=(( Y[0]|facteur ))$, soit + \item Puisque $A\,( (( X[0]|facteur ))~;~(( Y[0]|facteur )) )$ est sur la courbe de $f$, alors $f\,( (( X[0]|facteur )) )=(( Y[0]|facteur ))$, soit $a \times (( X[0]|facteur ))^2+b\times (( X[0]|facteur ))+c=(( Y[0]|facteur ))$, - c'est-à-dire $(( (X[0]**2)|facteur ))a + (( X[0]|facteur ))b + c = (( Y[0]|facteur ))$. - \item De même, puisque $B( (( X[1]|facteur )) ; (( Y[1]|facteur )) )$ est sur la courbe de $f$, alors $f( (( X[1]|facteur )) )=(( Y[1]|facteur ))$, soit + c'est-à-dire $(( (X[0]**2)|facteur(variable="a") )) + (( X[0]|facteur(variable="b") )) + c = (( Y[0]|facteur ))$. + \item De même, puisque $B\,( (( X[1]|facteur ))~;~(( Y[1]|facteur )) )$ est sur la courbe de $f$, alors $f\,( (( X[1]|facteur )) )=(( Y[1]|facteur ))$, soit $a \times (( X[1]|facteur ))^2+b\times (( X[1]|facteur ))+c=(( Y[1]|facteur ))$, - c'est-à-dire $(( (X[1]**2)|facteur ))a + (( X[1]|facteur ))b + c = (( Y[1]|facteur ))$. - \item Enfin, puisque $C( (( X[2]|facteur )) ; (( Y[2]|facteur )) )$ est sur la courbe de $f$, alors $f( (( X[2]|facteur )) )=(( Y[2]|facteur ))$, soit + c'est-à-dire $(( (X[1]**2)|facteur(variable="a") )) + (( X[1]|facteur(variable="b") )) + c = (( Y[1]|facteur ))$. + \item Enfin, puisque $C\,( (( X[2]|facteur ))~;~(( Y[2]|facteur )) )$ est sur la courbe de $f$, alors $f\,( (( X[2]|facteur )) )=(( Y[2]|facteur ))$, soit $a \times (( X[2]|facteur ))^2+b\times (( X[2]|facteur ))+c=(( Y[2]|facteur ))$, - c'est-à-dire $(( (X[2]**2)|facteur ))a + (( X[2]|facteur ))b + c = (( Y[2]|facteur ))$. + c'est-à-dire $(( (X[2]**2)|facteur(variable="a") )) + (( X[2]|facteur(variable="b") )) + c = (( Y[2]|facteur ))$. \end{itemize} On en déduit le système suivant : \[ \left\{\begin{array}{rcl} - (( (X[0]**2)|facteur ))a + (( X[0]|facteur ))b + c &=& (( Y[0]|facteur )) \\ - (( (X[1]**2)|facteur ))a + (( X[1]|facteur ))b + c &=& (( Y[1]|facteur )) \\ - (( (X[2]**2)|facteur ))a + (( X[2]|facteur ))b + c &=& (( Y[2]|facteur )) \\ + (( (X[0]**2)|facteur(variable="a") )) + (( X[0]|facteur(variable="b") )) + c &=& (( Y[0]|facteur )) \\ + (( (X[1]**2)|facteur(variable="a") )) + (( X[1]|facteur(variable="b") )) + c &=& (( Y[1]|facteur )) \\ + (( (X[2]**2)|facteur(variable="a") )) + (( X[2]|facteur(variable="b") )) + c &=& (( Y[2]|facteur )) \\ \end{array}\right.\] \item \begin{align*} \left\{\begin{array}{rcl} - (( (X[0]**2)|facteur ))a + (( X[0]|facteur ))b + c &=& (( Y[0]|facteur )) \\ - (( (X[1]**2)|facteur ))a + (( X[1]|facteur ))b + c &=& (( Y[1]|facteur )) \\ - (( (X[2]**2)|facteur ))a + (( X[2]|facteur ))b + c &=& (( Y[2]|facteur )) \\ + (( (X[0]**2)|facteur(variable="a") )) + (( X[0]|facteur(variable="b") )) + c &=& (( Y[0]|facteur )) \\ + (( (X[1]**2)|facteur(variable="a") )) + (( X[1]|facteur(variable="b") )) + c &=& (( Y[1]|facteur )) \\ + (( (X[2]**2)|facteur(variable="a") )) + (( X[2]|facteur(variable="b") )) + c &=& (( Y[2]|facteur )) \\ \end{array}\right. &\iff \begin{pmatrix} -(( (X[0]**2)|facteur ))a + (( X[0]|facteur ))b + c \\ -(( (X[1]**2)|facteur ))a + (( X[1]|facteur ))b + c \\ -(( (X[2]**2)|facteur ))a + (( X[2]|facteur ))b + c \\ +(( (X[0]**2)|facteur(variable="a") )) + (( X[0]|facteur(variable="b") )) + c \\ +(( (X[1]**2)|facteur(variable="a") )) + (( X[1]|facteur(variable="b") )) + c \\ +(( (X[2]**2)|facteur(variable="a") )) + (( X[2]|facteur(variable="b") )) + c \\ \end{pmatrix} = (( Y|zip|matrice ))\\ &\iff (( M|matrice)) \times (( [["a"], ["b"], ["c"]]|matrice )) = (( Y|zip|matrice )) \\ -&\iff M X=R +&\iff M\, X=R \end{align*} Avec : $M= (( M|matrice ))$, $X= (( [["a"], ["b"], ["c"]]|matrice ))$ et $R= (( Y|zip|matrice ))$. \end{enumerate} \item - Comme $M$ est inversible, et que $MX = R$, alors $X = M^{-1}\times R$. À la calculatrice, on obtient -$M^{-1}\times R=(( M|matrice ))^{-1}\times ((Y|zip|matrice)) = (( A|zip|matrice ))$. + Comme $M$ est inversible, et que $M\,X = R$, alors $X = M^{-1}\times R$. + + À la calculatrice, on obtient + $M^{-1}\times R=(( M|matrice ))^{-1}\times ((Y|zip|matrice)) = (( A|zip|matrice ))$. Ainsi, $a=(( A[0]|facteur ))$, $b=(( A[1]|facteur ))$, et $c=(( A[2]|facteur ))$. \item -En utilisant les valeurs de $a$, $b$, et $c$ calculées précédemment, nous connaissons l'expression de la fonction : $f(x) = (( A[0]|facteur ))x^2 + (( A[1]|facteur))x + (( A[2]|facteur ))$. +En utilisant les valeurs de $a$, $b$, et $c$ calculées précédemment, nous connaissons l'expression de la fonction : $f\,(x) = (( A[0]|facteur("X") )) (( A[1]|facteur("x", signe=True))) (( A[2]|facteur(signe=True) ))$. Nous pouvons maintenant calculer l'image de $(( x|facteur ))$ par cette fonction : \begin{align*} -f( (( x|facteur )) ) -&= (( A[0]|facteur )) \times (( x|facteur ))^2 + (( A[1]|facteur )) \times (( x|facteur)) + (( A[2]|facteur ))\\ +f\,( (( x|facteur )) ) +&= (( A[0]|facteur )) \times (( x|facteur ))^2 (( A[1]|facteur(signe=True) )) \times (( x|facteur)) (( A[2]|facteur(signe=True) ))\\ &= (( (A[0]*x**2+A[1]*x+A[2])|facteur )) \end{align*} -Donc $f( (( x|facteur )) ) = (( (A[0]*x**2+A[1]*x+A[2])|facteur ))$. +Donc $f\,( (( x|facteur )) ) = (( (A[0]*x**2+A[1]*x+A[2])|facteur ))$. \end{enumerate} diff --git a/data/ex/templates/InterpolationMatrices-statement.tex b/data/ex/templates/InterpolationMatrices-statement.tex index 92897c30..408d6465 100644 --- a/data/ex/templates/InterpolationMatrices-statement.tex +++ b/data/ex/templates/InterpolationMatrices-statement.tex @@ -1,15 +1,17 @@ +\exercice Dans un repère orthonormé, on cherche à déterminer l'équation d'une fonction dont la courbe passe par les points -$A( (( X[0]|facteur )) ; (( Y[0]|facteur )) )$, -$B( (( X[1]|facteur )) ; (( Y[1]|facteur )) )$ et -$C( (( X[2]|facteur )) ; (( Y[2]|facteur )) )$. +$A\,( (( X[0]|facteur )) ~;~ (( Y[0]|facteur )) )$, +$B\,( (( X[1]|facteur )) ~;~ (( Y[1]|facteur )) )$ et +$C\,( (( X[2]|facteur )) ~;~ (( Y[2]|facteur )) )$. -On cherche un trinôme du second degré, c'est-à-dire une fonction $f$ définie sur $]-\infty ; +\infty[$ par $f(x) = ax^2 + bx + c$ où $a$, $b$ et $c$ sont trois nombres réels, que l'on cherche à déterminer. +On cherche un trinôme du second degré, c'est-à-dire une fonction $f$ définie sur $\interval[open]{-\infty}{+\infty}$ par + \mbox{$f\,(x) = a\,x^2 + b\,x + c$} où $a$, $b$ et $c$ sont trois nombres réels, que l'on cherche à déterminer. \begin{enumerate} \item \begin{enumerate} \item À partir des données de l'énoncé, écrire un système d'équations traduisant cette situation. - \item En déduire que le système précédent est équivalent à : $MX = R$ avec + \item En déduire que le système précédent est équivalent à : $M\,X = R$ avec $M = (( M|matrice ))$, $X= (( [["a"], ["b"], ["c"]]|matrice ))$ et $R$ une matrice colonne que l'on précisera. \end{enumerate} @@ -18,6 +20,6 @@ \setcounter{enumi}{1} \item On admet que la matrice $M$ est inversible. Déterminer les valeurs des cœfficients $a$, $b$ et $c$, en détaillant les calculs. - \item Quelle est la valeur de $f( (( x|facteur )) )$ ? + \item Quelle est la valeur de $f\,( (( x|facteur )) )$ ? \end{enumerate} diff --git a/data/templates/evaluation.tex b/data/templates/evaluation.tex index 2f029ec3..3e8e870c 100644 --- a/data/templates/evaluation.tex +++ b/data/templates/evaluation.tex @@ -21,6 +21,7 @@ \usepackage{wrapfig} % allows figures or tables to have text wrapped around \usepackage{pst-eucl, pst-plot} % figures géométriques \usepackage{enumitem} +\usepackage{interval} \usepackage{wasysym} % Symbole Euro \usepackage{mathtools} % Encadrement dans align* \usepackage[inline]{asymptote} @@ -35,6 +36,7 @@ ps2eps -f "\image.ps" } } +\intervalconfig{ separator symbol={\,;\,}} %\usepackage{textcomp} diff --git a/data/templates/pyromaths.tex b/data/templates/pyromaths.tex index f6c0b071..c58168b4 100644 --- a/data/templates/pyromaths.tex +++ b/data/templates/pyromaths.tex @@ -21,6 +21,7 @@ \usepackage{wrapfig} % allows figures or tables to have text wrapped around \usepackage{pst-eucl, pst-plot} % figures géométriques \usepackage{enumitem} +\usepackage{interval} \usepackage{wasysym} % Symbole Euro \usepackage{mathtools} % Encadrement dans align* \usepackage[inline]{asymptote} @@ -35,6 +36,7 @@ ps2eps -f "\image.ps" } } +\intervalconfig{ separator symbol={\,;\,}} %\usepackage{textcomp} diff --git a/locale/ca@valencia/LC_MESSAGES/pyromaths.po b/locale/ca@valencia/LC_MESSAGES/pyromaths.po index ee757005..6e7cf3e3 100644 --- a/locale/ca@valencia/LC_MESSAGES/pyromaths.po +++ b/locale/ca@valencia/LC_MESSAGES/pyromaths.po @@ -2808,7 +2808,7 @@ msgid "Sens de variations" msgstr "Intervals de monotonia" #: src/pyromaths/ex/lycee/ExoPolynome.py:284 -msgid "0.Term STG" +msgid "0.Term STMG" msgstr "0.2n Batxillerat" #: src/pyromaths/ex/lycee/ExoPolynome.py:302 diff --git a/locale/en/LC_MESSAGES/pyromaths.po b/locale/en/LC_MESSAGES/pyromaths.po index f341bcc9..e2226c26 100644 --- a/locale/en/LC_MESSAGES/pyromaths.po +++ b/locale/en/LC_MESSAGES/pyromaths.po @@ -1851,7 +1851,7 @@ msgid "Sens de variations" msgstr "" #: src/pyromaths/ex/lycee/ExoPolynome.py:284 -msgid "0.Term STG" +msgid "0.Term STMG" msgstr "" #: src/pyromaths/ex/lycee/ExoPolynome.py:302 diff --git a/locale/es/LC_MESSAGES/pyromaths.po b/locale/es/LC_MESSAGES/pyromaths.po index 1466d39b..7a2a6c56 100644 --- a/locale/es/LC_MESSAGES/pyromaths.po +++ b/locale/es/LC_MESSAGES/pyromaths.po @@ -2566,7 +2566,7 @@ msgid "Sens de variations" msgstr "Las variaciones en el significado" #: src/pyromaths/ex/lycee/ExoPolynome.py:284 -msgid "0.Term STG" +msgid "0.Term STMG" msgstr "0.2º Bachillerato" #: src/pyromaths/ex/lycee/ExoPolynome.py:302 diff --git a/locale/pl/LC_MESSAGES/pyromaths.po b/locale/pl/LC_MESSAGES/pyromaths.po index f0d8a6fe..04cb9047 100644 --- a/locale/pl/LC_MESSAGES/pyromaths.po +++ b/locale/pl/LC_MESSAGES/pyromaths.po @@ -1849,7 +1849,7 @@ msgid "Sens de variations" msgstr "" #: src/pyromaths/ex/lycee/ExoPolynome.py:284 -msgid "0.Term STG" +msgid "0.Term STMG" msgstr "" #: src/pyromaths/ex/lycee/ExoPolynome.py:302 diff --git a/locale/pyromaths.pot b/locale/pyromaths.pot index 75b2458c..c9ea5ab9 100644 --- a/locale/pyromaths.pot +++ b/locale/pyromaths.pot @@ -1849,7 +1849,7 @@ msgid "Sens de variations" msgstr "" #: src/pyromaths/ex/lycee/ExoPolynome.py:284 -msgid "0.Term STG" +msgid "0.Term STMG" msgstr "" #: src/pyromaths/ex/lycee/ExoPolynome.py:302 diff --git a/src/pyromaths/ex/lycee/ExoPolynome.py b/src/pyromaths/ex/lycee/ExoPolynome.py index 336286d4..01e5bbf7 100644 --- a/src/pyromaths/ex/lycee/ExoPolynome.py +++ b/src/pyromaths/ex/lycee/ExoPolynome.py @@ -281,7 +281,7 @@ def exo_variation(): return exo, cor exo_variation.description = _(u"Sens de variations") -exo_variation.level = [_(u"1.1èreS"), _(u"0.Term STG")] +exo_variation.level = [_(u"1.1èreS"), _(u"0.Term STMG")] def exo_variation_lim(): diff --git a/src/pyromaths/ex/lycee/matrices.py b/src/pyromaths/ex/lycee/matrices.py index f8d0c064..7cf020eb 100644 --- a/src/pyromaths/ex/lycee/matrices.py +++ b/src/pyromaths/ex/lycee/matrices.py @@ -59,7 +59,7 @@ class EtatStableSysteme2(Jinja2Exercice): description = u"Recherche d'état stable (avec un système)" - level = u"0.TermES" + level = u"0.Term ES" def __init__(self): super(EtatStableSysteme2, self).__init__() @@ -83,7 +83,7 @@ class InterpolationMatrices(Jinja2Exercice): # Plus ou moins inspiré du sujet de bac ES Amérique du Nord, juin 2015. description = u"Interpolation polynomiale en utilisant des matrices" - level = u"0.TermES" + level = u"0.Term ES" def __init__(self): super(InterpolationMatrices, self).__init__() diff --git a/src/pyromaths/outils/jinja2.py b/src/pyromaths/outils/jinja2.py index 93f45e2c..0aae057f 100644 --- a/src/pyromaths/outils/jinja2.py +++ b/src/pyromaths/outils/jinja2.py @@ -248,13 +248,26 @@ def facteur(nombre, court="", else: strabsolu = "{}.{}".format(entier, decimal) + # Ajoute une espace fine entre les coefficients et les variables + if variable: + if absolu != 1 : variable= r'\,'+variable + else: absolu="" + # Ajout éventuel des parenthèses - if parentheses and nombre < 0: - formatter = r"\left(\numprint{{{signe}{absolu}}}{variable}\right)" - elif operation: - formatter = r"{signe}\numprint{{{absolu}}}{variable}" - else: - formatter = r"\numprint{{{signe}{absolu}}}{variable}" + if absolu: + if parentheses and nombre < 0: + formatter = r"\left(\numprint{{{signe}{absolu}}}{variable}\right)" + elif operation: + formatter = r"{signe}\numprint{{{absolu}}}{variable}" + else: + formatter = r"\numprint{{{signe}{absolu}}}{variable}" + else: # supprime le 1 devant la variable + if parentheses and nombre < 0: + formatter = r"\left({signe}{variable}\right)" + elif operation: + formatter = r"{signe}{variable}" + else: + formatter = r"{signe}{variable}" # Enfin ! return formatter.format( From 47e27490d5c8ce8ea51527db93458c61e29ebea0 Mon Sep 17 00:00:00 2001 From: Louis Date: Sat, 16 Jun 2018 15:51:39 +0200 Subject: [PATCH 23/26] [outils.jinja2] Ajout d'une espace devant la variable --- src/pyromaths/outils/jinja2.py | 41 +++++++++++++++------------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/src/pyromaths/outils/jinja2.py b/src/pyromaths/outils/jinja2.py index 0aae057f..defa2fb4 100644 --- a/src/pyromaths/outils/jinja2.py +++ b/src/pyromaths/outils/jinja2.py @@ -95,6 +95,8 @@ def facteur(nombre, court="", '\\numprint{2}' >>> facteur(2.3) '\\numprint{2.3}' + >>> facteur(-122.0) + '\\numprint{-122}' Arrondi >>> facteur(12345.6789, arrondi=None) @@ -151,20 +153,22 @@ def facteur(nombre, court="", '-x' >>> facteur(0, produit=True, variable="x") '' + >>> facteur(1, produit=False, variable="x") + '\\numprint{1}\\,x' Variable >>> facteur(2, variable='x') - '\\numprint{2}x' + '\\numprint{2}\\,x' >>> facteur(-1, produit=True, variable='x') '-x' Version courte des arguments >>> facteur(-2, court="2zXo") - '-\\numprint{2.00}x^2' + '-\\numprint{2.00}\\,x^2' >>> facteur(-2, court="2zXp") - '\\left(\\numprint{-2.00}x^2\\right)' + '\\left(\\numprint{-2.00}\\,x^2\\right)' >>> facteur(-2, court="2zY") - '\\numprint{-2.00}y^2' + '\\numprint{-2.00}\\,y^2' >>> facteur(-1, court="y*") '-y' >>> facteur(1, court="p*x") @@ -172,9 +176,9 @@ def facteur(nombre, court="", >>> facteur(-1, court="p*x") '\\left(-x\\right)' >>> facteur(-2, court="p*x") - '\\left(\\numprint{-2}x\\right)' + '\\left(\\numprint{-2}\\,x\\right)' >>> facteur(2, court="p*x") - '\\numprint{2}x' + '\\numprint{2}\\,x' >>> facteur(1, court="s*x") '+x' @@ -248,26 +252,17 @@ def facteur(nombre, court="", else: strabsolu = "{}.{}".format(entier, decimal) - # Ajoute une espace fine entre les coefficients et les variables + # Ajout éventuel d'une espace devant la variable if variable: - if absolu != 1 : variable= r'\,'+variable - else: absolu="" + variable = r"\," + variable # Ajout éventuel des parenthèses - if absolu: - if parentheses and nombre < 0: - formatter = r"\left(\numprint{{{signe}{absolu}}}{variable}\right)" - elif operation: - formatter = r"{signe}\numprint{{{absolu}}}{variable}" - else: - formatter = r"\numprint{{{signe}{absolu}}}{variable}" - else: # supprime le 1 devant la variable - if parentheses and nombre < 0: - formatter = r"\left({signe}{variable}\right)" - elif operation: - formatter = r"{signe}{variable}" - else: - formatter = r"{signe}{variable}" + if parentheses and nombre < 0: + formatter = r"\left(\numprint{{{signe}{absolu}}}{variable}\right)" + elif operation: + formatter = r"{signe}\numprint{{{absolu}}}{variable}" + else: + formatter = r"\numprint{{{signe}{absolu}}}{variable}" # Enfin ! return formatter.format( From 7a191467b26777e08467ff79774ad1c70427f810 Mon Sep 17 00:00:00 2001 From: Louis Date: Sat, 16 Jun 2018 15:52:39 +0200 Subject: [PATCH 24/26] =?UTF-8?q?[exercice.InterpolationMatrices]=20Le=20s?= =?UTF-8?q?igne=20-=20est=20une=20op=C3=A9ration=20(et=20doit=20=C3=AAtr?= =?UTF-8?q?=20=C3=A0=20l'ext=C3=A9rieur=20du=20`\numprint`)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/ex/templates/InterpolationMatrices-answer.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/ex/templates/InterpolationMatrices-answer.tex b/data/ex/templates/InterpolationMatrices-answer.tex index dd044364..24e07f34 100644 --- a/data/ex/templates/InterpolationMatrices-answer.tex +++ b/data/ex/templates/InterpolationMatrices-answer.tex @@ -51,12 +51,12 @@ Ainsi, $a=(( A[0]|facteur ))$, $b=(( A[1]|facteur ))$, et $c=(( A[2]|facteur ))$. \item -En utilisant les valeurs de $a$, $b$, et $c$ calculées précédemment, nous connaissons l'expression de la fonction : $f\,(x) = (( A[0]|facteur("X") )) (( A[1]|facteur("x", signe=True))) (( A[2]|facteur(signe=True) ))$. +En utilisant les valeurs de $a$, $b$, et $c$ calculées précédemment, nous connaissons l'expression de la fonction : $f\,(x) = (( A[0]|facteur("X") )) (( A[1]|facteur("sox*"))) (( A[2]|facteur("so") ))$. Nous pouvons maintenant calculer l'image de $(( x|facteur ))$ par cette fonction : \begin{align*} f\,( (( x|facteur )) ) -&= (( A[0]|facteur )) \times (( x|facteur ))^2 (( A[1]|facteur(signe=True) )) \times (( x|facteur)) (( A[2]|facteur(signe=True) ))\\ +&= (( A[0]|facteur )) \times (( x|facteur ))^2 (( A[1]|facteur("so") )) \times (( x|facteur)) (( A[2]|facteur("so") ))\\ &= (( (A[0]*x**2+A[1]*x+A[2])|facteur )) \end{align*} Donc $f\,( (( x|facteur )) ) = (( (A[0]*x**2+A[1]*x+A[2])|facteur ))$. From ac1494892df01a885a4de8c8bc1e1e07b07b245a Mon Sep 17 00:00:00 2001 From: Louis Date: Sat, 16 Jun 2018 15:53:09 +0200 Subject: [PATCH 25/26] [exercice.InterpolationMatrices] Correction de deux erreurs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Les nombres a, b, c ne sont jamais égaux à 1. - Dans certains rares cas, l'approximation de float() pose problème : utilisation de decimal() à la place --- src/pyromaths/ex/lycee/matrices.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/pyromaths/ex/lycee/matrices.py b/src/pyromaths/ex/lycee/matrices.py index 7cf020eb..3c57a93d 100644 --- a/src/pyromaths/ex/lycee/matrices.py +++ b/src/pyromaths/ex/lycee/matrices.py @@ -23,6 +23,8 @@ # """Exercice de Terminale ES, spécialité : Déterminer un état stable en utilisant un système.""" + +import decimal import random from pyromaths.ex import Jinja2Exercice @@ -97,14 +99,21 @@ def __init__(self): ]) a = b = c = 0 - while len(set([a, b, c])) != 3: - a = random.choice([1, -1]) * random.randint(2, 19) - b = random.choice([1, -1]) * random.randint(2, 19) - c = random.choice([1, -1]) * random.randint(2, 19) + while True: + a = decimal.Decimal(random.choice([1, -1]) * random.randint(2, 19)) + b = decimal.Decimal(random.choice([1, -1]) * random.randint(2, 19)) + c = decimal.Decimal(random.choice([1, -1]) * random.randint(2, 19)) + + if len(set([a, b, c])) != 3: + continue + if 10 in (abs(a), abs(b), abs(c)): + continue + break + if random.randint(0, 1) == 1: - a = float(a) / 10 - b = float(b) / 10 - c = float(c) / 10 + a = a / 10 + b = b / 10 + c = c / 10 M = [ [X[0]**2, X[0], 1], From 8cd1726903286f821b3506e5404a2876be8edcf0 Mon Sep 17 00:00:00 2001 From: Louis Date: Sat, 16 Jun 2018 16:06:17 +0200 Subject: [PATCH 26/26] =?UTF-8?q?Mise=20=C3=A0=20jour=20des=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BilanTrinomeSansDiscriminant-answer.tex | 2 +- .../BilanTrinomeSansDiscriminant.0.answer | 70 +++++++++---------- .../BilanTrinomeSansDiscriminant.0.statement | 14 ++-- .../BilanTrinomeSansDiscriminant.1.answer | 70 +++++++++---------- .../BilanTrinomeSansDiscriminant.1.statement | 14 ++-- data/ex/tests/EtatStableSysteme2.0.answer | 14 ++-- data/ex/tests/InterpolationMatrices.0.answer | 47 +++++++------ .../tests/InterpolationMatrices.0.statement | 14 ++-- 8 files changed, 125 insertions(+), 120 deletions(-) diff --git a/data/ex/templates/BilanTrinomeSansDiscriminant-answer.tex b/data/ex/templates/BilanTrinomeSansDiscriminant-answer.tex index 0b63c318..337ce265 100644 --- a/data/ex/templates/BilanTrinomeSansDiscriminant-answer.tex +++ b/data/ex/templates/BilanTrinomeSansDiscriminant-answer.tex @@ -124,7 +124,7 @@ (* if a > 0 *) les premier et dernier intervalles (* else *) l'intervalle central (* endif *). Les solutions sont donc : (* if a > 0 *) - \[ x\in\interval[open left, scaled]{-\infty; (( (x1, x2)|min|facteur ))} \cup \interval[open right, scaled]{(( (x1, x2)|max|facteur ))}{+\infty} \] + \[ x\in\interval[open left, scaled]{-\infty}{(( (x1, x2)|min|facteur ))} \cup \interval[open right, scaled]{(( (x1, x2)|max|facteur ))}{+\infty} \] (* else *) \[ x\in\interval[scaled]{(( (x1, x2)|min|facteur ))}{(( (x1, x2)|max|facteur ))} \] (* endif *) diff --git a/data/ex/tests/BilanTrinomeSansDiscriminant.0.answer b/data/ex/tests/BilanTrinomeSansDiscriminant.0.answer index abb8f207..844e16fb 100644 --- a/data/ex/tests/BilanTrinomeSansDiscriminant.0.answer +++ b/data/ex/tests/BilanTrinomeSansDiscriminant.0.answer @@ -1,64 +1,64 @@ \exercice* -On considère le trinôme du second degré $f: x\mapsto \numprint{2} x^2 -\numprint{4}x -\numprint{70}$. +On considère le trinôme du second degré $f: x\mapsto \numprint{2}\,x^2 -\numprint{4}\,x -\numprint{70}$. \begin{enumerate} \item \begin{enumerate} \item Soit $x\in\mathbb{R}$. Alors : \begin{align*} - \numprint{2} \left( x +\numprint{5} \right) \left( x -\numprint{7} \right) - &= \numprint{2} \left(x\times x +\numprint{5}\times x -\numprint{7}\times x +\numprint{5}\times \left(\numprint{-7}\right) \right) \\ - &= \numprint{2} \left(x^2 -\numprint{2}x -\numprint{35}\right) \\ - &= \numprint{2} x^2 +\numprint{2}\times\left(\numprint{-2}\right)x +\numprint{2}\times\left(\numprint{-35}\right) \\ - &= \numprint{2} x^2 -\numprint{4}x -\numprint{70}\\ - &= f(x) + \numprint{2} \,\left( x +\numprint{5} \right) \, \left( x -\numprint{7} \right) + &= \numprint{2} \,\left(x\times x +\numprint{5}\times x -\numprint{7}\times x +\numprint{5}\times \left(\numprint{-7}\right) \right) \\ + &= \numprint{2} \,\left(x^2 -\numprint{2}\,x -\numprint{35}\right) \\ + &= \numprint{2}\,x^2 +\numprint{2}\times\left(\numprint{-2}\,x\right) +\numprint{2}\times\left(\numprint{-35}\right) \\ + &= \numprint{2}\,x^2 -\numprint{4}\,x -\numprint{70}\\ + &= f\,(x) \end{align*} \item Soit $x\in\mathbb{R}$. Alors : \begin{align*} - \numprint{2}\left( x -\numprint{1} \right)^2 -\numprint{72} - &= \numprint{2}\left( x^2 -\numprint{2}\times \numprint{1} \times x + \numprint{1}^2\right) -\numprint{72}\\ - &= \numprint{2}\left( x^2 -\numprint{2}x + \numprint{1}\right) -\numprint{72}\\ - &= \numprint{2}x^2 +\numprint{2}\times \left(\numprint{-2}x\right) +\numprint{2}\times \numprint{1} -\numprint{72}\\ - &= \numprint{2}x^2 -\numprint{4}x +\numprint{2} -\numprint{72}\\ - &= \numprint{2}x^2 -\numprint{4}x -\numprint{70}\\ - &= f(x) + \numprint{2}\,\left( x -\numprint{1} \right)^2 -\numprint{72} + &= \numprint{2}\,\left( x^2 -\numprint{2}\times \numprint{1} \times x + \numprint{1}^2\right) -\numprint{72}\\ + &= \numprint{2}\,\left( x^2 -\numprint{2}\,x + \numprint{1}\right) -\numprint{72}\\ + &= \numprint{2}\,x^2 +\numprint{2}\times \left(\numprint{-2}\,x\right) +\numprint{2}\times \numprint{1} -\numprint{72}\\ + &= \numprint{2}\,x^2 -\numprint{4}\,x +\numprint{2} -\numprint{72}\\ + &= \numprint{2}\,x^2 -\numprint{4}\,x -\numprint{70}\\ + &= f\,(x) \end{align*} \end{enumerate} \item Résoudre les équations suivantes en choisissant la forme appropriée de $f$. \begin{enumerate} -\item En prenant la forme factorisée, l'équation $f(x)=0$ est équivalente à l'équation produit nul $\numprint{2}(x +\numprint{5} )(x -\numprint{7} ) = 0$. Donc : +\item En prenant la forme factorisée, l'équation $f\,(x)=0$ est équivalente à l'équation produit nul $\numprint{2}\,(x +\numprint{5} )\,(x -\numprint{7} ) = 0$. Donc : \begin{align*} x +\numprint{5}=0 &\text{ ou } x -\numprint{7}=0 \\ x=\numprint{-5} &\text{ ou } x=\numprint{7} \end{align*} Il y a donc deux solutions : $\numprint{-5}$ et $\numprint{7}$. -\item $f(x)=\numprint{-70}$ On remarque que la forme développée contient la constante $\numprint{-70}$ : celles-ci devraient donc s'annuler, pour simplifier notre résolution. +\item $f\,(x)=\numprint{-70}$ On remarque que la forme développée contient la constante $\numprint{-70}$ : celles-ci devraient donc s'annuler, pour simplifier notre résolution. \begin{align*} -f(x) &= \numprint{-70} \\ -\numprint{2}x^2 -\numprint{4}x -\numprint{70} &= \numprint{-70} \\ -\numprint{2}x^2 -\numprint{4}x -\numprint{70} +\numprint{70} &= \numprint{-70} +\numprint{70} \\ -\numprint{2}x^2 -\numprint{4}x &= 0 \\ +f\,(x) &= \numprint{-70} \\ +\numprint{2}\,x^2 -\numprint{4}\,x -\numprint{70} &= \numprint{-70} \\ +\numprint{2}\,x^2 -\numprint{4}\,x -\numprint{70} +\numprint{70} &= \numprint{-70} +\numprint{70} \\ +\numprint{2}\,x^2 -\numprint{4}\,x &= 0 \\ \end{align*} Nous pouvons maintenant factoriser le membre de gauche par $x$, ce qui nous donnera une équation produit nul. \begin{align*} -\numprint{2}x^2 -\numprint{4}x &= 0 \\ -\numprint{2}x\times x -\numprint{4}\times x &= 0 \\ -x\left( \numprint{2}x -\numprint{4} \right) &= 0 \\ +\numprint{2}\,x^2 -\numprint{4}\,x &= 0 \\ +\numprint{2}\,x\times x -\numprint{4}\times x &= 0 \\ +x\,\left( \numprint{2}\,x -\numprint{4} \right) &= 0 \\ \end{align*} \begin{align*} -x =0 &\text{ ou } \numprint{2}x -\numprint{4}=0 \\ -x =0 &\text{ ou } \numprint{2}x =\numprint{4} \\ +x =0 &\text{ ou } \numprint{2}\,x -\numprint{4}=0 \\ +x =0 &\text{ ou } \numprint{2}\,x =\numprint{4} \\ x =0 &\text{ ou } x = \frac{\numprint{4}}{\numprint{2}} \\ x =0 &\text{ ou } x = \numprint{2} \\ \end{align*} Il y a donc deux solutions : $x=0$ et $x=\numprint{2}$. -\item $f(x)=\numprint{-72}$ On remarque que la forme canonique contient la constante $\numprint{-72}$ : en l'utilisant, elles devraient se simplifier. +\item $f\,(x)=\numprint{-72}$ On remarque que la forme canonique contient la constante $\numprint{-72}$ : en l'utilisant, elles devraient se simplifier. \begin{align*} -f(x) &= \numprint{-72} \\ -\numprint{2} \left( x -\numprint{1} \right)^2 -\numprint{72} &= \numprint{-72}\\ -\numprint{2} \left( x -\numprint{1} \right)^2 -\numprint{72} +\numprint{72} &= \numprint{-72} +\numprint{72}\\ -\numprint{2} \left( x -\numprint{1} \right)^2 &= 0\\ +f\,(x) &= \numprint{-72} \\ +\numprint{2} \,\left( x -\numprint{1} \right)^2 -\numprint{72} &= \numprint{-72}\\ +\numprint{2} \,\left( x -\numprint{1} \right)^2 -\numprint{72} +\numprint{72} &= \numprint{-72} +\numprint{72}\\ +\numprint{2} \,\left( x -\numprint{1} \right)^2 &= 0\\ \left( x -\numprint{1} \right)^2 &= 0\\ \end{align*} Or $0$ est le seul nombre dont le carré est nul, donc l'équation précédente est équivalente à : @@ -75,7 +75,7 @@ Il y a donc une unique solution $x=\numprint{1}$. donc la fonction est décroissante puis croissante . De plus, l'absisse du sommet est $-\frac{\numprint{-4}}{2\times\numprint{2}}$, soit $\numprint{1}$, et -$f( \numprint{1} )=\numprint{2}\times\numprint{1}^2 -\numprint{4}\times \numprint{1} -\numprint{70}=\numprint{-72}$. +$f\,( \numprint{1} )=\numprint{2}\times\numprint{1}^2 -\numprint{4}\times \numprint{1} -\numprint{70}=\numprint{-72}$. Le tableau de variations est donc : \begin{center} \begin{tikzpicture} @@ -85,7 +85,7 @@ Le tableau de variations est donc : \tkzTabVar{+/, -/$\numprint{-72}$/, +/} \end{tikzpicture} \end{center} -\item \emph{Dresser le tableau de signes de $f$.} Construisons un tableau de signes en utilisant la forme factorisée $f(x)=\numprint{2} \left(x +\numprint{5}\right) \left(x -\numprint{7}\right)$. +\item \emph{Dresser le tableau de signes de $f$.} Construisons un tableau de signes en utilisant la forme factorisée $f\,(x)=\numprint{2} \,\left(x +\numprint{5}\right) \, \left(x -\numprint{7}\right)$. \begin{itemize} \item Le premier facteur $x +\numprint{5}$ est une fonction affine, de coefficient directeur $a=1$ positif, et d'ordonnée à l'origine $b=\numprint{5}$. Elle est donc négative, puis positive, et change de signe en $-\frac{b}{a}=-\frac{\numprint{5}}{1}=\numprint{-5}$. @@ -99,7 +99,7 @@ Le tableau de variations est donc : $\numprint{2}$/1, $x +\numprint{5}$/1, $x -\numprint{7}$/1, - $f(x)=\numprint{2}\left( x +\numprint{5} \right) \left( x -\numprint{7} \right)$/1.5 + $f\,(x)=\numprint{2}\,\left( x +\numprint{5} \right)\,\left( x -\numprint{7} \right)$/1.5 } {$-\infty$, $\numprint{-5}$, $\numprint{7}$, $+\infty$} \tkzTabLine{, +, t, +, t, +} @@ -111,10 +111,10 @@ Le tableau de variations est donc : \end{enumerate} \item Répondre aux questions suivantes en utilisant le tableau de signes ou de variations. \begin{enumerate} -\item \emph{Résoudre $f(x)\geq0$.} En regardant la dernière ligne du tableau de signes, on observe que $f$ est positive sur +\item \emph{Résoudre $f\,(x)\geqslant0$.} En regardant la dernière ligne du tableau de signes, on observe que $f$ est positive sur les premier et dernier intervalles . Les solutions sont donc : - \[x\in\left]-\infty; \numprint{-5}\right] \cup \left[ \numprint{7}; +\infty\right[\] + \[ x\in\interval[open left, scaled]{-\infty}{\numprint{-5}} \cup \interval[open right, scaled]{\numprint{7}}{+\infty} \] \item \emph{Quel est l'extremum de $f$ ? Est-ce un maximum ou un minimum ? Pour quelle valeur de $x$ est-il atteint ?} On lit sur le tableau de variations que la plus petite valeur prise par $f$ est $\numprint{-72}$. Le minimum de $f$ est donc $\numprint{-72}$, et il est atteint pour $x=\numprint{1}$. diff --git a/data/ex/tests/BilanTrinomeSansDiscriminant.0.statement b/data/ex/tests/BilanTrinomeSansDiscriminant.0.statement index ec5cadf8..c2be40ab 100644 --- a/data/ex/tests/BilanTrinomeSansDiscriminant.0.statement +++ b/data/ex/tests/BilanTrinomeSansDiscriminant.0.statement @@ -1,17 +1,17 @@ \exercice -On considère le trinôme du second degré $f: x\mapsto \numprint{2} x^2 \numprint{-4}x -\numprint{70}$. +On considère le trinôme du second degré $f: x\mapsto \numprint{2}\,x^2 -\numprint{4}\,x -\numprint{70}$. \begin{enumerate} \item \begin{enumerate} - \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f(x)=\numprint{2} \left( x +\numprint{5} \right) \left( x -\numprint{7} \right) $. - \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f(x)=\numprint{2}\left( x -\numprint{1} \right)^2 -\numprint{72}$. + \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f\,(x)=\numprint{2} \,\left( x +\numprint{5} \right) \, \left( x -\numprint{7} \right) $. + \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f\,(x)=\numprint{2} \,\left( x -\numprint{1} \right)^2 -\numprint{72}$. \end{enumerate} \item Résoudre les équations suivantes en choisissant la forme appropriée de $f$. \begin{enumerate} -\item $f(x)=0$ -\item $f(x)=\numprint{-70}$ -\item $f(x)=\numprint{-72}$ +\item $f\,(x)=0$ +\item $f\,(x)=\numprint{-70}$ +\item $f\,(x)=\numprint{-72}$ \end{enumerate} \item \begin{enumerate} @@ -20,7 +20,7 @@ On considère le trinôme du second degré $f: x\mapsto \numprint{2} x^2 \numpri \end{enumerate} \item Répondre aux questions suivantes en utilisant le tableau de signes ou de variations. \begin{enumerate} -\item Résoudre $f(x)\geq0$. +\item Résoudre $f(x)\geqslant0$. \item Quel est l'extremum de $f$ ? Est-ce un maximum ou un minimum ? Pour quelle valeur de $x$ est-il atteint ? \end{enumerate} \end{enumerate} \ No newline at end of file diff --git a/data/ex/tests/BilanTrinomeSansDiscriminant.1.answer b/data/ex/tests/BilanTrinomeSansDiscriminant.1.answer index a3a366ae..6f58af77 100644 --- a/data/ex/tests/BilanTrinomeSansDiscriminant.1.answer +++ b/data/ex/tests/BilanTrinomeSansDiscriminant.1.answer @@ -1,64 +1,64 @@ \exercice* -On considère le trinôme du second degré $f: x\mapsto \numprint{-2} x^2 -\numprint{6}x +\numprint{80}$. +On considère le trinôme du second degré $f: x\mapsto \numprint{-2}\,x^2 -\numprint{6}\,x +\numprint{80}$. \begin{enumerate} \item \begin{enumerate} \item Soit $x\in\mathbb{R}$. Alors : \begin{align*} - \numprint{-2} \left( x -\numprint{5} \right) \left( x +\numprint{8} \right) - &= \numprint{-2} \left(x\times x -\numprint{5}\times x +\numprint{8}\times x -\numprint{5}\times \numprint{8} \right) \\ - &= \numprint{-2} \left(x^2 +\numprint{3}x -\numprint{40}\right) \\ - &= \numprint{-2} x^2 -\numprint{2}\times\numprint{3}x -\numprint{2}\times\left(\numprint{-40}\right) \\ - &= \numprint{-2} x^2 -\numprint{6}x +\numprint{80}\\ - &= f(x) + \numprint{-2} \,\left( x -\numprint{5} \right) \, \left( x +\numprint{8} \right) + &= \numprint{-2} \,\left(x\times x -\numprint{5}\times x +\numprint{8}\times x -\numprint{5}\times \numprint{8} \right) \\ + &= \numprint{-2} \,\left(x^2 +\numprint{3}\,x -\numprint{40}\right) \\ + &= \numprint{-2}\,x^2 -\numprint{2}\times\numprint{3}\,x -\numprint{2}\times\left(\numprint{-40}\right) \\ + &= \numprint{-2}\,x^2 -\numprint{6}\,x +\numprint{80}\\ + &= f\,(x) \end{align*} \item Soit $x\in\mathbb{R}$. Alors : \begin{align*} - \numprint{-2}\left( x +\numprint{1.5} \right)^2 +\numprint{84.5} - &= \numprint{-2}\left( x^2 +\numprint{2}\times \numprint{1.5} \times x + \numprint{1.5}^2\right) +\numprint{84.5}\\ - &= \numprint{-2}\left( x^2 +\numprint{3}x + \numprint{2.25}\right) +\numprint{84.5}\\ - &= \numprint{-2}x^2 -\numprint{2}\times \numprint{3}x -\numprint{2}\times \numprint{2.25} +\numprint{84.5}\\ - &= \numprint{-2}x^2 -\numprint{6}x -\numprint{4.5} +\numprint{84.5}\\ - &= \numprint{-2}x^2 -\numprint{6}x +\numprint{80}\\ - &= f(x) + \numprint{-2}\,\left( x +\numprint{1.5} \right)^2 +\numprint{84.5} + &= \numprint{-2}\,\left( x^2 +\numprint{2}\times \numprint{1.5} \times x + \numprint{1.5}^2\right) +\numprint{84.5}\\ + &= \numprint{-2}\,\left( x^2 +\numprint{3}\,x + \numprint{2.25}\right) +\numprint{84.5}\\ + &= \numprint{-2}\,x^2 -\numprint{2}\times \numprint{3}\,x -\numprint{2}\times \numprint{2.25} +\numprint{84.5}\\ + &= \numprint{-2}\,x^2 -\numprint{6}\,x -\numprint{4.5} +\numprint{84.5}\\ + &= \numprint{-2}\,x^2 -\numprint{6}\,x +\numprint{80}\\ + &= f\,(x) \end{align*} \end{enumerate} \item Résoudre les équations suivantes en choisissant la forme appropriée de $f$. \begin{enumerate} -\item En prenant la forme factorisée, l'équation $f(x)=0$ est équivalente à l'équation produit nul $\numprint{-2}(x -\numprint{5} )(x +\numprint{8} ) = 0$. Donc : +\item En prenant la forme factorisée, l'équation $f\,(x)=0$ est équivalente à l'équation produit nul $\numprint{-2}\,(x -\numprint{5} )\,(x +\numprint{8} ) = 0$. Donc : \begin{align*} x -\numprint{5}=0 &\text{ ou } x +\numprint{8}=0 \\ x=\numprint{5} &\text{ ou } x=\numprint{-8} \end{align*} Il y a donc deux solutions : $\numprint{5}$ et $\numprint{-8}$. -\item $f(x)=\numprint{80}$ On remarque que la forme développée contient la constante $\numprint{80}$ : celles-ci devraient donc s'annuler, pour simplifier notre résolution. +\item $f\,(x)=\numprint{80}$ On remarque que la forme développée contient la constante $\numprint{80}$ : celles-ci devraient donc s'annuler, pour simplifier notre résolution. \begin{align*} -f(x) &= \numprint{80} \\ -\numprint{-2}x^2 -\numprint{6}x +\numprint{80} &= \numprint{80} \\ -\numprint{-2}x^2 -\numprint{6}x +\numprint{80} -\numprint{80} &= \numprint{80} -\numprint{80} \\ -\numprint{-2}x^2 -\numprint{6}x &= 0 \\ +f\,(x) &= \numprint{80} \\ +\numprint{-2}\,x^2 -\numprint{6}\,x +\numprint{80} &= \numprint{80} \\ +\numprint{-2}\,x^2 -\numprint{6}\,x +\numprint{80} -\numprint{80} &= \numprint{80} -\numprint{80} \\ +\numprint{-2}\,x^2 -\numprint{6}\,x &= 0 \\ \end{align*} Nous pouvons maintenant factoriser le membre de gauche par $x$, ce qui nous donnera une équation produit nul. \begin{align*} -\numprint{-2}x^2 -\numprint{6}x &= 0 \\ -\numprint{-2}x\times x -\numprint{6}\times x &= 0 \\ -x\left( \numprint{-2}x -\numprint{6} \right) &= 0 \\ +\numprint{-2}\,x^2 -\numprint{6}\,x &= 0 \\ +\numprint{-2}\,x\times x -\numprint{6}\times x &= 0 \\ +x\,\left( \numprint{-2}\,x -\numprint{6} \right) &= 0 \\ \end{align*} \begin{align*} -x =0 &\text{ ou } \numprint{-2}x -\numprint{6}=0 \\ -x =0 &\text{ ou } \numprint{-2}x =\numprint{6} \\ +x =0 &\text{ ou } \numprint{-2}\,x -\numprint{6}=0 \\ +x =0 &\text{ ou } \numprint{-2}\,x =\numprint{6} \\ x =0 &\text{ ou } x = \frac{\numprint{6}}{\numprint{-2}} \\ x =0 &\text{ ou } x = \numprint{-3} \\ \end{align*} Il y a donc deux solutions : $x=0$ et $x=\numprint{-3}$. -\item $f(x)=\numprint{84.5}$ On remarque que la forme canonique contient la constante $\numprint{84.5}$ : en l'utilisant, elles devraient se simplifier. +\item $f\,(x)=\numprint{84.5}$ On remarque que la forme canonique contient la constante $\numprint{84.5}$ : en l'utilisant, elles devraient se simplifier. \begin{align*} -f(x) &= \numprint{84.5} \\ -\numprint{-2} \left( x +\numprint{1.5} \right)^2 +\numprint{84.5} &= \numprint{84.5}\\ -\numprint{-2} \left( x +\numprint{1.5} \right)^2 +\numprint{84.5} -\numprint{84.5} &= \numprint{84.5} -\numprint{84.5}\\ -\numprint{-2} \left( x +\numprint{1.5} \right)^2 &= 0\\ +f\,(x) &= \numprint{84.5} \\ +\numprint{-2} \,\left( x +\numprint{1.5} \right)^2 +\numprint{84.5} &= \numprint{84.5}\\ +\numprint{-2} \,\left( x +\numprint{1.5} \right)^2 +\numprint{84.5} -\numprint{84.5} &= \numprint{84.5} -\numprint{84.5}\\ +\numprint{-2} \,\left( x +\numprint{1.5} \right)^2 &= 0\\ \left( x +\numprint{1.5} \right)^2 &= 0\\ \end{align*} Or $0$ est le seul nombre dont le carré est nul, donc l'équation précédente est équivalente à : @@ -75,7 +75,7 @@ Il y a donc une unique solution $x=\numprint{-1.5}$. donc la fonction est croissante puis décroissante . De plus, l'absisse du sommet est $-\frac{\numprint{-6}}{2\times\left(\numprint{-2}\right)}$, soit $\numprint{-1.5}$, et -$f( \numprint{-1.5} )=\numprint{-2}\times\left(\numprint{-1.5}\right)^2 -\numprint{6}\times \left(\numprint{-1.5}\right) +\numprint{80}=\numprint{84.5}$. +$f\,( \numprint{-1.5} )=\numprint{-2}\times\left(\numprint{-1.5}\right)^2 -\numprint{6}\times \left(\numprint{-1.5}\right) +\numprint{80}=\numprint{84.5}$. Le tableau de variations est donc : \begin{center} \begin{tikzpicture} @@ -85,7 +85,7 @@ Le tableau de variations est donc : \tkzTabVar{-/, +/$\numprint{84.5}$/, -/} \end{tikzpicture} \end{center} -\item \emph{Dresser le tableau de signes de $f$.} Construisons un tableau de signes en utilisant la forme factorisée $f(x)=\numprint{-2} \left(x -\numprint{5}\right) \left(x +\numprint{8}\right)$. +\item \emph{Dresser le tableau de signes de $f$.} Construisons un tableau de signes en utilisant la forme factorisée $f\,(x)=\numprint{-2} \,\left(x -\numprint{5}\right) \, \left(x +\numprint{8}\right)$. \begin{itemize} \item Le premier facteur $x -\numprint{5}$ est une fonction affine, de coefficient directeur $a=1$ positif, et d'ordonnée à l'origine $b=\numprint{-5}$. Elle est donc négative, puis positive, et change de signe en $-\frac{b}{a}=-\frac{\numprint{-5}}{1}=\numprint{5}$. @@ -99,7 +99,7 @@ Le tableau de variations est donc : $\numprint{-2}$/1, $x -\numprint{5}$/1, $x +\numprint{8}$/1, - $f(x)=\numprint{-2}\left( x -\numprint{5} \right) \left( x +\numprint{8} \right)$/1.5 + $f\,(x)=\numprint{-2}\,\left( x -\numprint{5} \right)\,\left( x +\numprint{8} \right)$/1.5 } {$-\infty$, $\numprint{-8}$, $\numprint{5}$, $+\infty$} \tkzTabLine{, -, t, -, t, -} @@ -111,10 +111,10 @@ Le tableau de variations est donc : \end{enumerate} \item Répondre aux questions suivantes en utilisant le tableau de signes ou de variations. \begin{enumerate} -\item \emph{Résoudre $f(x)\geq0$.} En regardant la dernière ligne du tableau de signes, on observe que $f$ est positive sur +\item \emph{Résoudre $f\,(x)\geqslant0$.} En regardant la dernière ligne du tableau de signes, on observe que $f$ est positive sur l'intervalle central . Les solutions sont donc : - \[ x\in\left[ \numprint{-8} ; \numprint{5} \right] \] + \[ x\in\interval[scaled]{\numprint{-8}}{\numprint{5}} \] \item \emph{Quel est l'extremum de $f$ ? Est-ce un maximum ou un minimum ? Pour quelle valeur de $x$ est-il atteint ?} On lit sur le tableau de variations que la plus grande valeur prise par $f$ est $\numprint{84.5}$. Le maximum de $f$ est donc $\numprint{84.5}$, et il est atteint pour $x=\numprint{-1.5}$. diff --git a/data/ex/tests/BilanTrinomeSansDiscriminant.1.statement b/data/ex/tests/BilanTrinomeSansDiscriminant.1.statement index 1593295b..ec799a4e 100644 --- a/data/ex/tests/BilanTrinomeSansDiscriminant.1.statement +++ b/data/ex/tests/BilanTrinomeSansDiscriminant.1.statement @@ -1,17 +1,17 @@ \exercice -On considère le trinôme du second degré $f: x\mapsto \numprint{-2} x^2 \numprint{-6}x +\numprint{80}$. +On considère le trinôme du second degré $f: x\mapsto \numprint{-2}\,x^2 -\numprint{6}\,x +\numprint{80}$. \begin{enumerate} \item \begin{enumerate} - \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f(x)=\numprint{-2} \left( x -\numprint{5} \right) \left( x +\numprint{8} \right) $. - \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f(x)=\numprint{-2}\left( x +\numprint{1.5} \right)^2 +\numprint{84.5}$. + \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f\,(x)=\numprint{-2} \,\left( x -\numprint{5} \right) \, \left( x +\numprint{8} \right) $. + \item Montrer que pour tout $x\in\mathbb{R}$, on a : $f\,(x)=\numprint{-2} \,\left( x +\numprint{1.5} \right)^2 +\numprint{84.5}$. \end{enumerate} \item Résoudre les équations suivantes en choisissant la forme appropriée de $f$. \begin{enumerate} -\item $f(x)=0$ -\item $f(x)=\numprint{80}$ -\item $f(x)=\numprint{84.5}$ +\item $f\,(x)=0$ +\item $f\,(x)=\numprint{80}$ +\item $f\,(x)=\numprint{84.5}$ \end{enumerate} \item \begin{enumerate} @@ -20,7 +20,7 @@ On considère le trinôme du second degré $f: x\mapsto \numprint{-2} x^2 \numpr \end{enumerate} \item Répondre aux questions suivantes en utilisant le tableau de signes ou de variations. \begin{enumerate} -\item Résoudre $f(x)\geq0$. +\item Résoudre $f(x)\geqslant0$. \item Quel est l'extremum de $f$ ? Est-ce un maximum ou un minimum ? Pour quelle valeur de $x$ est-il atteint ? \end{enumerate} \end{enumerate} \ No newline at end of file diff --git a/data/ex/tests/EtatStableSysteme2.0.answer b/data/ex/tests/EtatStableSysteme2.0.answer index f2fa1c55..5504a302 100644 --- a/data/ex/tests/EtatStableSysteme2.0.answer +++ b/data/ex/tests/EtatStableSysteme2.0.answer @@ -8,20 +8,20 @@ Puisque $P$ est l'état stable, alors $P=P\times M$. \numprint{0.45} & \numprint{0.55} \\ \end{pmatrix}\\ &= \begin{pmatrix} - \numprint{0.95} x + \numprint{0.45} y & \numprint{0.05} x + \numprint{0.55} y + \numprint{0.95}\,x + \numprint{0.45}\,y & \numprint{0.05}\,x + \numprint{0.55}\,y \end{pmatrix} \end{align*} -Or $\begin{pmatrix}x&y\end{pmatrix}=P=P\times M$, donc les coefficients des matrices sont deux à deux égaux, donc $x=0.95 x + 0.45 y$. +Or $\begin{pmatrix}x&y\end{pmatrix}=P=P\times M$, donc les coefficients des matrices sont deux à deux égaux, donc $x=\numprint{0.95}\,x + \numprint{0.45}\,y$. D'autre part, puisque $P$ est un état probabiliste, alors $x+y=1$, donc $y=1-x$. Donc, en remplaçant $y$ par $1-x$ dans l'équation précédente, on obtient : \begin{align*} - x &= \numprint{0.95} x + \numprint{0.45} (1-x) \\ - x &= \numprint{0.95} x + \numprint{0.45} - \numprint{0.45}x\\ - x-\numprint{0.95} x +\numprint{0.45}x &= \numprint{0.45}\\ - (1-\numprint{0.95}+\numprint{0.45})x &= \numprint{0.45}\\ - \numprint{0.5} x &= \numprint{0.45}\\ + x &= \numprint{0.95}\,x + \numprint{0.45}\,(1-x) \\ + x &= \numprint{0.95}\,x + \numprint{0.45} - \numprint{0.45}\,x\\ + x-\numprint{0.95}\,x +\numprint{0.45}\,x &= \numprint{0.45}\\ + (1-\numprint{0.95}+\numprint{0.45}) \,x &= \numprint{0.45}\\ + \numprint{0.5}\,x &= \numprint{0.45}\\ x &= \frac{\numprint{0.45}}{\numprint{0.5}}\\ x &= \numprint{0.9} \end{align*} diff --git a/data/ex/tests/InterpolationMatrices.0.answer b/data/ex/tests/InterpolationMatrices.0.answer index 7a8087dd..acb550c8 100644 --- a/data/ex/tests/InterpolationMatrices.0.answer +++ b/data/ex/tests/InterpolationMatrices.0.answer @@ -1,60 +1,63 @@ +\exercice* \begin{enumerate} \item \begin{enumerate} \item \begin{itemize} - \item Puisque $A( \numprint{4} ; \numprint{-75} )$ est sur la courbe de $f$, alors $f( \numprint{4} )=\numprint{-75}$, soit + \item Puisque $A\,( \numprint{4}~;~\numprint{-75} )$ est sur la courbe de $f$, alors $f\,( \numprint{4} )=\numprint{-75}$, soit $a \times \numprint{4}^2+b\times \numprint{4}+c=\numprint{-75}$, - c'est-à-dire $\numprint{16}a + \numprint{4}b + c = \numprint{-75}$. - \item De même, puisque $B( \numprint{5} ; \numprint{-126} )$ est sur la courbe de $f$, alors $f( \numprint{5} )=\numprint{-126}$, soit + c'est-à-dire $\numprint{16}\,a + \numprint{4}\,b + c = \numprint{-75}$. + \item De même, puisque $B\,( \numprint{5}~;~\numprint{-126} )$ est sur la courbe de $f$, alors $f\,( \numprint{5} )=\numprint{-126}$, soit $a \times \numprint{5}^2+b\times \numprint{5}+c=\numprint{-126}$, - c'est-à-dire $\numprint{25}a + \numprint{5}b + c = \numprint{-126}$. - \item Enfin, puisque $C( \numprint{6} ; \numprint{-191} )$ est sur la courbe de $f$, alors $f( \numprint{6} )=\numprint{-191}$, soit + c'est-à-dire $\numprint{25}\,a + \numprint{5}\,b + c = \numprint{-126}$. + \item Enfin, puisque $C\,( \numprint{6}~;~\numprint{-191} )$ est sur la courbe de $f$, alors $f\,( \numprint{6} )=\numprint{-191}$, soit $a \times \numprint{6}^2+b\times \numprint{6}+c=\numprint{-191}$, - c'est-à-dire $\numprint{36}a + \numprint{6}b + c = \numprint{-191}$. + c'est-à-dire $\numprint{36}\,a + \numprint{6}\,b + c = \numprint{-191}$. \end{itemize} On en déduit le système suivant : \[ \left\{\begin{array}{rcl} - \numprint{16}a + \numprint{4}b + c &=& \numprint{-75} \\ - \numprint{25}a + \numprint{5}b + c &=& \numprint{-126} \\ - \numprint{36}a + \numprint{6}b + c &=& \numprint{-191} \\ + \numprint{16}\,a + \numprint{4}\,b + c &=& \numprint{-75} \\ + \numprint{25}\,a + \numprint{5}\,b + c &=& \numprint{-126} \\ + \numprint{36}\,a + \numprint{6}\,b + c &=& \numprint{-191} \\ \end{array}\right.\] \item \begin{align*} \left\{\begin{array}{rcl} - \numprint{16}a + \numprint{4}b + c &=& \numprint{-75} \\ - \numprint{25}a + \numprint{5}b + c &=& \numprint{-126} \\ - \numprint{36}a + \numprint{6}b + c &=& \numprint{-191} \\ + \numprint{16}\,a + \numprint{4}\,b + c &=& \numprint{-75} \\ + \numprint{25}\,a + \numprint{5}\,b + c &=& \numprint{-126} \\ + \numprint{36}\,a + \numprint{6}\,b + c &=& \numprint{-191} \\ \end{array}\right. &\iff \begin{pmatrix} -\numprint{16}a + \numprint{4}b + c \\ -\numprint{25}a + \numprint{5}b + c \\ -\numprint{36}a + \numprint{6}b + c \\ +\numprint{16}\,a + \numprint{4}\,b + c \\ +\numprint{25}\,a + \numprint{5}\,b + c \\ +\numprint{36}\,a + \numprint{6}\,b + c \\ \end{pmatrix} = \begin{pmatrix}\numprint{-75}\\\numprint{-126}\\\numprint{-191}\\\end{pmatrix}\\ &\iff \begin{pmatrix}\numprint{16} & \numprint{4} & \numprint{1}\\\numprint{25} & \numprint{5} & \numprint{1}\\\numprint{36} & \numprint{6} & \numprint{1}\\\end{pmatrix} \times \begin{pmatrix}a\\b\\c\\\end{pmatrix} = \begin{pmatrix}\numprint{-75}\\\numprint{-126}\\\numprint{-191}\\\end{pmatrix} \\ -&\iff M X=R +&\iff M\, X=R \end{align*} Avec : $M= \begin{pmatrix}\numprint{16} & \numprint{4} & \numprint{1}\\\numprint{25} & \numprint{5} & \numprint{1}\\\numprint{36} & \numprint{6} & \numprint{1}\\\end{pmatrix}$, $X= \begin{pmatrix}a\\b\\c\\\end{pmatrix}$ et $R= \begin{pmatrix}\numprint{-75}\\\numprint{-126}\\\numprint{-191}\\\end{pmatrix}$. \end{enumerate} \item - Comme $M$ est inversible, et que $MX = R$, alors $X = M^{-1}\times R$. À la calculatrice, on obtient -$M^{-1}\times R=\begin{pmatrix}\numprint{16} & \numprint{4} & \numprint{1}\\\numprint{25} & \numprint{5} & \numprint{1}\\\numprint{36} & \numprint{6} & \numprint{1}\\\end{pmatrix}^{-1}\times \begin{pmatrix}\numprint{-75}\\\numprint{-126}\\\numprint{-191}\\\end{pmatrix} = \begin{pmatrix}\numprint{-7}\\\numprint{12}\\\numprint{-11}\\\end{pmatrix}$. + Comme $M$ est inversible, et que $M\,X = R$, alors $X = M^{-1}\times R$. + + À la calculatrice, on obtient + $M^{-1}\times R=\begin{pmatrix}\numprint{16} & \numprint{4} & \numprint{1}\\\numprint{25} & \numprint{5} & \numprint{1}\\\numprint{36} & \numprint{6} & \numprint{1}\\\end{pmatrix}^{-1}\times \begin{pmatrix}\numprint{-75}\\\numprint{-126}\\\numprint{-191}\\\end{pmatrix} = \begin{pmatrix}\numprint{-7}\\\numprint{12}\\\numprint{-11}\\\end{pmatrix}$. Ainsi, $a=\numprint{-7}$, $b=\numprint{12}$, et $c=\numprint{-11}$. \item -En utilisant les valeurs de $a$, $b$, et $c$ calculées précédemment, nous connaissons l'expression de la fonction : $f(x) = \numprint{-7}x^2 + \numprint{12}x + \numprint{-11}$. +En utilisant les valeurs de $a$, $b$, et $c$ calculées précédemment, nous connaissons l'expression de la fonction : $f\,(x) = \numprint{-7}\,x^2 +\numprint{12}\,x -\numprint{11}$. Nous pouvons maintenant calculer l'image de $\numprint{17}$ par cette fonction : \begin{align*} -f( \numprint{17} ) -&= \numprint{-7} \times \numprint{17}^2 + \numprint{12} \times \numprint{17} + \numprint{-11}\\ +f\,( \numprint{17} ) +&= \numprint{-7} \times \numprint{17}^2 +\numprint{12} \times \numprint{17} -\numprint{11}\\ &= \numprint{-1830} \end{align*} -Donc $f( \numprint{17} ) = \numprint{-1830}$. +Donc $f\,( \numprint{17} ) = \numprint{-1830}$. \end{enumerate} diff --git a/data/ex/tests/InterpolationMatrices.0.statement b/data/ex/tests/InterpolationMatrices.0.statement index 4d7f4d48..e2761d29 100644 --- a/data/ex/tests/InterpolationMatrices.0.statement +++ b/data/ex/tests/InterpolationMatrices.0.statement @@ -1,15 +1,17 @@ +\exercice Dans un repère orthonormé, on cherche à déterminer l'équation d'une fonction dont la courbe passe par les points -$A( \numprint{4} ; \numprint{-75} )$, -$B( \numprint{5} ; \numprint{-126} )$ et -$C( \numprint{6} ; \numprint{-191} )$. +$A\,( \numprint{4} ~;~ \numprint{-75} )$, +$B\,( \numprint{5} ~;~ \numprint{-126} )$ et +$C\,( \numprint{6} ~;~ \numprint{-191} )$. -On cherche un trinôme du second degré, c'est-à-dire une fonction $f$ définie sur $]-\infty ; +\infty[$ par $f(x) = ax^2 + bx + c$ où $a$, $b$ et $c$ sont trois nombres réels, que l'on cherche à déterminer. +On cherche un trinôme du second degré, c'est-à-dire une fonction $f$ définie sur $\interval[open]{-\infty}{+\infty}$ par + \mbox{$f\,(x) = a\,x^2 + b\,x + c$} où $a$, $b$ et $c$ sont trois nombres réels, que l'on cherche à déterminer. \begin{enumerate} \item \begin{enumerate} \item À partir des données de l'énoncé, écrire un système d'équations traduisant cette situation. - \item En déduire que le système précédent est équivalent à : $MX = R$ avec + \item En déduire que le système précédent est équivalent à : $M\,X = R$ avec $M = \begin{pmatrix}\numprint{16} & \numprint{4} & \numprint{1}\\\numprint{25} & \numprint{5} & \numprint{1}\\\numprint{36} & \numprint{6} & \numprint{1}\\\end{pmatrix}$, $X= \begin{pmatrix}a\\b\\c\\\end{pmatrix}$ et $R$ une matrice colonne que l'on précisera. \end{enumerate} @@ -18,6 +20,6 @@ On cherche un trinôme du second degré, c'est-à-dire une fonction $f$ définie \setcounter{enumi}{1} \item On admet que la matrice $M$ est inversible. Déterminer les valeurs des cœfficients $a$, $b$ et $c$, en détaillant les calculs. - \item Quelle est la valeur de $f( \numprint{17} )$ ? + \item Quelle est la valeur de $f\,( \numprint{17} )$ ? \end{enumerate} \ No newline at end of file