首页 > 其他分享 >实例84 二分法求解方程

实例84 二分法求解方程

时间:2022-09-23 10:02:30浏览次数:56  
标签:int double 二分法 实例 printf include z1 84

#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <stdlib.h>
 
double Func(double);
int BisectRoot(double,double,double,double,double *,int,int *);
 
void main()
{
    int i,n,m;
    double a,b,h,eps,*x;
    n = 3;                        /*方程根的个数的预估值*/
    x = (double*)calloc(n,sizeof(double));        /*开辟内存空间*/
    if(x == NULL)
    {
        printf("内存分配失败\n");
        exit(1);
    }
    a = -3;                                /*区间起始端点*/
    b = 7;                                /*区间终止端点*/
    h = 0.1;                            /*步长*/
    eps = 1.e-8;                        /*要求达到的精度*/
    BisectRoot(a,b,h,eps,x,n,&m);        /*调用二分法函数*/
    printf("y=sin(x)在范围%2.0f和%2.0f之间的根有%d个根\n",a,b,m);
    printf("它们分别是:\n");
    for(i = 0;i<n;i++)
    printf("x[%d] = %e\n",i,x[i]);
    free(x);                    /*释放内存空间*/
}
 
double Func(double x)
{
    return(sin(x));
}
 
int BisectRoot(a,b,h,eps,x,n,m)
double a;            /*实型变量,输入参数,求根区间的起始端点*/
double b;            /*实型变量,输入参数,求根区间的终止端点*/
double h;            /*利用逐步扫描法确定根位置时的步长*/
double eps;            /*实型变量,输入参数,控制精度的参数*/
double *x;            /*实型一维数组,输出参数,存放计算得到的数组*/
int n;                /*输入参数,区间内方程根的个数的预估值*/
int *m;                /*输出参数,实际求得的根的个数*/
{
    double z,z0,z1,y,y0,y1;
    *m = 0;
    z = a;
    y = Func(z);
    while(1)        /*无限循环,直到遇到return或者break语句*/
    {/*如果逐步扫描到求根区间的右端点或者得到的根的个数达到预估根的个数*/
        if((z>b+h/2)||(*m==n))    
            return(1);
        if(fabs(y)<eps)        /*如果当前根z对应的函数f(z)满足精度要求*/
        {
            *m+=1;
            x[*m-1] = z;    /*将此时的z值赋值给x数组*/
            z+=h/2;
            y = Func(z);
            continue;        /*结束本次循环,即跳过循环体中下面尚未执行
                             的语句接着进行下一次是否执行循环的判定*/
        }
    
        z1 = z+h;            /*逐步扫描中小区间的右端点*/
        y1 = Func(z1);        /*小区间右端点对应的函数值*/
        if(fabs(y1)<eps)    /*如果右端点恰好满足根的精度要求*/
        {
            *m+=1;
            x[*m-1] = z1;
            z = z1+h/2;
            y = Func(z);
            continue;
        }
        if(y*y1>0)            /*如果对应根乘积大于零,说明该区间内没有根*/
        {
            y = y1;            
            z = z1;
            continue;
        }
        while(1)        /*如果本while循环执行,说明逐步扫描小区建z和z1间有根*/
        {
            if(fabs(z1-z)<eps)        /*如果满足精度要求*/
            {
                *m+=1;
                x[*m-1]=(z1+z)/2;
                z = z1+h/2;
                y = Func(z);
                break;
            }
            z0 = (z1+z)/2;            /*二分发求根公式*/
            y0 = Func(z0);
            if(fabs(y0)<eps)
            {
                *m = *m+1;
                x[*m-1] = z0;
                z =z0+h/2;
                y = Func(z);
                break;
            }
            if(y*y0<0)            /*如果乘积小于零,说明根在z和z0之间*/
            {
                z1 = z0;
                y1 = y0;
            }
            else                /*否则根在z0和z1之间*/
            {
                z = z0;
                y = y0;
            }
        }
    }
}
 
 
trust100@ubuntu:~/test/clanguage$ ./a.out 
y=sin(x)在范围-3和 7之间的根有3个根
它们分别是:
x[0] = 1.526557e-15
x[1] = 3.141593e+00
x[2] = 6.283185e+00

 

标签:int,double,二分法,实例,printf,include,z1,84
From: https://www.cnblogs.com/mapstar/p/16721672.html

相关文章

  • 实例85 牛顿迭代法求解方程
    #include<stdio.h>#include<math.h>#include<stdlib.h>intFunction(double,double*,double*);intNewton(double*,double,int);intFunction(x,f,dy)dou......
  • Spring Boot 切面AOP实现权限校验(实例演示与注解全解)
    目录理解AOP什么是AOPAOP体系与概念AOP实例第一个实例第二个实例AOP相关注解@Pointcut@Around@Before@After@AfterReturning@AfterThrowing1......
  • 在 Kubernetes 中缩放容器实例
    在一天中的某些时间,微服务可能会负载很大。Kubernetes通过为你添加额外的实例来轻松缩放微服务。运行以下命令,将后端微服务缩放为五个实例。kubectlscale--replic......
  • java反射前及反射后类的实例化等操作
    什么是反射?java的反射就是利用Class对象在运行阶段获取任何类的各种信息,从而可以实例化对象,访问对象的方法和属性的这么一种机制。什么时候使用反射?在某种业务场景下,无......
  • 39. [实例]Scrapy框架应用
    1.前言通过上一节《PythonScrapy爬虫框架详解》的学习,您已经对Scrapy框架有了一个初步的认识,比如它的组件构成,配置文件,以及工作流程。本节将通过一个的简单爬虫项目对......
  • 37. [实例]Selenium实战应用
    1.前言本节讲解PythonSelenium爬虫实战案例,通过对实战案例的讲解让您进一步认识Selenium框架。实战案例目标:抓取京东商城(https://www.jd.com/)商品名称、商品价格、评......
  • linux下手动删除数据库实例
      关闭所有oracle进程因为准备要删除数据库,所以不用正常完成数据的保存shutdownabort如果没有设置开机自动启动,服务器也没有运行其它系统,可以考虑重启服务......
  • React 面向组件编程 之 类式组件、组件实例的三大核心属性
    类式组件importReact,{Component}from"react";exportdefaultclassAppextendsComponent{render(){return<h2>我是类式组件</h2>}}......
  • Redis与Python连接实例
    2022-09-221、Redis与Python建立连接之前需要先安装“Redis”安装包:在ubantu中,打开终端,输入命令:sudopipinstallredis此时,是安装Python2.0的版本。一般来说,是将3......
  • Python 第3章 实例部分
    一、实验目的和要求  掌握控制流常用语句的用法,并写出控制流语句的应用实例。二、实验过程  采用Python。三、实验过程  根据《零基础学Python》(全彩版)的......