Skip to content

RunChuan123/sym

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 

Repository files navigation

Sym 符号求导系统

轻量级 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;
}

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors