使用Math.Commons库的Newton-Raphson方法 [英] Newton-Raphson method using the Math.Commons library

查看:357
本文介绍了使用Math.Commons库的Newton-Raphson方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我制作了一个测试程序,尝试 NewtonRaphsonSolver 类通过 Apache Commons Math 一个>库.牛顿法用于查找给定函数的根.

I made a test program to try the NewtonRaphsonSolver class through the Apache Commons Math library. Newton's method is used to find roots for a given function.

我编写的测试程序引用了cos(x)函数(我分析起来比较困难,首先要看一下cos(x)函数).

The test program that I wrote references the cos(x) function (I have a more difficult function to analyze and am looking at the cos(x) function first).

测试程序的代码是

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()

Not certain if I needed to reference Math.cos(x) and t.cos() twice

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

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

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

Newton's method finds all of the zeroes and displays them to the user.

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

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

Is there some way to prevent printing out zeroes that are duplicates? For example, the above output would read

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循环内完成还是可以通过仅打印出不重复值的数组来完成?

Can this be done inside a for loop or through an array which only prints out values which are not duplicates?

推荐答案

import java.util.TreeSet;
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 Test5 {

    public static void main(String args[]) {
        NewtonRaphsonSolver test = new NewtonRaphsonSolver(1E-10);

        UnivariateDifferentiableFunction f = new UnivariateDifferentiableFunction() {

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

            public DerivativeStructure value(DerivativeStructure t) throws
                    DimensionMismatchException {
                return t.sin();
            }
        };

        double EPSILON = 1e-6;
        TreeSet<Double> set = new TreeSet<>();
        for (int i = 1; i <= 5000; i++) {
            set.add(test.solve(1000, f, i, i + EPSILON));
        }
        for (Double s : set) {
            if (s > 0) {
                System.out.println(s);
            }
        }
    }
}

这篇关于使用Math.Commons库的Newton-Raphson方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