java - 使用 Math.Commons 库的牛顿-拉夫森方法

标签 java apache-commons newtons-method apache-commons-math

我做了一个测试程序来尝试 NewtonRaphsonSolver类通过Apache Commons Math图书馆。牛顿法用于求给定函数的根。

我编写的测试程序引用了 cos(x) 函数(我有一个更难分析的函数,所以首先查看 cos(x) 函数)。

测试程序的代码是

import org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
import org.apache.commons.math3.analysis.differentiation.UnivariateDifferentiableFunction;
import org.apache.commons.math3.analysis.solvers.*;
import org.apache.commons.math3.exception.DimensionMismatchException;

public class Test3 {

    public static void main(String args[]) {
        NewtonRaphsonSolver test = new NewtonRaphsonSolver();
        UnivariateDifferentiableFunction f = new UnivariateDifferentiableFunction() {

            public double value(double x) {
                return Math.cos(x);
            }

            @Override
            public DerivativeStructure value(DerivativeStructure t) throws DimensionMismatchException {
                return t.cos();
            }
        };

        for (int i = 1; i <= 500; i++) {
            System.out.println(test.solve(1000, f, i, i+0.1));
        }
    }
}

不确定是否需要引用 Math.cos(x) 和 t.cos() 两次

public double value(double x) {
                return Math.cos(x);
            }

            @Override
            public DerivativeStructure value(DerivativeStructure t) throws DimensionMismatchException {
                return t.cos();
            }

牛顿方法找到所有零并将其显示给用户。

1.5707963267948966
1.5707963267948966
-7.853981633974483
4.71238898038469
4.71238898038469
1.5707963267948966
7.853981633974483
7.853981633974483
10.995574287564276
10.995574287564276
10.995574287564276
10.995574287564276
14.137166941154069
14.137166941154069
14.137166941154069
127.23450247038663
17.278759594743864
17.278759594743864
23.56194490192345
20.420352248333657
20.420352248333657
39.269908169872416
23.56194490192345
23.56194490192345
14.137166941154069
26.703537555513243
26.703537555513243
23.56194490192345
29.845130209103036
29.845130209103036
26.703537555513243
32.98672286269283
32.98672286269283
32.98672286269283
36.12831551628262
36.12831551628262
36.12831551628262
23.56194490192345
39.269908169872416
39.269908169872416
45.553093477052
42.411500823462205
42.411500823462205

是否有某种方法可以防止打印出重复的零?例如,上面的输出将显示为

1.5707963267948966
4.71238898038469
7.853981633974483
10.995574287564276
14.137166941154069
17.278759594743864
20.420352248333657
23.56194490192345
26.703537555513243
29.845130209103036
32.98672286269283
36.12831551628262
39.269908169872416
42.411500823462205
45.553093477052

这可以在 for 循环内或通过仅打印不重复值的数组来完成吗?

最佳答案

第一个问题是,相同的零是什么。我会上课:

class SolutionForZero{
    public final double value;
    final int hash;
    static double tolerance = 1e-6;
    public SolutionForZero(double value){
        this.value = value;
        hash = 1;
    }
    public boolean equals(Object other){
        if( other instanceof SolutionForZero ){
           double v = value - other.value;
           return (v < 0) ? (-v > tolerance) : (v > tolerance);
        }
        return false;
    }
    public int hashCode(){
        return hash;
    }
}

本类(class)将比较 double 。使用此类:

Set<SolutionForZero> resultSet = new HashSet<>();
for(double d: yourAnswers){
    if(resultSet.add(new SolutionForZero(d))){
        System.out.println("'unique' zero at: " + d);
    };
}

现在您的结果集将仅包含至少具有容差的值。

哈希码有点棘手。只要公差小于 1.0,我提供的方法就可以工作。我希望得到改进。

关于java - 使用 Math.Commons 库的牛顿-拉夫森方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32494230/

相关文章:

java - 如何从一个for循环中抛出线程?

java - 无法使用 HtmlUnit 点击谷歌的新 reCaptcha 复选框

java - boolean if 语句

java - Java 中的 LIKE 谓词。它存在吗?

java - 递归搜索具有特定结尾的文件,避免 SVN 文件夹

c++ - C++中的牛顿正切方法

matlab - MATLAB ERROR Feval需要一个函数句柄作为第一个参数

java - 为什么 Netbeans 不签署某些 jar?

scala - 当最后一列名称包含空格时,Spark 无法读取 CSV

python - 如何判断牛顿法是否失败