C语言二分法求最小值解,C语言二分法求方程近似根,c语言二分法求方程的近似解...

导航:网站首页 >

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不知道看明白了没有......

问题推荐

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值