deriv API

deriv 包根据调用者给出的初始步长 h 估计函数在某一点处的导数。每个函数都会同时返回估计值和误差界。

deriv_central : (f: Func_Math, x: Double, h: Double) -> (Double, Double)

描述:
使用自适应中心差分法计算函数 f 在点 x 处的导数,通过平衡截断误差和舍入误差提高精度。

参数:

  • f: Func_Math — 输入 Double 类型值并返回 Double 的数学函数。
  • x: Double — 求导点的位置。
  • h: Double — 数值微分的初始步长,必要时会自动调整。

返回值:

元组 (Double, Double),其中:

  • 第一个值为 x 处的导数估计值。
  • 第二个值为总估计误差(包含截断误差和舍入误差)。

示例:

test "deriv_central" {
  let f = fn(x : Double) { x * x } // f(x) = x², f'(x) = 2x
  let (deriv, error) = deriv_central(f, 2.0, 0.1)
  inspect((deriv - 4.0).abs() < error, content="true")
}

注意事项:

  • 方法自动调整步长以优化精度。
  • 对平滑函数效果良好,但在不连续点附近精度可能下降。
  • 相比简单的两点法,此方法显著降低了数值误差。

deriv_forward : (f: Func_Math, x: Double, h: Double) -> (Double, Double)

描述:
使用自适应前向差分法计算函数 f 在点 x 处的导数,通过优化步长最小化截断和舍入误差。

参数:

  • f: Func_Math — 输入 Double 类型值并返回 Double 的数学函数。
  • x: Double — 求导点的位置。
  • h: Double — 数值微分的初始步长,必要时会自动调整。

返回值:

元组 (Double, Double),其中:

  • 第一个值为 x 处的导数估计值。
  • 第二个值为总估计误差(包含截断误差和舍入误差)。

示例:

test "deriv_forward" {
  let f = fn(x : Double) { x * x } // f(x) = x², f'(x) = 2x
  let (deriv, error) = deriv_forward(f, 2.0, 0.1)
  inspect((deriv - 4.0).abs() < error, content="true")
}

注意事项:

  • 方法自动优化步长以提高精度。
  • 相比基础前向差分法,此方法显著减少数值误差。
  • 对平滑函数效果良好,但对于存在剧烈变化或不连续点的函数精度可能下降。
  • 适用于边界点求导(此时中心差分法不可用)。

deriv_backward : (f: Func_Math, x: Double, h: Double) -> (Double, Double)

描述:
使用自适应后向差分法计算函数 f 在点 x 处的导数,原理与前向差分法相同但步长为负。

参数:

  • f: Func_Math — 输入 Double 类型值并返回 Double 的数学函数。
  • x: Double — 求导点的位置。
  • h: Double — 数值微分的初始步长,必要时会自动调整。

返回值:
元组 (Double, Double):

  • 第一个值为 x 处的导数估计值。
  • 第二个值为总估计误差(包含截断误差和舍入误差)。

示例:

test "deriv_backward" {
  let f = fn(x : Double) { x * x } // f(x) = x², f'(x) = 2x
  let (deriv, error) = deriv_backward(f, 2.0, 0.1)
  inspect((deriv - 4.0).abs() < error, content="true")
}

注意事项:

  • 方法自动优化步长以提高精度。
  • 适用于数据集的上边界附近求导。
  • 与 deriv_forward 具有相同的数值优势,相比简单有限差分显著降低数值误差。