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

123 lines
3.2 KiB
Python
Raw Normal View History

2014-10-10 00:02:58 +02:00
# 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 lintervalle [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 lintervalle ]a,c[ ou dans
# lintervalle ]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 quelle accepte en paramètres
# nimporte quelle fonction continue strictement monotone et nimporte 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)