❗❗❗必看:
下列题我全部都使用 Java 语言写的,并且均可以提交成功,获得Accepted 结果的. 如果代码和详解看了之后,对答案有任何疑问,都可以在评论区提出来,我都会一个一个回答.
❗❗❗感谢大家的支持,如果喜欢我的博客,关注 点赞 收藏 评论一波,非常感谢!!!
题目:二分法求函数零点
有函数:
f(x) = x^5 - 15 * x^4+ 85 * x^3- 225 * x^2+ 274 * x - 121
已知 f(1.5) > 0 , f(2.4) < 0 且方程 f(x) = 0 在区间 [1.5,2.4] 有且只有一个根,请用二分法求出该根。
Input
无。
Output
该方程在区间[1.5,2.4]中的根。要求四舍五入到小数点后6位。
代码
import java.util.*;
import java.util.Scanner;
//f(x) = x^5 - 15 * x^4+ 85 * x^3- 225 * x^2+ 274 * x - 121
public class Main03{
//先把函数模拟出来
public static double f(double mid) {
return Math.pow(mid,5)-15*Math.pow(mid,4)+85*Math.pow(mid,3)-225*Math.pow(mid,2)+274*mid-121;
}
public static void main(String[] args) {
double a = 1.5;//左边边界
double b = 2.4;//右边边界
double precision = 1e-7;//精确值
//调用求根的方法
double root = findRoot(a,b,precision);
System.out.print(root);
}
//计算根的方法
public static double findRoot(double a,double b,double precision) {
double mid = 0.0;
while((b-a)>precision) {//如果规定精度以内都无法找到根就可以结束找了
mid = (a+b)/2;//mid每次都要更新
if(f(mid)==0.0) {
break;//直接结束了,因为mid就已经符合要求了
}else if(f(a)*f(mid)<0) {
b = mid;
}else {
a = mid;
}
}
return Math.round(mid*1e6)/1e6;
}
}
初步思路
通过不断地将区间一分为二,找到函数 ( f(x) ) 在给定区间内的零点。
具体步骤
-
定义函数:
- 模拟函数 ( f(x) ) 的表达式: ( f(x) = x^5 - 15x^4 + 85x^3 - 225x^2 + 274x - 121 )。
-
初始化边界和精度:
- 左边界 a = 1.5
- 右边界 b = 2.4
- 精度 precision = 1e-7
-
求根方法:
- 计算区间中点 mid: mid = (a + b) / 2
- 根据函数值判断根的位置:
- 如果f(mid) == 0.0,则 mid 就是根。
- 如果 f(a) * f(mid) < 0,说明根在左半区间 [a, mid],更新右边界 b = mid。
- 否则,根在右半区间 [mid, b],更新左边界 a = mid。
- 重复上述过程,直到 (b - a) <= precision,表示找到的根在精度范围内。
-
返回结果:
- 将找到的根
mid
四舍五入到小数点后6位: Math.round(mid * 1e6) / 1e6
- 将找到的根
总结方法
二分法通过不断缩小区间范围,逐步逼近函数的零点。关键是每次迭代都将当前区间分为两半,并根据函数值判断根所在的区间。这个方法适用于在确定的区间内有且只有一个根的单调函数。通过严格控制区间的精度,可以保证结果的准确性,适合求解数值精确度要求高的问题。