asc-community/AngouriMath · 上手攻略

  • 仓库:asc-community/AngouriMath
  • 链接:https://github.com/asc-community/AngouriMath
  • 分类:academic-writing / math
  • 作者:Tom
  • 更新:2026-08-23

这是什么

AngouriMath 是一个开源、跨平台的符号代数库,使用 C# 开发(同时支持 F# 和实验性 C++),可同时用于生产项目和科研场景。与纯数值计算库不同,AngouriMath 处理的是符号运算——可以理解 x^2 + sin(y) 这样的数学表达式,自动求解方程、求导求积、化简多项式、生成 LaTeX,并编译为高效的原声 Lambda 函数。项目同时提供 Jupyter Notebook 支持、跨平台 CLI 终端工具,以及 NuGet 包一键安装。

⚠️ 版本注意:当前稳定版本为 2.1.0(建议使用),2.0.0 和 2.1.0 对部分历史输入的结果有变化(之前版本算错的现在改对了),从早期版本升级前请阅读 BREAKING-CHANGES.md

解决什么问题

在 .NET/C# 项目中需要处理数学符号运算时,传统方案要么依赖外部数学软件(MATLAB、Mathematica)的 DLL 调用,要么自己手写解析器。AngouriMath 的核心价值:

  • 符号表达式解析:从字符串 "x^2 + ln(cos(x) + 3)" 直接构建数学对象
  • 自动化求解:方程求解、微分、积分、极限、布尔代数、真值表
  • 高性能编译:表达式编译为原生 Lambda函数,实测比逐行数值计算快 15 倍以上
  • 多语言绑定:C#、F#、Jupyter(.NET Interactive)、实验性 C++
  • LaTeX 互转:任意表达式 ↔ LaTeX 字符串双向转换

快速安装

C# / F#(.NET 项目)

# C#
dotnet add package AngouriMath

# F#
dotnet add package AngouriMath.FSharp

要求 .NET SDK(支持 netstandard2.0、net8.0、net10.0)。⚠️ 如果项目使用 net7.0,会降级到 netstandard2.0,丢失泛型数学(generic-math)特性,建议升级到 net8.0 或更高。

Jupyter Notebooks(.NET Interactive)

在 notebook 中直接运行:

#r "nuget:AngouriMath.Interactive"

或 F#:

#r "nuget:AngouriMath.Interactive"

需要先安装 .NET Interactive

Terminal 交互式终端(无需 IDE)

下载对应平台的二进制文件,无需 .NET 环境即可运行:

# Linux x64
wget https://github.com/asc-community/AngouriMathLab/releases/latest/download/angourimath-terminal-linux-x64.zip
unzip angourimath-terminal-linux-x64.zip
./AngouriMath.Terminal

# 验证安装
# 在终端中输入 F# 代码:
solutions "x" "sin(x) = 1/2"

CLI 工具(轻量自动化)

# Linux
wget https://github.com/asc-community/AngouriMathCLI/releases/latest/download/amcli-linux-x64
chmod +x amcli-linux-x64
./amcli-linux-x64 help

核心用法

1. 基本表达式操作

using AngouriMath;

// 从字符串解析表达式
Entity expr = "x + sin(y)";
Console.WriteLine(expr);                    // x + sin(y)
Console.WriteLine(expr.Differentiate("x")); // cos(y)

// 计算数值结果
Entity numeric = "1 + 2 * log(3, 9)";
Console.WriteLine(numeric.EvalNumerical()); // 5

// 化简复杂表达式
Entity simplified = "2x + x + 3 + (4 * a * a^6) / a^3 / 5".Simplify();
Console.WriteLine(simplified);  // 3 + (4/5) * a^4 + 3 * x

2. 方程与方程组求解

// 解二次方程(解析解)
var solutions = "x^2 + x + a".SolveEquation("x");
Console.WriteLine(solutions);
// 输出: { (-1 - sqrt(1 - 4*a)) / 2, (-1 + sqrt(1 - 4*a)) / 2 }

// 解方程组
var system = MathS.Equations(
    "x^2 + y + a",
    "y - 0.1*x + b"
);
var solved = system.Solve("x", "y");
Console.WriteLine(solved);

3. 微积分

// 求导
Entity func = "x^2 + ln(cos(x) + 3) + 4*x";
var derivative = func.Differentiate("x").Simplify();
Console.WriteLine(derivative);

// 求不定积分
var integral = "x^2 + a*x".Integrate("x").InnerSimplified;
Console.WriteLine(integral);  // x^3/3 + a*x^2/2

// 求极限
var limit = "(a*x^2 + b*x) / (e*x - h*x^2 - 3)".Limit("x", "+oo").InnerSimplified;
Console.WriteLine(limit);  // a / (-h)

