二分法
- 这就是二分法的数学基础。
以下是二分法的具体过程,可以解决估计近似值的问题:
- 最后只要近似值与准确值的差不超过题目要求的精度即可,可以不需要计算二分次数。
误差分析
根据此不等式来确定二分的次数。在程序中循环退出的条件也可以转化为 | b(k+1) - a(k+1) | <= ε。
例题分析
手算:
- 首先估计二分的次数n。
- 得出次数n后,二分n次就可得出近似值。每次二分,把二分的中值带入式子与0(这里是0)作比较,判断在于0的大小,在判断应该取前半部分还是后半部分,再次重复上述过程。
- 1.3281 - 1.3242 < 0.005,最后答案就是 x6。
计算机实现:
注意: 每个小区间左端点的函数值f(ak)都与f(a)同号,因此f(xk)只需与f(a)比较符号即可,避免了计算f(ak)的麻烦。
- 法一:
#include <stdio.h>
#include <math.h>
#define e 0.005
#define f(x) ((x*x-1)*x-1)
int main()
{
int i=0;
float x,a=1,b=1.5,y=f(a);
//两端点同号,无解
//f(a)*f(b)
if(y*f(b)>=0)
{
printf("\nThe range is error!");
return;
}
else
do
{
x=(a+b)/2;
printf("\nx%d=%6.4f",i,x);
i++;
if(f(x)==0)
break;
//左端点乘中值
if(y*f(x)<0)
b=x;
else
a=x;
}while(fabs(b-a)>e);
printf("\nx=%4.2f",x);
}
- 法二:
#include <stdio.h>
#include <math.h>
#define e 0.005
#define f(x) ((x*x-1)*x-1)
int main()
{
int i=0;
float x,a=1,b=1.5,y=f(a);
//两端点同号
if(y*f(b)>=0)
{
printf("\nThe range is error!");
return;
}
else
for(i=0;i<=6;i++)
{
x=(a+b)/2;
printf("\nx%d=%6.4f",i,x);
if(f(x)==0) break;
if(y*f(x)<0)
b=x;
else
a=x;
}
printf("\nx=%4.2f",x);
}
利用几何图像理解: