用高斯消元法(列主元法),解线性方程组。
要求:(1)、用 C语言编
(2)、数据从文件输入,阶数(未知量个数),增广矩阵。
(分行存放在文件中)
(3)、程序要写尽可能清楚的注释。
这是我的一道作业题,请大家帮我想一下怎么做。谢了!
8 个解决方案
#1
我有现成的程序。
#2
上楼的源程序在哪?可以一看吗?
#3
可是我没有义务帮别人做作业啊。
#4
作业还是自己做吧,如果你不想做就不做,也不会咋样吧,我上大学没交过几次作业,还不是活着
#5
cxjddd(北极小熊): 如果需要代码的话,可以发信到我的信箱:sayu_yangyou@163.com,我可以发给你,但是我不希望是完成作业用的。
#6
sayu_yangyou(),请你帮帮我好吗,我这道题目真的不知道怎么做?
#7
这样吧,我给你一个列主元法的程序,但是你上面要求的3个条件你自己想办法解决,这样比较好一点:这个程序是我给别人解不相容方程时的程序,删除掉了一点不相容的转化步骤,余下的主题部分是列主元法的程序,你看注释就知道了,不过里面可能有几个变量事先声明了到后面没有用上,那不影响什么东西,你拿回去改改吧。就这样,如果还需要什么帮助,就给我发信吧。地址在上面。
#include <iostream.h>
#include <math.h>
void main(){
float x[5];//未知数矩阵,最后的解就放在这里
float b[36];//等式右边的全部为1的向量
float parA[5][5],parb[5];//最后用来计算的矩阵
int i,j,k;
int label;
float mid=0;
//在这里你需要做的是初始化的工作,对A矩阵进行初始化,下面用的A矩阵是已经赋值过的了,
//同样b向量也是初始化为1的向量,x向量初始化为0
//下面对parA矩阵进行初始化赋值
//对par和b组成的增广矩阵进行列主元消去法求解。
for (i=0;i<4;i++){
mid=fabs(parA[i][i]);
label=i;
//下面找列主元
for (k=i+1;k<5;k++){
if (fabs(parA[k][i])>mid){
label=k;
mid=fabs(parA[k][i]);
}
}
//判断矩阵的秩
if (mid<=0.000001){
cout<<"由于系数矩阵的秩小于行数,不能进行方程组的求解。\n";
return;
}
//交换主元
if (label!=i){
cout<<"change\n";
for (j=0;j<5;j++){
mid=parA[i][j];
parA[i][j]=parA[label][j];
parA[label][j]=mid;
}
mid=parb[i];
parb[i]=parb[label];
parb[label]=mid;
}
//开始消元
//标准化第i行
parb[i]=parb[i]/parA[i][i];
for (j=4;j>=0;j--){
parA[i][j]=parA[i][j]/parA[i][i];
}
//消b
for (j=i+1;j<5;j++) parb[j]=parb[j]-parb[i]*parA[j][i];
//消par
for (j=i+1;j<5;j++){
for (k=5;k>i;k--){
parA[j][k]=parA[j][k]-parA[i][k]*parA[j][i];
}
}
//列主元消元完成
}
//下面回代求解
for (i=4;i>=0;i--){
mid=0;
for (j=4;j>i;j--) mid+=parA[i][j]*x[j];
x[i]=(parb[i]-mid)/parA[i][i];
}
//输出结果
for (i=0;i<5;i++) cout<<x[i]<<endl;
}
#include <iostream.h>
#include <math.h>
void main(){
float x[5];//未知数矩阵,最后的解就放在这里
float b[36];//等式右边的全部为1的向量
float parA[5][5],parb[5];//最后用来计算的矩阵
int i,j,k;
int label;
float mid=0;
//在这里你需要做的是初始化的工作,对A矩阵进行初始化,下面用的A矩阵是已经赋值过的了,
//同样b向量也是初始化为1的向量,x向量初始化为0
//下面对parA矩阵进行初始化赋值
//对par和b组成的增广矩阵进行列主元消去法求解。
for (i=0;i<4;i++){
mid=fabs(parA[i][i]);
label=i;
//下面找列主元
for (k=i+1;k<5;k++){
if (fabs(parA[k][i])>mid){
label=k;
mid=fabs(parA[k][i]);
}
}
//判断矩阵的秩
if (mid<=0.000001){
cout<<"由于系数矩阵的秩小于行数,不能进行方程组的求解。\n";
return;
}
//交换主元
if (label!=i){
cout<<"change\n";
for (j=0;j<5;j++){
mid=parA[i][j];
parA[i][j]=parA[label][j];
parA[label][j]=mid;
}
mid=parb[i];
parb[i]=parb[label];
parb[label]=mid;
}
//开始消元
//标准化第i行
parb[i]=parb[i]/parA[i][i];
for (j=4;j>=0;j--){
parA[i][j]=parA[i][j]/parA[i][i];
}
//消b
for (j=i+1;j<5;j++) parb[j]=parb[j]-parb[i]*parA[j][i];
//消par
for (j=i+1;j<5;j++){
for (k=5;k>i;k--){
parA[j][k]=parA[j][k]-parA[i][k]*parA[j][i];
}
}
//列主元消元完成
}
//下面回代求解
for (i=4;i>=0;i--){
mid=0;
for (j=4;j>i;j--) mid+=parA[i][j]*x[j];
x[i]=(parb[i]-mid)/parA[i][i];
}
//输出结果
for (i=0;i<5;i++) cout<<x[i]<<endl;
}
#8
谢了!
#1
我有现成的程序。
#2
上楼的源程序在哪?可以一看吗?
#3
可是我没有义务帮别人做作业啊。
#4
作业还是自己做吧,如果你不想做就不做,也不会咋样吧,我上大学没交过几次作业,还不是活着
#5
cxjddd(北极小熊): 如果需要代码的话,可以发信到我的信箱:sayu_yangyou@163.com,我可以发给你,但是我不希望是完成作业用的。
#6
sayu_yangyou(),请你帮帮我好吗,我这道题目真的不知道怎么做?
#7
这样吧,我给你一个列主元法的程序,但是你上面要求的3个条件你自己想办法解决,这样比较好一点:这个程序是我给别人解不相容方程时的程序,删除掉了一点不相容的转化步骤,余下的主题部分是列主元法的程序,你看注释就知道了,不过里面可能有几个变量事先声明了到后面没有用上,那不影响什么东西,你拿回去改改吧。就这样,如果还需要什么帮助,就给我发信吧。地址在上面。
#include <iostream.h>
#include <math.h>
void main(){
float x[5];//未知数矩阵,最后的解就放在这里
float b[36];//等式右边的全部为1的向量
float parA[5][5],parb[5];//最后用来计算的矩阵
int i,j,k;
int label;
float mid=0;
//在这里你需要做的是初始化的工作,对A矩阵进行初始化,下面用的A矩阵是已经赋值过的了,
//同样b向量也是初始化为1的向量,x向量初始化为0
//下面对parA矩阵进行初始化赋值
//对par和b组成的增广矩阵进行列主元消去法求解。
for (i=0;i<4;i++){
mid=fabs(parA[i][i]);
label=i;
//下面找列主元
for (k=i+1;k<5;k++){
if (fabs(parA[k][i])>mid){
label=k;
mid=fabs(parA[k][i]);
}
}
//判断矩阵的秩
if (mid<=0.000001){
cout<<"由于系数矩阵的秩小于行数,不能进行方程组的求解。\n";
return;
}
//交换主元
if (label!=i){
cout<<"change\n";
for (j=0;j<5;j++){
mid=parA[i][j];
parA[i][j]=parA[label][j];
parA[label][j]=mid;
}
mid=parb[i];
parb[i]=parb[label];
parb[label]=mid;
}
//开始消元
//标准化第i行
parb[i]=parb[i]/parA[i][i];
for (j=4;j>=0;j--){
parA[i][j]=parA[i][j]/parA[i][i];
}
//消b
for (j=i+1;j<5;j++) parb[j]=parb[j]-parb[i]*parA[j][i];
//消par
for (j=i+1;j<5;j++){
for (k=5;k>i;k--){
parA[j][k]=parA[j][k]-parA[i][k]*parA[j][i];
}
}
//列主元消元完成
}
//下面回代求解
for (i=4;i>=0;i--){
mid=0;
for (j=4;j>i;j--) mid+=parA[i][j]*x[j];
x[i]=(parb[i]-mid)/parA[i][i];
}
//输出结果
for (i=0;i<5;i++) cout<<x[i]<<endl;
}
#include <iostream.h>
#include <math.h>
void main(){
float x[5];//未知数矩阵,最后的解就放在这里
float b[36];//等式右边的全部为1的向量
float parA[5][5],parb[5];//最后用来计算的矩阵
int i,j,k;
int label;
float mid=0;
//在这里你需要做的是初始化的工作,对A矩阵进行初始化,下面用的A矩阵是已经赋值过的了,
//同样b向量也是初始化为1的向量,x向量初始化为0
//下面对parA矩阵进行初始化赋值
//对par和b组成的增广矩阵进行列主元消去法求解。
for (i=0;i<4;i++){
mid=fabs(parA[i][i]);
label=i;
//下面找列主元
for (k=i+1;k<5;k++){
if (fabs(parA[k][i])>mid){
label=k;
mid=fabs(parA[k][i]);
}
}
//判断矩阵的秩
if (mid<=0.000001){
cout<<"由于系数矩阵的秩小于行数,不能进行方程组的求解。\n";
return;
}
//交换主元
if (label!=i){
cout<<"change\n";
for (j=0;j<5;j++){
mid=parA[i][j];
parA[i][j]=parA[label][j];
parA[label][j]=mid;
}
mid=parb[i];
parb[i]=parb[label];
parb[label]=mid;
}
//开始消元
//标准化第i行
parb[i]=parb[i]/parA[i][i];
for (j=4;j>=0;j--){
parA[i][j]=parA[i][j]/parA[i][i];
}
//消b
for (j=i+1;j<5;j++) parb[j]=parb[j]-parb[i]*parA[j][i];
//消par
for (j=i+1;j<5;j++){
for (k=5;k>i;k--){
parA[j][k]=parA[j][k]-parA[i][k]*parA[j][i];
}
}
//列主元消元完成
}
//下面回代求解
for (i=4;i>=0;i--){
mid=0;
for (j=4;j>i;j--) mid+=parA[i][j]*x[j];
x[i]=(parb[i]-mid)/parA[i][i];
}
//输出结果
for (i=0;i<5;i++) cout<<x[i]<<endl;
}
#8
谢了!