Apache Commons Mathライブラリを介してNewtonRaphsonSolverクラスを試すテスト プログラムを作成しました。ニュートン法は、与えられた関数の根を見つけるために使用されます。
私が書いたテスト プログラムは、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() を 2 回参照する必要があるかどうかは不明
public double value(double x) {
return Math.cos(x);
}
@Override
public DerivativeStructure value(DerivativeStructure t) throws DimensionMismatchException {
return t.cos();
}
Newton の方法では、すべてのゼロが検出され、ユーザーに表示されます。
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 ループ内で、または重複していない値のみを出力する配列を介して実行できますか?