一个用c++的问题,设有形如double f(double x);的函数,且已知此函数在区间[a,b]内有一个根,编写一个函数root,用二分法求出方程f(x)=0的在此区间内的根,要求使用函数指针且终止精度为le-6.double root(do

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/30 11:14:26
一个用c++的问题,设有形如double f(double x);的函数,且已知此函数在区间[a,b]内有一个根,编写一个函数root,用二分法求出方程f(x)=0的在此区间内的根,要求使用函数指针且终止精度为le-6.double root(do

一个用c++的问题,设有形如double f(double x);的函数,且已知此函数在区间[a,b]内有一个根,编写一个函数root,用二分法求出方程f(x)=0的在此区间内的根,要求使用函数指针且终止精度为le-6.double root(do
一个用c++的问题,
设有形如double f(double x);的函数,且已知此函数在区间[a,b]内有一个根,编写一个函数root,用二分法求出方程f(x)=0的在此区间内的根,要求使用函数指针且终止精度为le-6.
double root(doublex1,double x2)
{
double f(double x);
double (*p)(double);
p=f;
double x,y,y1;
do
{
y1=p(x1);
x=(x1+x2)/2;
y=p(x);
if(y*y1>0)
x1=x;
else x2=x;
}while(fabs(x1-x2)>=1e-6);
return x;
}
请问什么是二分法?我看不懂这个程序...

一个用c++的问题,设有形如double f(double x);的函数,且已知此函数在区间[a,b]内有一个根,编写一个函数root,用二分法求出方程f(x)=0的在此区间内的根,要求使用函数指针且终止精度为le-6.double root(do
#include<math.h>
double root(double x1,double x2)
{
         double f(double x);
         double (*p)(double);
         p=f;
         double x,y,y1;
         do
         {
                   y1=p(x1);/**/
                   x=(x1+x2)/2;
                   y=p(x);
                   if(y*y1>0)
                            x1=x;
                   else x2=x;
         }while(fabs(x1-x2)>=1e-6);
         return x;
}

double f(double x)
{
/*这里是一些处理,我假设如下:*/
return x -3;
/*这是个正比例函数(y=x-3),对吧?你可以
在草稿纸上画出它的坐标轴的图像.
*/
}
/*区间:
    *--------------*----------------*
    |              |                |
   x1          x                x2
   刚开始,可以看成这样,x1在左,x2在右.语句:
   x=(x1+x2)/2;说明x在二者之间,先判断一半.
   将x1的值带入计算,得到y1的值,再将x的
   值带入计算,得到y,
   然后比较y和y1是否同符号(都为正或都为负数).其中
   那个:if(y*y1>0)  的判断就是在判断是否同符号.
   试想:如果y和y1异号,说明一个值在x轴上方,一个在下方,区间内肯定就
   有y=f(x)=0的解了,是吧?所以就将区间[x1,x2]减半为[x,x2].
   否则解就在另一半[x1,x].所以那个if-else语句就是来做这段工作的.
   如此循环,直到区间精确到 10^-6为之.

明白了吧?

*/