计算方法实验报告.docx

上传人:b****6 文档编号:7531375 上传时间:2023-01-24 格式:DOCX 页数:15 大小:101.52KB
下载 相关 举报
计算方法实验报告.docx_第1页
第1页 / 共15页
计算方法实验报告.docx_第2页
第2页 / 共15页
计算方法实验报告.docx_第3页
第3页 / 共15页
计算方法实验报告.docx_第4页
第4页 / 共15页
计算方法实验报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

计算方法实验报告.docx

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

计算方法实验报告.docx

计算方法实验报告

计算方法实验报告(四)

(一)线性方程的迭代解法

一、实验问题

利用简单迭代法,两种加速技术,牛顿法,改进牛顿法,弦割法求解习题5-1,5-2,5-3中的一题,并尽可能准确。

选取5-3:

在x=1.5附近的根。

二、问题的分析(描述算法的步骤等)

(1)简单迭代法算法:

给定初始近似值

的解。

Step1令i=0;

Step2令

(计算

);

Step3如果

则迭代终止,否则重复Step2。

(2)Aitken加速法算法

Step1令k=0,利用简单迭代算法

得到迭代序列

Step2令

-

(计算

,其中k=0,1,2…);

Step3如果

则迭代终止,否则重复Step2。

(3)插值加速法算法

Step1令k=0,利用简单迭代算法

得到迭代序列

Step2令

+

(计算

,其中k=1,2

3…);

Step3如果

则迭代终止,否则重复Step2。

(4)牛顿法算法

Step1给定初始近似值

Step2令

其中k

Step3如果

则迭代终止,否则重复Step2。

(5)改进牛顿法的算法

Step1给定初始近似值

Step2令

其中k

Step3如果

则迭代终止,否则重复Step2。

(6)弦割法算法(双点弦割法)

Step1给定初始近似值

Step2令

其中k

Step3如果

则迭代终止,否则重复Step2。

三、程序设计

(1)简单迭代法

利用迭代公式

进行迭代运算。

#include

#include

#include

doublefun(doublex)

{

doublec=1+x*x;

returnpow(c,1/3.0);

}

voidmain()

{

doublex=1.5;

doubley=0;

doubleD=1;

doublee=0.001;

while(D>e)

{

D=0;

y=fun(x);

if(fabs(y-x)>=D)

{

D=fabs(y-x);

}

x=y;

}

cout<

}

(2))Aitken加速法源程序如下:

x1=1.5;

eps=0.0001;

y1=(1+x1^2)^(1/3);

z1=(1+y1^2)^(1/3);

x=z1-(z1-y1)^2/(z1-2*y1+x1);

whileeps

x=x2;

x1=y1;

y1=(1+x1^2)^(1/3);

z1=(1+y1^2)^(1/3);

x2=z1-(z1-y1)^2/(z1-2*y1+x1);

n=n+1;

end

fprintf('迭代次数n=%.0f\n',n);

fprintf('x2=%.5f\n',x2)

(3)插值加速法源程序如下:

x1=0;

x2=1.5;

eps=0.0000001;

y1=0;

z1=0;

n=0;

whileeps

x1=x2;

y1=(1+x1^2)^(1/3);

z1=(1+y1^2)^(1/3);

x2=z1+(z1-y1)^2/(z1-2*y1+x1);

n=n+1;

end

fprintf('迭代次数n=%.0f\n',n);

fprintf('x2=%.5f\n',x2)

(4)牛顿法:

利用公式

进行迭代运算

程序设计如下:

#include

#include

doublefun(doublex)

{

doublea=2*pow(x,3.0)-pow(x,2.0)+1;

doubleb=3*pow(x,2.0)-2*x;

returna/b;

}

voidmain()

{

doublex=1.5;

doubley=0;

doubleD=1;

doublee=0.001;

doublef=0;

while(D>e)

{

D=0;

y=fun(x);

if(fabs(y-x)>=D)

{

D=fabs(y-x);

}

x=y;

f++;

}

cout<

cout<<"f="<

}

(5)运用改进牛顿法:

迭代公式:

程序代码如下:

#include

#include

doublefun(doublex)

{

doublea=2*pow(x,3.0)-pow(x,2.0)+1;

doubleb=3*pow(x,2.0)-2*x;

doublec=pow((pow(x,3.0)-pow(x,2.0)-1),2.0);

doubled=(6*x-2)/12;

returna/b-c*d;

}

voidmain()

{

doublex=1.5;

doubley=0;

doubleD=1;

doublee=0.001;

doublef=0;

while(D>e)

{

D=0;

y=fun(x);

if(fabs(y-x)>=D)

{

D=fabs(y-x);

}

x=y;

f++;

}

cout<

cout<<"f="<

}

(6)利用弦割法

利用公式

程序代码:

#include"stdafx.h"

#include

usingnamespacestd;

#include

