当前位置:文档之家› 计算方法实验三线性方程组解法列主元高斯消去法

计算方法实验三线性方程组解法列主元高斯消去法

实验报告
学院:电子信息工程
实验课程:计算方法
学生姓名:
学号:
专业班级:通信工程
实验三线性方程组解法
1 目的与要求
(1)进一步理解和掌握求线性方程组数值解的有关方法和理论。

(2)完成利用列主元高斯消去法、雅可比迭代法及高斯-赛德尔迭代法求线性方程组数值解的程序设计。

本次实验只需完成列主元高斯消去法的程序设计。

(3)比较三种算法的不同特点。

2 实验内容
通过编制程序,分别用列主元高斯消去法、雅可比迭代法及高斯-赛德尔迭代法计算如下方程组的解。

设初始值为要求满足前后两次迭代结果的差向量的
1 范数小于
3 实验原理
1)列主元高斯消去法
列主元高斯消去法就是在顺序高斯消去法的基础上,每步消元之前都要进行选主元操作,即在第k 步消元前,在第k 列的元素
中选取绝对值最大的元素,设为
,然后交换第 k 行和第 p 行,继续进行消去过程,直到获得上三角方程组,然后通过回代得到方程的根。

4 程序设计
(1)流程图
列主元高斯消去程序流程图
(2)程序代码
#include<stdio.h>
#include<math.h>
void main()
{
float a[3][4],x,s;
int i,j,m,k;
printf("please input coeffient martix array:\n");
for(i=0;i<3;i++) //输入增广矩阵// {
for(j=0;j<4;j++)
{
scanf("%f",&a[i][j]);
}
}
printf("\n");
printf("Output the input matrix");
printf("\n");
for(i=0;i<3;i++) //输出输入的矩阵// {
for(j=0;j<4;j++)
{
printf("%8.4f",a[i][j]);
}
printf("\n");
}
printf("\n");
for(k=0;k<=2;k++) //在不同列中选主元// {
m=k;
for(i=k+1;i<=2;i++)
{
x=fabs(a[m][k]);
if(a[i][k]>x)
{
m=i;
}
}
if (a[m][k]==0)
{
printf("ERROR");
return;
}
else
{
for(j=k;j<=3;j++) //交换两行// {
x=a[k][j];
a[k][j]=a[m][j];
a[m][j]=x;
}
for(i=k+1;i<=2;i++) //消元过程//
{
s=a[i][k]/a[k][k];
for(j=0;j<=3;j++)
{
a[i][j]=a[i][j]-s*a[k][j];
}
}
}
}
printf("output matrix after gauss transform");
printf("\n");
for(i=0;i<3;i++) //输出变换后的矩阵//
{
for(j=0;j<4;j++)
{
printf("%8.4f",a[i][j]);
}
printf("\n");
}
printf("\n");
a[2][3]=a[2][3]/a[2][2]; //回代过程//
for(i=1;i>=0;i--)
{
x=0;
for(j=i+1;j<3;j++)
{
x=x+a[i][j]*a[j][3];
}
a[i][3]=(a[i][3]-x)/a[i][i];
}
printf("output roots of linear equations"); printf("\n");
printf("x1=%f\n",a[0][3]); //输出//
printf("x2=%f\n",a[1][3]);
printf("x3=%f\n",a[2][3]);
}
5 实验结果与分析
分析:
(1)本次试验采用了for循环及if-else判断语句,较简单的实现了线性方程组列主元高斯消去求根的编程任务。

(2)由本次试验结果来看,列主元高斯消去法避免了选用小元或零元作分母,数值稳定性较好。

对于雅克比迭代法,其计算公式简单,
每迭代一次只需计算一次矩阵和向量的乘法,且计算过程中原始矩阵A始终不变,比较容易并行计算。

然而雅克比迭代法收敛速度较慢,而且占据的存储空间较大,所以工程中一般不直接用雅克比迭代法,而用其改进方法。

对于高斯赛德尔迭代法,达到相同精度时比雅克比迭代法收敛快。

(3)此次试验较好的完成了任务,巩固了课堂学习知识。

相关主题