9.5方程求根的数值试验.docx

上传人:聆听****声音 文档编号:715934 上传时间:2023-04-29 格式:DOCX 页数:10 大小:202.25KB
下载 相关 举报
9.5方程求根的数值试验.docx_第1页
第1页 / 共10页
9.5方程求根的数值试验.docx_第2页
第2页 / 共10页
9.5方程求根的数值试验.docx_第3页
第3页 / 共10页
9.5方程求根的数值试验.docx_第4页
第4页 / 共10页
9.5方程求根的数值试验.docx_第5页
第5页 / 共10页
9.5方程求根的数值试验.docx_第6页
第6页 / 共10页
9.5方程求根的数值试验.docx_第7页
第7页 / 共10页
9.5方程求根的数值试验.docx_第8页
第8页 / 共10页
9.5方程求根的数值试验.docx_第9页
第9页 / 共10页
9.5方程求根的数值试验.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

9.5方程求根的数值试验.docx

《9.5方程求根的数值试验.docx》由会员分享,可在线阅读,更多相关《9.5方程求根的数值试验.docx(10页珍藏版)》请在冰点文库上搜索。

9.5方程求根的数值试验.docx

数值分析实验报告

(二)倪萍(0611080103)

数值分析实验报告

(二)

班级:

06110801姓名:

倪萍学号:

0611080103日期:

2008-12-31

一课题名称:

方程求根的数值试验

二问题:

当用迭代法求方程的根时,我们从开始,并用公式

计算序列,为避免在每步都要计算导数,有人建议在每一步中都用来代替,也有人建议每隔一步计算一次公式中的导数,这个方法由下式给出:

对比以上建议的2种方法,以几个已知其根的简单函数为例,与法作数值比较,打印出每种算法的误差,以检查收敛性,这两种算法的效果如何?

三计算公式以及算法:

(Ⅰ)迭代法:

(1)

(Ⅱ)在每一步中都用来代替

(2)

(Ⅲ)每隔一步计算一次公式中的导数

;(3)

四数据流向图

恰当选择迭代的初始值

给出其导函数

给出已知其根的简单函数

Y

输出结果

判断是否符合精度要求

对上面的是三种算法分别进行迭代

N

五符号引用

标志符

数学符号

类型

个数

作用

i

整型

不定

迭代次数

X0/y0/z0

实型

不定

初始值、迭代后的值以及最后结果

X1/y1/z1

实型

不定

中间变量

a

实型

1

的值

m

实型

1

的值

六函数说明

实验中选取了两个简单的函数进行了实验,即:

(1);则

(2);则

函数分别为对进行迭代法,在每一步中都用来代替,每隔一步计算一次公式中的导数的程序。

函数分别为对进行迭代法,在每一步中都用来代替,每隔一步计算一次公式中的导数的程序。

七流向图

i=0;根据已经选定的X0/y0/z0,赋值给X1/y1/z1

利用公式(3),计算x0

利用公式

(2),计算x0

利用公式

(1),计算x0

(Ⅲ)

(Ⅱ)

(Ⅰ)

输出,结束

输出误差

Y

N

八模块和程序

1.迭代模块

do

{

if(i%2==0)

{a=g1(z0);}

z1=z0;

z0=z1-g(z1)/a;

i++;

cout<<"x"<

"<

}

while(fabs(z0-4)>1e-15);

当迭代次数为偶数时,即i为2的倍数时,计算一次公式的导数的值。

当时,即尚未达精度要求,则需要继续计算,迭代。

2.源程序

#include

#include

#include

floatf(floatx)

{returnx*x-1.0;}//以函数f(x)=x^2-1为例

floatf1(floaty)

{return2.0*y;}//函数f(x)=x^2-1的导数为f'(x)=2*x

floatg(floatm)

{returnsqrt(m)-2.0;}//以函数f(x)=sqrt(x)-2为例

floatg1(floatn)

{return1.0/(2*sqrt(n));}

voidN(floatx0)//用Newton迭代算法

{

floatx1;

inti=0;

cout<<"迭代初值为:

"<<'\t'<<"x0="<

do

{

x1=x0;

x0=x1-f(x1)/f1(x1);

i++;

cout<<"x"<

"<

}

while(fabs(x1-x0)>1e-15);

}

voidN1(floaty0)//导数用f'(x0)来代替

