三九宝宝网宝宝教育教学论文

C语言二分法解方程急谢谢

12月24日 编辑 39baobao.com

[c语言编程二分法解方程]这段代码是求解方程f(x)=0在区间[-10,10]上的根的数值解。 方法的思想就是:一直选取区间中间的数值,如果发现中间的函数值与一侧函数值,异号,那么说明解在这个更小的区间中,采用e...+阅读

本题的一个完整的c程序如下,程序在win-tc下调试通过,结果正确。#include #include #include #include int n; double c[16]; double Func(double); int BisectRoot(double,double,double,double,double *,int,int *); int main() { int i,m; double a,b,h,eps,*x; printf("Please input integer k:\n"); scanf("%d",&n); /*方程根的个数的预估值*/ printf("Please input %d coefficients one by one:\n",n+1); for(i=0;i scanf("%lf",&c[i]); x = (double*)calloc(n,sizeof(double)); /*开辟内存空间*/ if(x == NULL) { printf("内存分配失败\n"); exit(1); } a = -10; /*区间起始端点*/ b = 10; /*区间终止端点*/ h = 0.1; /*步长*/ eps = 1.e-5; /*要求达到的精度*/ BisectRoot(a,b,h,eps,x,n,&m); /*调用二分法函数*/ printf("The roots between %2.0f and %2.0f are: %d\n",a,b,m); printf("They are:\n"); for(i = 0;i printf("x[%d] = %f\n",i,x[i]); free(x); /*释放内存空间*/ system("pause"); return 0; } double Func(double x) { int i; double s=0.0; for(i=0;i s+=c[i]*pow(x,i); return(s); } int BisectRoot(a,b,h,eps,x,n,m) double a; /*实型变量,输入参数,求根区间的起始端点*/ double b; /*实型变量,输入参数,求根区间的终止端点*/ double h; /*利用逐步扫描法确定根位置时的步长*/ double eps; /*实型变量,输入参数,控制精度的参数*/ double *x; /*实型一维数组,输出参数,存放计算得到的数组*/ int n; /*输入参数,区间内方程根的个数的预估值*/ int *m; /*输出参数,实际求得的根的个数*/ { double z,z0,z1,y,y0,y1; *m = 0; z = a; y = Func(z); while(1) /*无限循环,直到遇到return或者break语句*/ {/*如果逐步扫描到求根区间的右端点或者得到的根的个数达到预估根的个数*/ if((z>b+h/2)||(*m==n)) return(1); if(fabs(y) { *m+=1; x[*m-1] = z; /*将此时的z值赋值给x数组*/ z+=h/2; y = Func(z); continue; /*结束本次循环,即跳过循环体中下面尚未执行 的语句接着进行下一次是否执行循环的判定*/ } z1 = z+h; /*逐步扫描中小区间的右端点*/ y1 = Func(z1); /*小区间右端点对应的函数值*/ if(fabs(y1) { *m+=1; x[*m-1] = z1; z = z1+h/2; y = Func(z); continue; } if(y*y1>0) /*如果对应根乘积大于零,说明该区间内没有根*/ { y = y1; z = z1; continue; } while(1) /*如果本while循环执行,说明逐步扫描小区建z和z1间有根*/ { if(fabs(z1-z) { *m+=1; x[*m-1]=(z1+z)/2; z = z1+h/2; y = Func(z); break; } z0 = (z1+z)/2; /*二分法求根公式*/ y0 = Func(z0); if(fabs(y0) { *m = *m+1; x[*m-1] = z0; z =z0+h/2; y = Func(z); break; } if(y*y0 { z1 = z0; y1 = y0; } else /*否则根在z0和z1之间*/ { z = z0; y = y0; } } } }

推荐阅读
图文推荐