导航:网站首页 >
C语言二分法求方程近似根,c语言二分法求方程的近似解
C语言二分法求方程近似根,c语言二分法求方程的近似解
匿名网友:
按照你的要求只实现了这个方程的,不能泛用,不过很容易修改,代码如下:#include#includefloat function(float x){float result = 0.0;result = ((x*x*x) - (3*x) + 1);return result;}int main(){ float a = 0;float b = 1;float e = (float)0.001;float m = (a+b)/2;while(1){if (fabs((function(m)) {printf("result is %lf ", m);return 1;}else if (function(m) >0){a = m;}else if (function(m) {b = m;}m = (a+b)/2;}return 1;}
匿名网友:
#include #include double point(double x){return exp(-x) + 10 * x - 2; }double solve(double l, double r){double t = point((l + r) / 2.0);while(fabs(t) >= 5e-4){l = t r = t >0 ? (l + r) / 2.0 : r; t = point((l + r) / 2.0);} return (l + r) / 2.0;}int main(int argc, char *argv){printf("%f\n", solve(0, 1));printf("%f\n", point(0.110474)); return 0;}
匿名网友:
#include#includevoid main(){float a,b,x,Sx,Sb,Sa;printf("input a and b :");scanf("%f,%f",&a,&b);Sa=log(a)+2*a-3;Sb=log(b)+2*b-3;while(1){x=(a+b)/2;Sx=log(x)+2*x-3;if(Sx {printf("The root is%f",x);break;}if(Sx*Sa {b=x;}else{a=x; }}
匿名网友:
刚才那个只能找一个根,现在改了下,可以找所有根: 刚才有个小BUG,改了下:: ================================================= #include void FindRoot(void) { double dbLeftX = -10.0; double dbRightX = 10.0; double dbResultY = 0.0; double dbTmp = 0.0; double dbMidleX =0.0; //当二分点Y的值不为0不是根即,二分点X不满足方程 //当区间无限小时完成计算下面的语句表示当区间不是无限小时继续计算 while ( abs(dbRightX-dbLeftX) >0.1e-6 ) { //二分区间 dbMidleX = ( dbLeftX + dbRightX ) / 2.0; //算二分点Y的值 dbResultY = 2 * pow(dbMidleX,3) - 4 * pow(dbMidleX,2) + 3 * dbMidleX - 6; //如果计算的Y值为0时,找到一个根 if ( abs(dbResultY) { printf("Finde a root in -10,10 , value = %lf.\n",dbMidleX); } //判断方程的根落于刚才二分区间的哪个区间,并生成新的区间. if ( dbResultY { dbTmp = 2 * pow(dbLeftX,3) - 4 * pow(dbLeftX,2) + 3 * dbLeftX - 6; if ( dbTmp { dbLeftX = dbMidleX; } else { dbRightX = dbMidleX; } } else { dbTmp = 2 * pow(dbLeftX,3) - 4 * pow(dbLeftX,2) + 3 * dbLeftX - 6; if ( dbTmp >0.0 ) { dbLeftX = dbMidleX; } else { dbRightX = dbMidleX; } } } //区间无限小,如果区间两端计算的Y值一个为正一个为负则区间中点也是一个根 if( 2 * pow(dbLeftX,3) - 4 * pow(dbLeftX,2) + 3 * dbLeftX - 6 2 * pow(dbRightX,3) - 4 * pow(dbRightX,2) + 3 * dbRightX - 6 >0 ) { printf("Finde a root in -10,10 , value = %lf.\n",dbMidleX); } }
匿名网友:
只有一个错误。
f2 = f3;这句话,你赋值的是一个值,而不是一个表达式。
需要改成f2 = (2*m*(m-2)+3)*m-6; 同理f1=f3也不对。
而且,感觉你这算法也不对。
求不出来值,是不是2分法跨度太大查不到。
可以用弦截法。
float f(float x){float y;y=(2*x*(x-2)+3)*x-6;return y;}float xpoint(float x1,float x2){float y;y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));return y;} 增加这样两个函数m=xpoint(a,b);替换 二分法m=(a+b)/2。
就有结果了对了 还有问题。
do {m = xpoint(a,b);f3 = (2*m*(m-2)+3)*m-6;if (f1*f2 =1e-5);底下的循环,也就是赋值缩小区间的过程,你写反了。
f1*f2 0,这时b=m。
匿名网友:
按照你的要求只实现了这个方程的,不能泛用,不过很容易修改,代码如下: #include#includefloat function(float x){ float result = 0.0; result = ((x*x*x) - (3*x) + 1); return result;}int main(){ float a = 0; float b = 1; float e = (float)0.001; float m = (a+b)/2; while(1) { if (fabs((function(m)) 0) { a = m; } else if (function(m) < 0) { b = m; } m = (a+b)/2; } return 1;}...
匿名网友:
你看看吧。
我写的#include<stdio.h> float getvalue(float x) { return 2*x*x*x-4*x*x+3*x-6; } float fabs(float n) { if (n<0) { return -n; } else return n; } void main() { float a=-9.8,b=10.2,c; c=(a+b)/2; while(fabs(getvalue(c))>0.00001 && fabs(a-b)>0.00001){ if(getvalue(c)*getvalue(b)<0) a=c; if(getvalue(a)*getvalue(c)<0) b=c; c=(a+b)/2; printf("%lf\n",c); }}
匿名网友:
#include #include double point(double x){ return exp(-x) + 10 * x - 2; }double solve(double l, double r){ double t = point((l + r) / 2.0); while(fabs(t) >= 5e-4) { l = t 0 ? (l + r) / 2.0 : r; t = point((l + r) / 2.0); } return (l + r) / 2.0;}int main(int argc, char *argv){ printf("%f\n", solve(0, 1)); printf("%f\n", point(0.110474)); return 0;}...
匿名网友:
前面自定义函数funx(r)的返回值与funx(n)的返回值相乘如果小于零的话那么m就等于r,不然的话n就等于r,就是先把r当做实际参数传入给funx进行计算,在funx函数内,x的值为r,再把n当做实际参数传入给funx进行计算,在funx函数内,x的值为n,总的运算:2*((m+n)/2)*((m+n)/2)*((m+n)/2)-4*((m+n)/2)*((m+n)/2)+3*((m+n)/2)-6*2*n*n*n-4*n*n+3*n-6不知道看明白了没有......
问题推荐