C语言 二分法求方程近似解 ,运行没反应,不知哪里有问题,求指教

# include <stdio.h>
# include <math.h>
int main ( )
{
float a,b,m,f1,f2,f3;
a = -10;
b = 10;
f1 = (2*a*(a-2)+3)*a-6;
f2 = (2*b*(b-2)+3)*b-6;
do
{
m = (a+b)/2;
f3 = (2*m*(m-2)+3)*m-6;
if (f1*f2 < 0)
{
b =m;
f2 = f3;
}
else
{
a =m;
f1 = f3;
}
} while (fabs(f3)>=1e-5);
printf ("the root of equation is : %f\n",m);

return 0;
}

第1个回答  推荐于2016-05-09
只有一个错误。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。本回答被提问者采纳
第2个回答  2014-08-20
有可能是死循环了,在关键的地方弄个打印,看看相关值,如果一直在打印,就是死循环追问

打印什么的,不会啊!

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;retur...

二分法求方程近似解的步骤
若f(c)=0,则c就是函数的零点;若f(a)f(c)<0,则令b=c(此时零点x0∈(a,c));若f(c)f(b)<0,则令a=c(此时零点x0∈(c,b))。4、判断是否达到精确度ε 即若|a-b|<ε,则得到零点近似值为a(或b);否则重复第2至第4步,直到使|a-b|<ε为止。二、二分法求解方程近似...

用二分法求方程的近似解的方法
1、首先确定一个区间[a,b],使得f(a)和f(b)异号。由介值定理可得,这个区间内一定存在方程式的根。2、求出该区间的中点c=(a+b)\/2,并求出f(c)的值。3、判断f(c)的正负,如果f(c)的正负号和f(a)的正负号相同,则取[c,b]为新的区间,反之取[a,c]为新的区间。4、重复步骤二和...

C++编程之如何用二分法求方程近似解
e,则得到零点近似值a(或b);否则重复⑵-⑷。代码如下:double F(double a,double b,double c,double d,double x)\/\/函数妇联表达式{ return (((a x + b)x)x + d)\/ c;} double Function(double a,double b,double c,double d,double low,double high,double e){ double mid = (l...

二分法求方程近似解的步骤
二分法求方程近似解的步骤是:确定初始区间,计算区间中点,判断中点函数值,根据函数值调整区间,重复计算与判断,直至满足精度要求。首先,我们需要确定一个包含方程根的初始区间。这个区间可以通过观察函数图像、利用已知条件或者其他方法得到。确定初始区间后,我们计算这个区间的中点,并计算函数在这个中点处...

C语言编程例题:用二分法求方程的解
方法的思想就是:一直选取区间中间的数值,如果发现中间的函数值与一侧函数值,异号,那么说明解在这个更小的区间中,采用eps=1e-5作为区间的极限大小,通过迭代的方法求解这个方程的数值解。所以了解了上述思想,那么else if(f(a)*f(c)<0)b=c;说明的是 f(a)和f(c)异号,那么使用b=(a+b...

二分法求方程近似解的过程
高中数学新课程中引入二分法的意义:首先,“二分法”简便而又应用广泛,它对函数没有要求,任何方程都可以用“二分法”求近似解,这就为教材后面函数知识的应用提供了一个很好的、必需的工具。其次,它体现现代而又根植传统,算法作为一种计算机时代最重要的数学思想方法,将作为新课程新增的内容安排在数学...

c语言求一元二次方程的近似解
include<stdio.h> double f(double x){ return x*x+x-1;} void main(){ double xnj1,xn,temp;xnj1=0;xn=1;while(xn-xnj1>=0.001){ temp=(xnj1+xn)\/2;if(f(temp)>0)xn=temp;else xnj1=temp;} printf("%.3f\\n",xn);} ...

用C语言编写二分法解方程程序
{ return x*x*x+4*x*x-10;} void main(){ float a=1,b=1.5,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("%0.3f\\n",c);} ...

用二分法求方程的近似解时如何判断大概范围
楼上说的很清楚,我补充一点 先举个例子:F(x) = x^2 + 2*x + 1 = 0,抛物线开口向上,跟为-1,那么显然在区间(-2,2)内,该方程有解 如果用二分法的话,f(2) > 0, f(-2) > 0, f(2)*f(-2) > 0,判断结果是该区域无解 楼主应该发现,在所给定的范围一定要为该函数的...

相似回答