source: pyromaths/trunk/fuentes/src/pyromaths/ex/troisiemes/notion_de_fonction.py @ 1624

Last change on this file since 1624 was 1624, checked in by jrpelegrina, 3 years ago

Fix i18n in troisiemes ex

File size: 12.1 KB
Line 
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3#
4# Pyromaths
5# Un programme en Python qui permet de créer des fiches d'exercices types de
6# mathématiques niveau collège ainsi que leur corrigé en LaTeX.
7# Copyright (C) 2006 -- Jérôme Ortais (jerome.ortais@pyromaths.org)
8#
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software
21# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22#
23'''
24Créé le 9 déc. 2013
25
26.. sectionauthor:: Jérôme Ortais <jerome.ortais@pyromaths.org>
27'''
28from random import shuffle, randrange
29if __name__ == '__main__':
30    pass
31
32def choix_points(min=-4, max=4, nb=5):
33    """**choix_points**\ ()
34
35    Renvoie un tuple contenant nb coordonnées sous forme de tuple telles que
36    les abscisses et ordonnées sont distinctes, comprises entre min et max,
37    une abscisse n'est jamais égale à une ordonnée et la coordonnée (b, a) n'est
38    pas listée si la coordonnée (a, b) existe.
39
40    >>> from pyromaths.ex.troisiemes import notion_de_fonction
41    >>> notion_de_fonction.choix_points()  # doctest: +SKIP
42    ((-4, -2), (-2, 0), (0, 4), (2, -4), (4, 2))
43
44    :rtype: tuple
45
46    """
47    if nb > max - min + 1:
48        raise ValueError('On demande trop de points vu le min et le max')
49    abscisse = [i for i in range(min, max + 1)]
50    for dummy in range(max - min - nb):
51        del abscisse[randrange(len(abscisse))]
52    refaire = True
53    while refaire:
54        ordonnee = [abscisse[i] for i in range(nb)]
55        shuffle(ordonnee)
56        refaire = False
57        for i in range(nb):
58            if abscisse[i] == ordonnee[i] or abscisse.index(ordonnee[i]) == ordonnee.index(abscisse[i]):
59                refaire = True
60                break
61    return tuple([(abscisse[i], ordonnee[i]) for i in range(nb)])
62
63def Lagrange(points):
64    """**Lagrange**\ (*points*)
65    Renvoie le polynôme d'interpolation de Lagrange pour les points de coordonnées *points*
66
67    Est prévue pour être utilisé avec :py:func:`choix_points`
68
69    Associé à  :py:func:`pyromaths.outils.Priorites3.priorites`, permet d'obtenir sa version réduite.
70
71    Associé à  :py:func:`pyromaths.outils.Priorites3.plotify`, permet d'obtenir sa version utilisable avec psplot.
72
73    >>> from pyromaths.ex.troisiemes import notion_de_fonction
74    >>> p = notion_de_fonction.Lagrange(((-4, -2), (-2, 0), (0,4), (2,-4), (4,2)))
75
76    >>> from pyromaths.outils import Priorites3
77    >>> Priorites3.priorites(p)[-1]
78    ['Polynome([[Fraction(5, 48), 4], [Fraction(1, 8), 3], [Fraction(-23, 12), 2], [Fraction(-3, 2), 1], [Fraction(4, 1), 0]], "x", 0)']
79    >>> Priorites3.plotify(Priorites3.priorites(p)[-1])
80    '5/48*x^4+1/8*x^3-23/12*x^2-3/2*x^1+4/1'
81    """
82    PIL = []
83    for i in range(len(points)):
84        if points[i][1]:
85            PIL.append('Fraction(%s, ' % points[i][1])
86            produit = []
87            for j in  range(len(points)):
88                if j != i: produit.append(repr(points[i][0] - points[j][0]))
89            produit = repr(eval("*".join(produit)))
90            PIL[i] += produit + ")*"
91            produit = []
92            for j in  range(len(points)):
93                if j != i and points[j][0] > 0: produit.append("Polynome(\"x-%s\", details = 0)" % points[j][0])
94                elif j != i and points[j][0] < 0: produit.append("Polynome(\"x+%s\", details = 0)" % -points[j][0])
95                elif j != i and points[j][0] == 0: produit.append("Polynome(\"x\", details = 0)")
96            produit = "*".join(produit)
97            PIL[i] += produit
98        else:
99            PIL.append('0')
100    return "+".join(PIL)
101
102def creer_fonction(degre):
103    """Crée une fonction polynôme de degré donné
104
105    >>> notion_de_fonction.creer_fonction(2) # doctest: +SKIP
106    'Polynome([[7, 2], [-1, 1], [-3, 0]], "x", details=0)'
107    """
108    p = []
109    for exp in range(degre + 1):
110        p.insert(0, [randrange(1, 10) * (-1) ** (randrange(3)), exp])
111    return _(u'Polynome(%s, "x", details=0)') % p
112
113
114def corrige(nom, fct, ant):
115    from pyromaths.outils import Priorites3
116    sol = []
117    calc = fct(ant)
118    res = Priorites3.priorites(calc)
119    res = Priorites3.texify(res)
120    sol.append(r"\par $%s\,(%s)=%s$\par" % (nom, ant, Priorites3.texify([Priorites3.splitting(calc)])[0]))
121    sol.append('\\par\n'.join(['$%s\\,(%s)=%s$' % (nom, ant, res[j]) for j in range(len(res) - 1)]))
122    sol.append(r'\par')
123    sol.append('\\fbox{$%s\\,(%s)=%s$}\\\\\n' % (nom, ant, res[-1]))
124    return sol
125
126def notion_fonction():
127    """Créé un exercice bilan sur la notion de fonction"""
128    from pyromaths.classes.PolynomesCollege import Polynome
129    from pyromaths.outils import Priorites3
130    fct = [eval(creer_fonction(1)), eval(creer_fonction(2))]
131    ant = [randrange(1, 6) * (-1) ** fct[0].degre(), randrange(1, 6) * (-1) ** fct[1].degre(), randrange(1, 6) * (-1) ** fct[1].degre(), randrange(1, 6) * (-1) ** fct[0].degre()]
132    shuffle(fct)
133    val_exo2 = choix_points(nb=7)
134    exo = [r"\exercice", r"\begin{multicols}{2}", r"\begin{enumerate}", u"\\item On donne"]
135    exo.append(r"$\begin{array}[t]{l}")
136    exo.append(u"f:~x \\longmapsto %s \\\\ g:~x \\longmapsto %s" % (fct[0], fct[1]))
137    exo.extend([r"\end{array}$", r"\begin{enumerate}", ])
138    exo.append(_(u"\\item Quelle est l'image de $%s$ par la fonction $f$ ?") % ant[0])
139    cor = [r"\exercice", r"\begin{multicols}{2}", r"\begin{enumerate}", u"\\item On donne"]
140    cor.append(r"$\begin{array}[t]{l}")
141    cor.append(u"f:~x \\longmapsto %s \\\\ g:~x \\longmapsto %s" % (fct[0], fct[1]))
142    cor.extend([r"\end{array}$", r"\begin{enumerate}", ])
143    cor.append(_(u"\\item Quelle est l'image de $%s$ par la fonction $f$ ?") % ant[0])
144    cor.extend(corrige('f', fct[0], ant[0]))
145    exo.append(_(u"\\item Quelle est l'image de $%s$ par la fonction $g$ ?") % ant[1])
146    cor.append(_(u"\\item Quelle est l'image de $%s$ par la fonction $g$ ?") % ant[1])
147    cor.extend(corrige('g', fct[1], ant[1]))
148    exo.append(_(u"\\item Calculer $f\\,(%s)$.") % ant[2])
149    cor.append(_(u"\\item Calculer $f\\,(%s)$.") % ant[2])
150    cor.extend(corrige('f', fct[0], ant[2]))
151    exo.append(_(u"\\item Calculer $g\\,(%s)$.") % ant[3])
152    cor.append(_(u"\\item Calculer $g\\,(%s)$.") % ant[3])
153    cor.extend(corrige('g', fct[1], ant[3]))
154    exo.append(r"\end{enumerate}")
155    cor.append(r"\end{enumerate}")
156    exo.append(_(u"\\item Voici un tableau de valeurs correspondant à une fonction $h$.\\par"))
157    exo.append(r"\renewcommand{\arraystretch}{1.5}")
158    exo.append(r"\begin{tabularx}{\linewidth}[t]{|c|*7{>{\centering}X|}}")
159    exo.append(r"\hline")
160    exo.append(r"$x$ & %s \tabularnewline \hline" % " & ".join(["$%s$" % c[0] for c in val_exo2]))
161    exo.append(r"$h\,(x)$ & %s \tabularnewline \hline" % " & ".join(["$%s$" % c[1] for c in val_exo2]))
162    exo.append(r"\end{tabularx} \medskip")
163    exo.append(r"\begin{enumerate}")
164    cor.append(_(u"\\item Voici un tableau de valeurs correspondant à une fonction $h$.\\par"))
165    cor.append(r"\renewcommand{\arraystretch}{1.5}")
166    cor.append(r"\begin{tabularx}{\linewidth}[t]{|c|*7{>{\centering}X|}}")
167    cor.append(r"\hline")
168    cor.append(r"$x$ & %s \tabularnewline \hline" % " & ".join(["$%s$" % c[0] for c in val_exo2]))
169    cor.append(r"$h\,(x)$ & %s \tabularnewline \hline" % " & ".join(["$%s$" % c[1] for c in val_exo2]))
170    cor.append(r"\end{tabularx} \medskip")
171    cor.append(r"\begin{enumerate}")
172    lpos21 = [i for i in range(7)]
173    for dummy in range(3):
174        del lpos21[randrange(len(lpos21))]
175    shuffle(lpos21)
176    lquest = [_(u"Quelle est l'image de $%s$ par la fonction $h$ ?") % val_exo2[lpos21[0]][0],
177              _(u"Quel est l'antécédent de $%s$ par la fonction $h$ ?") % val_exo2[lpos21[1]][1],
178              _(u"Compléter : $h\\,(%s)=\\ldots\\ldots$") % val_exo2[lpos21[2]][0],
179              _(u"Compléter : $h\\,(\\ldots\\ldots)=%s$") % val_exo2[lpos21[3]][1]]
180    lpos22 = [0, 1, 2, 3]
181    shuffle(lpos22)
182    for i in range(4):
183        exo.append(_(u"\\item %s") % lquest[lpos22[i]])
184        if lpos22[i] == 0:
185            cor.append(_(u"\\item L'image de $%s$ par la fonction $h$ est $\\mathbf{%s}$.") % (val_exo2[lpos21[0]][0], val_exo2[lpos21[0]][1]))
186        elif lpos22[i] == 1:
187            cor.append(_(u"\\item Un antécédent de $%s$ par la fonction $h$ est $\\mathbf{%s}$.") % (val_exo2[lpos21[1]][1], val_exo2[lpos21[1]][0]))
188        if lpos22[i] == 2:
189            cor.append(_(u"\\item $h\\,(%s)=\\mathbf{%s}$.") % (val_exo2[lpos21[2]][0], val_exo2[lpos21[2]][1]))
190        elif lpos22[i] == 1:
191            cor.append(_(u"\\item $h\\,(\\mathbf{%s})=%s$.") % (val_exo2[lpos21[3]][0], val_exo2[lpos21[3]][1]))
192
193    exo.extend([r"\end{enumerate}", r"\columnbreak"])
194    cor.append(r"\end{enumerate}")
195    val_exo3 = choix_points()
196    p = Priorites3.plotify(Priorites3.priorites(Lagrange(val_exo3))[-1])
197    exo.extend([_(u"\\item Le graphique ci-dessous représente une fonction $k$ : \\par"), r"\begin{center}",
198                r"\psset{unit=8mm, algebraic, dotsize=4pt 4}", r"\begin{pspicture*}(-4.2,-4.2)(4.2,4.2)"])
199    exo.append(r"\psgrid[subgriddiv=2, gridwidth=.6pt,subgridcolor=lightgray, gridlabels=0pt]")
200    exo.append(r"\psaxes[linewidth=1.2pt,]{->}(0,0)(-4.2,-4.2)(4.2,4.2)")
201    exo.append(r"\psplot[plotpoints=200, linewidth=1.5pt, linecolor=DarkRed]{-4.2}{4.2}{%s}" % p)
202    exo.append(r"\psdots %s" % " ".join([str(val) for val in val_exo3]))
203    exo.extend([r"\end{pspicture*}", r"\end{center}", r"\begin{enumerate}"])
204    cor.extend([_(u"\\item Le graphique ci-après représente une fonction $k$ : \\par"), r"\begin{center}",
205                r"\psset{unit=8mm, algebraic, dotsize=4pt 4}", r"\begin{pspicture*}(-4.2,-4.2)(4.2,4.2)"])
206    cor.append(r"\psgrid[subgriddiv=2, gridwidth=.6pt,subgridcolor=lightgray, gridlabels=0pt]")
207    cor.append(r"\psaxes[linewidth=1.2pt,]{->}(0,0)(-4.2,-4.2)(4.2,4.2)")
208    cor.append(r"\psplot[plotpoints=200, linewidth=1.5pt, linecolor=DarkRed]{-4.2}{4.2}{%s}" % p)
209    cor.append(r"\psdots %s" % " ".join([str(val) for val in val_exo3]))
210    lpos31 = [i for i in range(5)]
211    for dummy in range(1):
212        del lpos31[randrange(len(lpos31))]
213    for i in range(4):
214        cor.append(r"\psline[linestyle=dashed, linecolor=DarkRed](0, %s)(%s, %s)(%s, 0)" % (val_exo3[lpos31[i]][1], val_exo3[lpos31[i]][0], val_exo3[lpos31[i]][1], val_exo3[lpos31[i]][0]))
215    cor.extend([r"\end{pspicture*}", r"\end{center}", r"\begin{enumerate}"])
216    shuffle(lpos31)
217    lquest = [_(u"Quelle est l'image de $%s$ par la fonction $k$ ?") % val_exo3[lpos31[0]][0],
218              _(u"Donner un antécédent de %s par la fonction $k$.") % val_exo3[lpos31[1]][1],
219              _(u"Compléter : $k\\,(%s)=\\ldots\\ldots$") % val_exo3[lpos31[2]][0],
220              _(u"Compléter : $k\\,(\\ldots\\ldots)=%s$") % val_exo3[lpos31[3]][1]]
221    lpos32 = [0, 1, 2, 3]
222    shuffle(lpos32)
223    for i in range(4):
224        exo.append(_(u"\\item %s") % lquest[lpos32[i]])
225        if lpos32[i] == 0:
226            cor.append(_(u"\\item L'image de $%s$ par la fonction $k$ est $\\mathbf{%s}$.") % (val_exo3[lpos31[0]][0], val_exo3[lpos31[0]][1]))
227        elif lpos32[i] == 1:
228            cor.append(_(u"\\item Un antécédent de $%s$ par la fonction $k$ est $\\mathbf{%s}$.") % (val_exo3[lpos31[1]][1], val_exo3[lpos31[1]][0]))
229        if lpos32[i] == 2:
230            cor.append(_(u"\\item $k\\,(%s)=\\mathbf{%s}$.") % (val_exo3[lpos31[2]][0], val_exo3[lpos31[2]][1]))
231        elif lpos32[i] == 3:
232            cor.append(_(u"\\item $k\\,(\\mathbf{%s})=%s$.") % (val_exo3[lpos31[3]][0], val_exo3[lpos31[3]][1]))
233    exo.append(r"\end{enumerate}")
234    cor.append(r"\end{enumerate}")
235
236
237
238    exo.append(r"\end{enumerate}")
239    exo.append(r"\end{multicols}")
240    cor.append(r"\end{enumerate}")
241    cor.append(r"\end{multicols}")
242
243    return exo, cor
244notion_fonction.description = _(u'Bilan sur la notion de fonction')
245
Note: See TracBrowser for help on using the repository browser.