symbolic mathematics engine in OCaml with differentiation, integration, simplification, and numerical methods
1open Expr
2open Diff
3open Simplify
4
5let gradient vars expr =
6 List.map (fun v -> diff v expr) vars
7
8let jacobian vars exprs =
9 List.map (fun expr -> gradient vars expr) exprs
10
11let hessian vars expr =
12 let grad = gradient vars expr in
13 List.map (fun deriv -> List.map (fun v -> diff v deriv) vars) grad
14
15let divergence vars vector_field =
16 if List.length vars <> List.length vector_field then
17 failwith "divergence: dimension mismatch"
18 else
19 let terms = List.map2 (fun v e -> diff v e) vars vector_field in
20 let sum = List.fold_left (fun acc t -> Add (acc, t)) (Const 0.0) terms in
21 simplify sum
22
23let curl vector_field =
24 match vector_field with
25 | [fx; fy; fz] ->
26 let dfz_dy = diff "y" fz in
27 let dfy_dz = diff "z" fy in
28 let dfx_dz = diff "z" fx in
29 let dfz_dx = diff "x" fz in
30 let dfy_dx = diff "x" fy in
31 let dfx_dy = diff "y" fx in
32 [simplify (Sub (dfz_dy, dfy_dz));
33 simplify (Sub (dfx_dz, dfz_dx));
34 simplify (Sub (dfy_dx, dfx_dy))]
35 | _ -> failwith "curl: requires exactly 3 components"
36
37let laplacian vars expr =
38 let hess = hessian vars expr in
39 let diagonal = List.mapi (fun i row -> List.nth row i) hess in
40 let sum = List.fold_left (fun acc t -> Add (acc, t)) (Const 0.0) diagonal in
41 simplify sum