二分法

二分法

一个函数在定义域内单调有根,通过将根区间不断等分寻找近似解或精确解的方法。

算法步骤

步骤1: 准备 计算f(x)在有根区间[a,b]端点处的值f(a),f(b).
步骤2: 二分 计算f(x)在区间中点 (a+b)/2处的值 f((a+b)/2).
步骤3: 判断 若f((a+b)/2)=0,则(a+b)/2即是根,计算过程结束,否则检验;若f((a+b)/2)f(a)<0,则以(a+b)/2代替b,否则以(a+b)/2代替a.

反复执行步骤2和步骤3,直到区间[a,b]的长度小于允许误差e,此时中点(a+b)/2即为所
求近似根。

算法流程

二分法_第1张图片

例题

例:证明方程x3 +x-4=0在[1,3]内有一个根;若采用对分区间法求误差的绝对值不大于10-3的近似根,则至少迭代计算多少次?

源码

// An highlighted block
#include "stdio.h"
#include "math.h"
#define f(x) (x*x*x+x-4)   /*定义原函数,此函数需要是单调的*/
#define e 0.001      /*迭代误差*/
main()
{
 int i=0;
 float x,a=1,b=3,y=f(a);   /*定义根区间初始值*/
 if(y*f(b)>=0)    /*检验根的存在性*/
 {
  printf("\nThe range is error!");
  return 0;
 }
 else   /*若根存在,开始二分迭代*/
  do
   { x=(a+b)/2;
     printf("\nx%d=%6.4f",i,x);
     i++;
     if (f(x)==0) break;  /*函数值为零停止,得到精确解*/
     if(y*f(x)<0)
       b=x;
     else
       a=x;
    }while(fabs(b-a)>e);    /*误差小于e时停止迭代,得到近似解*/
 printf("\nx=%4.2f",x);
}

计算结果

在这里插入图片描述

你可能感兴趣的:(数值计算)