(1) 取两个不同点x1,x2,如果f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一个根。如果f(x1)与f(x2)同符号,则应改变x1,x2,直到f(x1)、f(x2)异号为止。注意x1、x2的值不应差太大,以保证(x1,x2)区间内只有一个根。
(2) 连接(x1,f(x1))和(x2,f(x2))两点,此线(即弦)交x轴于x。
该点的横坐标X可用下式求出 x=(x1f(x2)-x2f(x1)) / (f(x2)-f(x1))
(3) 若f(x)与f(x1)同符号,则根必在(x,x2)区间内,此时将x作为新的x1。如果f(x)与f(x2)同符号,则表示根在(x1,x)区间内,将x作为新的x2。
(4) 重复步骤 (2) 和 (3) , 直到 |f(x)|<ε 为止, ε为一个很小的数, 例如 10-6\. 此时认为 f(x)≈0
自己写的:
#include <iostream>
#include<cmath>
#include<iomanip>
using namespace std;
double f(double x)
{
return x*x*x-5*x*x+16*x-80;
}
int main()
{
double x1,x2,x;
cin>>x1>>x2;
while (f(x1)*f(x2)>0)
{
cout<<"请重新输入x1 x2:"<<endl;
cin>>x1>>x2;
}
x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
while(fabs(f(x))>=1e-6)
{
if (f(x)*f(x1)>0)
x1=x;
else
x2=x;
x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
}
cout<<setiosflags(ios::fixed)<<setprecision(7);
cout<<"方程的根为:"<<x<<endl;
}
书上答案:
#include <cmath>
#include <iomanip>
#include<iostream>
using namespace std;
double f (double x);
double xpoint (double x1,double x2);
double root (double x1 ,double x2);
int main()
{
double x1,x2,f1,f2,x;
do{
cout<<"请输入变量x1,x2的值:";
cin>>x1>>x2;
f1=f(x1);
f2=f(x2);
}while (f1*f2>=0);
x=root(x1,x2);
cout<<setiosflags(ios::fixed)<<setprecision(7);
cout<<"方程的根为:"<<x<<endl;
return 0;
}
double f (double x)
{
double y;
y=x*x*x-5*x*x+16*x-80;
return y;
}
double xpoint (double x1,double x2)
{
double y;
y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return y;
}
double root (double x1 ,double x2)
{
double x,y, y1;
y1=f(x1);
do{
x=xpoint (x1,x2);
y=f(x);
if(y*y1>0)
{
x1=x;
y1=y;
}
else
{
x2=x;
}
}while (fabs(y)>=0.000001);
return x;
}