在 commons.math 中寻找 PolynomialFunction 的最优值
Finding optima of PolynomialFunction in commons.math
有没有一种简单的方法可以找到 commons.math 中的 PolynomialFunction(也是 UnivariateDifferentiableFunction)的最优值?有一系列令人眼花缭乱的多维优化器,但 AFAICS 唯一明确的单变量优化器是 Brent,它没有利用可微性。
这里有一些代码遵循了 ortis 的回答:
Optional< Double >
optimizeNR( PolynomialFunction f, double min, double max, double tol ) {
NewtonRaphsonSolver solver = new NewtonRaphsonSolver();
final double opt = solver.solve( MAX_EVAL, f.polynomialDerivative(), min, max);
if( f.value( opt - tol ) < opt && f.value( opt + tol ) < opt )
return Optional.of( opt );
else
return Optional.empty();
}
多项式是特殊函数(在 "special" 的一般意义上)并且具有许多独特的、有用的属性。我的建议是利用这些属性,而不是尝试使用一种方法来实现更通用的功能。具体来说,多项式的极值是其导数的根(其中二阶导数不为零)。多项式的导数很容易构造和计算,即使在 Java 中也是如此。我看到 Apache Commons Math 有 LaguerreSolver 来求多项式的根。
有没有一种简单的方法可以找到 commons.math 中的 PolynomialFunction(也是 UnivariateDifferentiableFunction)的最优值?有一系列令人眼花缭乱的多维优化器,但 AFAICS 唯一明确的单变量优化器是 Brent,它没有利用可微性。
这里有一些代码遵循了 ortis 的回答:
Optional< Double >
optimizeNR( PolynomialFunction f, double min, double max, double tol ) {
NewtonRaphsonSolver solver = new NewtonRaphsonSolver();
final double opt = solver.solve( MAX_EVAL, f.polynomialDerivative(), min, max);
if( f.value( opt - tol ) < opt && f.value( opt + tol ) < opt )
return Optional.of( opt );
else
return Optional.empty();
}
多项式是特殊函数(在 "special" 的一般意义上)并且具有许多独特的、有用的属性。我的建议是利用这些属性,而不是尝试使用一种方法来实现更通用的功能。具体来说,多项式的极值是其导数的根(其中二阶导数不为零)。多项式的导数很容易构造和计算,即使在 Java 中也是如此。我看到 Apache Commons Math 有 LaguerreSolver 来求多项式的根。