您的当前位置:首页正文

实验4解线性方程组的直接法

来源:独旅网
西华大学计算机系学生上机实践报告

西华数学与计算机学院上机实践报告

课程名称:数值计算方法B 指导教师:严常龙

上机实践名称:解线性方程组的直接法 上机实践编号:4 年级:2009级 姓名: 学号:

上机实践成绩:

上机实践日期:2011.12.2 上机实践时间:8:00~9:40

一、目的

1.通过本实验,加深对解线性方程组的直接法——高斯列主消元法和LU分解法的构造过程的理解; 2.能将各种方法的算法描述正确地改编为程序并上机实现;

3.熟悉并掌握各种方法的适用对象及优缺点,学会针对不同问题选择不同方法。

自选线性方程组,编制一个程序,分别用高斯列主元消元法和LU分解法求解。然后完成作业: 分别用高斯列主元消元法和LU分解法求解下面的方程组(以下方程组供选择)。

7.2x12.3x24.4x30.5x415.11.3x16.3x23.5x32.8x41.8 5.6x10.9x28.1x31.3x416.61.5x0.4x3.7x5.9x36.91234二、内容与设计思想

三、使用环境

操作系统:windows xp

软件平台:vc++ 6.0

四、核心代码及调试过程

#include #include #include

void main() {

int i,j,k,p,N;

float a[50][51],t,x[50]; float max,temp;

printf(\"\\n请输入方程未知数的个数N:\"); scanf(\"%d\

printf(\"\\n请输入方程的增广矩阵的数据,数据之间按回车键隔开!\\n\"); for(i=0;i{ printf(\"请输入第%d行的%d个数据:\\n\ for(j=0;j第 1 页 共 7 页

西华大学计算机系学生上机实践报告

}

printf(\"\\n增广矩阵的初始数值:\\n\"); for(i=0;ifor(j=0;j{printf(\"%f \ printf(\"\\n\"); }

for(k=0;k//******************************* if(a[k][k]>=0){max=a[k][k];} else{max=a[k][k];} for(i=k;iif((max=0){max=a[i][k];} else{max=-a[i][k];} } }

for(i=k;iif((max=a[i][k])||(max=-a[i][k])) { p=i; break; } }

for(j=0;jtemp=a[p][j]; a[p][j]=a[k][j]; a[k][j]=temp; }

//****************************选主列的元。 for(i=k+1;i第 2 页 共 7 页

西华大学计算机系学生上机实践报告

}

}

}

printf(\"\\n增广矩阵系数上三角形化得到的矩阵:\\n\"); for(i=0;ifor(j=0;j{printf(\"%f \ printf(\"\\n\"); }

for(k=N-1;k>=0;k--) {

for(i=k-1;i>=0;i--) { t=(a[i][k]/a[k][k]); for(j=0;jprintf(\"\\n增广矩阵的系数对角线化得到的矩阵:\\n\"); for(i=0;ifor(j=0;j{printf(\"%f \ printf(\"\\n\"); }

printf(\"该方程的解为:\\n\"); for(k=0;kx[k]=a[k][N]/a[k][k];

printf(\" x[%d]=%f\\n\}

第 3 页 共 7 页

西华大学计算机系学生上机实践报告

2.L-U分解法:

//*** (L-U)分解法求解线性方程组。

#include #include #include

float a[50][51],x[50],u[50][51];

void main() {

int i,j,k,p,N; float sum,t;

printf(\"\\n请输入方程未知数的个数N:\"); scanf(\"%d\

//*************************************输入矩阵a的数据。

printf(\"\\n请输入方程系数矩阵 a 的数据,数据之间按回车键隔开!\\n\"); for(i=0;i{ printf(\"请输入第%d行的%d个数据:\\n\ for(j=0;j第 4 页 共 7 页

西华大学计算机系学生上机实践报告

printf(\"\\n\"); }

//**************************************输出矩阵a的数据。

printf(\"\\n系数矩阵 a 的初始数值:\\n\"); for(i=0;ifor(j=0;j{printf(\"%f \ printf(\"\\n\"); }

//*****************************************进行变换计算。 for(j=1;j{a[j][0]=a[j][0]/a[0][0];}

for(k=1;kfor(j=k;jt=a[k][k];

for(j=k+1;j<=N;j++) //从第2列起,进行列变换。 { sum=0; for(p=0;p//****************************************************** for(i=0;ifor(j=0;jprintf(\"\\n系数矩阵 u 的初始数值:\\n\"); for(i=0;ifor(j=0;j第 5 页 共 7 页

西华大学计算机系学生上机实践报告

{printf(\"%f \ printf(\"\\n\"); }

//***************************************************

for(k=N-1;k>=0;k--) //把矩阵u对角化。 {

for(i=k-1;i>=0;i--) { t=(u[i][k]/u[k][k]); for(j=0;jfor(k=0;kx[k]=u[k][N]/u[k][k];

printf(\" x[%d]=%f\\n\ } }

第 6 页 共 7 页

西华大学计算机系学生上机实践报告

7.2x12.3x24.4x30.5x415.11.3x16.3x23.5x32.8x41.8 5.6x10.9x28.1x31.3x416.61.5x0.4x3.7x5.9x36.91234

五、总结

通过本次上机实验,我掌握了高斯列主元消元法和LU分解法求解线性方程组。编程序实现这两种解线性方程组的方法,就要先熟悉具体的操作步骤,逻辑思路要清晰。在程序实现过程种,我主要运用了数组存储数据,调用了数组类型的子函数,编写了求逆矩阵的子函数并在主函数中调用,熟练的使用了数组和循环语句。我编写的程序具有一定的通用性和可读性,可以解决这一类计算。

六、附录

第 7 页 共 7 页

因篇幅问题不能全部显示,请点此查看更多更全内容