您当前的位置:首页 > 计算机论文>计算机应用论文

数值分析与实验

2015-07-04 20:20 来源:学术参考网 作者:未知

  论文关键词: 列主元高斯消去法 雅可比法 高斯-赛德尔迭代法 幂法

  论文摘要:本文通过实例对线性方程组数值解法和矩阵的特征值及特向量的计算进行了探讨。在对线性方程组数值解法的讨论下用到了列主元高斯消去法、雅可比法和高斯-赛德尔迭代法。正是高斯消去法在消元时存在一些必须的条件,才启发我们通过列主元高斯消去法来对线性方程组数值解法作进一步的研究,达到了很好的的效果。同时用雅可比法和高斯-赛德尔迭代法对相类似的问题的探讨来比较它们的优劣,使我们在分析问题时能更好的把握方法。在求矩阵按模最大的特征值及对应特征向量时,本文用到了幂法,可以使现实中很多复杂的计算简单。

  第一章:线性方程组数值解法

  实验目的

  熟悉求解线性方程组的有关理论和方法 ;会编制列主元消去法,雅可比及高斯-赛德尔迭代法的程序 ;通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。

  实验内容

  列主元高斯消去法求解线形方程组;

  雅可比法和高斯-赛德尔迭代法解方程组;

  1.1 题目:列主元高斯消去法求解线形方程组

  方程组为:

  1.1.1 列主元高斯消去法算法

  将方程用增广矩阵 表示

  1) 消元过程

  对k=1,2,….,n-1

  1 选主元,找 使得

  2 如果 则矩阵a奇异,程序结束;否则执行3

  3 如果 则交换第k行与第 行对应元素位置, j=k,…,n+1

  4 消元,对i=k+1,…,n计算 对j=k+1,…,n+1计算

  2) 回代过程

  1 若 则矩阵a奇异,程序结束;否则执行2

  2 ;对i=n-1,…2,1计算

#include

#include

void colpivot(float *c,int n,float x[])

{ int i,j,t,k;

float p;

for(i=0;i<=n-2;i++)

{k=i;

for(j=i+1;j<=n-1;j++)

if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))k=j;

if(k!=i)

for(j=i;j<=n;j++)

{

p=*(c+i*(n+1)+j);

*(c+i*(n+1)+j)=*(c+k*(n+1)+j);

*(c+k*(n+1)+j)=p;

}

for(j=i+1;j<=n-1;j++)

{

p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));

for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));

}

}

for(i=n-1;i>=0;i--)

{

for(j=n-1;j>=i+1;j--)

(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));

x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));

}

}


void main()

{

void colpivot(float*,int,float[]);

int i;

float x[4];

float c[4][5]={1,-1,2,-1,-8,2,-2,3,-3,-20,1,1,1,0,-2,1,-1,4,3,4,};

colpivot(c[0],4,x);

for(i=0;i<=3;i++)printf("x[%d]=%f\n",i,x[i]);

}

  1.1.3 输出结果

  

  1.1.4结果分析

  从输出结果可以得到 =-6.999999,=3.000000,

   =2.000000,=2.000000

  从结果和过程可以知道这种方法一般能保证舍入误差不扩散,这个方法基本上是稳定的。wWw.133229.cOm


  1.2 题目 雅可比法解方程组

  方程组为:

  1.2.1 雅可比迭代法算法

  设方程组ax=b的系数矩阵的对角线元素(i=1,2,…,n),m为迭代次数容许的最大值 为容许误差。

  1 取初始向量 令k=0.

  2 对i=1,2,…,n计算

  3 如果则输出结果;否则执行4

  4 如果则不收敛,终止程序;否则,转2


  1.2.2 程 序

#include

#include

#define eps 1e-6

#define max 100

void jacobi(float *a,int n,float x[])

