《数值分析》实验报告.docx
《《数值分析》实验报告.docx》由会员分享,可在线阅读,更多相关《《数值分析》实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
《数值分析》实验报告
《数值分析》实验报告
实验序号:
实验三题目名称:
解非线性方程
学号:
20101104200姓名:
葛广帅
任课教师:
马季骕专业班级:
10计算机科学与技术(非师范)
1.实验目的:
理解并掌握二分法、迭代法、牛顿法、弦线法解非线性方程求根的原理,掌握相应的求根原理,算法原理,通过计算机解决实验问题。
2、实验内容:
(1)求方程X3-3*X-1=0在X=2附近的根。
(2)保留四位有效数字。
3.实验代码:
#include
#include
#include
#include
#defineexp1e-5//精度要求
#defineExp1e-8//判零条件
#defineF(x)(x*x*x-x*x-1)//F(x)函数
#definef(x)(3*x*x-2*x)
#defineQ1(x)(pow(1+x*x,1.0/3))//导数为0.30
#defineQ2(x)(1+1.0/(x*x))//导数为0.59
usingnamespacestd;
intmenu();
voidfun1();
voidfun2();
voidfun31();
voidfun32();
voidfun3();
voidfun4();
voidfun5();
intmain()
{
intoper;
while
(1)
{
oper=menu();
switch(oper)
{
case1:
fun1();break;
case2:
fun2();break;
case3:
fun3();break;
case4:
fun4();break;
case5:
fun5();break;
case6:
exit
(1);
}
}
return0;
}
intmenu()
{
intoper;
cout<<"**************************************"<cout<<"实验三方程(x*x*x-x*x-1=0)求根"<cout<<"**************************************"<cout<<"1对分区间法"<cout<<"2黄金分割法"<cout<<"3迭代法"<cout<<"4牛顿法"<cout<<"5弦位法"<cout<<"6退出"<cout<<"**************************************"<cout<<"请选择操作方法:
";cin>>oper;
system("cls");
returnoper;
}
voidfun1()//对分区间法
{
doublea,b,c;
doubleFa,Fb,Fc;
intk;
cout<<"***************************************************************"<cout<<"对分区间法演示"<cout<<"***************************************************************"<cout<<"---------------------------------------------------------------"<cout<<"k根所在区间F(a)F(b)F((a+b)/2)"<cout<<"---------------------------------------------------------------"<k=0;
a=1;b=2;
Fa=F(a);Fb=F(b);
while((b-a)/2>exp)
{
cout<<""<(2)<k++;
c=(a+b)/2;
Fc=F(c);
cout<<""<if(Fc>0)cout<<"";
cout<if(fabs(Fc){
cout<<""<(2)<break;
}
elseif(Fc*Fa>0)
{
Fa=Fc;
a=c;
}
else
{
Fb=Fc;
b=c;
}
}
system("pause");
system("cls");
return;
}
voidfun2()//黄金分割法
{
doublea,b,c;
doubleFa,Fb,Fc;
intk;
cout<<"***************************************************************"<cout<<"黄金分割法演示"<cout<<"***************************************************************"<cout<<"---------------------------------------------------------------"<cout<<"k根所在区间F(a)F(b)F((a+b)/2)"<cout<<"---------------------------------------------------------------"<k=0;
a=1;b=2;
Fa=F(a);Fb=F(b);
while((b-a)/2>exp)
{
cout<<""<(2)<k++;
c=a+(b-a)*0.618;
Fc=F(c);
cout<<""<if(Fc>0)cout<<"";
cout<if(fabs(Fc){
cout<<""<(2)<break;
}
elseif(Fc*Fa>0)
{
Fa=Fc;
a=c;
}
else
{
Fb=Fc;
b=c;
}
}
system("pause");
system("cls");
return;
}
voidfun3()
{
intnum;
cout<<"**************************"<cout<<"迭代法演示"<cout<<"**************************"<cout<<"1Q(x)=pow(1+x*x,1.0/3)"<cout<<"Q'(x)=0.30"<cout<<"2Q(x)=1+1.0/(x*x)"<cout<<"Q'(x)=0.59"<cout<<"0返回主界面"<cout<<"--------------------------"<cout<<"请选择迭代方式:
";cin>>num;
system("cls");
switch(num)
{
case1:
fun31();break;
case2:
fun32();break;
case0:
return;
}
fun3();
}
voidfun31()//迭代法1
{
intk;
doublex,xx;
k=0;
x=1.5;
xx=Q1(x);
cout<<"**************************"<cout<<"迭代法演示(Q'(x)=0.30)"<cout<<"**************************"<cout<<"--------------------------"<cout<<"kX(k)"<cout<<"--------------------------"<cout<<""<(2)<while(fabs(xx-x)>exp)
{
x=xx;
xx=Q1(x);
k++;
cout<<""<(2)<}
system("pause");
system("cls");
return;
}
voidfun32()//迭代法2
{
intk;
doublex,xx;
k=0;
x=1.5;
xx=Q2(x);
cout<<"**************************"<cout<<"迭代法演示(Q'(x)=0.59)"<cout<<"**************************"<cout<<"--------------------------"<cout<<"kX(k)"<cout<<"--------------------------"<cout<<""<(2)<while(fabs(xx-x)>exp)
{
x=xx;
xx=Q2(x);
k++;
cout<<""<(2)<}
system("pause");
system("cls");
return;
}
voidfun4()//牛顿法
{
intk;
doublex,xx;
x=1.5;
xx=x-F(x)/f(x);
k=0;
cout<<"**************************"<cout<<"牛顿法演示"<cout<<"**************************"<cout<<"--------------------------"<cout<<"kX(k)"<cout<<"--------------------------"<cout<<""<(2)<while(fabs(xx-x)>exp)
{
x=xx;
xx=x-F(x)/f(x);
k++;
cout<<""<(2)<}
system("pause");
system("cls");
return;
}
voidfun5()//弦位法
{
intk;
doublex0,x1,Fx0,Fx1,x2,Fx2;
x0=1;x1=2;
Fx0=F(x0);
Fx1=F(x1);
k=0;
cout<<"**************************"<cout<<"弦位法演示"<cout<<"**************************"<cout<<"--------------------------"<cout<<"kX(k)"<cout<<"--------------------------"<cout<<""<(2)<while(fabs(x1-x0)>Exp)
{
x2=x1-Fx1*(x1-x0)/(Fx1-Fx0);
Fx2=F(x2);
x0=x1;
Fx0=Fx1;
x1=x2;
Fx1=Fx2;
k++;
cout<<""<(2)<if(fabs(Fx2){
break;
}
}
system("pause");
system("cls");
return;
}
4.结果分析:
分析:
对分区间法简单,有根区间以1/2的比率缩小,所以它是线性收敛的。
它的缺点是只能用于求实根,而且不能求偶重根,收敛速度较慢。
迭代法需要判断迭代方程的收敛性,即需要满足李氏条件且李氏常数L<1,当L越接近于零,迭代收敛就越快。
Newton法有十分明显的几何意义,它的收敛速度最快,是二阶收敛,但是它每次迭代都需要计算一次函数值和一次导数值,因此它的计算量比较大。
弦位法的收敛阶是1.618,收敛速度相对于Newton法较慢,但是它的工作量较小,是一种较好的方法。
各种方法都有其优点和不足,在解决问题时应该根据需要即条件选取适当的方法。
求解非线性方程组的方法还有抛物线法等。