symbolic mathematics engine in OCaml with differentiation, integration, simplification, and numerical methods
17

Configure Feed

Select the types of activity you want to include in your feed.

leibniz / lib / multivariate.ml
1.3 kB 41 lines
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