-- -- -- Differentiation -- -- ∂/∂ $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 (map 2#((capply `(userRefs g [%1]) args) * ∂/∂ %2 x) (zip 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 d/d := ∂/∂ pd/pd := ∂/∂ ∇ := ∂/∂ nabla := ∇ grad := ∇ taylorExpansion $f $x $a := multivariateTaylorExpansion f [|x|] [|a|] maclaurinExpansion := 2#(taylorExpansion %1 %2 0) 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)) multivariateMaclaurinExpansion $f %xs := multivariateTaylorExpansion f xs (tensorMap 1#0 xs) addUserScript $f $i := let (g, is) := deconsUserScripts f in appendUserScripts g (sort (is ++ [i]))