symbolic mathematics engine in OCaml with differentiation, integration, simplification, and numerical methods
1open Leibniz
2
3let print_help () =
4 print_endline "leibniz - symbolic differentiation engine";
5 print_endline "";
6 print_endline "commands:";
7 print_endline " diff <var> <expr> - differentiate expression";
8 print_endline " partial <var1,var2> <expr> - partial derivative";
9 print_endline " integrate <var> <expr> - symbolic integration";
10 print_endline " simplify <expr> - simplify expression";
11 print_endline " eval <var=val,...> <expr> - evaluate numerically";
12 print_endline " taylor <var> <center> <order> <expr> - taylor series expansion";
13 print_endline " gradient <var1,var2> <expr> - compute gradient";
14 print_endline " latex <expr> - output latex format";
15 print_endline " graphviz <expr> - output graphviz format";
16 print_endline " help - show this help";
17 print_endline " quit - exit";
18 print_endline ""
19
20let parse_env str =
21 let pairs = String.split_on_char ',' str in
22 List.map (fun p ->
23 match String.split_on_char '=' p with
24 | [var; value] -> (String.trim var, float_of_string (String.trim value))
25 | _ -> failwith "invalid environment format"
26 ) pairs
27
28let () =
29 print_help ();
30
31 let rec loop () =
32 print_string "> ";
33 flush stdout;
34 try
35 let line = read_line () in
36 let parts = String.split_on_char ' ' line in
37 match parts with
38 | [] -> loop ()
39 | "quit" :: _ -> ()
40 | "help" :: _ -> print_help (); loop ()
41 | "diff" :: var :: rest ->
42 let expr_str = String.concat " " rest in
43 let expr = Parser.parse expr_str in
44 let result = Diff.diff var expr in
45 print_endline (Expr.to_string result);
46 loop ()
47 | "partial" :: vars :: rest ->
48 let var_list = String.split_on_char ',' vars in
49 let expr_str = String.concat " " rest in
50 let expr = Parser.parse expr_str in
51 let result = List.fold_left (fun e v -> Diff.diff (String.trim v) e) expr var_list in
52 print_endline (Expr.to_string result);
53 loop ()
54 | "integrate" :: var :: rest ->
55 let expr_str = String.concat " " rest in
56 let expr = Parser.parse expr_str in
57 (match Integrate.integrate var expr with
58 | Some result -> print_endline (Expr.to_string result)
59 | None -> print_endline "integration failed: no closed form found");
60 loop ()
61 | "simplify" :: rest ->
62 let expr_str = String.concat " " rest in
63 let expr = Parser.parse expr_str in
64 let result = Simplify.simplify expr in
65 print_endline (Expr.to_string result);
66 loop ()
67 | "eval" :: env_str :: rest ->
68 let env = parse_env env_str in
69 let expr_str = String.concat " " rest in
70 let expr = Parser.parse expr_str in
71 let result = Eval.eval env expr in
72 print_endline (string_of_float result);
73 loop ()
74 | "taylor" :: var :: center_str :: order_str :: rest ->
75 let center = float_of_string center_str in
76 let order = int_of_string order_str in
77 let expr_str = String.concat " " rest in
78 let expr = Parser.parse expr_str in
79 let result = Series.taylor var expr (Expr.Const center) order in
80 print_endline (Expr.to_string result);
81 loop ()
82 | "gradient" :: vars :: rest ->
83 let var_list = List.map String.trim (String.split_on_char ',' vars) in
84 let expr_str = String.concat " " rest in
85 let expr = Parser.parse expr_str in
86 let grad = Multivariate.gradient var_list expr in
87 print_endline "[";
88 List.iter (fun g -> print_endline (" " ^ Expr.to_string g)) grad;
89 print_endline "]";
90 loop ()
91 | "latex" :: rest ->
92 let expr_str = String.concat " " rest in
93 let expr = Parser.parse expr_str in
94 print_endline (Format.to_latex expr);
95 loop ()
96 | "graphviz" :: rest ->
97 let expr_str = String.concat " " rest in
98 let expr = Parser.parse expr_str in
99 print_endline (Format.to_graphviz expr);
100 loop ()
101 | _ ->
102 print_endline "unknown command (type 'help' for commands)";
103 loop ()
104 with
105 | End_of_file -> ()
106 | e ->
107 print_endline ("error: " ^ Printexc.to_string e);
108 loop ()
109 in
110 loop ()