c语言二分法求方程
⑴ c语言二分法求方程的根的算法
如果连续函数在给定区间不单调,很有可能中值*下界值和中值*上界值都大于,那么会跳出认为没有根,而事实上很有可能这个中值点靠近函数极点。
而真正用二分法求给定区间的思路是:
首先为函数求导,算出导函数的零点,然后再判断零点性质,最后将函数区间分为单调递增和单调递减间隔的形式,对每一段进行二分法求根。
#include<stdio.h>
#include<math.h>
#defineDEFAULT_UPPER(10)
#defineDEFAULT_LOWER(-10)
#defineDEFAULT_E(0.00000001)
#define_MID(x,y)((x+y)/2)
#define_VALUE(x)(2*x*x*x-4*x*x+3*x-6)
double_e;
intgetRoot(doublelower,doubleupper,double*result);
main()
{
doubleroot;
printf("Enteradeviation:");
scanf("%lf",&_e);
if(_e==0.0)
_e=DEFAULT_E;
if(getRoot(DEFAULT_LOWER,DEFAULT_UPPER,&root))
printf("Root:%2.8lf ",root);
else
printf("Root:NoSolution. ");
}
intgetRoot(doublelower,doubleupper,double*result)
{
*result=_MID(lower,upper);
if(upper-lower<=_e)
return1;
if(_VALUE(lower)*_VALUE(*result)<=0)
returngetRoot(lower,*result,result);
elseif(_VALUE(*result)*_VALUE(upper)<=0)
returngetRoot(*result,upper,result);
else
return0;
}
⑵ C语言二分法求方程(找问题)
#include<stdio.h>
#include<math.h>
#defineesp1e-6
#definef(a)(((2*a)*a+3)*a-6)
voidmain()
{
doublem,n,r;//你在下面都用%lf输入/输出,所以这几个数应该是double
printf("Pleaseinputtwofugures: ");///**/
scanf("%lf%lf ",&m,&n);
for(;;)
{
scanf("%lf%lf ",&m,&n);
if(f(m)*f(n)>=0)
{
printf("Thereisnoconsequence!Pleaseinputagain: ");
scanf("%lf%lf ",&m,&n);
}
else
break;
}
while(fabs(f(m)-f(n))>=esp)
{
r=(m+n)/2;
if(f(m)*f(r)<0)
n=r;
else
//if(f(m)*f(r)>0)//多余的
m=r;
//else//多余的
//break;//多余的
}
printf("Rootis%lf. ",(m+n)/2);
}
⑶ C语言:用二分法求方程的根,求具体可用程序;
楼主你好~
提供以下代码。
Fedora10下gcc4.3.2编译通过,手动测试通过。。
#include <stdio.h>
#include <math.h>
#define DEFAULT_UPPER (10)
#define DEFAULT_LOWER (-10)
#define DEFAULT_E (0.00000001)
#define _MID(x,y) ((x+y)/2)
#define _VALUE(x) (2*x*x*x-4*x*x+3*x-6)
double _e;
int getRoot(double lower, double upper, double *result);
main()
{
double root;
printf("Enter a deviation:");
scanf("%lf",& _e);
if(_e == 0.0)
_e = DEFAULT_E;
if(getRoot(DEFAULT_LOWER, DEFAULT_UPPER, &root))
printf("Root:%2.8lf\n", root);
else
printf("Root:No Solution.\n");
}
int getRoot(double lower, double upper, double *result)
{
*result = _MID(lower,upper);
if(upper - lower <= _e)
return 1;
if(_VALUE(lower)*_VALUE(*result) <= 0)
return getRoot(lower, *result, result);
else if(_VALUE(*result)*_VALUE(upper) <= 0)
return getRoot(*result, upper, result);
else
return 0;
}
很简单的递归。
不过对于楼主的这道题,还要说一点,提示中的二分法求根,只能适用于在给定函数在给定区间中呈单调连续情况下才行得通哦~我也是按照给定的提示来写的上述代码。
如果连续函数在给定区间不单调,很有可能中值*下界值和中值*上界值都大于0,那么会跳出认为没有根,而事实上很有可能这个中值点靠近函数极点。
而真正用二分法求给定区间的思路是:
首先为函数求导,算出导函数的零点,然后再判断零点性质,最后将函数区间分为单调递增和单调递减间隔的形式,对每一段进行二分法求根。
请追问~
⑷ c语言用二分法求解方程
用二分法求2X^3-4X^2+3X-6=0在(-10,10)之间的根
#include <stdio.h>
#include <math.h>
void main()
{
float x0,x1,x2,f0,f1,f2;
do
{
printf("please enter x1 & x2:\n");
scanf("%f,%f",&x1,&x2);
f1=((2*x1-4)*x1+3)*x1-6;
f2=((2*x2-4)*x2+3)*x2-6;
}
while ((f1*f2)>0);
do
{
x0=(x1+x2)/2;
f0=((2*x0-4)*x0+3)*x0-6;
if ((f0*f1)<0)
{
x2=x0;
f2=f0;
}
else
{
x1=x0;
f1=f0;
}
}
while(fabs(f0)>=1e-5);
printf("the root of equation is :%f\n",x0);
}
⑸ C语言编程 二分法求方程的根
前面自定义函数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的话,m=r,不然n=r.
不知道看明白了没有......
⑹ c语言用二分法求方程(-10,10)之间的根
你的好象是算0-10的根,而且只迭代10次,恐怕是没有正确结果的.
下面的参数对a,b做了少许修版改,目的权是避免除零错误.
float getvalue(float x)
{
return 2*x*x*x-4*x*x+3*x-6;
}
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);
}
⑺ C语言怎么样用二分法求方程的解
x1,x2请输入-10,10
#include <stdio.h>
#include <math.h>
void main()
{
float x0,x1,x2,f0,f1,f2;
do
{
printf("please enter x1 & x2:\n");
scanf("%f,%f",&x1,&x2);
f1=((2*x1-4)*x1+3)*x1-6;
f2=((2*x2-4)*x2+3)*x2-6;
}
while ((f1*f2)>0);
do
{
x0=(x1+x2)/2;
f0=((2*x0-4)*x0+3)*x0-6;
if ((f0*f1)<0)
{
x2=x0;
f2=f0;
}
else
{
x1=x0;
f1=f0;
}
}
while(fabs(f0)>=1e-5);
printf("the root of equation is :%f\n",x0);
}
⑻ c语言 使用二分法求方程额e^x+x=0在(-1,0)之间的根
#include<stdio.h>
#include<math.h>
#define eps 5e-6
#define delta 1e-6
#define e 2.718
float bisection(float a,float b,float (*f)(float)){
float c,fc,fa=(*f)(a),fb=(*f)(b);
int n=1;
printf("二分法次数\tc\t\tf(c)\n");
while(1){
if(fa*fb>0){printf("不能用二分法求解");break;}
c=(a+b)/2;fc=(*f)(c);
if(fabs(fc)<delta) break;
else if(fa*fc<0){b=c,fb=fc; }
else {a=c,fa=fc;}
if (fabs(b-a)<eps) break;
printf(" %d\t\t%f\t%f\n",n++,c,fc);
}
return c;
}
float f(float x){
//return x*x*x+x*x-3*x-3;
return exp(x)+x;}
void main(){
float a=-1,b=0;
float x;
x=bisection(a,b,f);
printf("\n 方程的根是: %f\n",x);
getchar();
}
⑼ c语言编程 二分法解方程
这段代码是求解方程f(x)=0在区间[-10,10]上的根的数值解。
方法的思想就是:一直选取区间中间的数值,如果发现中间的函数值与一侧函数值,异号,那么说明解在这个更小的区间中,采用eps=1e-5作为区间的极限大小,通过迭代的方法求解这个方程的数值解。
所以了解了上述思想,那么else if(f(a)*f(c)<0) b=c; 说明的是 f(a)和f(c)异号,那么使用b=(a+b)/2缩小迭代区间,继续迭代;同理else a=c;说明f(a)和f(c)同号,那么使用a(a+b)/2缩小迭代区间,继续迭代!