二分递进步长求解简单非线性方程

文章给自己看的,代码是在QT工程中截出来的

 

 

double Equation(double x)

{
double z=0;
int i;
for (i=0;i<=maxpower;i++)
{
z=z+coe[i]*pow(x,i);//coe为方程系数对应的幂级数
}
 
return(z);
}
 
/*参数意义:
a 要求的根的下界
b 要求的根的上界,即:所求的根落在区间 [a,b]之内
h 递进的步长
eps 精度
x 根的值
m 预计的根的个数*/
int BinSearchRoot(double a,double b,double h,double eps,double x[],int m) /*用二分法计算非线性方程的实根*/
 
{
 
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); /*返回根的个数*/
}
 
 
 
n=BinSearchRoot(-500.0,500.0,0.2,0.000001,x,m);  //在主函数中调用此语句,实参对应的意义在上面写过了,步长的确定一般可以为0.5,此处为了保险设置为0.2,x是开的一个存根的double数组,最后输出就显而易见了
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值