分法”求二元方程的解
前面说到了用“精确迭代法”求两个数的最大公约数,这里的“二分法”也属于迭代法——近似迭代。
另外还有“牛顿迭代”也属于近似迭代。
思想:二分法属于数学问题,但为了说清楚问题就再说一下原理。
先取二元方程f(x) 的两个初略解x1 和x2 ,若f(x1) 与f(x2) 的符号相反,则方程f(x)=0 在[x1 , x2]区间至少有一个根;若f(x)在[x1 , x2]区间单调,则至少有一个实根;所以取
x3=(x1+x2)/2 ,并在x1 和x2 中舍去和f(x3) 同号者,那么解就在x3和另外那个没有舍去的初略解组成的区间里;如此反复取舍,直到xn 与xn-1 之差满足要求时,那么xn 便是方程f(x) 的近似根。
所以有算法:
while( 误差>给定误差)
if(f(x)==0)
x 就是根,不在迭代;
else if(f(x)*f(x1)<0) /* 这里的x
相当于上面所说的x3*/
x2=x;
else
x1=x;
例:用二分法求方程x2-2-x=0 在[0 ,3]区间的
根。
float f(float x)
{return (x*x-x-2);}
#include<iostream.h>
#include<math.h> main()
{
float x1=0,x2=3,x,root;
//给定
const float err=.5e-5
精度
//求
while(fabs(x1-x2)>err)
根
{
if(f(x1)==0)
{root=x1;break;}
if(f(x2)==0)
{root=x2;break;}
x=(x1+x2)/2;
if(f(x)==0)
{root=x;break;}
if(f(x)*f(x1)<0)
x2=x;
else
x1=x;
}
root=x1; cout<<"The root is:"<<root<<endl; }。