任务代码:
例题1:
/*
功能:弦截法求f(x)=x^3-5x^2+16x-80的根
算法:去两个不同的点x1,x2,如果对应的f(x1),f(x2)是异号的则在区间(x1,x2)区间内必有一个根
*/
#include <stdio.h>
#include <math.h>
double xpoint(double,double);
double f(double);
double root(double,double);
/*main主控输入和输出*/
int main()
{
double x1,x2,f1,f2,x;
printf("此程序执行求方程f(x)=x^3-5x^2+16x-80的根!\n");
while(1)
{
printf("请输入x1,x2:");
scanf("%lf %lf",&x1,&x2);
f1=f(x1);
f2=f(x2);
if(f1*f2>=0)//f1,f2同号的时候循环输入,知道异号的时候停止
continue;
else
break;
}
x=root(x1,x2);//当f1,f2异号的时候才能将此时的x1,x2传输到root
printf("方程的根是:%lf",x);
return 0;
}
/*
功能:求(x1, x2)区间方程的实根
参数:两个浮点型值,表示x轴上两点,由主调函数保证f(x1)和f(x2)是异号
返回值:方程的根
*/
double root (double x1,double x2)
{
double x,y,y1;
y1=f(x1);
do
{
x=xpoint(x1,x2);
y=f(x);//(x,y)为弦和x轴的切点坐标
if(y*y1>0)
{
y1=y;
x1=x;
}else
{
x2=x;
}
}while(fabs(y)>=0.00001);//无限接近x轴,也就切点的时候
return x;
}
/*
功能:求(x1, f(x1))和(x2, f(x2))的连线与x轴的交点x
参数:两个浮点型值,表示x轴上两点
返回值:交点的x轴坐标
*/
double xpoint(double x1,double x2)
{
double x;
x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return x;
}
/*
功能:求函数f(x)=x3-5x2+16x-80的值
参数:一个浮点型数表示x轴上的一点
返回值:给定函数值
*/
double f(double x)
{
double y;
y=pow(x,3)-5*pow(x,2)+16*x-80;
return y;
}
实践1:
设计程序,计算: