
正文
c语言函数求解二分法 c语言二分算法
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
c语言二分法求方程的根的算法
如果连续函数在给定区间不单调,很有可能中值*下界值和中值*上界值都大于0,那么会跳出认为没有根,而事实上很有可能这个中值点靠近函数极点。
而真正用二分法求给定区间的思路是:
首先为函数求导,算出导函数的零点,然后再判断零点性质,最后将函数区间分为单调递增和单调递减间隔的形式,对每一段进行二分法求根。
#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;
}
相关问答
Q1: c语言编程 二分法解方程
这段代码是求解方程f(x)=0在区间[-10,10]上的根的数值解。
方法的思想就是c语言函数求解二分法:一直选取区间中间的数值c语言函数求解二分法,如果发现中间的函数值与一侧函数值c语言函数求解二分法,异号,那么说明解在这个更小的区间中,采用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缩小迭代区间,继续迭代c语言函数求解二分法!
Q2: 怎么用C语言求二分法
二分法查找有一个前提,数据应该是排好序的,假设从小到大排列,则:
首先用中间那个数(也可以不是正中间,差一两位没有关系,只要保证不忽略数据就行)与查找值比较,大于查找值就跳到左边。
然后重新设定新的数列。新的数列为,从最小的数值到中间那个数。
以这个新的数列为基础,重复以上步骤。
Q3: C语言二分法求解方程f(x)=0根
二分法是一种求解方程 $f(x) = 0$ 根的迭代算法,具体步骤如下:
定义一个函数 $f(x)$;
确定初始区间 $[a, b]$,使得 $f(a)$ 和 $f(b)$ 异号;
在区间 $[a, b]$ 中取中点 $c = \frac{a+b}{2}$,计算 $f(c)$;
如果 $f(c) = 0$,则 $c$ 是方程的解,算法结束;
如果 $f(c)$ 与 $f(a)$ 异号,则解在区间 $[a, c]$ 中,令 $b = c$,重复步骤 3 - 5;
如果 $f(c)$ 与 $f(b)$ 异号,则解在区间 $[c, b]$ 中,令 $a = c$,重复步骤 3 - 5。
下面是求解方程 $f(x) = x^3 - 3x + 1$ 在区间 $[1, 2]$ 中的根的 C 语言代码:
cCopy code#include stdio.h#include math.hdouble f(double x) { return pow(x, 3) - 3 * x + 1;
}double bisection(double a, double b, double eps) { double c = (a + b) / 2.0; while (fabs(b - a) eps) { if (f(c) == 0) { return c;
} else if (f(c) * f(a) 0) {
b = c;
} else {
a = c;
}
c = (a + b) / 2.0;
} return c;
}int main() { double a = 1.0, b = 2.0, eps = 1e-6; double root = bisection(a, b, eps); printf("The root of the equation is %lf.\n", root); return 0;
}
在上面的代码中,f(x) 函数定义了要求解的方程,bisection(a, b, eps) 函数实现了二分法的迭代过程,main 函数调用了 bisection 函数并输出了方程的根。
Q4: 求用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,bc语言函数求解二分法,循环次数n0 */
for(k=0;k=n0;k++)
{ x=(a+b)/2;
h=(b-a)/2;
y=f(x);
if(h10e-6||fabs(y)10e-6)
{ printf("k=%d,x=%f,y=%f",k,x,y);
breakc语言函数求解二分法; } /*输出分半次数k,函数c语言函数求解二分法的根x,及x对应c语言函数求解二分法的函数值.*/
else
{if(f(a)*f(x)0)
b=x;
else a=x;
}
}
}
Q5: C语言二分法求y =2x ³-4x ²+3x-6=0的程序?
/*
二分法,适用于原函数是单调递增或单调递减,即方程只有1个根,
或在指定区间只有1个根
*/
//函数y( x),直接按题目中的方程写
double y(double x)
{
return 2*x*x*x -4*x*x +3*x -6;
}
//递归调用函数,这种调用多少次不一定的函数,
//用递归调用最简单,但要掌握递归技巧
double f(double x1,double x2)
{
double xm = (x1+x2)/2.0;
if( (x2-x1) 0.0000001) //预先设定的很小的数值,控制计算精度
{
return xm; //递归调用出口
}
if( y( xm ) 0 )//用xm 代替x2
{
f( x1,xm);
}
else ////否则 用xm 代替x1
{
f( xm,x2);
}
}
void main()
{
double x1,x2;
x1 = -100000;
x2 = +100000;//取+ - 2个较极端的数,保证y(x1)0,且y(x2)0
printf("%7.3lf",f(x1,x2));
}
关于c语言函数求解二分法和c语言二分算法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。








