open Expr open Diff open Substitute open Simplify let rec factorial n = if n <= 1 then 1.0 else float_of_int n *. factorial (n - 1) let taylor var expr center order = let rec build_terms n acc = if n > order then acc else let derivative = diff_n var n expr in let deriv_at_center = substitute var center derivative in let coeff = Div (deriv_at_center, Const (factorial n)) in let h = Sub (Var var, center) in let term = Mul (coeff, Pow (h, Const (float_of_int n))) in build_terms (n + 1) (term :: acc) in let terms = List.rev (build_terms 0 []) in let series = List.fold_left (fun acc t -> Add (acc, t)) (Const 0.0) terms in simplify series let maclaurin var expr order = taylor var expr (Const 0.0) order