symbolic mathematics engine in OCaml with differentiation, integration, simplification, and numerical methods
1open Expr
2
3let rec eval env = function
4 | Const f -> f
5 | SymConst Pi -> 4.0 *. atan 1.0
6 | SymConst E -> exp 1.0
7 | Var v ->
8 (try List.assoc v env
9 with Not_found -> failwith ("unbound variable: " ^ v))
10 | Add (e1, e2) -> eval env e1 +. eval env e2
11 | Sub (e1, e2) -> eval env e1 -. eval env e2
12 | Mul (e1, e2) -> eval env e1 *. eval env e2
13 | Div (e1, e2) -> eval env e1 /. eval env e2
14 | Pow (e1, e2) -> eval env e1 ** eval env e2
15 | Neg e -> -.(eval env e)
16 | Sin e -> sin (eval env e)
17 | Cos e -> cos (eval env e)
18 | Tan e -> tan (eval env e)
19 | Sinh e -> sinh (eval env e)
20 | Cosh e -> cosh (eval env e)
21 | Tanh e -> tanh (eval env e)
22 | Asin e -> asin (eval env e)
23 | Acos e -> acos (eval env e)
24 | Atan e -> atan (eval env e)
25 | Atan2 (e1, e2) -> atan2 (eval env e1) (eval env e2)
26 | Exp e -> exp (eval env e)
27 | Ln e -> log (eval env e)
28 | Log (base_e, arg) ->
29 let b = eval env base_e in
30 let a = eval env arg in
31 log a /. log b
32 | Sqrt e -> sqrt (eval env e)
33 | Abs e -> abs_float (eval env e)