simsym
A simple symbolic computation library for Rust, with exact rational arithmetic.
Quick start
use *;
let x = symbol;
let y = symbol;
// Operators
let f = x.pow + rational * x * y + sin;
// Macro DSL
let g = expr!;
let df_dx = f.clone.diff;
let grad = f.gradient;
let exact = f.eval?;
let approx = f.eval_f64?;
let approx32 = f.eval_f32?;
let F = f.integrate?; // symbolic when a rule applies
let area = f.integrate_definite?;
// Numeric fallback
let num = integrate_numeric?;
Features
- Expression AST with
+ - * / ^, full circular & hyperbolic trig (sin…acsch), plusexp,ln - Exact
Rationalconstants (i64ratios);From/TryFromfor all integer primitives andf32/f64 - Simplification (algebraic folding, some like-term merging)
- Partial derivatives and gradients / Hessians
- Symbolic integration for polynomials and common elementary forms
- Definite integrals (symbolic antiderivative or adaptive Simpson)
expr!procedural macro
Limitations
Symbolic integration is rule-based (polynomials, affine trig/exp, e^x×P, parts, sin^n/cos^n reduction, partial fractions for low-degree P/Q including atan terms, sin·cos products, etc.) — not a full Risch algorithm. See docs/INTEGRATION.md for the algorithm stack. When integrate returns IntegrateError::NoRule, use integrate_numeric or integrate_definite (which falls back automatically).
Transcendental functions are not supported in exact eval; use eval_f64 or eval_f32.
Examples
Optional features
Cargo features (enabled by default):
| Feature | Enables |
|---|---|
simplify |
Expr::simplify |
diff |
Expr::diff, gradient, hessian |
integrate |
Expr::integrate, integrate_definite (implies diff) |
Minimal build (AST + rationals + evaluation only):
Other optional features:
serde— serialize rationals as(numer, denom)bigint—BigRational/Constant::Widefor coefficients beyondi64;From<i128>etc. forExpr