计算方法实验报告4.docx
《计算方法实验报告4.docx》由会员分享,可在线阅读,更多相关《计算方法实验报告4.docx(16页珍藏版)》请在冰豆网上搜索。
计算方法实验报告4
计算方法实验报告(四)
(一)线性方程的迭代解法
一、实验问题
利用简单迭代法,两种加速技术,牛顿法,改进牛顿法,弦割法求解习题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);
whileepsx=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;
whileepsx1=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)赛德尔迭代法运行结果如下:
五、结果分析
通过观察运行结果很容易发现使用赛德尔迭代法求解此线性方程组具有明显的优势,它的迭代次数明显少于雅克比迭代法,因此收敛速度更快。
六、实验的总结与体会
在求解线性方程组的时候除了直接法外,还可以选用迭代法。
由于直接法受到计算机内存容量的限制,所以较多的选用迭代法。
迭代法是一种逐次逼近的方法,具有原理简单、程序编写方便、占用内存少等优点,但存在是否收敛与收敛速度快慢的问题,不能盲目使用。
我们在处理具体的问题时,要根据实际情况选择合适的迭代方法。