迭代法方程求根
实验目的:加深对迭代方法方程求根的认识,掌握算法;熟悉使用二分法、迭代法等方法对给定的方程进行根的求解。
实验要求:使用上述两种方法求方程: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;
}
/*public static double songChiIterativeCalculation(double result){
}*/
}
自定义异常:
package com.code;
public class ErrorException extends RuntimeException{
public ErrorException(String message) {
super(message);
}
}