用二分法编写一个求解各次一元方程方程在给定区间解的函数,用该函数来求下列三个方程在区间[1.0, 4.0]
上的解.
(1) x2−5=0
(2) x3−5=0
(3) sinx=0
要求:
编写的函数要能判断在给定区间上是否有解,如果有解按照二分法进行求解,如果无解函数返回一个实数值-32768
作为无解的标志。
函数接口定义:
double bisection(double (*f)(),double a,double b)
其中 参数f
是一个指向函数的指针变量。参数 a
和b
是解区间的两个端点
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
double quadratic(double x) /*一个一元二次函数f*/
{
return x*x-5;
}
double cubic(double x) /*一个一元三次函数f*/
{
return x*x*x-5;
}
/* 你编写的二分法解方程的函数放在这里 */
int main()
{
double x;
double a,b;
scanf("%lf%lf",&a,&b); //输入解区间左右端点的值
x=bisection(quadratic,a,b); //解一元二次方程
printf("%.3f\n",x);
x=bisection(cubic,a,b); //解一元三次方程
printf("%.3f\n",x);
x=bisection(sin,a,b); //求解方程sinx=0
printf("%.3f\n",x);
return 0;
}
输入样例1:
1.0 4.0
输出样例2:
2.236
1.710
3.142
输入样例2:
4.0 6.0
输出样例2:
-32768.000
-32768.000
-32768.000
代码如下:
double bisection(double (*f)(),double a,double b)
{
if(f(a)*f(b)>0) return -32768;
double m;
while(b>a)
{
m=(a+b)/2;
if(fabs(f(m))<1e-15) return m;
if(f(m)*f(a)>0) a=m;
else b=m;
}
}