Apache Common Maths - 单变量函数求解器

时间:2017-09-29 04:20:39

标签: java apache-commons-math

我正在尝试使用apache-commons-math解算器为“V”解决以下数学方程式。

公式:

V = log(X /(V-1))

以下是MWE;

import org.apache.commons.math3.analysis.UnivariateFunction;
import org.apache.commons.math3.analysis.solvers.*;

public class Test {
    public static void main(String[] args) {

        UnivariateFunction function = v ->  v - Math.log( (9/(v-1)) );
        UnivariateSolver solver = new BrentSolver();
        double c = solver.solve(100, function, -10.0, 10.0, 0);
        System.out.println(c);
    }
}

但是,我收到以下错误;

线程“main”中的异常org.apache.commons.math3.exception.NoBracketingException:端点处的函数值没有不同的符号,端点:[ - 10,10],值:[ ,10]

我环顾互联网解决它,但到目前为止还没有成功。我正在寻找一个解决“V”的MWE,任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

BrentSolver仅适用于实数上的单变量函数。函数f(v) = v - log(c / (v - 1))的实数支持为(1, Infinity)。如果v小于或等于1,则函数计算为复数。

解算器失败,因为它试图在-10处评估函数并在该值处接收NaN。这会导致出现包围异常,因为NaN的符号是不确定的。

因此,为了使求解器工作,您必须提供包含在实数支持中的初始下限。只要大于1的东西就足够了。