Module_Calculus_zh - vorcyc/Vorcyc.Mathematics GitHub Wiki

当前位置 : 首页/微积分模块


微积分模块 - Calculus Module

Vorcyc.Mathematics.Calculus 命名空间提供了全面的计算工具,包括极限计算、积分计算、导数计算、泰勒级数展开、傅里叶级数展开、龙格-库塔法求解微分方程和牛顿-拉夫逊法求解非线性方程。

本模块所有类型的根命名空间为 :Vorcyc.Mathematics.Calculus

📒目录


Vorcyc.Mathematics.Calculus.Limits 类

Vorcyc.Mathematics.Calculus.Limits 是一个提供数值极限计算的类,支持泛型浮点类型。支持从左侧、右侧或双侧趋近目标点计算极限。

方法

1. CalculateLimit 方法

  • 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: 当参数无效或极限不存在时抛出。

2. ClearCache 方法

  • 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 类

Vorcyc.Mathematics.Calculus.Integration 是一个提供数值积分计算的类,支持泛型浮点类型。

方法

1. 构造函数

  • public Integration(T defaultH) — 每次积分传入被积函数。
  • public Integration(SingleVariableFunction<T> func, T defaultH, T lowerBound = default) — 绑定被积函数与不定积分下限。

2. Integrate 方法

  • 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 过小或方法不支持时抛出。

3. IndefiniteIntegrate / GetIndefiniteIntegral 方法

  • public T IndefiniteIntegrate(T x, int n = 1000, Method method = Method.Trapezoidal) — 数值不定积分 F(x)=∫ f(t)dt。
  • public SingleVariableFunction<T> GetIndefiniteIntegral(...) — 返回不定积分函数。

4. ClearCache 方法

  • 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 类

Vorcyc.Mathematics.Calculus.Derivative 是一个提供导数和偏导数计算的类,支持数值方法和自动微分。

方法

1. Calculate 方法

  • 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 或步长过小时抛出。

2. CalculateAD 方法

  • public T CalculateAD(T x)
    • 使用自动微分计算单变量导数。
    • 参数:
      • x: 计算导数的点。
    • 返回值: 导数值。
    • 异常:
      • InvalidOperationException: 当实例不支持单变量自动微分时抛出。

3. Gradient / GradientAD 方法

  • public T[] Gradient(Span<T> point, T? h = null, Method method = Method.Central) — 多变量标量函数的数值梯度。
  • public T[] GradientAD(Span<T> point) — 多变量自动微分梯度。

4. ClearCache 方法

  • 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}");
    }
}

Vorcyc.Mathematics.Calculus.DualNumber 结构

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); // e

Vorcyc.Mathematics.Calculus.Jacobian 类

Jacobian<T> 计算向量值函数 f: Rⁿ→Rᵐ 的雅可比矩阵。

  • public Matrix<T> Calculate(Span<T> point, T? h = null, Derivative<T>.Method method = Central)

Vorcyc.Mathematics.Calculus.Series.TaylorSeries 类

Vorcyc.Mathematics.Calculus.Series.TaylorSeries 是一个提供泰勒级数展开计算的类,支持泛型浮点类型。

方法

1. Calculate 方法

  • public T Calculate(T x, int order = 5)
    • 计算泰勒级数在指定点的值,截断到指定阶数。
    • 参数:
      • x: 计算点。
      • order: 最高阶数,默认为 5。
    • 返回值: 泰勒级数近似值。
    • 异常:
      • ArgumentException: 当 order 小于 0 时抛出。

2. GetTaylorCoefficient 方法

  • public T GetTaylorCoefficient(int order)
    • 获取泰勒级数的系数(导数值除以阶乘)。
    • 参数:
      • order: 阶数。
    • 返回值: 第 order 阶泰勒系数。

3. ClearCache 方法

  • 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 类

Vorcyc.Mathematics.Calculus.Series.FourierSeries 是一个提供傅里叶级数展开计算的类,支持泛型浮点类型。

方法

