This repository has been archived on 2019-08-08. You can view files and clone it, but cannot push or open issues or pull requests.
s1-tp/S1/TP 6/suites.py

213 lines
5.5 KiB
Python

# PREUD'HOMME BONTOUX Geoffrey - PeiP 12 - 2014/2015
# TP n°6 donné le 17/10/2014 - Calculs de suites
# http://www2.lifl.fr/~mailliet/Initprog/TP6.pdf
import doctest
# Racine carrée
def rac_car1(A, p):
"""
Retourne une approximation de √A (flottant) en calculant le terme de rang p
de la suite de Héron.
CU : A numérique ≥ 0, p entier ≥ 0
>>> rac_car1(0, 10)
0
>>> rac_car1(5, 1)
2.25
>>> rac_car1(5, 10)
2.23606797749979
"""
assert(type(A) is int or type(A) is float), "A doit être un numérique"
assert(type(p) is int and p >= 0), "p doit être un entier ≥ 0"
if A == 0: # Cas à différencier pour éviter une division par 0
return 0
else:
x = A/2 # Définition de x_0
for i in range(1, p+1): # Pour chaque terme de 1 à p (on a déjà x_0)
x = (x+A/x)/2 # On calcule le terme suivant
return x # Retour de la valeur
def rac_car2(A):
"""
Retourne une approximation de √A (flottant) en utilisant la suite de
Héron.
CU : A numérique ≥ 0
>>> rac_car2(0)
0
>>> rac_car2(5)
2.23606797749979
"""
assert(type(A) is int or type(A) is float), "A doit être un numérique"
if A == 0: # Cas à différencier pour éviter une division par 0
return 0
else:
x = A/2 # Définition de x_0
xP = x + 1 # Initialisation par une valeur autre que x pour démarrer
# la boucle
while x != xP: # Tant que Python peut calculer les décimales
xP = x # La valeur actuelle devient précédente
x = (x+A/x)/2 # On calcule le terme suivant
return x # Retour de la valeur
# Somme et produit
def factorielle(k):
"""
Retourne k! (entier)
CU : k entier ≥ 0
>>> factorielle(0)
1
>>> factorielle(5)
120
"""
assert(type(k) is int and k >= 0), "k doit être un entier ≥ 0"
f=1 # Initialisation du produit
for i in range(1, k+1): # De 1 à k
f = f * i # On ajoute un élément du produit
return f # Retour de la valeur
def somme(n):
"""
Retourne la somme des entiers de 1 à n (entier)
CU : n entier ≥ 0
>>> somme(0)
0
>>> somme(1)
1
>>> somme(3)
6
"""
assert(type(n) is int and n >= 0), "n doit être un entier ≥ 0"
s = 0 # Initialisation de la somme
for i in range(1, n+1): # De 1 à n
s += i # On ajoute un élement de la somme
return s # Retour de la valeur
def sommeA(n): # Alternative plus rapide à calculer
"""
Retourne la somme des entiers de 1 à n (entier)
CU : n entier ≥ 0
>>> sommeA(0)
0
>>> sommeA(1)
1
>>> sommeA(3)
6
"""
assert(type(n) is int and n >= 0), "n doit être un entier ≥ 0"
return n*(n+1)//2
# Exponentielle
def exponentielle(x):
"""
Retourne une approximation de exp(x) (flottant)
CU : x numérique
>>> exponentielle(-5)
0.006737946999086907
>>> exponentielle(0)
1.0
>>> exponentielle(1)
2.7182818284590455
>>> exponentielle(5)
148.41315910257657
"""
assert(type(x) is int or type(x) is float), "x doit être un numérique"
e = 0 # Initialisation de la somme
eP = 1 # Initialisation par une valeur autre que s pour démarrer la boucle
i = 0 # Initialisation de l'incrémenteur
while e != eP: # Tant que Python peut calculer les décimales
eP = e # La valeur actuelle devient précédente
e = e + (x ** i) / (factorielle(i)) # On ajoute un élement de la somme
i += 1 # On incrémente i
return e # Retour de la valeur
# Sinus
def sinus(X):
"""
Retourne une approximation de sin(x) (flottant)
CU : X numérique
>>> sinus(-5)
0.9589242746631357
>>> sinus(0)
0.0
>>> sinus(5)
-0.9589242746631357
"""
assert(type(X) is int or type(X) is float), "X doit être un numérique"
s = 0 # Initialisation de la somme
sP = 1 # Initialisation par une valeur autre que s pour démarrer la boucle
i = 0 # Initialisation de l'incrémenteur
while s != sP: # Tant que Python peut calculer les décimales
sP = s # La valeur actuelle devient précédente
if i % 2: # Si i est impair alors (-1)^i=-1, si pair =1
p = -1
else:
p = 1
s += p * (X ** (2 * i + 1)) / factorielle(2 * i + 1) # On ajoute une
# partie de la
# somme
i += 1 # On incrémente i
return s # Retour de la valeur
# Logarithme
def ln(X):
"""
Retourne une approximation de Ln(1+X) (flottant)
CU : X numérique ∈ [0,1]
>>> ln(0)
0.0
>>> ln(0.5)
0.4054651081081643
"""
assert((type(X) is int or type(X) is float) and X >= 0 and X <= 1), \
"X doit être un numérique ∈ [0,1]"
l = 0 # Initialisation de la somme
lP = 1 # Initialisation par une valeur autre que l pour démarrer la boucle
i = 1 # Initialisation de l'incrémenteur
while l != lP : # Tant que Python peut calculer les décimales
lP = l # La valeur actuelle devient précédente
if i % 2: # Vérifier si i-1 est pair revient à vérifier si i est impair
# cela revient à inverser les actions
p = 1
else:
p = -1
l += p * X**i / i # On ajoute un élement de la somme
i += 1 # On incrémente i
return l # Retour de la valeur
def tester():
doctest.testmod(verbose=True)