0votos

Hallar integral evaluandola de manera numerica en Haskell

por josejuan hace 3 años

Se resuelve de cuatro formas diferentes. Las tres primeras usando el método Newton-Cotes y la segunda el de Montecarlo.

Se recomienda realizar un par de bucles anidados que nos permitan recorrer as vaariables x e y. EL CÓDIGO DEBE SER VALIDO PARA PYTHON (Spyder).

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import System.Random 
import Data.List 
import Control.Monad 
import System.IO.Unsafe -- sólo para que montecarlo tenga la misma firma que el resto 
 
-- Calcula la media de una serie de valores 
promedio xs = ∑xs / genericLength xs 
 
-- Corta un intervalo en subrangos 
cortes (a, b) n = [a, a + (b - a) / fromIntegral n … b] 
 
-- Calcula la integral usando la familia de métodos de Newton-Cotes 
newtonCotes pf r n = (λxs → ∑ $ zipWith pf xs $ tail xs) (cortes r n) 
 
-- Las más sencillas variantes de la familia Newton-Cotes 
rectángulo f = newtonCotes $ λa b → (b - a) * f a 
puntoMedio f = newtonCotes $ λa b → (b - a) * f (promedio [a, b]) 
simpson    f = newtonCotes $ λa b → (b - a) * (f a + 4 * f (promedio [a, b]) + f b) / 6 
 
-- Si el dominio no se puede cortar en subrangos podemos usar Montecarlo 
montecarlo f r n = promedio [f (unsafePerformIO $ randomRIO r) | _ ← [1…n]] 
 
 
 
 
 
 
 
 
-- ================================================================= 
 
-- algunas funciones 
funciones :: [(String, Double → Double)] 
funciones = [ ("Identidad"      , id) 
            , ("Raíz cuadrada"  , √) 
            , ("Cuadrado"       , (²)) 
 
-- los métodos de integración 
integradores :: [(String, (Double → Double) → (Double, Double) → Int → Double)] 
integradores = [ ("Newton-Cotes rectángulo"   , rectángulo) 
               , ("Newton-Cotes punto medio"  , puntoMedio) 
               , ("Newton-Cotes Simpson"      , simpson) 
               , ("Montecarlo"                , montecarlo) 
 
-- reportamos todos los métodos y funciones 
reportar = do 
  let r = (0.0, 1.0) 
      n = 1000 :: Int 
  ↰_funciones $ λ(fn, f) → do 
    putStrLn fn 
    ↰_integradores $ λ(tn, t) → do 
      putStrLn $ "  " ⧺ tn ⧺ ": " ⧺ show (t f r n) 
 
 
 
{- Ejemplo de ejecución: 
 
> reportar  
Identidad 
  Newton-Cotes rectángulo: 0.49950000000000105 
  Newton-Cotes punto medio: 0.5000000000000007 
  Newton-Cotes Simpson: 0.5000000000000008 
  Montecarlo: 0.4981572003859337 
Raíz cuadrada 
  Newton-Cotes rectángulo: 0.6661601343936833 
  Newton-Cotes punto medio: 0.6666685712956795 
  Newton-Cotes Simpson: 0.6666657589950139 
  Montecarlo: 0.652826230703355 
Cuadrado 
  Newton-Cotes rectángulo: 0.3328335000000012 
  Newton-Cotes punto medio: 0.3333332500000006 
  Newton-Cotes Simpson: 0.33333333333333437 
  Montecarlo: 0.3064358886910113 
 
 
-} 
2 comentarios
0votos

Escrito por Damz hace 3 años

Es valido el codigo para Spyder (Python)?

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.