use std::collections::HashMap;
use crate::numerical::elementary::eval_expr;
use crate::symbolic::core::Expr;
pub fn taylor_coefficients(
f: &Expr,
var: &str,
at_point: f64,
order: usize,
) -> Result<Vec<f64>, String> {
let mut coeffs = Vec::with_capacity(order + 1);
let mut current_f = f.clone();
let mut factorial = 1.0;
let mut vars_map = HashMap::new();
vars_map.insert(var.to_string(), at_point);
coeffs.push(eval_expr(¤t_f, &vars_map)?);
for i in 1..=order {
current_f = crate::symbolic::calculus::differentiate(¤t_f, var);
factorial *= i as f64;
let val = eval_expr(¤t_f, &vars_map)? / factorial;
coeffs.push(val);
}
Ok(coeffs)
}
#[must_use]
pub fn evaluate_power_series(
coeffs: &[f64],
at_point: f64,
x: f64,
) -> f64 {
let dx = x - at_point;
let mut sum = 0.0;
let mut p = 1.0;
for &c in coeffs {
sum += c * p;
p *= dx;
}
sum
}
pub fn sum_series(
f: &Expr,
var: &str,
start: i64,
end: i64,
) -> Result<f64, String> {
let mut sum = 0.0;
let mut vars_map = HashMap::new();
for i in start..=end {
vars_map.insert(var.to_string(), i as f64);
sum += eval_expr(f, &vars_map)?;
}
Ok(sum)
}