Commit 58207ac7 authored by Louis's avatar Louis
Browse files

Déplacement de Lagrange() dans le module PolynomesCollege

parent c3ad8a89
......@@ -17,7 +17,6 @@ Table des matières
intro.rst
pyromaths.api
pyromaths.ex.troisiemes
pyromaths.cli
......
:mod:`Notion de fonction` --- Exercice sur la notion de fonction
================================================================
Le module :mod:`notion_de_fonction`, pour le niveau troisièmes.
.. automodule:: pyromaths.ex.troisiemes.notion_de_fonction
:members:
:special-members:
.. :private-members:
:undoc-members:
:show-inheritance:
.. TODO::
- Vérifier si cette documentation n'est pas obsolètes.
- Voir s'il est pertinent de déplacer :func:`Lagrange`
(et les autres fonctions réutilisables)
dans :mod:`outils` ou :mod:`classes`.
Les exercices de troisièmes de Pyromaths
========================================
.. toctree::
:maxdepth: 2
pyromaths.ex.troisiemes.notion_de_fonction
......@@ -529,6 +529,29 @@ Constructeur
>>> repr(Polynome([[2, 1], [1, 0]], details=3) + Polynome([[2, 1], [1, 0]], details=3))
Polynome([[2, 1], [2, 1], [1, 0], [1, 0]], "x", 3)
* Constructeur à partir d'une liste de points, en utilisant l'interpolation de Lagrange (:func:`Lagrange`). Ce polynôme est davantage destiné à être tracé qu'à être utilisé pour des calculs.
.. doctest:: polynomescollege
>>> Lagrange(((2,0), (4,2)))
0+Fraction(2, 2)*Polynome("x-2", details = 0)
>>> # Tracé d'un polynôme avec psplot
>>> from pyromaths.outils.Priorites3 import plotify, priorites
>>> plotify(priorites(Lagrange(((2,0), (4,2))))[-1])
1*x^1-2
* Choix de points pour un polynôme de Lagrange (:func:`choix_points`).
Renvoie un tuple contenant `nb` coordonnées sous forme de tuple telles que les abscisses et ordonnées sont distinctes, comprises entre `min` et `max`, une abscisse n'est jamais égale à une ordonnée et la coordonnée (b, a) n'est pas listée si la coordonnée (a, b) existe.
.. doctest:: polynomescollege
>>> import random
>>> random.seed(0)
None
>>> choix_points(-4, 4, nb=5)
((-4, 1), (-3, -1), (-1, -4), (0, -3), (1, 0))
Caractéristiques
""""""""""""""""
......
......@@ -25,6 +25,8 @@ from pyromaths.outils import Priorites3
from pyromaths.classes.SquareRoot import SquareRoot
from pyromaths.classes.Fractions import Fraction
from random import *
class Polynome():
""" Cette classe crée la notion de polynômes.
......@@ -1256,3 +1258,74 @@ def factoriser(calcul):
return "".join(lcalcul)
else:
return None
def choix_points(min=-4, max=4, nb=5):
"""**choix_points**\ ()
Renvoie un tuple contenant nb coordonnées sous forme de tuple telles que
les abscisses et ordonnées sont distinctes, comprises entre min et max,
une abscisse n'est jamais égale à une ordonnée et la coordonnée (b, a) n'est
pas listée si la coordonnée (a, b) existe.
>>> from pyromaths.ex.troisiemes import notion_de_fonction
>>> notion_de_fonction.choix_points() # doctest: +SKIP
((-4, -2), (-2, 0), (0, 4), (2, -4), (4, 2))
:rtype: tuple
"""
if nb > max - min + 1:
raise ValueError('On demande trop de points vu le min et le max')
abscisse = [i for i in range(min, max + 1)]
for dummy in range(max - min - nb):
del abscisse[randrange(len(abscisse))]
refaire = True
while refaire:
ordonnee = [abscisse[i] for i in range(nb)]
shuffle(ordonnee)
refaire = False
for i in range(nb):
if abscisse[i] == ordonnee[i] or abscisse.index(ordonnee[i]) == ordonnee.index(abscisse[i]):
refaire = True
break
return tuple([(abscisse[i], ordonnee[i]) for i in range(nb)])
def Lagrange(points):
"""**Lagrange**\ (*points*)
Renvoie le polynôme d'interpolation de Lagrange pour les points de coordonnées *points*
Est prévue pour être utilisé avec :py:func:`choix_points`
Associé à :py:func:`pyromaths.outils.Priorites3.priorites`, permet d'obtenir sa version réduite.
Associé à :py:func:`pyromaths.outils.Priorites3.plotify`, permet d'obtenir sa version utilisable avec psplot.
>>> from pyromaths.ex.troisiemes import notion_de_fonction
>>> p = notion_de_fonction.Lagrange(((-4, -2), (-2, 0), (0,4), (2,-4), (4,2)))
>>> from pyromaths.outils import Priorites3
>>> Priorites3.priorites(p)[-1]
['Polynome([[Fraction(5, 48), 4], [Fraction(1, 8), 3], [Fraction(-23, 12), 2], [Fraction(-3, 2), 1], [Fraction(4, 1), 0]], "x", 0)']
>>> Priorites3.plotify(Priorites3.priorites(p)[-1])
5/48*x^4+1/8*x^3-23/12*x^2-3/2*x^1+4/1
"""
PIL = []
for i in range(len(points)):
if points[i][1]:
PIL.append('Fraction(%s, ' % points[i][1])
produit = []
for j in range(len(points)):
if j != i: produit.append(repr(points[i][0] - points[j][0]))
produit = repr(eval("*".join(produit)))
PIL[i] += produit + ")*"
produit = []
for j in range(len(points)):
if j != i and points[j][0] > 0: produit.append("Polynome(\"x-%s\", details = 0)" % points[j][0])
elif j != i and points[j][0] < 0: produit.append("Polynome(\"x+%s\", details = 0)" % -points[j][0])
elif j != i and points[j][0] == 0: produit.append("Polynome(\"x\", details = 0)")
produit = "*".join(produit)
PIL[i] += produit
else:
PIL.append('0')
return "+".join(PIL)
......@@ -28,13 +28,11 @@ Created on 1 janv. 2015
from pyromaths import ex
from random import randrange
from math import sqrt
from pyromaths.ex.troisiemes import notion_de_fonction
from pyromaths.outils import Priorites3
from pyromaths.classes.PolynomesCollege import Polynome
from pyromaths.classes.PolynomesCollege import Polynome, Lagrange
from pyromaths.classes.Fractions import Fraction
if __name__ == '__main__':
from pyromaths.ex.troisiemes import notion_de_fonction
from pyromaths.outils import Priorites3
pass
......@@ -83,7 +81,7 @@ class EquationGraphique(ex.TexExercise):
#=======================================================================
y = [y[1], y[1], y[1], y[0], y[0], y[0]]
self.points = list([(l1[i], y[i]) for i in range(6)])
p = notion_de_fonction.Lagrange(self.points)
p = Lagrange(self.points)
self.polynome = eval(Priorites3.priorites(p)[-1][0])
End = True
for val in range(13):
......
......@@ -25,79 +25,13 @@ Créé le 9 déc. 2013
.. sectionauthor:: Jérôme Ortais <jerome.ortais@pyromaths.org>
'''
from random import shuffle, randrange
if __name__ == '__main__':
pass
def choix_points(min=-4, max=4, nb=5):
"""**choix_points**\ ()
Renvoie un tuple contenant nb coordonnées sous forme de tuple telles que
les abscisses et ordonnées sont distinctes, comprises entre min et max,
une abscisse n'est jamais égale à une ordonnée et la coordonnée (b, a) n'est
pas listée si la coordonnée (a, b) existe.
>>> from pyromaths.ex.troisiemes import notion_de_fonction
>>> notion_de_fonction.choix_points() # doctest: +SKIP
((-4, -2), (-2, 0), (0, 4), (2, -4), (4, 2))
:rtype: tuple
"""
if nb > max - min + 1:
raise ValueError('On demande trop de points vu le min et le max')
abscisse = [i for i in range(min, max + 1)]
for dummy in range(max - min - nb):
del abscisse[randrange(len(abscisse))]
refaire = True
while refaire:
ordonnee = [abscisse[i] for i in range(nb)]
shuffle(ordonnee)
refaire = False
for i in range(nb):
if abscisse[i] == ordonnee[i] or abscisse.index(ordonnee[i]) == ordonnee.index(abscisse[i]):
refaire = True
break
return tuple([(abscisse[i], ordonnee[i]) for i in range(nb)])
def Lagrange(points):
"""**Lagrange**\ (*points*)
Renvoie le polynôme d'interpolation de Lagrange pour les points de coordonnées *points*
Est prévue pour être utilisé avec :py:func:`choix_points`
Associé à :py:func:`pyromaths.outils.Priorites3.priorites`, permet d'obtenir sa version réduite.
Associé à :py:func:`pyromaths.outils.Priorites3.plotify`, permet d'obtenir sa version utilisable avec psplot.
from random import shuffle, randrange
>>> from pyromaths.ex.troisiemes import notion_de_fonction
>>> p = notion_de_fonction.Lagrange(((-4, -2), (-2, 0), (0,4), (2,-4), (4,2)))
from pyromaths.classes.PolynomesCollege import Lagrange, choix_points
>>> from pyromaths.outils import Priorites3
>>> Priorites3.priorites(p)[-1]
['Polynome([[Fraction(5, 48), 4], [Fraction(1, 8), 3], [Fraction(-23, 12), 2], [Fraction(-3, 2), 1], [Fraction(4, 1), 0]], "x", 0)']
>>> Priorites3.plotify(Priorites3.priorites(p)[-1])
5/48*x^4+1/8*x^3-23/12*x^2-3/2*x^1+4/1
"""
PIL = []
for i in range(len(points)):
if points[i][1]:
PIL.append('Fraction(%s, ' % points[i][1])
produit = []
for j in range(len(points)):
if j != i: produit.append(repr(points[i][0] - points[j][0]))
produit = repr(eval("*".join(produit)))
PIL[i] += produit + ")*"
produit = []
for j in range(len(points)):
if j != i and points[j][0] > 0: produit.append("Polynome(\"x-%s\", details = 0)" % points[j][0])
elif j != i and points[j][0] < 0: produit.append("Polynome(\"x+%s\", details = 0)" % -points[j][0])
elif j != i and points[j][0] == 0: produit.append("Polynome(\"x\", details = 0)")
produit = "*".join(produit)
PIL[i] += produit
else:
PIL.append('0')
return "+".join(PIL)
if __name__ == '__main__':
pass
def creer_fonction(degre):
"""Crée une fonction polynôme de degré donné
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment