论文关键词: 列主元高斯消去法 雅可比法 高斯-赛德尔迭代法 幂法
论文摘要:本文通过实例对线性方程组数值解法和矩阵的特征值及特向量的计算进行了探讨。在对线性方程组数值解法的讨论下用到了列主元高斯消去法、雅可比法和高斯-赛德尔迭代法。正是高斯消去法在消元时存在一些必须的条件,才启发我们通过列主元高斯消去法来对线性方程组数值解法作进一步的研究,达到了很好的的效果。同时用雅可比法和高斯-赛德尔迭代法对相类似的问题的探讨来比较它们的优劣,使我们在分析问题时能更好的把握方法。在求矩阵按模最大的特征值及对应特征向量时,本文用到了幂法,可以使现实中很多复杂的计算简单。
第一章:线性方程组数值解法
实验目的
熟悉求解线性方程组的有关理论和方法 ;会编制列主元消去法,雅可比及高斯-赛德尔迭代法的程序 ;通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。
实验内容
列主元高斯消去法求解线形方程组;
雅可比法和高斯-赛德尔迭代法解方程组;
1.1 题目:列主元高斯消去法求解线形方程组
方程组为:
1.1.1 列主元高斯消去法算法
将方程用增广矩阵 表示
1) 消元过程
对k=1,2,….,n-1
1 选主元,找
2 如果 则矩阵A奇异,程序结束;否则执行3
3 如果 j=k,…,n+1
4 消元,对i=k+1,…,n计算
2) 回代过程
1 若 则矩阵A奇异,程序结束;否则执行2
2
1.1.2 程 序
#include <stdio.h>
#include <math.h>
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
从结果和过程可以知道这种方法一般能保证舍入误差不扩散,这个方法基本上是稳定的。