{"id":7085,"date":"2022-06-21T06:00:53","date_gmt":"2022-06-21T04:00:53","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=7085"},"modified":"2022-06-21T11:54:22","modified_gmt":"2022-06-21T09:54:22","slug":"calculo-aproximado-de-integrales-definidas","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/calculo-aproximado-de-integrales-definidas\/","title":{"rendered":"C\u00e1lculo aproximado de integrales definidas"},"content":{"rendered":"<p>La integral definida de una funci\u00f3n f entre los l\u00edmites a y b puede calcularse mediante la <a href=\"http:\/\/bit.ly\/1FDhZ1z\">regla del rect\u00e1ngulo<\/a> usando la f\u00f3rmula<\/p>\n<pre lang=\"text\">\n   h * (f(a+h\/2) + f(a+h+h\/2) + f(a+2h+h\/2) + ... + f(a+n*h+h\/2))\n<\/pre>\n<p>con <code>a+n*h+h\/2 &lt;= b &lt; a+(n+1)*h+h\/2<\/code> y usando valores peque\u00f1os para <code>h<\/code>.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   integral :: (Fractional a, Ord a) => a -> a -> (a -> a) -> a -> a\n<\/pre>\n<p>tal que <code>(integral a b f h)<\/code> es el valor de dicha expresi\u00f3n. Por ejemplo, el c\u00e1lculo de la integral de <code>f(x) = x^3<\/code> entre <code>0<\/code> y <code>1<\/code>, con paso <code>0.01<\/code>, es<\/p>\n<pre lang=\"text\">\n   integral 0 1 (^3) 0.01  ==  0.24998750000000042\n<\/pre>\n<p>Otros ejemplos son<\/p>\n<pre lang=\"text\">\n   integral 0 1 (^4) 0.01                   ==  0.19998333362500048\n   integral 0 1 (\\x -> 3*x^2 + 4*x^3) 0.01  ==  1.9999250000000026\n   log 2 - integral 1 2 (\\x -> 1\/x) 0.01         ==  3.124931644782336e-6\n   pi - 4 * integral 0 1 (\\x -> 1\/(x^2+1)) 0.01  ==  -8.333333331389525e-6\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Test.QuickCheck.HigherOrder (quickCheck')\nimport Test.QuickCheck (Property, (==>), quickCheck)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nintegral1 :: (Fractional a, Ord a) => a -> a -> (a -> a) -> a -> a\nintegral1 a b f h\n  | a+h\/2 > b = 0\n  | otherwise = h * f (a+h\/2) + integral1 (a+h) b f h\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nintegral2 :: (Fractional a, Ord a) => a -> a -> (a -> a) -> a -> a\nintegral2 a b f h = aux a where\n  aux x | x+h\/2 > b = 0\n        | otherwise = h * f (x+h\/2) + aux (x+h)\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nintegral3 :: (Fractional a, Ord a) => a -> a -> (a -> a) -> a -> a\nintegral3 a b f h = h * suma (a+h\/2) b (+h) f\n\n-- (suma a b s f) es l valor de\n--    f(a) + f(s(a)) + f(s(s(a)) + ... + f(s(...(s(a))...))\n-- hasta que s(s(...(s(a))...)) > b. Por ejemplo,\n--    suma 2 5 (1+) (^3)  ==  224\nsuma :: (Ord t, Num a) => t -> t -> (t -> t) -> (t -> a) -> a\nsuma a b s f = sum [f x | x <- sucesion a b s]\n\n-- (sucesion x y s) es la lista\n--    [a, s(a), s(s(a), ..., s(...(s(a))...)]\n-- hasta que s(s(...(s(a))...)) > b. Por ejemplo,\n--    sucesion 3 20 (+2)  ==  [3,5,7,9,11,13,15,17,19]\nsucesion :: Ord a => a -> a -> (a -> a) -> [a]\nsucesion a b s = takeWhile (<=b) (iterate s a)\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_integral :: Int -> Int -> (Int -> Int) -> Int -> Property\nprop_integral a b f h =\n  a < b &#038;&#038; h > 0 ==> \n  all (=~ integral1 a' b' f' h')\n      [integral2 a' b' f' h',\n       integral3 a' b' f' h']\n  where\n    a' = fromIntegral a\n    b' = fromIntegral b\n    h' = fromIntegral h\n    f' = fromIntegral . f. round\n    x =~ y = abs (x - y) < 0.001\n        \n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck' prop_integral\n--    +++ OK, passed 100 tests; 385 discarded.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> integral1 0 10 (^3) 0.00001\n--    2499.999999881125\n--    (2.63 secs, 1,491,006,744 bytes)\n--    \u03bb> integral2 0 10 (^3) 0.00001\n--    2499.999999881125\n--    (1.93 secs, 1,419,006,696 bytes)\n--    \u03bb> integral3 0 10 (^3) 0.00001\n--    2499.9999998811422\n--    (1.28 secs, 817,772,216 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Calculo_aproximado_de_integrales_definidas.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La integral definida de una funci\u00f3n f entre los l\u00edmites a y b puede calcularse mediante la regla del rect\u00e1ngulo usando la f\u00f3rmula h * (f(a+h\/2) + f(a+h+h\/2) + f(a+2h+h\/2) + &#8230; + f(a+n*h+h\/2)) con a+n*h+h\/2 &lt;= b &lt; a+(n+1)*h+h\/2 y usando valores peque\u00f1os para h. Definir la funci\u00f3n integral :: (Fractional a, Ord a)&#8230;<\/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\/7085"}],"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=7085"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7085\/revisions"}],"predecessor-version":[{"id":7086,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7085\/revisions\/7086"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=7085"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=7085"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=7085"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}