packages feed

egison-4.1.0: lib/math/analysis/derivative.egi

--
--
-- Differentiation
--
--

def ∂/∂ $f *$x :=
  match f as mathExpr with
    -- symbol
    | #x -> 1
    | ?isSymbol -> 0
    -- function expression
    | func _ $argnames $args _ ->
      sum (map2 (\s r -> (userRefs f [s]) * ∂/∂ r x) argnames args)
    -- function application
    | #`exp $g -> exp g * ∂/∂ g x
    | #`log $g -> 1 / g * ∂/∂ g x
    | #`sqrt $g -> 1 / (2 * sqrt g) * ∂/∂ g x
    | #`(^) $g $h -> f * ∂/∂ (log g * h) x
    | #`cos $g -> (- sin g) * ∂/∂ g x
    | #`sin $g -> cos g * ∂/∂ g x
    | #`arccos $g -> 1 / sqrt (1 - g ^ 2) * ∂/∂ g x
    | apply $g $args ->
      sum (map2 2#((capply `(userRefs g [%1]) args) * ∂/∂ %2 x) nats args)
    -- quote
    | quote $g ->
      let g' := ∂/∂ g x
       in if isMonomial g'
            then g'
            else let d := capply gcd (fromPoly g')
                  in d *' '(mapPoly (/' d) g')
    -- term (constant)
    | #0 -> 0
    | _ * #1 -> 0
    -- term (multiplication)
    | #1 * $fx ^ $n -> n * fx ^ (n - 1) * ∂/∂ fx x
    | $a * $fx ^ $n * $r -> a * ∂/∂ (fx ^' n) x * r + a * fx ^' n * ∂/∂ r x
    -- polynomial
    | poly $ts -> sum (map 1#(∂/∂ %1 x) ts)
    -- quotient
    | $p1 / $p2 ->
      let p1' := ∂/∂ p1 x
          p2' := ∂/∂ p2 x
       in (p1' * p2 - p2' * p1) / p2 ^ 2

def d/d := ∂/∂

def pd/pd := ∂/∂

def ∇ := ∂/∂

def nabla := ∇

def grad := ∇

def taylorExpansion $f $x $a := multivariateTaylorExpansion f [|x|] [|a|]

def maclaurinExpansion := 2#(taylorExpansion %1 %2 0)

def multivariateTaylorExpansion $f %xs %ys :=
  withSymbols [h]
    let hs := generateTensor 1#h_%1 (tensorShape xs)
     in map2
          (*)
          (map 1#(1 / fact %1) nats0)
          (map
             (compose
                1#(V.substitute xs ys %1)
                1#(V.substitute hs (withSymbols [i] xs_i - ys_i) %1))
             (iterate (compose 1#(∇ %1 xs) 1#(V.* hs %1)) f))

def multivariateMaclaurinExpansion $f %xs :=
  multivariateTaylorExpansion f xs (tensorMap 1#0 xs)