112.求解非线性方程

简介: 112.求解非线性方程
#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];
    clrscr();
    puts("This is a program to solve Nonlinear function\n   by Binary Divisive Procedure.");
    puts("\n The Nonlinear function is:");
    puts("\n f(x)=(((((x-5.0)*x+3.0)*x+1.0)*x-7.0)*x+7.0)*x-20.0\n");
    n=BinSearchRoot(-2.0,5.0,0.2,0.000001,x,m);
    puts("\n >> Solve successfully!\n >> The results are:");
    printf(" >> The function has %d roots, they are:\n",n);/*输出根的个数*/
    for (i=0; i<=n-1; i++)
    printf(" >> x(%d)=%13.7e\n",i,x[i]);
    printf("\n Press any key to quit...\n");
    getch();
}
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);
}
相关文章
|
机器学习/深度学习 NoSQL 容器
递归的本质与基本实现形式
递归的本质与基本实现形式
|
资源调度 JavaScript 前端开发
Vue安装并使用Vue-CLI构建SPA项目并实现路由
Vue安装并使用Vue-CLI构建SPA项目并实现路由
158 0
|
存储 算法 Java
程序员必知:基本程序设计
程序员必知:基本程序设计
83 0
|
机器学习/深度学习 人工智能 文字识别
智能图像处理技术:开启未来视觉时代
围绕文档图像处理及 OCR 领域等前沿技术展开讨论,寻找文档图像处理领域的未来进阶方向。
379 0
智能图像处理技术:开启未来视觉时代
|
JavaScript 前端开发 开发者
JS中的事件监听
JS中的事件监听
149 0
|
监控 安全 API
《云上大型赛事保障白皮书》——第四章 监控告警与应急预案——4.1 云上大型赛事监控告警——4.1.2 北京冬奥监控告警体系介绍(2)
《云上大型赛事保障白皮书》——第四章 监控告警与应急预案——4.1 云上大型赛事监控告警——4.1.2 北京冬奥监控告警体系介绍(2)
293 0
|
运维 安全 算法
如何选择一块真正“好用的、性能高”的远程控制软件
从而影响工作。 - 当平台出现了故障,而运维却不在工位,也不在家中,手里没有电脑办公。 - 开发人员在公司、家写了某个功能的代码, 但是没有把代码传到正在使用的电脑上。 - 远程办公,家里有电脑,
338 0
 如何选择一块真正“好用的、性能高”的远程控制软件
|
存储 网络协议 Linux