实验一题目:方程求根
完成日期:2019年 3 月 11 日
1、实验目的
用不同方法求任意实函数方程f(x)=0在自变量[a,b]内或某一点附近的实根。并比较方法的优劣性。
2、实验内容(实验题目与内容说明)
二分法
对方程f(x)=0在[a,b]内求根。先判断在所给区间内是否有解,有则继续运行,无则打印“无解”并终止运行,令k=-1。
将所给区间二分,令temp=(a+b)/2.0,判断是否f(a)f(temp)<0,是则令b=temp,否则a=temp,k+1,判断(1/pow(2,k+1)(b0-a0))是否小于误差范围,若不是,继续二分循环,若是,结束循环,打印结果。
3、算法设计(核心代码或全部代码)
double method(double num)
{
//return (num*num-2);
return exp(num)+10*num-2;
}
int main()
{
cout<<"请输入区间[a,b]:"<<endl;
double a,b,range;
cout << "a=";
cin>>a;
cout << "b=";
cin >> b;
cout << "请输入误差范围:" << endl;
cin >> range;
double a0,b0;
a0=a;b0=b;
double temp;
int k=-1;
if(method(a)*method(b)>0)
cout<<"输入区间内无解"<<endl;
else
{
do
{
temp = (b+a)/2.0;
if(method(a)*method(temp)<0)
b= temp;
else
a= temp;
k++;
if(k == 0)
{
cout<<"a : "<<a<<endl;
cout<<"b : "<<b<<endl;
cout<<"temp:"<<temp<<endl<<endl;
}
else
{
cout<<"第"<<k<<"次:"<<endl;
cout<<"a : "<<a<<endl;
cout<<"b : "<<b<<endl;
cout<<"temp:"<<temp<<endl;
cout<<"y:"<<fabs(method(temp))<<endl;
cout<<endl;
}
}
while(abs(1/pow(2,k+1)*(b0-a0))>=range);
cout<<"解为: x="<<temp<<endl<<" f(x)="<<method(temp)<<endl;
}
return 0;
}
4、运行与测试(测试数据和实验结果分析)
测试数据:a=0,b=1,误差范围range=0.0005,
5、总结与心得
通过用c++实现用计算机计算二分法,加深了对二分法流程的了解,比如二分的起点是中点代入方程再进行判断是否达到误差范围而停止循环,而不是计算出中点为起点,这样会导致计算次数少一次,而达不到误差要求。虽然从结果来看,实现了二分的要求,但代码并不完善,虽然使用c++但用的是面向过程的,并没有用类,代码的复用性很差,换个方程使用二分法只能在代码中修改method(double num)方法实现。