simsym 0.1.0

A simple symbolic computation library.
Documentation
use simsym::prelude::*;

fn check_integral(f: Expr, x: Symbol) -> Result<(), Box<dyn std::error::Error>> {
    let f = f.simplify();
    println!("=== {f} ===");
    match f.clone().integrate(x) {
        Ok(fx) => {
            let fx = fx.simplify();
            println!("∫f dx = {fx}");
            let check = fx.diff_without_simplify(x);
            if let Ok(v) = f.eval_f64(&[(x, 0.5)]) {
                if let Ok(rv) = check.eval_f64(&[(x, 0.5)]) {
                    println!("check f(0.5)={v}  d/dx(F)(0.5)={rv}");
                }
            }
        }
        Err(e) => println!("integrate: {e}"),
    }
    println!();
    Ok(())
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let x = symbol("x");

    check_integral(expr!(e ^ x * (x ^ 3 + 2 * x)), x)?;
    check_integral(exp(x) * sin(x), x)?;
    check_integral(exp(expr!(2 * x + 1)) * sin(expr!(3 * x + 1 / 4)), x)?;
    check_integral(sin(x).pow(2) * cos(x).pow(2), x)?;
    check_integral(sin(x).pow(3) * cos(x).pow(2), x)?;
    check_integral(cos(x).pow(-4), x)?;
    check_integral(atan(x), x)?;
    check_integral(expr!(1 / (x ^ 2 + 1)), x)?;

    Ok(())
}