Funciones inversas por el método de Newton
Definir, usando puntoCero, la función
1 |
inversa :: (Double -> Double) -> Double -> Double |
tal que inversa g x
es el valor de la inversa de g
en x
. Por ejemplo,
1 |
inversa (^2) 9 == 3.000000002941184 |
Definir, usando inversa, las funciones raizCuadrada, raizCubica, arcoseno y arcocoseno que calculen la raíz cuadrada, la raíz cúbica, el arco seno y el arco coseno, respectivamente. Por ejemplo,
1 2 3 4 |
raizCuadrada 9 == 3.000000002941184 raizCubica 27 == 3.0000000000196048 arcoseno 1 == 1.5665489428306574 arcocoseno 0 == 1.5707963267949576 |
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
module Funciones_inversas_por_el_metodo_de_Newton where import Metodo_de_Newton_para_calcular_raices (puntoCero) import Test.Hspec (Spec, hspec, it, shouldBe) inversa :: (Double -> Double) -> Double -> Double inversa g a = puntoCero f where f x = g x - a raizCuadrada, raizCubica, arcoseno, arcocoseno :: Double -> Double raizCuadrada = inversa (^2) raizCubica = inversa (^3) arcoseno = inversa sin arcocoseno = inversa cos -- Verificación -- ============ verifica :: IO () verifica = hspec spec spec :: Spec spec = do it "e1" $ inversa (^2) 9 `shouldBe` 3.000000002941184 it "e2" $ raizCuadrada 9 `shouldBe` 3.000000002941184 it "e3" $ raizCubica 27 `shouldBe` 3.0000000000196048 it "e4" $ arcoseno 1 `shouldBe` 1.5665489428306574 it "e5" $ arcocoseno 0 `shouldBe` 1.5707963267949576 -- La verificación es -- λ> verifica -- -- e1 -- e2 -- e3 -- e4 -- e5 -- -- Finished in 0.0006 seconds -- 5 examples, 0 failures |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
from math import cos, sin from typing import Callable from src.Metodo_de_Newton_para_calcular_raices import puntoCero def inversa(g: Callable[[float],float], a: float) -> float: def f(x: float) -> float: return g(x) - a return puntoCero(f) def raizCuadrada(x: float) -> float: return inversa(lambda y: y**2, x) def raizCubica(x: float) -> float: return inversa(lambda y: y**3, x) def arcoseno(x: float) -> float: return inversa(sin, x) def arcocoseno(x: float) -> float: return inversa(cos, x) # Verificación # ============ def test_inversa() -> None: assert inversa(lambda x: x**2, 9) == 3.000000002941184 assert raizCuadrada(9) == 3.000000002941184 assert raizCubica(27) == 3.0000000000196048 assert arcoseno(1) == 1.5665489428306574 assert arcocoseno(0) == 1.5707963267949576 print("Verificado") # La comprobación es # >>> test_inversa() # Verificado |