资源描述
山西大学计算机与信息技术学院
实验报告
姓 名
小 超
学 号
11111111
专业班级
2013级 计算机科学与技术
课程名称
计算方法实验
指导教师
李
实验日期
2015/11/03
成 绩
实验名称
用列主元高斯-约当法解方程组
一、实验目的:
用列主元高斯-约当法解线性方程组。式中,为阶非奇异方阵,,式阶列向量,并分析选主元的重要性。
二、实验内容:
解下列方程组
三、实验程序:
源代码
#include <iostream>
// Hello.cpp : 定义控制台应用程序的入口点。
#include "stdio.h"
#include "stdlib.h"
#include"math.h"
int main() {
double arr[4][5]= {{1.1348,3.8326,1.1651,3.4017,9.5342},
{0.5301,1.7875,2.5330,1.5435,6.3941},
{3.4129,4.9317,8.7643,1.3142,18.4231},
{1.2371,4.9998,10.6721,0.0147,16.9237}
};
for(int i=1; i<3; i++) { //确定第一列列主元
if(arr[0][0]<arr[i][0])
for(int j=0; j<5; j++) {
double temp = arr[0][j];
arr[0][j] =arr[i][j];
arr[i][j] = temp;
}
}
////////////////////////////////////////输出矩阵
printf("确定第一列列主元\n");
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
printf("%f",arr[i][j]);
printf("\t");
}
printf("\n");
}/////////////////////////////////////////////////////////////
//将第一列除第一行外其他值变成0
double olda;
for(int i= 1; i<4; i++) {
olda = arr[i][0];
for(int j=0; j<5; j++) {
arr[i][j]=(arr[i][j]-(olda/arr[0][0])*arr[0][j]);
}
}
////////////////////////////////////////输出矩阵
printf("\n");
printf("\n");
printf("将第一列除第一行外其他值变成0\n");
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
printf("%f",arr[i][j]);
printf("\t");
}
printf("\n");
}/////////////////////////////////////////////////////////////
//把第一行第一列值变为1
for(int j=4; j>-1; j--) {
arr[0][j]=arr[0][j]/arr[0][0];
}
////////////////////////////////////////输出矩阵
printf("\n");
printf("\n");
printf("把第一行第一列值变为1\n");
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
printf("%f",arr[i][j]);
printf("\t");
}
printf("\n");
}/////////////////////////////////////////////////////////////
//确定第二列列主元
for(int i=2; i<4; i++) {
if(fabs(arr[1][1])<fabs(arr[i][1]))
for(int j=1; j<5; j++) {
double temp = arr[1][j];
arr[1][j] =arr[i][j];
arr[i][j] = temp;
}
}
////////////////////////////////////////输出矩阵
printf("\n");
printf("\n");
printf("确定第二列列主元\n");
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
printf("%f",arr[i][j]);
printf("\t");
}
printf("\n");
}/////////////////////////////////////////////////////////////
//把第二列三四行变为0
for(int i=2; i<4; i++) {
for(int j=4; j>0; j--) {
arr[i][j]=arr[i][j]-arr[i][1]/arr[1][1]*arr[1][j];
}
}
////////////////////////////////////////输出矩阵
printf("\n");
printf("\n");
printf("把第二列三四行变为0\n");
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
printf("%f",arr[i][j]);
printf("\t");
}
printf("\n");
}/////////////////////////////////////////////////////////////
//把第二行第二列的值变为1
for(int j=4; j>0; j--) {
arr[1][j]=arr[1][j]/arr[1][1];
}
////////////////////////////////////////输出矩阵
printf("\n");
printf("\n");
printf("第二行第二列的值变为1\n");
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
printf("%f",arr[i][j]);
printf("\t");
}
printf("\n");
}/////////////////////////////////////////////////////////////
//把第一行第二列值变为0
for(int j=4; j>0; j--) {
arr[0][j]=arr[0][j]-arr[1][j]*arr[0][1];
}
////////////////////////////////////////输出矩阵
printf("\n");
printf("\n");
printf("把第一行第二列值变为0\n");
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
printf("%f",arr[i][j]);
printf("\t");
}
printf("\n");
}/////////////////////////////////////////////////////////////
//确定第三列列主元
for(int i=3; i<4; i++) {
if(fabs(arr[2][2])<fabs(arr[i][2]))
for(int j=2; j<5; j++) {
double temp = arr[2][j];
arr[2][j] =arr[i][j];
arr[i][j] = temp;
}
}
////////////////////////////////////////输出矩阵
printf("\n");
printf("\n");
printf("确定第三列列主元\n");
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
printf("%f",arr[i][j]);
printf("\t");
}
printf("\n");
}/////////////////////////////////////////////////////////////
//把第四行第三列的值变为0
for(int j=4; j>1; j--) {
arr[3][j]=arr[3][j]-arr[3][2]/arr[2][2]*arr[2][j];
}
////////////////////////////////////////输出矩阵
printf("\n");
printf("\n");
printf("把第四行第三列的值变为0\n");
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
printf("%f",arr[i][j]);
printf("\t");
}
printf("\n");
}/////////////////////////////////////////////////////////////
//把第三行第三列的值变为1
for(int j=4; j>1; j--) {
arr[2][j]=arr[2][j]/arr[2][2];
}
////////////////////////////////////////输出矩阵
printf("\n");
printf("\n");
printf("把第三行第三列的值变为1\n");
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
printf("%f",arr[i][j]);
printf("\t");
}
printf("\n");
}/////////////////////////////////////////////////////////////
//把第一、二行的第三列元素变为0
for(int i=0; i<2; i++) {
for(int j=4; j>1; j--) {
arr[i][j]=arr[i][j]-arr[i][2]*arr[2][j];//kk
}
}
////////////////////////////////////////输出矩阵
printf("\n");
printf("\n");
printf("把第一、二行的第三列元素变为0\n");
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
printf("%f",arr[i][j]);
printf("\t");
}
printf("\n");
}/////////////////////////////////////////////////////////////
//把第四行第四列的值变为1
for(int j=4; j>2; j--) {
arr[3][j]=arr[3][j]/arr[3][3];
}
////////////////////////////////////////输出矩阵
printf("\n");
printf("\n");
printf("把第四行第四列的值变为1\n");
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
printf("%f",arr[i][j]);
printf("\t");
}
printf("\n");
}/////////////////////////////////////////////////////////////
//把第一、二、三行的第四列值变为0
for(int i=0; i<3; i++) {
for(int j=4; j>2; j--) {
arr[i][j]=arr[i][j]-arr[i][3]*arr[3][j];//kk
}
}
////////////////////////////////////////输出矩阵
printf("\n");
printf("\n");
printf("把第一、二、三行的第四列值变为0\n");
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
printf("%f",arr[i][j]);
printf("\t");
}
printf("\n");
}/////////////////////////////////////////////////////////////
double x1=arr[0][4];
double x2=arr[1][4];
double x3=arr[2][4];
double x4=arr[3][4];
printf("x1=%f",x1);
printf("\n");
printf("x2=%f",x2);
printf("\n");
printf("x3=%f",x3);
printf("\n");
printf("x4=%f",x4);
while(1);
return 0;
}
三、结果分析:
虽然两种方法得出的结果均正确,列主元素的计算量稍多,但是从计算过程上看,不列主元素时,矩阵在变换过程中曾出现4539多的数据,而列主元素数据较为稳定,波动不大。对于不能精确保留所有数据的计算机来说,数据变化越大,损失的精度越多。所以在进行精确计算时,还是列主元素更为精确稳定。
. . . .
展开阅读全文