《数值分析》实验报告.docx

上传人:b****2 文档编号:24312395 上传时间:2023-05-26 格式:DOCX 页数:16 大小:135.57KB
下载 相关 举报
《数值分析》实验报告.docx_第1页
第1页 / 共16页
《数值分析》实验报告.docx_第2页
第2页 / 共16页
《数值分析》实验报告.docx_第3页
第3页 / 共16页
《数值分析》实验报告.docx_第4页
第4页 / 共16页
《数值分析》实验报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

《数值分析》实验报告.docx

《《数值分析》实验报告.docx》由会员分享,可在线阅读,更多相关《《数值分析》实验报告.docx(16页珍藏版)》请在冰豆网上搜索。

《数值分析》实验报告.docx

《数值分析》实验报告

《数值分析》实验报告

实验序号:

实验三题目名称:

解非线性方程

学号:

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法较慢,但是它的工作量较小,是一种较好的方法。

各种方法都有其优点和不足,在解决问题时应该根据需要即条件选取适当的方法。

求解非线性方程组的方法还有抛物线法等。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1