迭代法方程求根
实验目的:加深对迭代方法方程求根的认识,掌握算法;熟悉使用二分法、迭代法等方法对给定的方程进行根的求解。
实验要求:使用上述两种方法求方程: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); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)