123 lines
3.2 KiB
Python
123 lines
3.2 KiB
Python
# PREUD'HOMME BONTOUX Geoffrey - PeiP 12 - 2014/2015
|
||
# TP n°4 donné le 3/10/2014 - Recherche de zéro par dichotomie
|
||
# http://www.fil.univ-lille1.fr/~wegrzyno/portail/Info/Doc/HTML/tp_iteration_conditionnelle.html
|
||
|
||
import doctest
|
||
|
||
# [Q1] Définissez en Python la fonction f.
|
||
def f(x):
|
||
"""
|
||
Renvoie la valeur x**2-3
|
||
|
||
CU : x réel positif
|
||
|
||
Exemple :
|
||
>>> f(0)
|
||
-3
|
||
>>> f(42)
|
||
1761
|
||
"""
|
||
assert((type(x) is int or type(x) is float) and x >= 0), \
|
||
"x doit être un réel positif"
|
||
|
||
return x**2-3
|
||
|
||
# [Q2] Créez deux variables a et b, puis calculez f(a) et f(b)
|
||
a = 0
|
||
b = 2
|
||
|
||
f_a = f(a) # -3
|
||
f_b = f(b) # 1
|
||
|
||
# [Q2] Calculez aussi la longueur de l’intervalle [a,b].
|
||
intervalle = b-a
|
||
|
||
# [Q3] Créez une variable c puis calculez f(c).
|
||
c = intervalle/2+a # 1
|
||
f_c = f(c) # -2
|
||
|
||
# [Q3] Doit-on chercher le zéro de f dans l’intervalle ]a,c[ ou dans
|
||
# l’intervalle ]c,b[ ?
|
||
|
||
# f(c) vaut -2, donc 0 ∈ [f(c);f(b)], donc on doit chercher le zéro de f dans
|
||
# ]c,b[
|
||
|
||
# [Q4] Écrivez une fonction zero qui prend un paramètre epsilon
|
||
# strictement positif et qui renvoie une approximation du zéro de f à epsilon
|
||
# / 2 près.
|
||
def zero(epsilon):
|
||
"""
|
||
Renvoie une approximation du zéro de f à epsilon/2 près.
|
||
|
||
CU : epsilon doit être un réel supérieur à 0
|
||
|
||
Exemple :
|
||
>>> zero(0.1)
|
||
1.6875
|
||
>>> zero(0.00001)
|
||
1.7320480346679688
|
||
"""
|
||
assert((type(epsilon) is int or type(epsilon) is float) and epsilon >= 0), \
|
||
"epsilon supérieur à 0"
|
||
|
||
# Pour être conforme à la règle PEP 3104
|
||
mini = a
|
||
maxi = b
|
||
|
||
while maxi - mini >= epsilon:
|
||
milieu = (maxi - mini)/2+mini
|
||
if f(milieu) > 0:
|
||
maxi = milieu
|
||
else:
|
||
mini = milieu
|
||
return milieu
|
||
|
||
# [Q5] Modifiez votre fonction zero pour qu’elle accepte en paramètres
|
||
# n’importe quelle fonction continue strictement monotone et n’importe quel
|
||
# intervalle initial contenant le zéro de cette fonction.
|
||
def fTest(x): # Fonction fournie pour tester zeroGenrique
|
||
"""
|
||
Renvoie la valeur x**3-4
|
||
|
||
CU : x réel
|
||
|
||
Exemple :
|
||
>>> f(0)
|
||
-3
|
||
>>> f(42)
|
||
1761
|
||
"""
|
||
assert((type(x) is int or type(x) is float)), \
|
||
"x doit être un réel"
|
||
|
||
return x**3-4
|
||
|
||
def zeroGenerique(fonction, mini, maxi, epsilon):
|
||
"""
|
||
Renvoie une approximation du zéro de la fonction f entre mini et maxi
|
||
à epsilon/2 près.
|
||
|
||
CU : fonction E → F continue et monotone avec E,F ⊂ ℝ, mini,maxi ∈ E,
|
||
mini<maxi, epsilon réel supérieur à 0
|
||
|
||
Exemple :
|
||
>>> zeroGenerique(fTest, -10, 10, 0.001)
|
||
1.5875244140625
|
||
"""
|
||
assert(type(mini) is int or type(mini) is float), "mini doit être un réel"
|
||
assert(type(maxi) is int or type(maxi) is float), "maxi doit être un réel"
|
||
assert(mini < maxi), "mini doit être inférieur à maxi"
|
||
assert((type(epsilon) is int or type(epsilon) is float) and epsilon >= 0), \
|
||
"epsilon doit être un réel supérieur à 0"
|
||
|
||
while maxi - mini >= epsilon:
|
||
milieu = (maxi - mini)/2+mini
|
||
if fonction(milieu) > 0:
|
||
maxi = milieu
|
||
else:
|
||
mini = milieu
|
||
return milieu
|
||
|
||
def tester():
|
||
doctest.testmod(verbose=True)
|