目录
一、题目内容--------------------------------------------------2 二、总体设计--------------------------------------------------2
2.1、题目分析--------------------------------------------2 2.2、系统功能模块图-----------------------------------3 2.3、程序结构图-----------------------------------------2 三、数据结构设计--------------------------------------------3 四、详细设计--------------------------------------------------3
4.1、主要代码--------------------------------------------3 4.2、函数功能--------------------------------------------5 4.3、算法描述--------------------------------------------5 4.4、流程图-----------------------------------------------6 五、运行结果--------------------------------------------------6 六、结论--------------------------------------------------------7 七、结束语-----------------------------------------------------7 八、参考文献--------------------------------------------------7
常熟理工学院课程设计报告
一.题目内容
编写程序,用牛顿迭代法求解方程x^3-x^2-1=0的一个实根。要求:设计算法,分析求解精度。
二.总体设计
2.1、题目分析
此题目是运用牛顿迭代法求一元三次函数的近视值,牛顿迭代法是一步一步接近函数根的算法,但是由于是接近,所以求出来的值不是函数的具体值。
2.2、系统功能模块图
图2-1
说明:先输入一个具体的函数,通过条件分句判断根的个数,然后再利用函数调用牛顿迭代法求解函数根的近视值。最后输出函数的解。 1
常熟理工学院课程设计报告
2.3、程序结构图
图2-2
说明:先自定义一个函数fun()用于牛顿迭代法的调用,然后主函数求解。输入函数,if条件分类讨论函数根的情况,在根据各具体情况调用函数fun()求解函数的近视根。 三.数据结构设计
自定义函数设计:float fun()。调用函数,浮点型变量。主要作用用牛顿迭代法求解函数值。
四.详细设计
4.1、主要代码
#include
float fun(float a,float b,float c,float d,float n);
float fun(float a,float b,float c,float d,float n) //t fun(float n) {
2
常熟理工学院课程设计报告
//float x0,f,a,b,c,d,f1; float x0,f,f1; do { x0=n; f=((a*x0+b)*x0+c)*x0+d; f1=(3*a*x0+2*b)*x0+c; n=x0-f/f1; }while(fabs(n-x0)>eps); return n; }
int main()
{ float i,x0,x2,f0,f2,a,b,c,d,m,k,y1,y2,y3; printf(\ scanf(\ k=4*b*b-12*a*c; if(k>0) /*导数有极值的情况*/ { if(a>0) /*右端递增的情况*/ { x0=(-2*b+sqrt(4*b*b-12*a*c))/a/6.0; x2=(-2*b-sqrt(4*b*b-12*a*c))/a/6.0; f0=((a*x0+b)*x0+c)*x0+d; f2=((a*x2+b)*x2+c)*x2+d; m=f0*f2; if(m<0) /*有三个解的情况*/ { printf(\函数有三个根\ for(i=x0;f0<0;i++) { x0=i; f0=((a*x0+b)*x0+c)*x0+d; } y1=fun(a,b,c,d,i); y2=fun(a,b,c,d,x0); y3=fun(a,b,c,d,x2); printf(\ } else if(f0>0) /*有一个左端的解*/ { printf(\函数有一个根\ y1=fun(a,b,c,d,x2); printf(\ } else /*有一个右端的解*/ { printf(\函数有一个根\ for(i=x0;f0<0;i++)
3
常熟理工学院课程设计报告
}
}
{ x0=i; f0=((a*x0+b)*x0+c)*x0+d; }
y1=fun(a,b,c,d,i); printf(\
4.2、函数功能
函数名称 功能 主函数 说明 函数的输入,输出,调用函数的求解。 float fun() int main() 函数调用,用牛顿迭代法求值 形参n,实参a,b,c,d。返回近视值n 4.3、算法描述
x0=(-2*b+sqrt(4*b*b-12*a*c))/a/6.0;-------------------------求解极值点x0
x2=(-2*b-sqrt(4*b*b-12*a*c))/a/6.0;--------------------------求解极值点x2
f0=((a*x0+b)*x0+c)*x0+d; ------------------------------------求解函数在极值点时的函数值f0 f2=((a*x2+b)*x2+c)*x2+d; ------------------------------------求解函数在极值点时的函数值f2 m=f0*f2; ----------------------------------------------------------函数值得乘积赋值给m
if(m<0) /*有三个解的情况*/----------------------if条件语句,函数有三个解的条件 { printf(\函数有三个根\输出函数有三个根 for(i=x0;f0<0;i++)------------------------------------------求最右端根的牛顿迭代起始值 { x0=i; -------------------------------------------------------------------------------------------- f0=((a*x0+b)*x0+c)*x0+d; ----------------------------------------------------------------- } y1=fun(a,b,c,d,i); -------------------------------------------函数调用求解根的近视值y1 y2=fun(a,b,c,d,x0); -----------------------------------------函数调用求解根的近视值y2 y3=fun(a,b,c,d,x2); -----------------------------------------函数调用求解根的近视值y3 printf(\输出根的近视值--------------- }
4