二分法求根c语言
‘壹’ c语言用二分法求根
while里的判断不应该用!=0这种方式,因为精度的限制极有可能是一个很小的数但也不为0,应该用abs(……)<1e-5这种判断方式
‘贰’ C语言二分法求方程的根
没听说过二分法能够求根,二分法只是对于有序数组的查找方法,并不能去求解任意方程的根(只可以求解在某个区间单调递增或递减的函数曲线对应方程的根),较为通用的方程求根方法是牛顿法。
‘叁’ 二分法求平方根 C语言
这应该是算法的伪代码,至少可以肯定,这不是C语言的代码,C语言里就没有<-这种语法。
二分法求解的方法,就是拿一个可能的结果,去试验、比较,看结果大还是小了,二分结果的区间,重复,直到得到满足精度要求的结果。
比如要求解2的平方根,x=2,给定区间[0,10],a=0,b=10。
第一次循环,c给定中点值5,5把区间[0,10]二分成两部分。试算5的平方,结果非小于x,可知最终的结果在[0,5),不是在(5,10],求解区间变成[0,5]
第二次循环,c给定中值2.5,然后循环重复,直到done=1或者c==c_old,即找到一个c的平方正好完成等于x即找到一个正好结果,或者两次计算结果完成一致的数,这个数的精度已经很高,划分的区间足够小,不能再分了,循环完成,得到结果c。
‘肆’ 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语言:用二分法求方程的根,求具体可用程序;
楼主你好~
提供以下代码。
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语言 二分法求三次方程根
二分法的基本思路是:任意两个点x1和x2,判断区间(x1,x2)内有无一个实根,如果f(x1)与f(x2)符号相反,则说明有一实根。接着取(x1,x2)的中点x,检查f(x)和f(x2)是否同号,如果不同号,说明实根在(x,x2)之间,如果同号,在比较(x1,x),这样就将范围缩小一半,然后按上述方法不断的递归调用,直到区间相当小(找出根为止)!
比如用二分法求f(x)=x^3-6x-1=0的实根。
代码如下(已调试):
#include
"math.h"
main()
{
float
x,x1,x2;
float
F(float
x,float
x1,float
x2);
printf("请输入区间[x1,x2]\n");
scanf("%f%f",&x1,&x2);
printf("x=%f\n",F(x,x1,x2));
}
float
F(float
x,float
x1,float
x2)
{
float
f,f1,f2;
do
{
f1=pow(x1,3)-6*x1-1.0;
f2=pow(x2,3)-6*x2-1.0;
}while(f1*f2>0);
//确保输入的x1,x2使得f1,f2符号相反
do
{
x=(x1+x2)/2;
//求x1,x2的中点
f=pow(x,3)-6*x-1.0;
if(f1*f>0)
//当f与f1符号相同时
{x1=x;f1=f;}
else
if(f2*f>0)
//当f与f2符号相同时
{x2=x;f2=f;}
}while(fabs(f)>1e-6);
//判断条件fabs(f)>1e-6的意思是f的值非常0
return
x;
}
输入:1
5
则输出:x=2.528918
输入:-10
10
则输出:x=2.528918
‘柒’ C语言中二分法求根
if(c*d<0)
{
a=m;
c=n;
}
else
{
b=m;
d=n;
}
改为
if(m*d<0)
{
a=m;
c=m;
}
else
{
b=m;
d=m;
}
‘捌’ c语言二分法求根
二分法计算函数f(x)=x*x*x*x+2*x*x*x-x-1;
本程序在turbo c或c++下编译:
#include "stdio.h"
#include <math.h>
float f(float x)
{float y;
y=x*x*x*x+2*x*x*x-x-1;
return y;
}
void main()
{float a=0,b=0,h,y,x;
int k,n0;
printf("please input qujian a and b");
scanf("%f%f%d",&a,&b,&n0); /*输入含根区间a,b,循环次数n0 */
for(k=0;k<=n0;k++)
{ x=(a+b)/2;
h=(b-a)/2;
y=f(x);
if(h<10e-6||fabs(y)<10e-6)
{ printf("k=%d,x=%f,y=%f",k,x,y);
break; } /*输出分半次数k,函数的根x,及x对应的函数值.*/
else
{if(f(a)*f(x)<0)
b=x;
else a=x;
}
}
}
‘玖’ 求用c语言编写一个函数二分法求根的算法
二分法计算函数f(x)=x*x*x*x+2*x*x*x-x-1;
本程序在turbo c或c++下编译
#include "stdio.h"
#include <math.h>
float f(float x)
{float y;
y=x*x*x*x+2*x*x*x-x-1;
return y;
}
void main()
{float a=0,b=0,h,y,x;
int k,n0;
printf("please input qujian a and b");
scanf("%f%f%d",&a,&b,&n0); /*输入含根区间a,b,循环次数n0 */
for(k=0;k<=n0;k++)
{ x=(a+b)/2;
h=(b-a)/2;
y=f(x);
if(h<10e-6||fabs(y)<10e-6)
{ printf("k=%d,x=%f,y=%f",k,x,y);
break; } /*输出分半次数k,函数的根x,及x对应的函数值.*/
else
{if(f(a)*f(x)<0)
b=x;
else a=x;
}
}
}