5-18 二分法求多项式单根 (20分)
二分法求函数根的原理为:如果连续函数f(x)f(x)在区间[a, b][a,b]的两个端点取值异号,即f(a)f(b)<0f(a)f(b)<0,则它在这个区间内至少存在1个根rr,即f(r)=0f(r)=0。
二分法的步骤为:
输入样例:
3 -1 -3 1
-0.5 0.5
输出样例:
0.33
分析:
二分法的定义上面已经描述的很清楚了,只需要把每个分步骤写出来即可
AC代码:
#include<stdio.h>
double f (double a[], double x);
int main ()
{
double a[4];
int i;
for (i=3; i>=0; i--) {
scanf("%lf", &a[i]);
}
double low, high;
scanf("%lf %lf", &low, &high);
double mid = ( low + high) /2;
//区间长度大于给定阈值,并且中点値不为零
while (f(a, mid) != 0 && (high - low) > 0.001) {
//如果左端点处值为零,即左端点为根,输出
if (f(a, low) == 0) {
mid = low;
break;
}
//如果右端点处值为零,即右端点为根,输出
if (f(a, high) == 0) {
mid = high;
break;
}
//如果f((a+b)/2)与f(low)同号
if (f(a, mid) * f(a, low) < 0) {
high = mid;
} else {
//如果f((a+b)/2)与f(high)同号
low = mid;
}
mid = (low + high) / 2;
}
printf("%.2f\n", mid);
return 0;
}
double f (double a[], double x) {
return a[3] * x * x * x + a[2] * x * x + a[1] * x + a[0];
}