轻量级 C++ 符号求导库,支持字符串表达式解析、符号求导、变量赋值求值等核心功能,适用于数学表达式求导场景。
- 支持基于 Expr 节点的变量/常量导数计算
- 支持字符串表达式解析(如 "2z + xx + sin(x)")
- 内存安全:通过 Arena 管理节点内存,Context 统一维护计算上下文
- 简单易用的 API:一行代码完成表达式解析、求导、求值
- C++17 及以上版本
- 标准数学库(cmath)
| 类名 | 核心职责 |
|---|---|
Expr |
计算项节点,封装常量、变量、运算符、函数(如 sin)等最小计算单元 |
Context |
核心上下文,持有符号表(SymbolTable)和内存池(Arena),负责节点分配/管理 |
Env |
环境实例,存储变量的具体数值,用于表达式求值 |
SymbolTable |
符号表,映射变量名(如 x/z)到对应的 Expr 节点 ID |
Arena |
内存池,统一管理 Expr 节点的内存分配与释放,避免内存泄漏 |
- Const
- Var
- Add
- Min
- Mul
- Div
- Sin
- Cos
- Tan
- Exp
- Ln
- Log2
- Log10
- Pow
- Sqrt
- Cbrt
#include <iostream>
// 引入 Sym 库头文件(根据实际路径调整)
#include "sym/sym.h"
int main() {
// 1. 初始化上下文(管理节点)和环境(管理变量值)
auto [ctx, env] = init();
// 2. 解析字符串表达式:f(x,z) = 2z + x² + sin(x)
auto f = parse(ctx, "2*z + x*x + sin(x)");
// 3. 为变量赋值并求值(x=2,z=1)
env.set_intern("x", 2).set_intern("z", 1);
// 预期输出:2*1 + 2² + sin(2) ≈ 2 + 4 + 0.9093 = 6.9093
std::cout << "f(2,1) = " << eval(f, env.raw()) << "\n";
// 4. 对不同变量求导
auto dfx = diff(f, "x"); // 对 x 求导:2x + cos(x)
auto dfz = diff(f, "z"); // 对 z 求导:2
// 5. 求导后表达式求值
// 预期输出:2*2 + cos(2) ≈ 4 + (-0.4161) = 3.5839
std::cout << "df/dx(2,1) = " << eval(dfx, env) << "\n";
// 预期输出:2
std::cout << "df/dz(2,1) = " << eval(dfz, env) << "\n";
return 0;
}