{"id":7092,"date":"2022-06-24T06:00:57","date_gmt":"2022-06-24T04:00:57","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=7092"},"modified":"2022-06-21T11:54:55","modified_gmt":"2022-06-21T09:54:55","slug":"metodo-de-biseccion-para-aproximar-raices-de-funciones","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/metodo-de-biseccion-para-aproximar-raices-de-funciones\/","title":{"rendered":"M\u00e9todo de bisecci\u00f3n para aproximar ra\u00edces de funciones"},"content":{"rendered":"<p>El m\u00e9todo de bisecci\u00f3n para calcular un cero de una funci\u00f3n en el intervalo [a,b] se basa en el teorema de Bolzano:<\/p>\n<blockquote><p>\n\u00abSi f(x) es una funci\u00f3n continua en el intervalo [a, b], y si, adem\u00e1s, en los extremos del intervalo la funci\u00f3n f(x) toma valores de signo opuesto (f(a) * f(b) < 0), entonces existe al menos un valor c en (a, b) para el que f(c) = 0\".\n<\/p><\/blockquote>\n<p>El m\u00e9todo para calcular un cero de la funci\u00f3n f en el intervalo [a,b] con un error menor que e consiste en tomar el punto medio del intervalo c = (a+b)\/2 y considerar los siguientes casos:<\/p>\n<ul>\n<li>Si |f(c)| &lt; e, hemos encontrado una aproximaci\u00f3n del punto que anula f en el intervalo con un error aceptable.<\/li>\n<li>Si f(c) tiene signo distinto de f(a), repetir el proceso en el intervalo [a,c].<\/li>\n<li>Si no, repetir el proceso en el intervalo [c,b].<\/li>\n<\/ul>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   biseccion :: (Double -> Double) -> Double -> Double -> Double -> Double\n<\/pre>\n<p>tal que <code>(biseccion f a b e)<\/code> es una aproximaci\u00f3n del punto del intervalo <code>[a,b]<\/code> en el que se anula la funci\u00f3n <code>f<\/code>, con un error menor que <code>e<\/code>, calculada mediante el m\u00e9todo de la bisecci\u00f3n. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   biseccion (\\x -> x^2 - 3) 0 5 0.01             ==  1.7333984375\n   biseccion (\\x -> x^3 - x - 2) 0 4 0.01         ==  1.521484375\n   biseccion cos 0 2 0.01                         ==  1.5625\n   biseccion (\\x -> log (50-x) - 4) (-10) 3 0.01  ==  -5.125\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Test.QuickCheck (Arbitrary, Gen, Property, (==>), arbitrary, choose, sized, quickCheck)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nbiseccion1 :: (Double -> Double) -> Double -> Double -> Double -> Double\nbiseccion1 f a b e  \n    | abs (f c) < e = c\n    | f a * f c < 0 = biseccion1 f a c e\n    | otherwise     = biseccion1 f c b e\n    where c = (a+b)\/2\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nbiseccion2 :: (Double -> Double) -> Double -> Double -> Double -> Double\nbiseccion2 f a b e = aux a b\n  where aux a' b' | abs (f c) < e = c\n                  | f a' * f c < 0 = aux a' c \n                  | otherwise     = aux c b'\n          where c = (a'+b')\/2\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\nnewtype Polinomio = P [Int]\n  deriving Show\n\nvalorPolinomio :: Polinomio -> Double -> Double\nvalorPolinomio (P cs) x =\n  sum [fromIntegral c * x^n | (c,n) <- zip cs [0..]]\n\npolinomioArbitrario :: Int -> Gen Polinomio\npolinomioArbitrario 0 = return (P [])\npolinomioArbitrario n = do\n  c <- choose (-10,10)\n  (P xs) <- polinomioArbitrario (n `div` 2)\n  return (P (c:xs))\n\ninstance Arbitrary Polinomio where\n  arbitrary = sized polinomioArbitrario\n\n-- La propiedad es\nprop_biseccion :: Polinomio -> Double -> Double -> Double -> Property\nprop_biseccion p a b e =\n  f a * f b < 0 &#038;&#038; e > 0 ==>\n  biseccion1 f a b e =~ biseccion2 f a b e\n  where\n    f = valorPolinomio p \n    x =~ y = abs (x - y) < 0.001\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheckWith (stdArgs {maxDiscardRatio=30}) prop_biseccion\n--    +++ OK, passed 100 tests; 2156 discarded.\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Metodo_de_biseccion_para_aproximar_raices_de_funciones.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El m\u00e9todo de bisecci\u00f3n para calcular un cero de una funci\u00f3n en el intervalo [a,b] se basa en el teorema de Bolzano: \u00abSi f(x) es una funci\u00f3n continua en el intervalo [a, b], y si, adem\u00e1s, en los extremos del intervalo la funci\u00f3n f(x) toma valores de signo opuesto (f(a) * f(b) < 0), entonces...\n<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[2],"tags":[578,579],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7092"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=7092"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7092\/revisions"}],"predecessor-version":[{"id":7095,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7092\/revisions\/7095"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=7092"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=7092"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=7092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}