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);
}
相关文章
|
监控 安全 API
《云上大型赛事保障白皮书》——第四章 监控告警与应急预案——4.1 云上大型赛事监控告警——4.1.2 北京冬奥监控告警体系介绍(2)
《云上大型赛事保障白皮书》——第四章 监控告警与应急预案——4.1 云上大型赛事监控告警——4.1.2 北京冬奥监控告警体系介绍(2)
339 0
|
2天前
|
数据采集 人工智能 安全
|
11天前
|
云安全 监控 安全
|
3天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1007 151
|
3天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1701 9
|
8天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
644 152
|
10天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
613 13