packages feed

egison-5.0.0: sample/math/analysis/leibniz-formula.egi

--
-- Leibniz formula (Fourier series coefficients)
--

def f (x: MathExpr) : MathExpr := x

def multSd (x: MathExpr) (f: MathExpr) (G: MathExpr) : MathExpr :=
  let F := Sd x f
   in F * G - Sd x (f * d/d G x)

-- Test multSd with various trigonometric functions
assertEqual "multSd cos x"
  (multSd x (cos x) (f x))
  (x * sin x + cos x - sin x)

assertEqual "multSd cos 2x"
  (multSd x (cos (2 * x)) (f x))
  (x * sin (2 * x) / 2 + cos (2 * x) / 4 - sin (2 * x) / 2)

assertEqual "multSd sin x"
  (multSd x (sin x) (f x))
  (- x * cos x + sin x + cos x)

-- Fourier coefficients for f(x) = x
def coeffAs : [MathExpr] :=
  map
    (\n ->
      let F := multSd x (cos (n * x)) (f x)
       in (substitute [(x, π)] F - substitute [(x, - π)] F) / π)
    nats

-- First 10 coefficients should all be 0 (f(x) = x is an odd function)
assertEqual "first 10 Fourier cosine coefficients"
  (take 10 coeffAs)
  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

def bs : [MathExpr] :=
  map
    (\n ->
      let F := multSd x (sin (n * x)) (f x)
       in (substitute [(x, π)] F - substitute [(x, - π)] F) / π)
    (take 10 nats)

assertEqual "first 10 Fourier sine coefficients"
  (take 10 bs)
  [2, -1, 2/3, -1/2, 2/5, -1/3, 2/7, -1/4, 2/9, -1/5]

def f' : [MathExpr] := map (\(k, b) -> b * sin (k * x)) (zip nats bs)

-- Fourier series terms
assertEqual "first 10 Fourier series terms"
  (take 10 f')
  [2 * sin x, - sin (2 * x), 2 * sin (3 * x) / 3, - sin (4 * x) / 2,
   2 * sin (5 * x) / 5, - sin (6 * x) / 3, 2 * sin (7 * x) / 7, - sin (8 * x) / 4,
   2 * sin (9 * x) / 9, - sin (10 * x) / 5]