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)