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 / bin / repl.ml
4.5 kB 110 lines
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 ()