类 FiniteDifferencesDifferentiator
- 所有已实现的接口:
-
Serializable
,UnivariateFunctionDifferentiator
,UnivariateMatrixFunctionDifferentiator
,UnivariateVectorFunctionDifferentiator
该类在常规的一元函数
(或一元向量函数
或一元矩阵函数
)周围创建一些包装对象。这些包装对象除了计算函数值外,还计算导数。
包装对象通过在当前点周围的采样网格上调用基础函数并执行多项式插值来工作。理论上,具有n个点的有限差分方案能够计算高达n-1阶的导数,但通常最好留有一定的余地。步长必须足够小,以便多项式逼近在当前点邻域内良好,但不应该太小,因为数值不稳定会很快出现(相邻点之间存在几个差异)。选择点数和步长高度取决于问题本身。
作为良好和不良设置的示例,让我们考虑五次多项式函数f(x) = (x-1)*(x-0.5)*x*(x+0.5)*(x+1)
。由于它是一个多项式,理论上至少使用6个点的有限差分应该能够恢复完全相同的多项式,因此对于任何阶数都能计算准确的导数。然而,由于数值误差,我们对于在[-10, 10]范围内的横坐标使用7个点的有限差分得到以下结果:
- 步长 = 0.25,二阶导数误差约为9.97e-10
- 步长 = 0.25,四阶导数误差约为5.43e-8
- 步长 = 1.0e-6,二阶导数误差约为148
- 步长 = 1.0e-6,四阶导数误差约为6.35e+14
这个例子表明,小步长实际上非常糟糕,即使对于二阶导数也是如此!
- 另请参阅:
-
构造器概要
构造器说明FiniteDifferencesDifferentiator
(int nbPoints, double stepSize) 使用点数和步长构建一个在自变量无界时的微分器。FiniteDifferencesDifferentiator
(int nbPoints, double stepSize, double tLower, double tUpper) 使用点数和步长构建一个在自变量有界时的微分器。 -
方法概要
修饰符和类型方法说明differentiate
(UnivariateFunction function) differentiate
(UnivariateMatrixFunction function) differentiate
(UnivariateVectorFunction function) int
获取要使用的点数。double
获取步长。
-
构造器详细资料
-
有限差分微分器
public FiniteDifferencesDifferentiator(int nbPoints, double stepSize) throws MathIllegalArgumentException 构建一个当自变量无界时使用点数和步长的微分器。请注意,对有限差分微分器的错误设置可能导致高度不稳定和不准确的结果,特别是对于高阶导数。通常使用非常小的步长是一个不好的主意。
- 参数:
-
nbPoints
- 要使用的点数 -
stepSize
- 步长(每个点之间的间隔) - 抛出:
-
MathIllegalArgumentException
- 如果stepsize <= 0
(注意MathIllegalArgumentException
扩展自MathIllegalArgumentException
) -
MathIllegalArgumentException
-nbPoint <= 1
-
有限差分微分器
public FiniteDifferencesDifferentiator(int nbPoints, double stepSize, double tLower, double tUpper) throws MathIllegalArgumentException 构建一个当自变量有界时使用点数和步长的微分器。当自变量有界(tLower < t < tUpper)时,用于微分的采样点将被调整以确保约束即使在边界附近也保持。这意味着在这些情况下样本将不再居中。在极端情况下,在下界处精确计算导数将导致样本完全位于导数点的右侧。
请注意,边界被认为是函数评估时排除的。
请注意,对有限差分微分器的错误设置可能导致高度不稳定和不准确的结果,特别是对于高阶导数。通常使用非常小的步长是一个不好的主意。
- 参数:
-
nbPoints
- 要使用的点数 -
stepSize
- 步长(每个点之间的间隔) -
tLower
- 自变量的下界(如果没有下界,则可以是Double.NEGATIVE_INFINITY
) -
tUpper
- 自变量的上界(如果没有上界,则可以是Double.POSITIVE_INFINITY
) - 抛出:
-
MathIllegalArgumentException
- 如果stepsize <= 0
(注意MathIllegalArgumentException
扩展自MathIllegalArgumentException
) -
MathIllegalArgumentException
-nbPoint <= 1
-
MathIllegalArgumentException
-stepSize * (nbPoints - 1) >= tUpper - tLower
-
-
方法详细资料
-
获取点数
public int getNbPoints()获取要使用的点数。- 返回:
- 要使用的点数
-
获取步长
public double getStepSize()获取步长。- 返回:
- 步长
-
微分
从常规function
创建一个differential
的实现。返回的对象不能计算任意阶数的导数。如果请求的导数阶数大于或等于点数,则值函数将抛出一个
MathIllegalArgumentException
。- 指定者:
-
differentiate
在接口中UnivariateFunctionDifferentiator
- 参数:
-
function
- 要微分的函数 - 返回:
- 差分函数
-
微分
从常规vector function
创建一个differential
的实现。返回的对象不能计算任意阶数的导数。如果请求的导数阶数大于或等于点数,则值函数将抛出一个
MathIllegalArgumentException
。- 指定者:
-
differentiate
在接口中UnivariateVectorFunctionDifferentiator
- 参数:
-
function
- 要微分的函数 - 返回:
- 差分函数
-
微分
从常规matrix function
创建一个differential
的实现。返回的对象不能计算任意阶数的导数。如果请求的导数阶数大于或等于点数,则值函数将抛出一个
MathIllegalArgumentException
。- 指定者:
-
differentiate
在接口中UnivariateMatrixFunctionDifferentiator
- 参数:
-
function
- 要微分的函数 - 返回:
- 差分函数
-