本次实现试位法的算法,该算法的背景如下:
该算法的详细解释如下:
该算法的实现如下:
/*
*试位法
*方程f(x)=0在区间[a,b]上连续,且f(a)f(b)<0,则方程f(x)=0在区间[a,b]上必有实根。
*函数接口:double false_pos(double a,double b,double eps,double f(double))
*a:求根区间的左端点
*b:求根区间的右端点
*eps:精度要求
*double f(double):指向计算方程f(x)=0的左端的函数
*函数返回double类型的数据
*
*/
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
double false_pos(double a, double b, double eps, double f(double))
{
int flag = 1; //flag,while的标志
double fa, fb; //存放弦的两端点的y值
double y, x; //存放产生的新的根的点
fa = (*f)(a);
fb = (*f)(b);
//判断能否用此方法求根
if (fa*fb > 0)
{
cout << "there mab be no root in this equation " << endl;
}
//求解
do
{
x = (a*fb - b*fa) / (fb - fa);
y = (*f)(x);
if (fabs(y) < eps) //满足精度要求退出
flag = 0;
if (y*fa > 0) //若根同号,则在该区间继续求解
{
a = x;
fa = y;
}
else //否则,在另一区间
{
b = x;
fb = y;
}
} while (flag);
return x;
}
double functest(double x)
{
double y;
y = exp(x*log(x)) - 10;
return y;
}
/*
*测试:求x^x=10的根,此根初略估计在[2,3]有一个根
*f(x)=x^x-10。 误差eps=0.0000001;
*/
//方程的根为 2.50618414
int main()
{
double eps = 0.0000001;
double a = 2.0;
double b = 3.0;
double root;
root = false_pos(a, b, eps, functest);
cout << "该方程的根为 " <<setprecision(9)<< root << endl;
return 0;
}