{

floaty1,a;

a=f1(y0);//计算出f'(x0)的值

inti=0;

cout<<"迭代初值为:

"<<'\t'<<"x0="<

cout<<"f'(x0)的值为:

"<

do

{

y1=y0;

y0=y1-f(y1)/a;

i++;

cout<<"x"<

"<

}

while(fabs(y1-y0)>1e-15);

}

voidN2(floatz0)//每隔一步计算一次导数

{

floatz1,m;

inti=0;

cout<<"迭代初值为:

"<<'\t'<<"x0="<

do

{

if(i%2==0)

{m=f1(z0);}

z1=z0;

z0=z1-f(z1)/m;

i++;

cout<<"x"<

"<

}

while(fabs(z0-z1)>1e-15);

}

voidG(floatx0)

{

floatx1;

inti=0;

cout<<"迭代初值为:

"<<'\t'<<"x0="<

do

{

x1=x0;

x0=x1-g(x1)/g1(x1);

i++;

cout<<"x"<

"<

}

while(fabs(x1-x0)>1e-15);

}

voidG1(floaty0)

{

floaty1,a;

a=g1(y0);

inti=0;

cout<<"迭代初值为:

"<<'\t'<<"x0="<

cout<<"g'(x0)的值为:

"<

do

{

y1=y0;

y0=y1-g(y1)/a;

i++;

cout<<"x"<

"<

}

while(fabs(y1-y0)>1e-15);

}

voidG2(floatz0)

{

floatz1,a;

inti=0;

cout<<"迭代初值为:

"<<'\t'<<"x0="<

do

{

if(i%2==0)

{a=g1(z0);}

z1=z0;

z0=z1-g(z1)/a;

i++;

cout<<"x"<

"<

}

while(fabs(z0-4)>1e-15);

}

voidmain(void)

{

cout<<"一、以函数f(x)=x^2-1为例,已知其根为1,-1。

"<

cout<<"1.1.用Newton迭代算法:

"<

N(0.78);

cout<

cout<<"1.2.每一步中都用来代替的算法:

"<

N1(0.78);

cout<

cout<<"1.3.每隔一步计算一次公式中的导数的算法:

"<

N2(0.78);

cout<

cout<<"二、以函数f(x)=sqrt(x)-2为例,已知其根为4。

"<

cout<<"2.1.用Newton迭代算法:

"<

G

(2);

cout<

cout<<"2.2.每一步中都用来代替的算法:

"<

G1

(2);

cout<

cout<<"2.3.每隔一步计算一次公式中的导数的算法:

"<

G2

(2);

}

注:

函数N,G基本思路、原理是相同的,只是将函数换了而已,方法简单、易懂,但不够简洁,可以考虑重新编程序,将他们用同一个函数表示出来,而调用时的参数不同来加以区分,这样可以简化程序,减少程序的篇幅。

九结果讨论

1.程序运行结果如下:

(1)开始调试程序时所选取的初值,导致迭代发散:

初值为0.15时,采用(Ⅲ)迭代所得根为-1:

(2)下面是改变出始值之后的结果

函数的计算结果

函数的计算结果

2.结果讨论:

从上面两个函数的例子,比较三种算法所得的结果,可以看出来迭代法和方法(Ⅲ)收敛的速度比较快,而(Ⅱ)的收敛速度相对较慢,达到相同精度的迭代次数要远大于其他两种方法(如二中,迭代法和方法(Ⅲ)的次数分别为4、5,而方法(Ⅱ)需要迭代14次)。

八问题思考与总结

通过编写和调试程序,熟悉了迭代法。

程序中,采用了平时所熟悉的do…while循环,使得程序易于理解,但程序的最后一步,即当结果满足误差的范围时,还会多进行一次迭代。

对于第一个函数,开始时初值的选取不合理,造成了程序迭代的次数比较多,甚至还造成了死循环。

分析后知:

这是因为迭代法的局部收敛性,选取了适当的初值,最终得到了正确的结果同时,在选取初值时,我发现,对上面的,对于方法(Ⅲ),选取初值为0.15时,它与根1更接近,但是在迭代过程中,它恰恰收敛到了-1,但如果选取初值0.78,它收敛到了1。

这也进一步说明,迭代时,需要恰当的选取初值,这对结果的影响比较大。

其次,(Ⅱ)中想通过用来代替,以减少计算量,结果导致计算次数的增加,甚至使本来收敛的初值的迭代变得发散,所以方法不可取,而每隔一步计算一次公式中的导数的算法比较容易让人接受。

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2