doublefua(doublel)

{

returnpow(l,3.0)-pow(l,2.0)-1;

}

int_tmain(intargc,_TCHAR*argv[])

{

doublex=1.4;

doubley=0;

doubleD=1;

doublee=0.001;

doublef=0;

while(D>e)

{

D=0;

y=x-fua(x)*(x-1.5)/(fua(x)-0.125);

if(fabs(y-x)>=D)

{

D=fabs(y-x);

}

x=y;

f++;

}

cout<

cout<<"f="<

return0;

}

四、计算结果

(1)简单迭代法的运行结果:

x=1.46624

(2)Aitken加速法运行结果如下:

迭代次数n=15

x2=1.46557

(3)插值加速法运行结果如下:

迭代次数n=15

x2=1.46557

(4)牛顿迭代法的运行结果如下

(5)改进牛顿迭代法运行结果:

(6)弦割法的运行结果

五、结果分析

通过实验很容易发现在相同的准确数字时,加速迭代法的迭代次数明显少于简单的迭代法。

但仅仅就实验结果而言,牛顿迭代法和改进的牛顿迭代法与弦割法所得运行结果相同,但是改进的迭代法速度比牛顿迭代法要快速。

六、实验的总结与体会

迭代法是一种逐次逼近的方法,且都是局部收敛的,具有原理简单,编写程序方便等优点,但还存在是否收敛与收敛速度快慢的问题,不能盲目使用。

当迭代过程只有线性收敛速度时,可采用埃特金加速法实现加速。

牛顿法是一种特殊的迭代法,用于求方程单根时具有二阶收敛速度。

但牛顿法对初值的要求苛刻,而且需要求函数的导数,遇到求导数复杂的情形,常用弦割法求解。

弦割法是对牛顿法的变形,不需要求函数的导数,但收敛阶不高,而且需要提供两个较好的初值。

(二)线性方程组的迭代解法

一、实验问题

利用雅可比迭代法,赛德尔迭代法求解如下方程组

二、问题的分析(描述算法的步骤等)

雅克比迭代法算法如下:

(1)

(2)

(3)

(4)对i=1

(5)若D

(6)输出

赛德尔迭代法算法如下

(3)

(4)若D

(5)输出

三、程序设计

(1)运用雅可比迭代法进行迭代:

代码如下:

#include

#include

voidmain()

{

doublex[3]={0,0,0};

doublea[3][3]={-8,1,1,1,-5,1,1,1,-4};

doubleb[3]={1,16,7};

doubley[3];

doublee=0.04;

doubleD=1;

intf=0;

while(D>e)

{

D=0;

for(intc=0;c<5;c++)

{

for(inti=0;i<3;i++)

{

y[i]=b[i];

for(intj=0;j<3;j++)

{

if(j!

=i)

{

y[i]=y[i]-a[i][j]*x[j];

}

}

y[i]=y[i]/a[i][i];

if(fabs(x[i]-y[i])>=D)

{

D=fabs(x[i]-y[i]);

}

}

for(intl=0;l<3;l++)

{

x[l]=y[l];

}

}

f++;

}

for(intk=0;k<3;k++)

{

cout<

}

cout<

}

(2)赛德尔迭代法源代码如下:

程序代码:

#include

#include

#include

voidmain()

{

doublex[3]={0,0,0};

doublea[3][3]={-8,1,1,1,-5,1,1,1,-4};

doubleb[3]={1,16,7};

doubley;

doublee=0.0001;

doubleD=1;

doublef=0;

while(D>e)

{

D=0;

for(intc=0;c<5;c++)

{

for(inti=0;i<3;i++)

{

y=b[i];

for(intj=0;j<3;j++)

{

if(j!

=i)

{

y=y-a[i][j]*x[j];

}

}

y=y/a[i][i];

if(fabs(x[i]-y)>=D)

{

D=fabs(x[i]-y);

}

}

for(intl=0;l<3;l++)

{

x[l]=y[l];

}

}

f++;

}

for(intk=0;k<3;k++)

{

cout<

};

cout<

}

四、计算结果

(1)雅克比迭代法运行结果如下:

(2)赛德尔迭代法运行结果如下:

五、结果分析

通过观察运行结果很容易发现使用赛德尔迭代法求解此线性方程组具有明显的优势,它的迭代次数明显少于雅克比迭代法,因此收敛速度更快。

六、实验的总结与体会

在求解线性方程组的时候除了直接法外,还可以选用迭代法。

由于直接法受到计算机内存容量的限制,所以较多的选用迭代法。

迭代法是一种逐次逼近的方法,具有原理简单、程序编写方便、占用内存少等优点,但存在是否收敛与收敛速度快慢的问题,不能盲目使用。

我们在处理具体的问题时,要根据实际情况选择合适的迭代方法。

..

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

当前位置:首页 > 初中教育 > 学科竞赛

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

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