from math import cos, pi, sin
from typing import Callable
# 1ª solución
# ===========
# derivada(f, x) es el valor de la derivada de la función f en el punto
# x con aproximación 0.0001. Por ejemplo,
# derivada(sin, pi) == -0.9999999983354435
# derivada(cos, pi) == 4.999999969612645e-5
def derivada(f: Callable[[float], float], x: float) -> float:
a = 0.0001
return (f(x+a) - f(x)) / a
def puntoCero(f: Callable[[float], float]) -> float:
def aceptable(b: float) -> bool:
return abs(f(b)) < 0.00001
def mejora(b: float) -> float:
return b - f(b) / derivada(f, b)
def aux(g: Callable[[float], float], x: float) -> float:
if aceptable(x):
return x
return aux(g, mejora(x))
return aux(f, 1)
# 2ª solución
# ===========
def puntoCero2(f: Callable[[float], float]) -> float:
def aceptable(b: float) -> bool:
return abs(f(b)) < 0.00001
def mejora(b: float) -> float:
return b - f(b) / derivada(f, b)
y = 1.0
while not aceptable(y):
y = mejora(y)
return y
# Verificación
# ============
def test_puntoCero () -> None:
assert puntoCero(cos) == 1.5707963267949576
assert puntoCero(cos) - pi/2 == 6.106226635438361e-14
assert puntoCero(sin) == -5.8094940533562345e-15
assert puntoCero2(cos) == 1.5707963267949576
assert puntoCero2(cos) - pi/2 == 6.106226635438361e-14
assert puntoCero2(sin) == -5.8094940533562345e-15
print("Verificado")
# La comprobación es
# >>> test_puntoCero()
# Verificado