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 4/dichotomie.py
2014-10-10 00:02:58 +02:00

123 lines
3.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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)