UOJ Logo xuekairui的博客

博客

二分法求零点(近似值)

2023-04-15 17:05:57 By xuekairui

Ps:人教版数学必修一P146 —————————————— 例2 借助信息技术,用二分法求方程2X(2的x次方)+3x=7的近似解(精确度为0.1)。

解:原方程等价于2X+3x-7=0,令f(x)=2X+3x-7。 ①分析图像可知f(1)f(2)<0,说明该函数在区间(1,2)内存在零点x0;

②取区间(1,2)的中点x1=1.5,因为f(1)f(1.5)<0,则x0∈(1,1.5);

 ③再取区间(1,1.5)的中点x2=1.25,因为f(1.25)f(1.5)<0,则x0∈(1.25,1.5);

④同理可得,x0∈(1.375,1.5),x0∈(1.375,1.4375);

⑤由于1.4375-1.375=0.0625<0.1,所以,原方程的近似解可取为1.375;

以上是较为详细的数学思路:) 然而,此方法计算量实在是太大,能否用程序实现呢?(C++)

—————————— 主要逻辑:确定范围(a~b)以后,每次求出其中点(c)后须判断零点所在位置,即在ac之间还是cb之间,f(a)f(c)<0则在ac之间,反之,则在c b 之间,f(c)==0时即直接求出零点为c,也不是不可能,对吧[doge] 由于b,a只差不能小于分度值,所以需要在while((b-a)>e)中进行。 —————————— 此方法使用了include里的函数 pow(x,y),即x为底数,y为指数,计算x的y次方的值

完整代码如下:

#include<bits/stdc++.h>
using namespace std; 
double HO_MO(double e/*分度值*/,double a/*首指针*/,double b/*尾指针*/){ 
    while((b-a)>e) { 
      double c=(a+b)/2;/中点横坐标/ 
      if((pow(2,a)+3*a-7)*(pow(2,c)+3*c-7)<0){ 
           b=c; 
      } 
      else{ 
           a=c; 
            if((pow(2,a)+3*a-7)==0) return a; 
    }
   } 
   return a; 
}
int main(){ 
    double E,A,B; 
    cin>>E>>A>>B; 
    double q=HO_MO(E,A,B); 
     cout<<q; 
  return 0; 
}

(原创,若有误,请指正orz)

评论

xuekairui
cout<<q; 改成printf("%lf",q);应该要好点

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。