二分法求方程的近似解c语言
Ⅰ 请帮我找一下求解一个用二分法求方程近似解的c语言代码的问题,
二分法的基本思路是:任意两个点x1和x2,判断区间(x1,x2)内有无一个实根,如果f(x1)与f(x2)符号相反,则说明有一实根。接着取(x1,x2)的中点x,检查f(x)和f(x2)是否同号,如果不同号,说明实根在(x,x2)之间,如果同号,在比较(x1,x),这样就将范围缩小一半,然后按上述方法不断的递归调用,直到区间相当小(找出根为止)!
代码如下(已调试):
#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)-x1-1.0;
f2=pow(x2,3)-x2-1.0;
}while(f1*f2>0);
//确保输入的x1,x2使得f1,f2符号相反
do
{
x=(x1+x2)/2;
//求x1,x2的中点
f=pow(x,3)-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
1.5
则输出:x=1.324718
Ⅱ C语言 二分法求方程x^2-3x-5=0的近似解
#include <cmath> double func(double x){
return x * (x - 3.0) - 5.0;
}
double binary_search(double x1, double x2, double (*f)(double)){
static const double epsilon = 1.0e-14;
double y1 = f(x1); double y2 = f(x2);
bool b1 = (y1 < 0.0 && y2 > 0.0);
bool b2 = (y1 > 0.0 && y2 < 0.0);
while (b1 || b2)
{
double x = (x1 + x2) / 2;
double y = f(x);
if (fabs(y) <= epsilon) { return x;}
((b1 == y < 0.0) ? x1 : x2) = x;
}
return 0.0;
}
int main(int, char*[]){
double f = binary_search(1.5, 10, func);
return 0;
}
Ⅲ C语言二分法解方程,急!谢谢!
本题的一个完整的c程序如下,程序在win-tc下调试通过,结果正确。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>
int n;
double c[16];
double Func(double);
int BisectRoot(double,double,double,double,double *,int,int *);
int main()
{
int i,m;
double a,b,h,eps,*x;
printf("Please input integer k:\n");
scanf("%d",&n); /*方程根的个数的预估值*/
printf("Please input %d coefficients one by one:\n",n+1);
for(i=0;i<=n;i++)
scanf("%lf",&c[i]);
x = (double*)calloc(n,sizeof(double)); /*开辟内存空间*/
if(x == NULL)
{
printf("内存分配失败\n");
exit(1);
}
a = -10; /*区间起始端点*/
b = 10; /*区间终止端点*/
h = 0.1; /*步长*/
eps = 1.e-5; /*要求达到的精度*/
BisectRoot(a,b,h,eps,x,n,&m); /*调用二分法函数*/
printf("The roots between %2.0f and %2.0f are: %d\n",a,b,m);
printf("They are:\n");
for(i = 0;i<m;i++)
printf("x[%d] = %f\n",i,x[i]);
free(x); /*释放内存空间*/
system("pause");
return 0;
}
double Func(double x)
{ int i;
double s=0.0;
for(i=0;i<=n;i++)
s+=c[i]*pow(x,i);
return(s);
}
int BisectRoot(a,b,h,eps,x,n,m)
double a; /*实型变量,输入参数,求根区间的起始端点*/
double b; /*实型变量,输入参数,求根区间的终止端点*/
double h; /*利用逐步扫描法确定根位置时的步长*/
double eps; /*实型变量,输入参数,控制精度的参数*/
double *x; /*实型一维数组,输出参数,存放计算得到的数组*/
int n; /*输入参数,区间内方程根的个数的预估值*/
int *m; /*输出参数,实际求得的根的个数*/
{
double z,z0,z1,y,y0,y1;
*m = 0;
z = a;
y = Func(z);
while(1) /*无限循环,直到遇到return或者break语句*/
{/*如果逐步扫描到求根区间的右端点或者得到的根的个数达到预估根的个数*/
if((z>b+h/2)||(*m==n))
return(1);
if(fabs(y)<eps) /*如果当前根z对应的函数f(z)满足精度要求*/
{
*m+=1;
x[*m-1] = z; /*将此时的z值赋值给x数组*/
z+=h/2;
y = Func(z);
continue; /*结束本次循环,即跳过循环体中下面尚未执行
的语句接着进行下一次是否执行循环的判定*/
}
z1 = z+h; /*逐步扫描中小区间的右端点*/
y1 = Func(z1); /*小区间右端点对应的函数值*/
if(fabs(y1)<eps) /*如果右端点恰好满足根的精度要求*/
{
*m+=1;
x[*m-1] = z1;
z = z1+h/2;
y = Func(z);
continue;
}
if(y*y1>0) /*如果对应根乘积大于零,说明该区间内没有根*/
{
y = y1;
z = z1;
continue;
}
while(1) /*如果本while循环执行,说明逐步扫描小区建z和z1间有根*/
{
if(fabs(z1-z)<eps) /*如果满足精度要求*/
{
*m+=1;
x[*m-1]=(z1+z)/2;
z = z1+h/2;
y = Func(z);
break;
}
z0 = (z1+z)/2; /*二分法求根公式*/
y0 = Func(z0);
if(fabs(y0)<eps)
{
*m = *m+1;
x[*m-1] = z0;
z =z0+h/2;
y = Func(z);
break;
}
if(y*y0<0) /*如果乘积小于零,说明根在z和z0之间*/
{
z1 = z0;
y1 = y0;
}
else /*否则根在z0和z1之间*/
{
z = z0;
y = y0;
}
}
}
}
Ⅳ C语言 二分法求方程近似解 ,运行没反应,不知哪里有问题,求指教
只有一个错误。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 < 0)
{
a =m;
f1 = (2*m*(m-2)+3)*m-6;
// cout<<f1<<endl;
}
else
{
b =m;
f2 = (2*m*(m-2)+3)*m-6;
//cout<<f2<<endl;
}
} while (fabs(f3)>=1e-5);
底下的循环,也就是赋值缩小区间的过程,你写反了。f1*f2 < 0,这时a=m。f1*f2 >0,这时b=m。
Ⅳ C语言中用递归算法实现二分法求方程在(0,5)的近似解
重点改动:
scanf("%lf,%lf",&x1,&x2);
#include <stdio.h>
#include <math.h>
int main()
{ double calculate(double y1,double y2,double fy1,double fy2);
double x1,x2,fx1,fx2;
double a;
printf("enter x1 & x2:");
scanf("%lf,%lf",&x1,&x2);
fx1=(((x1+3)*x1-8)*x1+12)*x1-10;
fx2=(((x2+3)*x2-8)*x2+12)*x2-10;
printf("%f %f %f %f ",x1,x2,fx1,fx2);
a=calculate(x1,x2,fx1,fx2);
printf("x=%lf ",a);
return 0;
}
double calculate(double y1,double y2,double fy1,double fy2)
{ double fy0,y0;
double a;
y0=(y1+y2)/2;
fy0=(((y0+3)*y0-8)*y0+12)*y0-10;
printf("%f ",y0);
if(fabs(fy0)>=1e-10)
{ if ((fy0*fy1)<0)
{ y2=y0;
fy2=fy0;
}
else
{ y1=y0;
fy1=fy0;
}
a=calculate(y1,y2,fy1,fy2);
}
else
{ a=y0;
printf("%6.2f",a);
}
return(a);
}
Ⅵ 用二分法求方程x^3-x-1=0在区间[1,1.5]内的一个近似解 用C语言编程 跪求!!!各位大虾
二分法的基本思路是:任意两个点x1和x2,判断区间(x1,x2)内有无一个实根,如果f(x1)与f(x2)符号相反,则说明有一实根。接着取(x1,x2)的中点x,检查f(x)和f(x2)是否同号,如果不同号,说明实根在(x,x2)之间,如果同号,在比较(x1,x),这样就将范围缩小一半,然后按上述方法不断的递归调用,直到区间相当小(找出根为止)!
代码如下(已调试):
#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)-x1-1.0;
f2=pow(x2,3)-x2-1.0;
}while(f1*f2>0); //确保输入的x1,x2使得f1,f2符号相反
do
{
x=(x1+x2)/2; //求x1,x2的中点
f=pow(x,3)-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 1.5
则输出:x=1.324718
Ⅶ c语言编写二分法求解近似根的问题【急】
#include<stdio.h>
#include<math.h>
doublepoint(doublex)
{
returnexp(-x)+10*x-2;
}
doublesolve(doublel,doubler)
{
doublet=point((l+r)/2.0);
while(fabs(t)>=5e-4)
{
l=t<0?(l+r)/2.0:l;
r=t>0?(l+r)/2.0:r;
t=point((l+r)/2.0);
}
return(l+r)/2.0;
}
intmain(intargc,char*argv[])
{
printf("%f ",solve(0,1));
printf("%f ",point(0.110474));
return0;
}
Ⅷ c语言二分法求方程的近似解
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
doublef(doublex)
{
returnx*x*x-3*x+1;
}
intmain()
{
doublei=1.0,j=2.0;
while(fabs(i-j)>=0.001)
{
if(f((i+j)/2.0)<0)
i=(i+j)/2.0;
else
j=(i+j)/2.0;
};
printf("%lf",i);
return0;
}