Menu Close

Operaciones con series de potencias

Una serie de potencias es una serie de la forma

   a₀ + a₁x + a₂x² + a₃x³ + ...

Las series de potencias se pueden representar mediante listas infinitas. Por ejemplo, la serie de la función exponencial es

   e^x = 1 + x + x²/2! + x³/3! + ...

y se puede representar por [1, 1, 1/2, 1/6, 1/24, 1/120, …]

Las operaciones con series se pueden ver como una generalización de las de los polinomios.

En lo que sigue, usaremos el tipo (Serie a) para representar las series de potencias con coeficientes en a y su definición es

   type Serie a = [a]

Definir las siguientes funciones

   opuesta      :: Num a => Serie a -> Serie a
   suma         :: Num a => Serie a -> Serie a -> Serie a
   resta        :: Num a => Serie a -> Serie a -> Serie a
   producto     :: Num a => Serie a -> Serie a -> Serie a
   cociente     :: Fractional a => Serie a -> Serie a -> Serie a
   derivada     :: (Num a, Enum a) => Serie a -> Serie a
   integral     :: (Fractional a, Enum a) => Serie a -> Serie a
   expx         :: Serie Rational

tales que

  • (opuesta xs) es la opuesta de la serie xs. Por ejemplo,
     λ> take 7 (opuesta [-6,-4..])
     [6,4,2,0,-2,-4,-6]
  • (suma xs ys) es la suma de las series xs e ys. Por ejemplo,
     λ> take 7 (suma [1,3..] [2,4..])
     [3,7,11,15,19,23,27]
  • (resta xs ys) es la resta de las series xs es ys. Por ejemplo,
     λ> take 7 (resta [3,5..] [2,4..])
     [1,1,1,1,1,1,1]
     λ> take 7 (resta ([3,7,11,15,19,23,27] ++ repeat 0) [1,3..])
     [2,4,6,8,10,12,14]
  • (producto xs ys) es el producto de las series xs e ys. Por ejemplo,
     λ> take 7 (producto [3,5..] [2,4..])
     [6,22,52,100,170,266,392]
  • (cociente xs ys) es el cociente de las series xs e ys. Por ejemplo,
     λ> take 7 (cociente ([6,22,52,100,170,266,392] ++ repeat 0) [3,5..])
     [2.0,4.0,6.0,8.0,10.0,12.0,14.0]
  • (derivada xs) es la derivada de la serie xs. Por ejemplo,
     λ> take 7 (derivada [2,4..])
     [4,12,24,40,60,84,112]
  • (integral xs) es la integral de la serie xs. Por ejemplo,
     λ> take 7 (integral ([4,12,24,40,60,84,112] ++ repeat 0))
     [0.0,4.0,6.0,8.0,10.0,12.0,14.0]
  • expx es la serie de la función exponencial. Por ejemplo,
     λ> take 8 expx
     [1 % 1,1 % 1,1 % 2,1 % 6,1 % 24,1 % 120,1 % 720,1 % 5040]
     λ> take 8 (derivada expx)
     [1 % 1,1 % 1,1 % 2,1 % 6,1 % 24,1 % 120,1 % 720,1 % 5040]
     λ> take 8 (integral expx)
     [0 % 1,1 % 1,1 % 2,1 % 6,1 % 24,1 % 120,1 % 720,1 % 5040]

Soluciones

type Serie a = [a] 
 
opuesta :: Num a => Serie a -> Serie a
opuesta = map negate
 
suma :: Num a => Serie a -> Serie a -> Serie a
suma = zipWith (+)
 
resta :: Num a => Serie a -> Serie a -> Serie a
resta xs ys = suma xs (opuesta ys)
 
producto :: Num a => Serie a -> Serie a -> Serie a
producto (x:xs) zs@(y:ys) = 
    x*y : suma (producto xs zs) (map (x*) ys)
 
cociente :: Fractional a => Serie a -> Serie a -> Serie a
cociente (x:xs) (y:ys) = zs 
    where zs = x/y : map (/y) (resta xs (producto zs ys))  
 
derivada :: (Num a, Enum a) => Serie a -> Serie a
derivada (_:xs) = zipWith (*) xs [1..]
 
integral :: (Fractional a, Enum a) => Serie a -> Serie a
integral xs = 0 : zipWith (/) xs [1..]
 
expx :: Serie Rational
expx = map (1/) (map fromIntegral factoriales)
 
-- factoriales es la lista de los factoriales. Por ejemplo, 
--    take 7 factoriales  ==  [1,1,2,6,24,120,720]
factoriales :: [Integer]
factoriales = 1 : scanl1 (*) [1..]
Medio

5 soluciones de “Operaciones con series de potencias

  1. rafpueleo
     
    opuesta :: Num a => Serie a -> Serie a
    opuesta [] = []
    opuesta (x:xs) = (-x) : opuesta xs
     
    suma :: Num a => Serie a -> Serie a -> Serie a
    suma (x:xs) (y:ys) = (x+y) : suma xs ys
     
    resta :: Num a => Serie a -> Serie a -> Serie a
    resta (x:xs) (y:ys) = (x-y) : resta xs ys
     
    producto :: Num a => Serie a -> Serie a -> Serie a
    producto (x:xs) (y:ys) = (x*y): producto xs ys
     
    cociente :: Integral a => Serie a -> Serie a -> Serie a
    cociente (x:xs) (y:ys) = (x `div`  y) : cociente xs ys
     
    derivada :: (Num a, Enum a) => Serie a -> Serie a
    derivada xs = [x*y | (x,y)<- zip xs [2..]]
     
    integral :: (Fractional a, Enum a) => Serie a -> Serie a
    integral xs = [x / y | (x,y) <- zip (0:xs) (1:[1..])]
     
    expx :: Serie Rational
    expx = [1%y | y <- xs]
      where xs = [product [1..x] | x <- [0..]]
  2. pabserpoz
    type Serie a = [a]
     
    opuesta :: Num a => Serie a -> Serie a
    opuesta xs = map (*(-1)) xs
     
    suma :: Num a => Serie a -> Serie a -> Serie a
    suma (x:xs) (y:ys) = (x+y) : suma xs ys
     
    resta :: Num a => Serie a -> Serie a -> Serie a
    resta (x:xs) (y:ys) = (x-y) : resta xs ys
     
    producto :: Num a => Serie a -> Serie a -> Serie a
    producto (x:xs) (y:ys) = (x*y) : suma (map (*x) ys) (producto (xs) (y:ys))
     
    cociente :: Fractional a => Serie a -> Serie a -> Serie a
    cociente (x:xs) (y:ys) = (x/y) : cociente (resta xs (map (*(x/y)) ys)) (y:ys)
     
    derivada :: (Num a, Enum a) => Serie a -> Serie a
    derivada xs = zipWith (*) [1..] (tail xs)
     
    integral :: (Fractional a, Enum a) => Serie a -> Serie a
    integral xs = 0 : zipWith (/) xs [1..]
    • pabserpoz
      expx :: Serie Rational
      expx = [1/y | y <- xs]
        where xs = [product [1..x] | x <- [0..]]
  3. rebgongor
    type Serie a = [a]
     
    opuesta :: Num a => Serie a -> Serie a
    opuesta [] = []
    opuesta (x:xs) = -x:opuesta xs
     
     
    suma :: Num a => Serie a -> Serie a -> Serie a
    suma xs ys = zipWith (+) xs ys
     
     
    resta :: Num a => Serie a -> Serie a -> Serie a
    resta xs ys = zipWith (-) xs ys
  4. Enrique Zubiría
    type Serie a = [a]
     
    opuesta      :: Num a => Serie a -> Serie a
    opuesta = map (*(-1))
     
    suma         :: Num a => Serie a -> Serie a -> Serie a
    suma = zipWith (+)
     
    resta        :: Num a => Serie a -> Serie a -> Serie a
    resta s1 s2 = suma s1 (opuesta s2)
     
    producto     :: Num a => Serie a -> Serie a -> Serie a
    producto s1 s2 = [sum [s1!!i * s2!!(k-i) | i <- [0..k]] | k <- [0..]]
     
    cociente     :: Fractional a => Serie a -> Serie a -> Serie a
    cociente (s1:ss1) (s2:ss2) = s1/s2 : cociente (resta ss1 (map (*(s1/s2)) ss2)) (s2:ss2)
     
    derivada     :: (Num a, Enum a) => Serie a -> Serie a
    derivada s1 = tail (zipWith (*) s1 [0..])
     
    integral     :: (Fractional a, Enum a) => Serie a -> Serie a
    integral s1 = 0:zipWith (/) s1 [1..]
     
    expx         :: Serie Rational
    expx = zipWith (/) (repeat 1) factoriales
      where factoriales = 1:zipWith (*) factoriales [1..]

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.