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
坑与注意
- 2.0→2.1 版本 Breaking Changes:2.1.0 的assembly 版本号仍固定为 2.0.0.0(兼容性设计),但部分历史输入结果有变化,升级前必读 BREAKING-CHANGES.md
- net7.0 降级问题:依赖 netstandard2.0 时丢失 generic-math 特性,实测项目应使用 net8.0+
- 非线性方程组可能无解析解:SolveEquation 对高次非线性方程组可能返回空集或过于复杂的表达式,需有预期
- 积分能力有限:符号积分是数学中最困难的问题之一,AngouriMath 对某些积分可能返回原表达式(无法积分)
- F# API 与 C# API 略有差异:部分函数命名和调用方式不同,F# 用户应参考官方 Jupyter 示例
- C++ 支持仍为实验性:CMake 安装说明中存在路径和依赖未完全文档化的问题
- 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 互转等核心场景覆盖完善,但复杂积分和高度非线性方程组的支持仍有局限。