用二分法求方程近似解时,可以精确到小数点后任一数字.对不对..二分法只用于求方程近似解呢

RT... RT 展开
 我来答
匿名用户
2013-10-18
展开全部
计算条件允许的情况下是可以精确到任何一位 二分法  数学方面:
  一般地,对于函数f(x),如果存在实数c,当x=c时,若f(c)=0,那么把x=c叫做函数f(x)的零点。
  解方程即要求f(x)的所有零点。
  假定f(x)在区间(x,y)上连续
  先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],
  现在假设f(a)<0,f(b)>0,a<b
   ①如果f[(a+b)/2]=0,该点就是零点,
  如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,(a+b)/2=>a,从①开始继续使用
  中点函数值判断。
  如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<=b,从①开始继续使用
  中点函数值判断。
  这样就可以不断接近零点。
  通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。
  给定精确度ξ,用二分法求函数f(x)零点近似值的步骤如下:
  1 确定区间[a,b],验证f(a)·f(b)<0,给定精确度ξ.
  2 求区间(a,b)的中点c.
  3 计算f(c).
  (1) 若f(c)=0,则c就是函数的零点;
  (2) 若f(a)·f(c)<0,则令b=c;
  (3) 若f(c)·f(b)<0,则令a=c.
  (4) 判断是否达到精确度ξ:即若┃a-b┃<ξ,则得到零点近似值a(或b),否则重复2-4.
  由于计算过程的具体运算复杂,但每一步的方式相同,所以可通过编写程序来运算。
  例:(C语言)
  方程式为:f(x) = 0,示例中f(x) = 1+x-x^3
  使用示例:
  input a b e: 1 2 1e-5
  solution: 1.32472
  源码如下:
  #include <stdio.h>
  #include <stdlib.h>
  #include <math.h>
  #include <assert.h>
  double f(double x)
  {
  return 1+x-x*x*x;
  }
  int main()
  {
  double a = 0, b = 0, e = 1e-5;
  printf("input a b e: ");
  scanf("%lf%lf%lf", &a, &b, &e);
  e = fabs(e);
  if (fabs(f(a)) <= e)
  {
  printf("solution: %lg\n", a);
  }
  else if (fabs(f(b)) <= e)
  {
  printf("solution: %lg\n", b);
  }
  else if (f(a)*f(b) > 0)
  {
  printf("f(%lg)*f(%lg) > 0 ! need <= 0 !\n", a, b);
  }
  else
  {
  while (fabs(b-a) > e)
  {
  double c = (a+b)/2.0;
  if (f(a)* f ( c ) < 0)
  b = c;
  else
  a = c;
  }
  printf("solution: %lg\n", (a+b)/2.0);
  }
  return 0;
  }
  例:C++语言[类C编写].
  |f(x)|<10^-5 f(x)=2x^3-4x^2+3x-6
  #include"iostream"
  #include"stdio.h"
  #include"math.h"
  #define null 0
  double f(x)(double); //f(x)函数
  void main()
  {
  double xa(null),xb(null),xc(null);
  do
  {
  printf("请输入一个范围x0 x1:");
  std::cin>>xa>>xb; //输入xa xb的值
  printf("%f %f",xa,xb);
  }
  while(fx(xa)*fx(xb)>=0); //判断输入范围内是否包含函数值0
  do
  {
  if(fx((xc=(xa+xb)/2))*fx(xb)<0) //二分法判断函数值包含0的X取值区间
  {
  xa=xc;
  }
  else
  {
  xb=xc;
  }
  }
  while(fx(xc)>pow(10.0,-5)||fx(xc)<-1*pow(10.0,-5));//判断x根是否在接近函数值0的精确范围内
  printf("\n 得数为:%f",xc);
  }
  double fx(double x)
  {
  return(2.0*pow(x,3)-4.0*pow(x,2)+3*x-6.0);
  }
  C++语言中的二分查找法
  算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。
  基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找
  ,直到找到为止。
  假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.
  1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为mid>x,故应在前半段中查找。
  2.令新的end=mid-1=2,而front=0不变,则新的mid=1。此时x>mid,故确定应在后半段中查找。
  3.令新的front=mid+1=2,而end=2不变,则新的mid=2,此时a[mid]=x,查找成功。
  如果要查找的数不是数列中的数,例如x=25,当第三次判断时,x>a[mid],按以上规律,令front=mid+1,即front=3,出现front>end的情况,表示查找不成功。
  例:在有序的有N个元素的数组中查找用户输进去的数据x。
  算法如下:
  1.确定查找范围front=0,end=N-1,计算中项mid(front+end)/2。
  2.若a[mid]=x或front>=end,则结束查找;否则,向下继续。
  3.若a[mid]<x,说明待查找的元素值只可能在比中项元素大的范围内,则把mid+1的值赋给front,并重新计算mid,转去执行步骤2;若a[mid]>x,说明待查找的元素值只可能在比中项元素小的范围内,则把mid-1的值赋给front,并重新计算mid,转去执行步骤2。
  代码:
  #include<iostream>
  #define N 10
  using namespace std;
  int main()
  {
  int a[N],front,end,mid,x,i;
  cout<<"请输入已排好序的a数组元素:"<<endl;
  for(i=0;i<N;i++)
  cin>>a[i];
  cout<<"请输入待查找的数x:"<<endl;
  cin>>x;
  front=0;
  end=N-1;
  mid=(front+end)/2;
  while(front<end&&a[mid]!=x)
  {
  if(a[mid]<x)front=mid+1;
  if(a[mid]>x)end=mid-1;
  mid=(front+end)/2;
  }
  if(a[mid]!=x)
  cout<<"没找到!"<<endl;
  else
  cout<<"找到了!在第"<<mid+1<<"项里。"<<endl;
  return 0;
  }
  经济学方面:
  传统的经济学家把经济分为实物经济和货币经济两部分,其中,经济理论分析实际变量的决定,而货币理论分析价格的决定,两者之间并没有多大的关系,这就是所谓的二分法。
  哲学方面:
  又称二分说,爱利亚学派芝诺四大著名悖论之一
  证明运动是不可能的。
  其主要思路是:假设一个存在物经过空间而运动,为了穿越某个空间,就必须穿越这个空间的一半。为了穿越这一半,就必须穿越这一半的一半;以此类推,直至无穷。所以,运动是不可能的。
  一般使用方面:
  即将所有的事物根据其属性分成两种。错误的分类可能导致逻辑谬论,如:非黑即白,不是忠的就是奸的。这很明显忽略了中间状态的存在。正确的分类法应如:白-非白。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式