实验目的:加深对方程求根加速算法,牛顿法和割线方法的理解,掌握算法;并能对不同方法进行比较。
实验要求:使用上述四种方法求方程: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) {
double resultNewton = FuncDao.NewtonIterativeCalculation(1.5);
double resultAitejin = FuncDao.AitejinIterativeCalculation(1.5);
double resultSongchi = FuncDao.songChiIterativeCalculation(1.5);
double resultXianjie = FuncDao.xianJieFaCalculation(1,2);
System.out.println("牛顿迭代法求得的根为:" + resultNewton);
System.out.println("埃特金加速法求得的根为:" + resultAitejin);
System.out.println("松弛迭代法求得的根为:" + resultSongchi);
System.out.println("弦截法求得的根为:" + resultXianjie);
}
}
package com.code;
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 getXianJieFaResult(double X0, double X1,double F0, double F1){
double result = X1 - (X1 - X0) / (F1 - F0) * F1;
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;
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 getSongChiWn(double X){
double temp = -0.5 * Math.pow(X + 4,-1.5) * Math.sqrt(10);
double result = 1 / (1 - temp);
return result;
}
public static double getSongChiXn(double X0,double Wn){
double result = (1 - Wn) * X0 + Wn * getAitejinInitResult(X0);
return result;
}
public static double songChiIterativeCalculation(double result){
double wn;
double X0,X1;
int num = 0;
X0 = result;
wn = getSongChiWn(X0);
X1 = getSongChiXn(X0,wn);
System.out.println("松弛迭代法第" + num++ + "次结果为:" + X0);
System.out.println("松弛迭代法第" + num++ + "次结果为:" + X1);
while (Math.abs(X1-X0) > 5e-6){
X0 = X1;
wn = getSongChiWn(X0);
X1 = getSongChiXn(X0,wn);
System.out.println("松弛迭代法第" + num++ + "次结果为:" + X1);
}
System.out.println("-------------------------------------------");
return X1;
}
public static double xianJieFaCalculation(double X0, double X1){
double F0 = getResult(X0);
double F1 = getResult(X1);
double X2 = getXianJieFaResult(X0, X1, F0, F1);
int num = 1;
System.out.println("弦截法迭代的初始值为:" + X0 + " " + X1);
System.out.println("弦截法第" + num++ + "次结果为:" + X2);
while (Math.abs(X2-X1) > 5e-6){
X0 = X1;
X1 = X2;
F0 = F1;
F1 = getResult(X1);
X2 = getXianJieFaResult(X0, X1, F0, F1);
System.out.println("弦截法第" + num++ + "次结果为:" + X2);
}
System.out.println("-------------------------------------------");
return X2;
}
}
package com.code;
public class ErrorException extends RuntimeException{
public ErrorException(String message) {
super(message);
}
}
该博客探讨了四种数值方法——牛顿法、埃特金加速法、松弛迭代法和弦截法在求解方程f(x)=x^3+4x^2-10=0在[1,2]区间内的实根问题。通过编程实现,分别展示了这些方法的迭代过程,并以误差不超过0.5×10^-5为终止条件。实验结果对比了各种方法的效率和精度。
1032

被折叠的 条评论
为什么被折叠?



