open Leibniz let () = print_endline "gradient descent optimization\n"; let f = Parser.parse "x^2 + y^2" in print_endline ("minimizing f(x,y) = " ^ Expr.to_string f); match Numerical.gradient_descent f ["x"; "y"] [5.0; 5.0] 0.1 100 with | Some [x; y] -> Printf.printf "minimum found at (%.4f, %.4f)\n" x y; let f_val = Eval.eval [("x", x); ("y", y)] f in Printf.printf "f(%.4f, %.4f) = %.4f\n" x y f_val | _ -> print_endline "optimization failed"; print_endline "\ngradient computation\n"; let grad = Multivariate.gradient ["x"; "y"] f in print_endline "∇f = ["; List.iter (fun g -> print_endline (" " ^ Expr.to_string g)) grad; print_endline "]"