{

int i,j,k=0;

float epsilon,s;

float *y= new float [n];

for(i=0;i

while(1)

{

epsilon=0;

k++;

for(i=0;i

{

s=0;

for(j=0;j

{

if(j==i)continue;

s+=*(a+i*(n+1)+j)*x[j];

}

y[i]=(*(a+i*(n+1)+n)-s)/(*(a+i*(n+1)+i));

epsilon+=fabs(y[i]-x[i]);

}

for(i=0;i

if(epsilon

{printf("die dai ci shu wei:%d\n",k);return;}

if(k>=max)

{printf("die dai fa san");return;}

}

delete y;

}

void main()

{s

int i;

float a[4][5]={10,-1,2,0,-11,0,8,-1,3,-11,2,-1,10,0,6,-1,3,-1,11,25};

float x[4];

jacobi(a[0],4,x);

for(i=0;i<4;i++)printf("x[%d]=%f\n",i,x[i]);

}

  1.2.3 输出结果

  
  1.2.4 结果分析

  迭代次数增加时,精度越高。从输出结果可以看出此方程组的迭代次数为17,迭代结果越来越接近精确解了,于是

    =-1.467391, =-2.358696, =0.657609, =2.842391

  1.3 题目 高斯-赛德尔迭代法解方程组

  方程组为:

  1.3.1 高斯-赛德尔迭代法算法

  设方程组ax=b的系数矩阵的对角线元素(i=1,2,…,n),m为迭代次数容许的最大值 为容许误差。

  1 取初始向量令k=0.

  2 对i=1,2,…,n计算

  3 如果则输出结束;否则执行4

  4 如果则不收敛,终止程序;否则,转2

  1.3.2 程 序

#include

#include

#define n 600

void main()

{

int i;

float x[4];

float c[4][5]={10,-1,2,0,-11,0,8,-1,3,-11,2,-1,10,0,6,-1,3,-1,11,25};

void gaussseidel(float *,int,float[]);

gaussseidel(c[0],4,x);

for(i=0;i<=3;i++)printf("x[%d]=%f\n",i,x[i]);

}

void gaussseidel(float *a,int n,float x[])

{

int i,j,k=1;

float d,dx,eps;

for(i=0;i

while(1)

{eps=0;

for(i=0;i

{

d=0;

for(j=0;j

{

if(j==i)continue;

d+=*(a+i*(n+1)+j)*x[j];

}

dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));

eps+=fabs(dx-x[i]);

x[i]=dx;

}

if(eps<1e-6)

{printf("迭代次数是:%d\n",k);return;}

if(k>n)

{

printf("迭代发散n\n");

return;

}

  k++;}}

  1.3.3 输出结果

  

  1.3.4 结果分析

  从输出结果可以看出此方程组的迭代次数为7,此时能得到精确结果是

   =-1.377632, =-1.281579, =0.747368, =-107374176

  从结果和原有知识可以知道其系数矩阵是严格对角占优的。所以此迭代解法有很好的收敛性。

  1.4 方法比较

  雅可比法和高斯-赛德尔迭代法解方程组两种方法的比较 。

  由于此题的系数矩阵是严格对角占优的,所以雅克比迭代法和高斯-赛德尔迭代法都是收敛的,这两种迭代法没迭代一步均是作一次矩阵和向量的乘法,但前者需要2组工作单元分别存放,而后者只需要1组工作单元。对于同一个线性方程组,这两种方法可能同时收敛,也可能同时发散,也可能其一收敛,而另一发散。但当两者皆收敛时,一般来说高斯-赛德尔迭代法比雅克比迭代法收敛快。实际中更多的是使用逐次超松弛迭代法。

  第二章 矩阵的特征值及特征向量的计算

  实验目的

  在数学和物理中,很多问题都需要计算矩阵的特征值及特征向量,它们是线性代数中的一个重要课题,而在实际问题中,这样的计算是很复杂的,有的要求矩阵按模最大特征值及相应的特征向量,有些则要求全部特征值及特征向量,根据不同的要求计算方法大体上可分为2种类型。本实验用的是幂法求矩阵按模最大的特征值及对应特征向量,要求领会求矩阵特征值及特征向量的幂法的方法,并要求会编制幂法的计算程序,来计算有关问题。

  实验内容

  利用幂法求矩阵按模最大的特征值及对应特征向量。

  2.1 幂法求矩阵按模最大的特征值及对应特征向量

   用幂法求矩阵按模最大的特征值及其相应的特征向量,使

  2.1.1 幂法算法

  幂法是求矩阵主特征值的一种迭代方法。设有n个线性无关的特征向量,而相应的特征值满足,则对任意非零初始向量按下述公式构造向量序列:

  

  其中表示中最大的分量,并且有

  用幂法计算实对称矩阵的特征值时,可用rayleigh商作加速。设的rayleigh商为

  当时,将比更快趋于

  2.1.2 程 序

  
  2.1.3 输出结果

  

  2.1.4结果分析

  主特征值为:98.521690;相应的特征向量为

  幂法是求矩阵主特征值的一种有效方法,特别当矩阵为大型稀疏(即矩阵元素中0元素较多)时,更显得如此。但由于特征值的分布无法事先预测,因此不能控制收敛速度,往往需要利用某些加速技巧。所以计算时我们要根据需要选择计算方法来计算矩阵的特征值及特征向量。

  参考文献

  [1] 袁尉平,孙志忠等.计算实习方法.南京:东南大学出版社.2005

  [2] 李庆扬,王能超等.数值分析.北京:清华大学出版社. 2001

  [3] 谭浩强.c程序设计.北京:清华大学出版社.1999

  [4] 孙志忠.计算方法与实习学习指导.南京:东南大学出社.2005

  [5] 孙志忠.计算方法典型例题分析.北京:科学出版社.2005

  [6] 曹志浩.张玉德等.矩阵计算与方程求根.北京:人民教育出版社.1979

相关文章
学术参考网 · 手机版
https://m.lw881.com/
首页