⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 binsearchroot.c

📁 提供大量C代码来实现不同功能
💻 C
字号:
#include "math.h"
#include "stdio.h"


int BinSearchRoot(a,b,h,eps,x,m) /*用二法计算非线性方程的实根*/
int m;
/*参数意义:
a    要求的根的下界
b    要求的根的上界,即:所求的根落在区间 [a,b]之内
h    递进的步长
eps  精度
x    根的值
m    预计的根的个数*/
double a,b,h,eps,x[];
{ 
	extern double Equation(); /*要求解的非线性方程*/
    int n,js;
    double z,y,z1,y1,z0,y0; 
    n=0; z=a; y=Equation(z);
    while ((z<=b+h/2.0)&&(n!=m)) /*对给定步长的子区间进行搜索*/
	{ 
		if (fabs(y)<eps)  /*当前的判定点是方程的根*/
		{ 
			n=n+1; 
			x[n-1]=z;
            z=z+h/2.0; 
            y=Equation(z);
		}
        else /*当前点不是方程的根*/
		{ 
			z1=z+h; 
			y1=Equation(z1);
			if (fabs(y1)<eps) /*下一个点是方程的根*/
			{ 
				n=n+1;
				x[n-1]=z1;
				z=z1+h/2.0;
				y=Equation(z);
			}
			else if (y*y1>0.0) /*该区间内无根*/
			{ y=y1; z=z1;}
			else   /*该区间内有根*/
			{ 
				js=0;/*标志,0表示未找到根,1表示已经确定了根*/
				while (js==0)
				{ 
					if (fabs(z1-z)<eps) /*区间的长度小于给定的精度,可以当作已经找到了根*/
					{ 
						n=n+1;  
						x[n-1]=(z1+z)/2.0; /*把区间的中位值作为根*/
						z=z1+h/2.0; /*把寻找的位置放到下一个区间内*/
						y=Equation(z);
						js=1; /*在当前区间内已经找到了根*/
					}
					else /*区间比给定的精度大,则进行二分*/
					{ 
						z0=(z1+z)/2.0;  /*区间二分*/ 
						y0=Equation(z0);
						if (fabs(y0)<eps) /*z0位置为根*/
						{ 
							x[n]=z0; 
							n=n+1; 
							js=1;
							z=z0+h/2.0; 
							y=Equation(z);
						}
						else if ((y*y0)<0.0) /*[z,z0]内有根*/
						{ z1=z0; y1=y0;} 
						else { z=z0; y=y0;}
					}
				}
			}
		}
	}
    return(n); /*返回根的个数*/
}
main()
{ 
	int i,n;
    static int m=6;
    static double x[6];
    n=BinSearchRoot(-2.0,5.0,0.2,0.000001,x,m);
    printf("M=%d\n",n); /*输出根的个数*/
    for (i=0; i<=n-1; i++)
		printf("x(%d)=%13.7e\n",i,x[i]);
    printf("\n");
}

double Equation(x)
double x;
{ 
	double z;
	z=(((((x-5.0)*x+3.0)*x+1.0)*x-7.0)*x+7.0)*x-20.0;
	return(z);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -