Module_Calculus_zh - vorcyc/Vorcyc.Mathematics GitHub Wiki
Vorcyc.Mathematics.Calculus 命名空间提供了全面的计算工具,包括极限计算、积分计算、导数计算、泰勒级数展开、傅里叶级数展开、龙格-库塔法求解微分方程和牛顿-拉夫逊法求解非线性方程。
本模块所有类型的根命名空间为 :Vorcyc.Mathematics.Calculus
📒目录
- 🔖 Vorcyc.Mathematics.Calculus.Limits 类
- 🔖 Vorcyc.Mathematics.Calculus.Integration 类
- 🔖 Vorcyc.Mathematics.Calculus.Derivative 类
- 🔖 Vorcyc.Mathematics.Calculus.DualNumber 结构
- 🔖 Vorcyc.Mathematics.Calculus.Jacobian 类
- 🔖 Vorcyc.Mathematics.Calculus.Series.TaylorSeries 类
- 🔖 Vorcyc.Mathematics.Calculus.Series.FourierSeries 类
- 🔖 Vorcyc.Mathematics.Calculus.NumericalMethods.RungeKutta 类
- 🔖 Vorcyc.Mathematics.Calculus.NumericalMethods.RungeKuttaSystem 类
- 🔖 Vorcyc.Mathematics.Calculus.NumericalMethods.NewtonRaphson 类
- 🔖 Vorcyc.Mathematics.Calculus.NumericalMethods.Bisection 类
- 🔖 Vorcyc.Mathematics.Calculus.NumericalMethods.Brent 类
- 🔖 Vorcyc.Mathematics.Calculus.Hessian 类
- 🔖 Vorcyc.Mathematics.Calculus.NumericalMethods.AdaptiveRungeKutta 类
- 🔖 Vorcyc.Mathematics.Calculus.Series.FourierSeriesFromSamples 类
- 🔖 Vorcyc.Mathematics.Calculus.NumericalMethods.NewtonRaphsonSystem 类
- 🔖 Vorcyc.Mathematics.Calculus.NumericalMethods.AdaptiveRungeKuttaSystem 类
Vorcyc.Mathematics.Calculus.Limits 是一个提供数值极限计算的类,支持泛型浮点类型。支持从左侧、右侧或双侧趋近目标点计算极限。
-
public T CalculateLimit(T a, Direction direction = Direction.Both, int maxSteps = 100, T? tolerance = null, T? h = null)- 计算函数在指定点的极限。
- 参数:
-
a: 目标点,极限趋近于此点。 -
direction: 趋近方向,默认为双侧趋近。 -
maxSteps: 最大迭代步数,默认值为 100。 -
tolerance: 收敛容差,默认值为 1e-10。 -
h: 初始步长,可选,优先级高于默认步长。
-
- 返回值: 极限值。
- 异常:
-
ArgumentException: 当参数无效或极限不存在时抛出。
-
-
public void ClearCache()- 清空实例的函数值缓存。
以下是一个使用 Limits 类中 CalculateLimit 方法的示例,并在示例中加入了注释:
using System;
using Vorcyc.Mathematics.Calculus;
public class LimitsExample
{
public static void Main()
{
// 定义函数
var limits = new Limits<double>(x => x * x, 1e-5);
// 计算极限
double resultLeft = limits.CalculateLimit(2.0, Limits<double>.Direction.Left);
double resultRight = limits.CalculateLimit(2.0, Limits<double>.Direction.Right);
double resultBoth = limits.CalculateLimit(2.0, Limits<double>.Direction.Both);
// 输出结果
Console.WriteLine($"Limits Test: Left = {resultLeft}, Right = {resultRight}, Both = {resultBoth}");
}
}Vorcyc.Mathematics.Calculus.Integration 是一个提供数值积分计算的类,支持泛型浮点类型。
-
public Integration(T defaultH)— 每次积分传入被积函数。 -
public Integration(SingleVariableFunction<T> func, T defaultH, T lowerBound = default)— 绑定被积函数与不定积分下限。
-
public T Integrate(T a, T b, int n, SingleVariableFunction<T> func, T? h = null, Method method = Method.Trapezoidal)- 计算定积分,从
a到b。
- 计算定积分,从
-
public T Integrate(T a, T b, int n = 1000, Method method = Method.Trapezoidal, T? h = null)- 使用构造时绑定的被积函数计算定积分。
- 参数:
-
a: 积分下限。 -
b: 积分上限。 -
n: 分段数,默认值为 1000。 -
func: 被积函数。 -
h: 步长,可选,优先级高于默认步长。 -
method: 积分方法,支持Trapezoidal、Simpson、Romberg、GaussLegendre、AdaptiveSimpson。
-
- 返回值: 定积分值。
- 异常:
-
ArgumentNullException: 当func为 null 时抛出。 -
ArgumentException: 当n小于 1、h过小或方法不支持时抛出。
-
-
public T IndefiniteIntegrate(T x, int n = 1000, Method method = Method.Trapezoidal)— 数值不定积分 F(x)=∫ f(t)dt。 -
public SingleVariableFunction<T> GetIndefiniteIntegral(...)— 返回不定积分函数。
-
public void ClearCache()- 清空实例的函数值缓存。
以下是一个使用 Integration 类中 Integrate 方法的示例,并在示例中加入了注释:
using System;
using Vorcyc.Mathematics.Calculus;
public class IntegrationExample
{
public static void Main()
{
// 定义被积函数
var integration = new Integration<double>(1e-5);
// 计算定积分
double resultTrapezoidal = integration.Integrate(0.0, 1.0, 1000, x => x * x);
double resultSimpson = integration.Integrate(0.0, 1.0, 1000, x => x * x, method: Integration<double>.Method.Simpson);
// 输出结果
Console.WriteLine($"Integration Test: Trapezoidal = {resultTrapezoidal}, Simpson = {resultSimpson}");
}
}Vorcyc.Mathematics.Calculus.Derivative 是一个提供导数和偏导数计算的类,支持数值方法和自动微分。
-
public T Calculate(T x, int order = 1, T? h = null, Method method = Method.Central)- 计算单变量函数的导数(数值方法)。
- 参数:
-
x: 计算导数的点。 -
order: 导数的阶数,默认为 1。 -
h: 步长,默认为 null。 -
method: 数值方法,默认为中央差分法。
-
- 返回值: 导数值。
- 异常:
-
InvalidOperationException: 当实例不支持数值单变量导数计算时抛出。 -
ArgumentException: 当order小于 1 或步长过小时抛出。
-
-
public T CalculateAD(T x)- 使用自动微分计算单变量导数。
- 参数:
-
x: 计算导数的点。
-
- 返回值: 导数值。
- 异常:
-
InvalidOperationException: 当实例不支持单变量自动微分时抛出。
-
-
public T[] Gradient(Span<T> point, T? h = null, Method method = Method.Central)— 多变量标量函数的数值梯度。 -
public T[] GradientAD(Span<T> point)— 多变量自动微分梯度。
-
public void ClearCache()- 清空实例的缓存。
以下是一个使用 Derivative 类中 Calculate 和 CalculateAD 方法的示例,并在示例中加入了注释:
using System;
using Vorcyc.Mathematics.Calculus;
public class DerivativeExample
{
public static void Main()
{
// 定义函数
var derivative = new Derivative<double>(x => x * x, 1e-5);
// 计算导数
double resultNumeric = derivative.Calculate(2.0);
var derivativeAD = new Derivative<double>(x => x * x);
double resultAD = derivativeAD.CalculateAD(2.0);
// 输出结果
Console.WriteLine($"Derivative Test: Numeric = {resultNumeric}, AD = {resultAD}");
}
}DualNumber<T> 表示对偶数 (value, deriv),用于前向模式自动微分。支持四则运算及 Sin、Cos、Exp、Log、Pow、Sqrt 的链式法则扩展。
var x = new DualNumber<double>(2.0, 1.0);
double deriv = (x * x).Deriv; // 4
var deriv = new Derivative<double>(DualNumber<double>.Exp);
double dExp = deriv.CalculateAD(1.0); // eJacobian<T> 计算向量值函数 f: Rⁿ→Rᵐ 的雅可比矩阵。
public Matrix<T> Calculate(Span<T> point, T? h = null, Derivative<T>.Method method = Central)
Vorcyc.Mathematics.Calculus.Series.TaylorSeries 是一个提供泰勒级数展开计算的类,支持泛型浮点类型。
-
public T Calculate(T x, int order = 5)- 计算泰勒级数在指定点的值,截断到指定阶数。
- 参数:
-
x: 计算点。 -
order: 最高阶数,默认为 5。
-
- 返回值: 泰勒级数近似值。
- 异常:
-
ArgumentException: 当order小于 0 时抛出。
-
-
public T GetTaylorCoefficient(int order)- 获取泰勒级数的系数(导数值除以阶乘)。
- 参数:
-
order: 阶数。
-
- 返回值: 第
order阶泰勒系数。
-
public void ClearCache()- 清空导数缓存。
以下是一个使用 TaylorSeries 类中 Calculate 方法的示例,并在示例中加入了注释:
using System;
using Vorcyc.Mathematics.Calculus.Series;
public class TaylorSeriesExample
{
public static void Main()
{
// 定义函数
var taylorSeries = new TaylorSeries<double>(x => Math.Exp(x), 0.0, 1e-5);
// 计算泰勒级数
double result = taylorSeries.Calculate(1.0, 5);
// 输出结果
Console.WriteLine($"Taylor Series Test: Result = {result}");
}
}Vorcyc.Mathematics.Calculus.Series.FourierSeries 是一个提供傅里叶级数展开计算的类,支持泛型浮点类型。
-
public T Calculate(T x, int order = 5, int segments = 1000)- 计算傅里叶级数在指定点的值,截断到指定阶数。
- 参数:
-
x: 计算点。 -
order: 最高阶数,默认为 5。 -
segments: 积分分段数,默认值为 1000。
-
- 返回值: 傅里叶级数近似值。
- 异常:
-
ArgumentException: 当order小于 0 或segments小于 1 时抛出。
-
-
public T GetFourierCoefficient(bool isCosine, int n, int segments = 1000)- 获取傅里叶级数的系数(aₙ 或 bₙ)。
- 参数:
-
isCosine: true 表示余弦系数 aₙ,false 表示正弦系数 bₙ。 -
n: 谐波阶数。 -
segments: 积分分段数,默认值为 1000。
-
- 返回值: 第
n阶傅里叶系数。 - 异常:
-
ArgumentException: 当n小于 0 或segments小于 1 时抛出。 -
InvalidOperationException: 当积分结果无效时抛出。
-
-
public void ClearCache()- 清空实例的函数值缓存。
以下是一个使用 FourierSeries 类中 Calculate 方法的示例,并在示例中加入了注释:
using System;
using Vorcyc.Mathematics.Calculus.Series;
public class FourierSeriesExample
{
public static void Main()
{
// 定义函数
var fourierSeries = new FourierSeries<double>(x => Math.Sin(x), 2 * Math.PI, 1e-5);
// 计算傅里叶级数
double result = fourierSeries.Calculate(Math.PI / 2, 5);
// 输出结果
Console.WriteLine($"Fourier Series Test: Result = {result}");
}
}Vorcyc.Mathematics.Calculus.NumericalMethods.RungeKutta 是一个使用龙格-库塔法(RK4)求解常微分方程的类,支持泛型浮点类型。
-
public T Solve(T x0, T y0, T xEnd, int steps = 100, T? h = null)- 使用四阶龙格-库塔法(RK4)求解微分方程。
- 参数:
-
x0: 初始 x 值。 -
y0: 初始 y 值。 -
xEnd: 目标 x 值。 -
steps: 步数,决定步长 h = (xEnd - x0) / steps。 -
h: 步长,可选,优先级高于默认步长。
-
- 返回值: 在
xEnd处的 y 值。 - 异常:
-
ArgumentException: 当steps小于 1 时抛出。
-
-
public void ClearCache()- 清空函数值缓存。
以下是一个使用 RungeKutta 类中 Solve 方法的示例,并在示例中加入了注释:
using System;
using Vorcyc.Mathematics.Calculus.NumericalMethods;
public class RungeKuttaExample
{
public static void Main()
{
// 定义微分方程
var rungeKutta = new RungeKutta<double>((x, y) => x + y, 1e-5);
// 求解微分方程
double result = rungeKutta.Solve(0.0, 1.0, 1.0, 100);
// 输出结果
Console.WriteLine($"Runge-Kutta Test: Result = {result}");
}
}RungeKuttaSystem<T> 使用 RK4 求解常微分方程组 dy/dx = f(x, y)。
public T[] Solve(T x0, ReadOnlySpan<T> y0, T xEnd, int steps = 100, T? h = null)
Vorcyc.Mathematics.Calculus.NumericalMethods.NewtonRaphson 是一个使用牛顿-拉夫逊法求解非线性方程 f(x) = 0 的类,支持泛型浮点类型。
-
public T Solve(T initialGuess, int maxIterations = 100, T? tolerance = null)- 使用牛顿-拉夫逊法求解方程 f(x) = 0 的根。
- 参数:
-
initialGuess: 初始猜测值。 -
maxIterations: 最大迭代次数,默认为 100。 -
tolerance: 收敛容差,默认为 1e-10。
-
- 返回值: 方程的近似根。
- 异常:
-
ArgumentException: 当maxIterations小于 1 时抛出。 -
InvalidOperationException: 当导数为 0 或迭代未收敛时抛出。
-
以下是一个使用 NewtonRaphson 类中 Solve 方法的示例,并在示例中加入了注释:
using System;
using Vorcyc.Mathematics.Calculus.NumericalMethods;
public class NewtonRaphsonExample
{
public static void Main()
{
// 定义函数
var newtonRaphson = new NewtonRaphson<double>(x => x * x - 2.0, 1e-5);
// 求解方程
double result = newtonRaphson.Solve(1.0);
// 输出结果
Console.WriteLine($"Newton-Raphson Test: Result = {result}");
}
}Bisection<T> 在区间 [a,b] 上用二分法求 f(x)=0,要求端点函数值异号。
public T Solve(T a, T b, int maxIterations = 100, T? tolerance = null)
Brent<T> 在区间 [a,b] 上用 Brent 法稳健求根,兼具二分法稳定性与割线法/反二次插值的速度。
public T Solve(T a, T b, int maxIterations = 100, T? tolerance = null)
Hessian<T> 计算标量多元函数 f: Rⁿ→R 的 Hessian 矩阵。
public Matrix<T> Calculate(Span<T> point, T? h = null)
AdaptiveRungeKutta<T> 使用 RK4 步长折半估计误差,自适应求解 dy/dx = f(x,y)。
public T Solve(T x0, T y0, T xEnd, T relativeTolerance, T absoluteTolerance, T? initialStep = null)
从周期均匀采样(长度须为 2 的幂)通过 FFT 估计傅里叶系数 aₙ、bₙ,并重构级数。
-
GetCosineCoefficient(int n)/GetSineCoefficient(int n)/Evaluate(float x, int order)
NewtonRaphsonSystem<T> 用数值雅可比矩阵与高斯消元求解非线性方程组 F(x)=0。
public T[] Solve(T[] initialGuess, int maxIterations = 50, T? tolerance = null)
AdaptiveRungeKuttaSystem<T> 对方程组 dy/dx = f(x,y) 使用 RK4 步长折半自适应积分。
public T[] Solve(T x0, ReadOnlySpan<T> y0, T xEnd, T relativeTolerance, T absoluteTolerance, T? initialStep = null)
-
Integration.Method.AdaptiveSimpson:n为最大递归深度,h(或构造默认步长)为区间误差容差。 -
Integration.Method.GaussLegendre:n须为 4、8 或 16。 -
Derivative在h为 null 时按机器精度 ε 选取步长 h ≈ ε^(1/(n+2))·max(|x|,1),一阶/二阶中心差分默认做 Richardson 外推。
-
BfgsOptimizer<T>.Minimize— 无约束极小化(稠密逆 Hessian 近似) -
LBfgsOptimizer<T>.Minimize— 有限内存 BFGS(默认历史长度 10,适合高维) -
LevenbergMarquardt<T>.Solve— 非线性最小二乘 -
LineSearch.ArmijoBacktracking— Armijo 回溯线搜索
模块在 不改变公共 API 语义 的前提下,通过实例缓冲复用、SIMD 向量内核与算法级减次(共享采样、Horner/Clenshaw、Aitken 加速等)降低分配与函数求值次数。double / float 在 CalculusVectorOps 中走 SIMD 路径。
| 子系统 | 主要手段 |
|---|---|
| 向量内核 |
Dot、MatVec、JᵀJ、Jᵀr、ScaledMaxError、SymmetricBfgsUpdate、Rk4Accumulate、AddScaled 等 |
| 优化器 | BFGS/L-BFGS 复用梯度与搜索方向;LineSearch.ArmijoBacktracking(..., trial);Dot(g,g) 判停 |
| 方程组 / LM | 高斯消元 workspace;试探/当前残差分缓冲;Dot 代价函数 |
| ODE |
SolveInPlace;RK k1–k4 复用;OdeStepControl.GrowStep;打靶 _perturbed 缓冲 |
| 积分 | Romberg/自适应 Simpson 栈;Gauss 节点 T[] 表;不定积分累积表;反常积分无闭包 |
| 微分 |
Gradient(destination);Richardson 共享 stencil;OptimalMagnitude 统一步长 |
| 级数 | 傅里叶预采样;Chebyshev cos(kθ) 表;Taylor 系数数组;FFT 谐波缓存 |
本地基准见 benchmarks/basic_benchmark/Calculus_benchmark.cs(dotnet run -c Release --project benchmarks/basic_benchmark)。
通用原则
-
复用实例:求解器、积分器、
Derivative、Jacobian、FourierSeries、TaylorSeries等在循环外构造,循环内反复调用。 -
写入已有缓冲:优先
Gradient(point, destination)、Jacobian/Hessian.Calculate(..., matrix?)、LineSearch.ArmijoBacktracking(..., trial)。 -
原地 API:
RungeKuttaSystem.SolveInPlace、高斯消元GaussianEliminationSolve(..., workspace)。 -
专用 workspace:
PadeWorkspace<T>、ChebyshevFitWorkspace<T>在重复拟合时传入。 -
何时
ClearCache():仅在底层函数、步长策略或绑定参数变更后调用;多数优化器/级数对象无需每步清空。
按场景
| 场景 | 建议 |
|---|---|
| 重复求同一函数的傅里叶系数 | 复用 FourierSeries 实例;ClearCache() 仅在函数或周期变更后调用 |
| 高维梯度 / 雅可比 |
Derivative.Gradient(point, destination);Jacobian.Calculate(..., matrix?);h == null 时自动按 max|x_i| 估步长 |
| 高维 Hessian |
Hessian.Calculate(..., matrix?);对称性已利用,勿重复计算下三角 |
| 批量 ODE 或打靶 |
RungeKuttaSystem.SolveInPlace;ShootingBvpSolver 复用内部 RK 缓冲 |
| 自适应 ODE 方程组 | 复用 AdaptiveRungeKuttaSystem 实例;double/float 误差估计走 SIMD |
| 非线性方程组 / 最小二乘 | 复用 NewtonRaphsonSystem / LevenbergMarquardt;线搜索用独立残差缓冲 |
| BFGS / L-BFGS | 复用 optimizer 实例;LBfgsOptimizer 适合维数 > 数十;BfgsOptimizer 适合中小维 |
| Padé / Chebyshev 拟合 |
PadeWorkspace<T>、ChebyshevFitWorkspace<T>(含 cos(kθ) 表) |
| 绑定被积函数的定/不定积分 |
Integration(func, h) 后调用无 func 的 Integrate;GetIndefiniteIntegral 梯形路径自动累积建表 |
| 二重 / Gauss 积分 | 复用同一 Integration 实例;节点 4/8/16 自动缓存 |
| 泰勒 / Chebyshev 求值 | 复用 TaylorSeries / ChebyshevSeries;系数按需缓存 |
| 周期采样傅里叶 |
FourierSeriesFromSamples;Evaluate 前系数按需缓存至 order
|
| 标量求根 | 复用 Brent / NewtonRaphson / Bisection 实例 |
-
HyperDualNumber<T>— 超对偶数;Derivative.SecondDerivativeAD;Hessian.CalculateAD -
Hessian.Calculate(point, h, matrix?)— 可选复用结果矩阵(同Jacobian.Calculate)
-
RungeKutta.SolveTrajectory/RungeKuttaSystem.SolveTrajectory— 记录轨迹与事件停止 -
AdaptiveRungeKutta.SolveTrajectory/AdaptiveRungeKuttaSystem.SolveTrajectory— 自适应步长轨迹 -
ImplicitEuler— 刚性标量 ODE -
ShootingBvpSolver— 打靶法边值问题(复用 RK 状态缓冲;RungeKuttaSystem.SolveInPlace)
-
PadeApproximant<T>— Padé 有理逼近(可选PadeWorkspace<T>复用求解缓冲) -
ChebyshevSeries<T>— Chebyshev 级数拟合与求值(FromFunction每点只采样一次;可选ChebyshevFitWorkspace<T>)
-
Integration.IntegrateToInfinity— 反常积分(截断 + 尾部修正) -
Integration.IntegrateDouble— 矩形区域二重 Gauss 积分