计算方法(数值分析)实验: 迭代法方程求根代码实现 二分法 牛顿迭代法 埃特金加速法 java

计算方法(数值分析)实验: 迭代法方程求根代码实现 二分法 牛顿迭代法 埃特金加速法 java,第1张

计算方法(数值分析)实验: 迭代法方程求根代码实现 二分法 牛顿迭代法 埃特金加速法 java

 迭代法方程求根

实验目的:加深对迭代方法方程求根的认识,掌握算法;熟悉使用二分法、迭代法等方法对给定的方程进行根的求解。

实验要求:使用上述两种方法求方程:f(x)=x3+4x2-10=0在[1,2]内的一个实根,且要求满足精度|x*-xn|<0.5×10-5

package com.code;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请依次输入左右区间的值:");
        double left = scanner.nextDouble();
        double right = scanner.nextDouble();
        double resultErFen = FuncDao.dichotomyCalculation(left,right);
        double resultNewton = FuncDao.NewtonIterativeCalculation(1.5);
        double resultAitejin = FuncDao.AitejinIterativeCalculation(1.5);
        System.out.println("二分法求得的根为:" + resultErFen);
        System.out.println("牛顿迭代法求得的根为:" + resultNewton);
        System.out.println("埃特金加速法求得的根为:" + resultAitejin);
    }
}

package com.code;

import com.sun.xml.internal.ws.encoding.MtomCodec;

public class FuncDao {
    //求函数的结果f(x)
    public static double getResult(double X){
        double result = 0;
        result = X * X * X + 4 * X * X - 10;
        return result;
    }

    public static double getAitejinInitResult(double X){
        double result = 0;
        result = Math.pow(((10/(X+4))),0.5);
        return result;
    }

    public static double getAitejinIterativeResult(double X, double X1, double X2){
        double result = 0;
        result = X2 - (X2 - X1) * (X2 - X1) / (X2 - 2 * X1 + X);
        return result;
    }

    public static double getNewtonIterativeResult(double X){
        double e = Math.E;
        double result = 0;
        result = X - (X * X * X + 4 * X * X- 10) / (3 * X * X + 8 * X);
        //System.out.print("f(x)为:");
        //System.out.println( +X*X*X-3*X-Math.pow(e,X)+2);
        //System.out.print("f'(x)为:");

        System.out.println(3*X*X-3-Math.pow(e,X));
        return result;
    }

    public static double getSongChiInitResult(double X){
        double result = 0;
        result = Math.pow(10/(X+4),0.5);
        return result;
    }
    public static double getSongChiIterativeResult(double X, double X1, double X2){
        double result = 0;
        result = X2 - (X2 - X1) * (X2 - X1) / (X2 - 2 * X1 + X);
        return result;
    }
    public static double getMedian(double left, double right){
        return (left +right) / 2;
    }

    public static double dichotomyCalculation(double left, double right) {
        int num = 0;
        double middle = 0;
        double leftResult = 0;
        double rightResult = 0;
        double middleResult = 0;
        middle = getMedian(left,right);
        System.out.println("二分法第" + num++ + "次结果为:" + middle);
        while (Math.abs(middleResult = getResult(middle)) > 0.5*10e-5 ){
            leftResult = getResult(left);
            rightResult = getResult(right);
            if (leftResult * middleResult < 0){
                right = middle;
                middle = getMedian(left,right);
            }else if (rightResult * middleResult < 0){
                left = middle;
                middle = getMedian(left,right);

            } else{
                throw new ErrorException("该区间左右两侧符号值相同");
            }
            System.out.println("二分法第" + num++ + "次结果为:" + middle);
        }
        System.out.println("-------------------------------------------");
        return middle;
    }

    public static double NewtonIterativeCalculation(double result){
        int num = 0;
        System.out.println("牛顿迭代法第" + num++ + "次结果为:" + result);
        double resultAfter = getNewtonIterativeResult(result);
        System.out.println("牛顿迭代法第" + num++ + "次结果为:" + result);
        while (Math.abs(resultAfter - result) > 5e-6){
            result = resultAfter;
            resultAfter = getNewtonIterativeResult(result);
            System.out.println("牛顿迭代法第" + num++ + "次结果为:" + resultAfter);
        }

        System.out.println("-------------------------------------------");
        return resultAfter;

    }

    public static double AitejinIterativeCalculation(double result){
        int num = 0;
        double x = result;
        double temp;
        double x1 = getAitejinInitResult(result);
        double x2 = getAitejinInitResult(x1);
        System.out.println("埃特金加速法第" + num++ + "次结果为:" + x);
        System.out.println("埃特金加速法第" + num++ + "次结果为:" + x1);
        System.out.println("埃特金加速法第" + num++ + "次结果为:" + x2);
        while (Math.abs(getAitejinIterativeResult(x,x1,x2) - x2 )> 5e-6){
            temp = getAitejinIterativeResult(x,x1,x2);
            x = x1;
            x1 = x2;
            x2 = temp;
            System.out.println("埃特金加速法第" + num++ + "次结果为:" + x2);
        }

        System.out.println("-------------------------------------------");
        return x2;
    }

    
}

自定义异常:

package com.code;

public class ErrorException extends RuntimeException{

    public ErrorException(String message) {
        super(message);
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5695635.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存