欧几里德,斐波那契,牛顿迭代法java编程实现

数学中的欧几里德算法,斐波那契数列和牛顿迭代法求非线性方程的近视解。
1.欧几里德算法
最经典的迭代算法,用于计算两个整数a,b的最大公约数。

java代码实现算法:

public static int Gcd(int a, int b){

        if(a <= 0 || b <= 0){//预防错误
            return 0;
        }
        int temp;
        if (a < b) { //交换a,b保证a大于b
            temp = a;
            a = b; 
            b = a;
        }
        //迭代计算
        while (b > 0) {  //边界条件
            temp = a % b;
            a = b; 
            b = temp;
        }
        return a;//最大公约数
    }

2.斐波那契数列
斐波那契数列为:0、1、1、2、3、5、8、13、21、…,即 fib⑴=0; fib⑵=1;fib(n)=fib(n-1)+fib(n-2) (当n>2时)。大学计算机课程中算法讲解中一个经典的数列计算。可以通过递归和非递归实现。
代码递归实现:

    public static int fib(int n){
    //边界判断
        if (n < 1) {
            return 0;
        }
        if (n == 1 || n == 2) {
            return 1;
        }

        return fib(n - 1) + fib(n - 2);
    }

代码非递归实现:

public static int fib1(int n){
        //边界判断
        if (n < 1) {
            return 0;
        }
        if (n == 1 || n == 2) {
            return 1;
        }
        int f1 = 1,f2 = 1,fn = 0;
        int i;
        for(i = 3; i <= n ; i++){//迭代计算
            fn = f1 + f2;
            f1 = f2;
            f2 = fn;
        }
        return fn;
    }

3.牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时线性收敛,但是可通过一些方法变成超线性收敛。该方法广泛用于计算机编程中。牛顿迭代关系式 这里写图片描述
代码实现:

public class NewtonIterator {

    public static void main(String[] args) {
        double x = 10,precision = 0.000000001;
        int maxcyc = 100;
        NewtonIterator newtonIterator = new NewtonIterator();
        if(newtonIterator.newton(x, precision, maxcyc) == 1){
            System.out.println("该值附近的根为" + result + " 迭代次数 : " + num);
        }else{
            System.out.println("迭代失败!");
        }
    }

    private static double result;
    private static int num;

    public double func(double x){ //函数
        return x*x*x*x - 3*x*x*x + 1.5*x*x - 4.0;
    }

    public double func1(double x){//导数
        return 4*x*x*x - 9*x*x + 3*x;
    }

    public int newton(double x, double precision,int maxcyc){//迭代次数

        double x1,x0;
        int k;
        x0 = x;

        for(k = 0; k < maxcyc; k++){
            if (func1(x0) == 0.0) {
                System.out.println("迭代过程中导数为0!");
                return 0;
            }

            x1 = x0 - func(x0) / func1(x0);  //牛顿迭代计算关系式,x1是是曲线过点(x0,f(x0))做切线,相交于x轴上的横坐标
            if (Math.abs(x1-x0) < precision || Math.abs(func(x1)) < precision) {//精度判断,达到精度就结束迭代
                result = x1;
                num = k + 1;
                return 1;
            }else{
                x0 = x1;
            }
        }

        System.out.println("迭代次数超过预期!");
        return 0;
    }
}

计算结果

该值附近的根为2.648936536183 迭代次数 : 10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值