问题描述
用弦截法求方程 x 3 -5x 2 +16x-80=0 的根
思路分析
设f(x)=x3-5x2+16x-80,用弦截法求方程根的方法如下:
①取相差不大的两个不同点x1、x2,如果f(x1)与f(x2)符号相反,则(x1,x2)区间内必有一个根。否则改变x1、x2的值使得f(x1)与f(x2)异号为止。
②连接f(x1)与f(x2)两点,此线(即弦)交x轴于x点(计算见图5-5)。再求出f(x)。
③若f(x)与f(x1)同号,则将x作为新的x1。若f(x)与f(x2)同号,则将x作为新的x2。
④重复第②与第③步,直到|f(x)|<e,其中e是一个很小的正数,如0.0001,此时可以认为: f(x)≈0。
代码
#include<stdio.h>
#include<math.h>
float f(float x);
float xpoint(float x1,float x2);
float root(float x1,float x2);
void main(){
float x1,x2,f1,f2,x;//输入x1和x2并保证其函数值反号
do{
printf("Input x1,x2:\n");
scanf("%f,%f",&x1,&x2);
f1=f(x1); //计算x1的函数值并赋给f1
f2=f(x2);
}while(f1*f2>=0);
x=root(x1,x2);//调用求根函数
printf("A root of equation is %8.4f",x);
}
//定义f函数,求f(x)的函数值
float f(float x){
float y;
y=((x-5.0)*x+16.0)*x-80;
return y;
}
// 定义xpoint函数,求弦与x轴的交点
float xpoint(float x1,float x2){
float x;
x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return x;
}
//定义root函数,求近似根
float root(float x1,float x2){
float x,y,y1;
y1=f(x1);
do{
x=xpoint(x1,x2);
y=f(x);
if(y*y1>0) //新的f(x)与f(x1)同号时,用x代替x1,否则替换x2
{
y1=y;
x1=x;
}
else{
x2=x;
}
}while(fabs(y)>=0.0001); //当f(x)约等于0时退出循环
return x;
}