1. Calculate 方法

  • public T Calculate(T x, int order = 5, int segments = 1000)
    • 计算傅里叶级数在指定点的值,截断到指定阶数。
    • 参数:
      • x: 计算点。
      • order: 最高阶数,默认为 5。
      • segments: 积分分段数,默认值为 1000。
    • 返回值: 傅里叶级数近似值。
    • 异常:
      • ArgumentException: 当 order 小于 0 或 segments 小于 1 时抛出。

2. GetFourierCoefficient 方法

  • 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: 当积分结果无效时抛出。

3. ClearCache 方法

  • 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 类

Vorcyc.Mathematics.Calculus.NumericalMethods.RungeKutta 是一个使用龙格-库塔法(RK4)求解常微分方程的类,支持泛型浮点类型。

方法

1. Solve 方法

  • 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 时抛出。

2. ClearCache 方法

  • 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}");
    }
}

Vorcyc.Mathematics.Calculus.NumericalMethods.RungeKuttaSystem 类

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 类

Vorcyc.Mathematics.Calculus.NumericalMethods.NewtonRaphson 是一个使用牛顿-拉夫逊法求解非线性方程 f(x) = 0 的类,支持泛型浮点类型。

方法

1. Solve 方法

  • 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}");
    }
}

Vorcyc.Mathematics.Calculus.NumericalMethods.Bisection 类

Bisection<T> 在区间 [a,b] 上用二分法求 f(x)=0,要求端点函数值异号。

  • public T Solve(T a, T b, int maxIterations = 100, T? tolerance = null)

Vorcyc.Mathematics.Calculus.NumericalMethods.Brent 类

Brent<T> 在区间 [a,b] 上用 Brent 法稳健求根,兼具二分法稳定性与割线法/反二次插值的速度。

  • public T Solve(T a, T b, int maxIterations = 100, T? tolerance = null)

Vorcyc.Mathematics.Calculus.Hessian 类

Hessian<T> 计算标量多元函数 f: Rⁿ→R 的 Hessian 矩阵。

  • public Matrix<T> Calculate(Span<T> point, T? h = null)

Vorcyc.Mathematics.Calculus.NumericalMethods.AdaptiveRungeKutta 类

AdaptiveRungeKutta<T> 使用 RK4 步长折半估计误差,自适应求解 dy/dx = f(x,y)。

  • public T Solve(T x0, T y0, T xEnd, T relativeTolerance, T absoluteTolerance, T? initialStep = null)

Vorcyc.Mathematics.Calculus.Series.FourierSeriesFromSamples 类

从周期均匀采样(长度须为 2 的幂)通过 FFT 估计傅里叶系数 aₙ、bₙ,并重构级数。

  • GetCosineCoefficient(int n) / GetSineCoefficient(int n) / Evaluate(float x, int order)

Vorcyc.Mathematics.Calculus.NumericalMethods.NewtonRaphsonSystem 类

NewtonRaphsonSystem<T> 用数值雅可比矩阵与高斯消元求解非线性方程组 F(x)=0。

  • public T[] Solve(T[] initialGuess, int maxIterations = 50, T? tolerance = null)

Vorcyc.Mathematics.Calculus.NumericalMethods.AdaptiveRungeKuttaSystem 类

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 外推。

优化(Vorcyc.Mathematics.Calculus.Optimization)

  • 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)。

性能调优指南

通用原则

  1. 复用实例:求解器、积分器、Derivative、Jacobian、FourierSeries、TaylorSeries 等在循环外构造,循环内反复调用。
  2. 写入已有缓冲:优先 Gradient(point, destination)、Jacobian/Hessian.Calculate(..., matrix?)、LineSearch.ArmijoBacktracking(..., trial)。
  3. 原地 API:RungeKuttaSystem.SolveInPlace、高斯消元 GaussianEliminationSolve(..., workspace)。
  4. 专用 workspace:PadeWorkspace<T>、ChebyshevFitWorkspace<T> 在重复拟合时传入。
  5. 何时 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)

ODE 轨迹与边值

  • 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 积分
⚠️ **GitHub.com Fallback** ⚠️