数值计算方法实验报告文档格式.docx

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

数值计算方法实验报告文档格式.docx

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

数值计算方法实验报告文档格式.docx

返回①重新循环,不断接近零点。

通过每次把f(x)的零点所在区间收缩一半的方法,使区间内的两个端点逐步逼近函数零点,最终求得零点近似值。

四、操作方法与实验步骤

1.二分法:

#include<

stdio.h>

stdlib.h>

math.h>

intmain()

{

doublea=1.0,b=2.0;

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(-0.000005<

s&

&

s<

0.000005)

{

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"

stdio.h"

math.h"

floatc,a=1.0,b=2.0;

每次得到的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)<

0.5*0.00001)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.完全主元素消元法:

iostream.h>

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]=0.0;

++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]=1.0;

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("

%0.2lf\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=0.0;

请输入精度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]=0.0000;

do

第"

次迭代值:

e2=0.0;

for(i=0;

doublesum=0.0;

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>

=t2?

e2:

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]={7.2,8.3,4.2};

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班

2010001419

张龙

2012.06.12

实验四矩阵特征值与特征向量问题

使用幂法求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次。

不明白那里原因。

推测是由于精确位数的不同导致。

最后在程序中更改了一下,验证得之。

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

当前位置:首页 > 教学研究 > 教学反思汇报

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

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