4. 布尔代数与真值表

// 布尔表达式
Entity boolExpr = "a -> true";  // a implies true
Console.WriteLine(MathS.SolveBooleanTable(boolExpr, "a"));
// False
// True

// 逻辑蕴含
Entity implies = "a implies b";
Console.WriteLine(MathS.SolveBooleanTable(implies, "a", "b"));

5. 编译为高性能函数(15x+ 加速)

using static AngouriMath.MathS;

// 创建表达式
var x = Variable("x");
var expr = Sin(x) + Sqrt(x) / (Sqrt(x) + Cos(x)) + Pow(x, 3);

// 编译为原生 Lambda(推荐做法)
var compiled = expr.Compile(x);
Console.WriteLine(compiled.Substitute(3));  // 数值计算,无重复解析开销

// 或从字符串直接编译
var fromStr = "sin(x) + sqrt(x) / (sqrt(x) + cos(x)) + x^3";
var func = fromStr.Compile("x");
Console.WriteLine(func.Substitute(4));

6. LaTeX 互转

// 表达式 → LaTeX
Entity expr = "x^y + sqrt(x) + integral(sqrt(x)/a, x, 1) + derive(sqrt(x)/a, x, 1)";
Console.WriteLine(expr.Latexize());
// {x}^{y}+\sqrt{x}+\int\left[\frac{\sqrt{x}}{a}\right]dx+\frac{d\left[\frac{\sqrt{x}}{a}\right]}{dx}

// 字符串解析为 Entity
Entity fromLatex = MathS.FromString("x + 2 + sqrt(x)");

7. 集合运算

// 集合字面量
Console.WriteLine("{ 1, 2 }".Latexize());           // {1, 2}
Console.WriteLine("[3; +oo)".Latexize());            // [3; ∞)
Console.WriteLine("RR".Latexize());                  // ℝ
Console.WriteLine("{ x : x^8 + a*x < 0 }".Latexize());

// 集合运算
Console.WriteLine(@"A \/ B".Latexize());  // A ∪ B (并集)
Console.WriteLine(@"A /\ B".Latexize());  // A ∩ B (交集)
Console.WriteLine(@"A \ B".Latexize());   // A \ B (差集)

典型适用场景

  • .NET 桌面/服务器数学应用:计算器、建模工具、教育软件
  • 科研符号推导:替代 Mathematica/Wolfram Alpha 作为代码库(成本更低)
  • Jupyter 交互式研究:在 .NET Notebook 中做符号数学实验,配合 F# 的函数式风格体验极佳
  • 游戏/物理引擎中的表达式编译:表达式编译为原生 Lambda,避免每帧重复解析
  • 自动微分基础:作为上游依赖,实现轻量级自动微分功能
  • LaTeX 文档生成管线:在 Web 服务中将用户输入的数学公式渲染为 LaTeX

坑与注意

  1. 2.0→2.1 版本 Breaking Changes:2.1.0 的assembly 版本号仍固定为 2.0.0.0(兼容性设计),但部分历史输入结果有变化,升级前必读 BREAKING-CHANGES.md
  2. net7.0 降级问题:依赖 netstandard2.0 时丢失 generic-math 特性,实测项目应使用 net8.0+
  3. 非线性方程组可能无解析解:SolveEquation 对高次非线性方程组可能返回空集或过于复杂的表达式,需有预期
  4. 积分能力有限:符号积分是数学中最困难的问题之一,AngouriMath 对某些积分可能返回原表达式(无法积分)
  5. F# API 与 C# API 略有差异:部分函数命名和调用方式不同,F# 用户应参考官方 Jupyter 示例
  6. C++ 支持仍为实验性:CMake 安装说明中存在路径和依赖未完全文档化的问题
  7. NuGet 安装需网络:国内环境可能需要配置镜像源

与同类对比

语言 符号运算 性能 适用场景
AngouriMath C# / F# ✅ 完整 编译后快 15x+ .NET 生态项目
Math.NET Symbolic C# ✅ 基础 中等 .NET 数值计算
SymPy Python ✅ 完整 中等 Python 科研
Mathematica 专有 ✅ 完整 最强 商业/学术顶级
julia symbolic Julia ✅ 完整 Julia 生态

AngouriMath 在 .NET 生态中是最完整的符号代数库,比 Math.NET Symbolic 功能更丰富,与 Python 的 SymPy 能力相近,但更适合需要深度集成 .NET 的生产项目。

一句话结论

如果你在 .NET 项目中需要符号数学能力,AngouriMath 是目前最完整的选择——2.1.0 稳定可用,从 NuGet 一行安装,对方程求解、符号微分、LaTeX 互转等核心场景覆盖完善,但复杂积分和高度非线性方程组的支持仍有局限。