leibniz/lib/series.ml
2026-01-19 03:37:26 +00:00

26 lines
769 B
OCaml

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