《数值分析》实验报告.docx
- 文档编号:24312395
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:16
- 大小:135.57KB
《数值分析》实验报告.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法较慢,但是它的工作量较小,是一种较好的方法。 各种方法都有其优点和不足,在解决问题时应该根据需要即条件选取适当的方法。 求解非线性方程组的方法还有抛物线法等。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值分析 数值 分析 实验 报告