数值计算方法实验报告Word文档格式.docx
- 文档编号:17679063
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:34
- 大小:279.49KB
数值计算方法实验报告Word文档格式.docx
《数值计算方法实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《数值计算方法实验报告Word文档格式.docx(34页珍藏版)》请在冰豆网上搜索。
通过每次把f(x)的零点所在区间收缩一半的方法,使区间内的两个端点逐步逼近函数零点,最终求得零点近似值。
四、操作方法与实验步骤
1.二分法:
#include<
>
intmain()
{
doublea=,b=;
doublex,s;
printf("
An\t\tBn\t\tF(Xn)\n"
);
while
(1)
{
x=(a+b)/2;
s=pow(x,3)+4*x*x-10;
if<
s&
&
s<
{
break;
}
elseif(s<
0)
a=x;
elseif(s>
b=x;
%f\t%f\t%f\n"
a,b,s);
X的值为:
%f\n"
x);
误差:
\t%f\n"
s);
return0;
}
2.割线法:
#include"
"
floatc,a=,b=;
每次得到的X的近似值:
\n"
{
c=b-(b*b*b+4*b*b-10)*(b-a)/(b*b*b+4*b*b-(a*a*a+4*a*a));
if(fabs(b-c)<
*break;
b=c;
b);
c);
五、实验结果与分析
二分法割线法
分析:
由程序知,使用二分法和割线法均能计算出方程的根,但利用割线法要比二分法计算的次数少,并且能够较早的达到精度要求。
相比之下,割线法程序代码量较少,精简明了。
六、讨论、心得
本次数值计算方法程序设计实验从习题练习中跳脱出来,直接面对实用性较强的程序代码编写。
效果很好,不仅加深对二分法、割线法的理解,还加强了实际用运能力。
将理论知识成功地转化成实践结果。
实验地点
北区多学科综合楼4506
指导教师
实验二线性方程组的直接解法
合理利用Gauss消元法、LU分解法、追赶法求解下列方程组:
1
2
3
1
2
3
4
(n=5,10,100,…)
高斯消元法:
将原方程组化为三角形方阵的方程组:
lik=aik/akk
aij=aij-lik*akj
(k=1,2,…,n-1i=k+1,k+2,…,nj=k+1,k+2,…,n+1)
由回代过程求得原方程组的解:
xn=ann+1/ann
xk=(akn+1-∑akjxj)/akk
完全主元素消元法流程图:
列主元素消元法:
LU分解法:
将系数矩阵A转化为A=L*U,L为单位下三角矩阵,U为普通上三角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x。
四、操作方法与实验步骤
1.完全主元素消元法:
floata[100][101];
floatx[10];
intN;
voidshuchu()
for(inti=1;
i<
=N;
i++)
for(intj=1;
j<
=N+1;
j++)
{
cout<
<
a[i][j]<
"
;
}
cout<
endl;
voidshuru()
cout<
请输入矩阵阶数:
cin>
N;
请输入矩阵各项:
cin>
a[i][j];
voidmain()
intz[10];
intmaxi,maxj;
shuru();
z[i]=i;
for(intk=1;
k<
k++)
maxi=k;
maxj=k;
floatmaxv=abs(a[k][k]);
for(i=k;
for(intj=k;
if(abs(a[i][j])>
maxv)
{
maxv=abs(a[i][j]);
maxi=i;
maxj=j;
}
if(maxi!
=k)
for(intj=1;
{
floatt=a[k][j];
a[k][j]=a[maxi][j];
a[maxi][j]=t;
}
if(maxj!
for(i=1;
floatt=a[i][k];
a[i][k]=a[i][maxj];
a[i][maxj]=t;
intt=z[k];
z[k]=z[maxj];
z[maxj]=t;
for(inti=k+1;
i++)
floatl=a[i][k]/a[k][k];
for(intj=k;
a[i][j]+=-l*a[k][j];
for(i=N;
i>
0;
i--)
floats=0;
for(intj=i+1;
s+=a[i][j]*x[z[j]];
x[z[i]]=(a[i][N+1]-s)/a[i][i];
完全主元素消去法之后的矩阵为:
<
shuchu();
for(i=1;
x["
]="
x[i]<
2.列主元素消元法:
{
floata[3][4]={{1,2,3,14},{0,1,2,8},{2,4,1,13}};
floatx[3];
floatsum=0;
intk,i,j;
for(k=0;
2;
k++)
for(i=k+1;
3;
i++)
for(j=k+1;
4;
a[i][j]=a[i][j]-a[i][k]/a[k][k]*a[k][j];
for(i=0;
i++)
for(j=0;
printf("
a[%d][%d]=%f"
i,j,a[i][j]);
x[2]=a[2][3]/a[2][2];
for(k=1;
k>
=0;
k--)
sum=0;
for(j=k+1;
sum+=a[k][j]*x[j];
x[k]=(a[k][3]-sum)/a[k][k];
}
printf("
x[%d]=%f\n"
i+1,x[i]);
3.LU分解法:
#include<
#defineL30
doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];
intn,i,j,k,r;
请输入矩阵元次:
scanf("
%d"
&
n);
请输入矩阵各项:
=n;
++i)
for(j=1;
++j)
{
scanf("
%lf"
a[i][j]);
请输入方程组的常数项:
++i)
scanf("
b[i]);
++j)
l[i][j]=0;
u[i][j]=;
++k)
for(j=k;
{
u[k][j]=a[k][j];
for(r=1;
r<
k;
++r)
u[k][j]-=l[k][r]*u[r][j];
}
}
l[i][k]=a[i][k];
++r)
l[i][k]-=l[i][r]*u[r][k];
l[i][k]/=u[k][k];
l[k][k]=;
y[i]=b[i];
i;
y[i]-=l[i][j]*y[j];
for(i=n;
--i)
x[i]=y[i];
for(j=i+1;
x[i]-=u[i][j]*x[j];
x[i]/=u[i][i];
printf("
%\n"
x[i]);
五、实验结果与分析
完全主元素消元法:
列主元素消元法:
分析:
对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素。
即,为了节约内存及时效,可以不必计算出主元素下方数据。
列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。
列主元素消元法的耗时比完全主元素法少很多,常采用之。
对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。
其中的L为n阶单位下三角阵、U为上三角阵.
本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间。
纠正各种语法、算法、思路错误。
最后勉强成功,但还是有几处警告,不得解决之法。
感到程序学习的不足,再加之对高斯的不甚了解。
编写过程很是痛苦。
查阅各种内外部资料,这点有利有弊。
突然觉得,应该再把数据结构之类的重新学习一下才行。
以后多花时间在编程吧,重在理解。
必须反省一下自己的C、C++学习了,还是得多加练习,平时必须养成一种好的算法思维习惯。
实验三线性方程组的迭代解法
使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。
设线性方程组Ax=b
的系数矩阵A可逆,且主对角元素a11,a22,…,ann均不为零,令
D=diag(a11,a22,…,ann)
并将A分解成A=(A-D)+D
从而线性方程组可写成Dx=(D-A)x+b
则有迭代公式
x(k+1)=B1x(k)+f1
其中,B1=I-D-1A,f1=D-1b。
各自详细流程图如下所示:
高斯—赛德尔迭代法
#include"
iostream"
iomanip"
usingnamespacestd;
inti,j,k=0,m,n;
doublet1,t2,e1,e2=;
请输入精度e:
e1;
请输入系数矩阵行数:
m;
请输入系数矩阵列数:
n;
double(**a)=newdouble*[m];
=m;
a[i]=newdouble[n];
double(*b)=newdouble[m];
double(*x)=newdouble[n];
cout<
请输入系数矩阵:
-------------------------------------------------------------"
for(intnum1=0;
num1<
num1++)
for(intnum2=0;
num2<
num2++)
a[num1][num2];
输入的系数矩阵为:
for(intnum3=0;
num3<
num3++)
for(intnum4=0;
num4<
num4++)
a[num3][num4]<
请输入矩阵b:
for(intnum5=0;
num5<
num5++)
cin>
b[num5];
输入的矩阵b为:
for(intnum6=0;
num6<
num6++)
b[num6]<
for(intnum7=0;
num7<
num7++)
x[num7]=;
do
第"
次迭代值:
e2=;
for(i=0;
doublesum=;
for(j=0;
if(j!
=i)
sum+=a[i][j]*x[j];
t1=x[i];
t2=e2;
x[i]=(b[i]-sum)/a[i][i];
e2=(x[i])-t1>
=0(x[i])-t1:
t1-(x[i]);
e2=(e2>
=t2e2:
t2);
setprecision(8)<
k++;
}while(e2>
=e1&
30);
共迭代了"
次"
delete[]a;
delete[]b;
delete[]x;
return0;
雅克比迭代法:
floata[3][3]={{10,-1,-2},{-1,10,-2},{-1,-1,5}},b[3]={,,};
floatx[3]={0,0,0},sum;
inti,j,k,n=3;
\t\tX[1]\t\tX[2]\t\tX[3]\n"
8;
sum=0;
for(j=0;
if(i==j)continue;
sum=sum+a[i][j]*x[j];
x[i]=(b[i]-sum)/a[i][i];
第%d次迭代:
\t"
k+1);
for(i=0;
%f\t"
高斯赛德尔迭代法:
雅克比迭代:
使用高斯-赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯-赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。
从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。
时效性上后者要好些。
这次试验算是比较成功,要归功于授课时候的认真听讲。
程序编写之前,对书本的理论知识进行了进一步的探索。
预习准备工作很彻底,自然随后的一切也都很顺利。
计Z1002班
19
张龙
实验四矩阵特征值与特征向量问题
使用幂法求A模为最大的特征值及其相应的特征向量。
幂法:
由已知的非零向量x0和矩阵A的乘幂构造向量序列{xn}以计算矩阵A的按模最大特征值及其特征向量的方法,称为幂法。
在计算过程,每步迭代中把向量xk进行规范化,即用xk乘以一个常数,使得其分量的模最大为1,这样,迭代公式变为:
其中,mk是yk模最大的第一个分量。
结果可取:
幂法流程图:
#defineN3
#defineeps1e-6
#defineM30
floatmaxvalue(floatx[],intn)
floatMax=x[0];
inti;
if(fabs(x[i])>
fabs(Max))
Max=x[i];
returnMax;
voidmatrix(float*A)
floatU[N],V[N],r1,r2,temp;
inti,j,k=0;
i++)U[i]=1;
while(k<
M)
temp=0;
j++)temp+=*(A+i*N+j)*U[j];
V[i]=temp;
U[i]=V[i]/maxvalue(V,N);
if(k==1)r1=maxvalue(V,N);
else
r2=maxvalue(V,N);
if(fabs(r2-r1)<
eps)break;
r1=r2;
迭代次数:
\t%d\n"
k);
矩阵的特征值:
r2);
("
U[i]);
)\n"
floatA[N][N]={{2,-1,0},{-1,2,-1},{0,-1,2}};
matrix(A[0]);
采用幂方法求解矩阵的最大特征值以及特征向量,其最大优点是计算简单,容易在计算机上实现,对稀疏矩阵较为适合。
但有时收敛速度很慢,时效性较差。
程序编写时详细分析了书上的求解过程,但最终结果还是有所出入。
课本的迭代次数只用7次,而程序运行之后显示为12次。
不明白那里原因。
推测是由于精确位数的不同导致。
最后在程序中更改了一下,验证得之。
实验五代数插值
使用拉格朗日插值法或牛顿插值法求解:
已知f(x)在6个点的函数值如下表所示,运用插值方法,求f的近似值。
X
f(x)
PC,Windows操作系统
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 计算方法 实验 报告