栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

计算方法(数值分析)实验: 迭代法方程求根代码实现 二分法 牛顿迭代法 埃特金加速法 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);
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/695490.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号