一个用c++的问题,设有形如double f(double x);的函数,且已知此函数在区间[a,b]内有一个根,编写一个函数root,用二分法求出方程f(x)=0的在此区间内的根,要求使用函数指针且终止精度为le-6.double root(do
来源:学生作业帮助网 编辑:六六作业网 时间:2025/01/11 08:28:29
一个用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为之.
明白了吧?
*/