当前位置:首页 » 编程语言 » 列主元消去法c语言

列主元消去法c语言

发布时间: 2022-03-07 13:16:03

㈠ 列主元消去法的基本思想,急


计算方法留的上机作业,难度比前几次提高数倍。感觉从来还没写过这么复杂的数学题程序- -!

#include <stdio.h>
#include <stdlib.h>

#define N 10 //矩阵大小范围

/*
* 使用已经求出的x,向前计算x(供getx()调用)
* float a[][] 系数矩阵
* float x[] 方程组解
* int i 解的序号
* int n 矩阵大小
* return 公式中需要的和
*/
float getm(float a[N][N], float x[N], int i, int n)
{
float m = 0;
int r;
for(r=i+1; r<n; r++)
{
m += a[i][r] * x[r];
}
return m;
}

/*
* 解方程组,计算x
* float a[][] 系数矩阵
* float b[] 右端项
* float x[] 方程组解
* int i 解的序号
* int n 矩阵大小
* return 方程组的第i个解
*/
float getx(float a[N][N], float b[N], float x[N], int i, int n)
{
float result;
if(i==n-1) //计算最后一个x的值
result = float(b[n-1]/a[n-1][n-1]);
else //计算其他x值(对于公式中的求和部分,需要调用getm()函数)
result = float((b[i]-getm(a,x,i,n))/a[i][i]);

return result;
}

void main()
{
//float a[N][N] = ,,};
//float b[N] = ;
float a[N][N]; //系数矩阵
float b[N]; //右端项
float x[N]; //方程组解
int i,j,k;
int n=N; //矩阵大小

/*用户手工输入矩阵*/
printf("请输入系数矩阵的大小:");
scanf("%d", &n);
printf("请连续输入矩阵值:");
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
scanf("%f", &a[i][j]);
}
printf("请输入右端项:");
for(i=0; i<n; i++)
{
scanf("%f", &b[i]);
}

/*显示原始矩阵*/
printf("\n原始矩阵\n");
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
printf("%f ",a[i][j]);
printf("\t|\t%f\n",b[i]);
}
printf("\n\n");

/*进行高斯消去*/
for(j=0; j<n-1; j++)
{
for(i=j+1; i<n; i++)
{
float m = (float)(a[i][j]/a[j][j]);
for(k=j; k<n; k++)
{
a[i][k] = a[i][k]-m*a[j][k];
}
b[i] = b[i]-m*b[j];
}
}

/*显示处理后矩阵*/
printf("高斯消去后矩阵\n");
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
printf("%f ",a[i][j]);
printf("\t|\t%f\n",b[i]);
}

/*回代方式解方程组*/
for(i=n-1; i>=0; i--)
{
x[i] = getx(a,b,x,i,n);
}

/*显示方程组解*/
printf("\n\n方程组解\n");
for(i=0; i<n; i++)
{
printf("x%d = %f\n", i+1,x[i]);
}
}

VC6.0下测试通过

===================================================================

㈡ 如何用C++用列主元高斯消去法求解线性方程组的解

大二的时候自己写得,包你满意!
四种方法:
Cramer算法解方程组
Gauss列主元解方程组
Gauss全主元解方程组
用Doolittle算法解方程组

//解线性方程组
#include<iostream.h>
#include<iomanip.h>
#include<stdlib.h>

//----------------------------------------------全局变量定义区
const int Number=15; //方程最大个数
double a[Number][Number],b[Number],_a[Number][Number],_b[Number]; //系数行列式
int A_y[Number]; //a[][]中随着横坐标增加列坐标的排列顺序,如a[0][0],a[1][2],a[2][1]...则A_y[]={0,2,1...};
int lenth,_lenth; //方程的个数
double a_sum; //计算行列式的值
char * x; //未知量a,b,c的载体

//----------------------------------------------函数声明区
void input(); //输入方程组
void print_menu(); //打印主菜单
int choose (); //输入选择
void cramer(); //Cramer算法解方程组
void gauss_row(); //Gauss列主元解方程组
void guass_all(); //Gauss全主元解方程组
void Doolittle(); //用Doolittle算法解方程组
int Doolittle_check(double a[][Number],double b[Number]); //判断是否行列式>0,若是,调整为顺序主子式全>0
void xiaoqu_u_l(); //将行列式Doolittle分解
void calculate_u_l(); //计算Doolittle结果
double & calculate_A(int n,int m); //计算行列式
double quanpailie_A(); //根据列坐标的排列计算的值,如A_y[]={0,2,1},得sum=a[0][ A_y[0] ] * a[1][ A_y[1] ] * a[2][ A_y[2] ]=a[0][0]*a[1][2]*a[2][1];
void exchange(int m,int i); //交换A_y[m],A_y[i]
void exchange_lie(int j); //交换a[][j]与b[];
void exchange_hang(int m,int n); //分别交换a[][]和b[]中的m与n两行
void gauss_row_xiaoqu(); //Gauss列主元消去法
void gauss_all_xiaoqu(); //Gauss全主元消去法
void gauss_calculate(); //根据Gauss消去法结果计算未知量的值
void exchange_a_lie(int m,int n); //交换a[][]中的m和n列
void exchange_x(int m,int n); //交换x[]中的x[m]和x[n]
void recovery(); //恢复数据

//主函数
void main()
{
int flag=1;
input(); //输入方程
while(flag)
{
print_menu(); //打印主菜单

flag=choose(); //选择解答方式
}

}

//函数定义区
void print_menu()
{
system("cls");
cout<<"------------方程系数和常数矩阵表示如下:\n";
for(int j=0;j<lenth;j++)
cout<<"系数"<<j+1<<" ";
cout<<"\t常数";
cout<<endl;
for(int i=0;i<lenth;i++)
{
for(j=0;j<lenth;j++)
cout<<setw(8)<<setiosflags(ios::left)<<a[i][j];
cout<<"\t"<<b[i]<<endl;
}
cout<<"-----------请选择方程解答的方案----------";
cout<<"\n 1. 克拉默(Cramer)法则";
cout<<"\n 2. Gauss列主元消去法";
cout<<"\n 3. Gauss全主元消去法";
cout<<"\n 4. Doolittle分解法";
cout<<"\n 5. 退出";
cout<<"\n 输入你的选择:";

}

void input()
{ int i,j;
cout<<"方程的个数:";
cin>>lenth;
if(lenth>Number)
{
cout<<"It is too big.\n";
return;
}
x=new char[lenth];
for(i=0;i<lenth;i++)
x[i]='a'+i;

//输入方程矩阵
//提示如何输入
cout<<"====================================================\n";
cout<<"请在每个方程里输入"<<lenth<<"系数和一个常数:\n";
cout<<"例:\n方程:a";
for(i=1;i<lenth;i++)
{
cout<<"+"<<i+1<<x[i];
}
cout<<"=10\n";
cout<<"应输入:";
for(i=0;i<lenth;i++)
cout<<i+1<<" ";
cout<<"10\n";
cout<<"==============================\n";

//输入每个方程
for(i=0;i<lenth;i++)
{
cout<<"输入方程"<<i+1<<":";
for(j=0;j<lenth;j++)
cin>>a[i][j];
cin>>b[i];
}

//备份数据
for(i=0;i<lenth;i++)
for(j=0;j<lenth;j++)
_a[i][j]=a[i][j];
for(i=0;i<lenth;i++)
_b[i]=b[i];
_lenth=lenth;
}

//输入选择
int choose()
{
int choice;char ch;
cin>>choice;
switch(choice)
{
case 1:cramer();break;
case 2:gauss_row();break;
case 3:guass_all();break;
case 4:Doolittle();break;
case 5:return 0;
default:cout<<"输入错误,请重新输入:";
choose();
break;
}
cout<<"\n是否换种方法求解(Y/N):";
cin>>ch;
if(ch=='n'||ch=='N') return 0;
recovery();
cout<<"\n\n\n";
return 1;

}

//用克拉默法则求解方程.
void cramer()
{
int i,j;double sum,sum_x;char ch;
//令第i行的列坐标为i
cout<<"用克拉默(Cramer)法则结果如下:\n";

for(i=0;i<lenth;i++)
A_y[i]=i;
sum=calculate_A(lenth,0);
if(sum!=0)
{
cout<<"系数行列式不为零,方程有唯一的解:";
for(i=0;i<lenth;i++)
{ ch='a'+i;
a_sum=0;
for(j=0;j<lenth;j++)
A_y[j]=j;
exchange_lie(i);
sum_x=calculate_A(lenth,0);
cout<<endl<<ch<<"="<<sum_x/sum;
exchange_lie(i);
}
}
else
{
cout<<"系数行列式等于零,方程没有唯一的解.";
}
cout<<"\n";
}

double & calculate_A(int n,int m) //计算行列式
{ int i;
if(n==1) {
a_sum+= quanpailie_A();
}
else{for(i=0;i<n;i++)
{ exchange(m,m+i);
calculate_A(n-1,m+1);
exchange(m,m+i);
}
}
return a_sum;
}

double quanpailie_A() //计算行列式中一种全排列的值
{
int i,j,l;
double sum=0,p;
for(i=0,l=0;i<lenth;i++)
for(j=0;A_y[j]!=i&&j<lenth;j++)
if(A_y[j]>i) l++;
for(p=1,i=0;i<lenth;i++)
p*=a[i][A_y[i]];
sum+=p*((l%2==0)?(1):(-1));
return sum;
}

//高斯列主元排列求解方程
void gauss_row()
{
int i,j;
gauss_row_xiaoqu(); //用高斯列主元消区法将系数矩阵变成一个上三角矩阵

for(i=0;i<lenth;i++)
{
for(j=0;j<lenth;j++)
cout<<setw(10)<<setprecision(5)<<a[i][j];
cout<<setw(10)<<b[i]<<endl;
}

if(a[lenth-1][lenth-1]!=0)
{

cout<<"系数行列式不为零,方程有唯一的解:\n";
gauss_calculate();
for(i=0;i<lenth;i++) //输出结果
{
cout<<x[i]<<"="<<b[i]<<"\n";
}
}
else
cout<<"系数行列式等于零,方程没有唯一的解.\n";
}

void gauss_row_xiaoqu() //高斯列主元消去法
{
int i,j,k,maxi;double lik;
cout<<"用Gauss列主元消去法结果如下:\n";
for(k=0;k<lenth-1;k++)
{
j=k;
for(maxi=i=k;i<lenth;i++)
if(a[i][j]>a[maxi][j]) maxi=i;
if(maxi!=k)
exchange_hang(k,maxi);//

for(i=k+1;i<lenth;i++)
{
lik=a[i][k]/a[k][k];
for(j=k;j<lenth;j++)
a[i][j]=a[i][j]-a[k][j]*lik;
b[i]=b[i]-b[k]*lik;
}
}
}

//高斯全主元排列求解方程
void guass_all()
{
int i,j;
gauss_all_xiaoqu();
for(i=0;i<lenth;i++)
{
for(j=0;j<lenth;j++)
cout<<setw(10)<<setprecision(5)<<a[i][j];
cout<<setw(10)<<b[i]<<endl;
}
if(a[lenth-1][lenth-1]!=0)
{

cout<<"系数行列式不为零,方程有唯一的解:\n";
gauss_calculate();

for(i=0;i<lenth;i++) //输出结果
{
for(j=0;x[j]!='a'+i&&j<lenth;j++);

cout<<x[j]<<"="<<b[j]<<endl;
}
}
else
cout<<"系数行列式等于零,方程没有唯一的解.\n";
}

void gauss_all_xiaoqu() //Gauss全主元消去法
{
int i,j,k,maxi,maxj;double lik;
cout<<"用Gauss全主元消去法结果如下:\n";

for(k=0;k<lenth-1;k++)
{

for(maxi=maxj=i=k;i<lenth;i++)
{
for(j=k;j<lenth;j++)
if(a[i][j]>a[maxi][ maxj])
{ maxi=i;
maxj=j;
}

}
if(maxi!=k)
exchange_hang(k,maxi);
if(maxj!=k)
{
exchange_a_lie(maxj,k); //交换两列
exchange_x(maxj,k);

}

for(i=k+1;i<lenth;i++)
{
lik=a[i][k]/a[k][k];
for(j=k;j<lenth;j++)
a[i][j]=a[i][j]-a[k][j]*lik;
b[i]=b[i]-b[k]*lik;
}
}
}

void gauss_calculate() //高斯消去法以后计算未知量的结果
{
int i,j;double sum_ax;
b[lenth-1]=b[lenth-1]/a[lenth-1][lenth-1];
for(i=lenth-2;i>=0;i--)
{
for(j=i+1,sum_ax=0;j<lenth;j++)
sum_ax+=a[i][j]*b[j];
b[i]=(b[i]-sum_ax)/a[i][i];
}
}

void Doolittle() //Doolittle消去法计算方程组
{
double temp_a[Number][Number],temp_b[Number];int i,j,flag;
for(i=0;i<lenth;i++)
for(j=0;j<lenth;j++)
temp_a[i][j]=a[i][j];
flag=Doolittle_check(temp_a,temp_b);
if(flag==0) cout<<"\n行列式为零.无法用Doolittle求解.";
xiaoqu_u_l();
calculate_u_l();
cout<<"用Doolittle方法求得结果如下:\n";
for(i=0;i<lenth;i++) //输出结果
{
for(j=0;x[j]!='a'+i&&j<lenth;j++);

cout<<x[j]<<"="<<b[j]<<endl;
}

}

void calculate_u_l() //计算Doolittle结果
{ int i,j;double sum_ax=0;
for(i=0;i<lenth;i++)
{
for(j=0,sum_ax=0;j<i;j++)
sum_ax+=a[i][j]*b[j];
b[i]=b[i]-sum_ax;
}

for(i=lenth-1;i>=0;i--)
{
for(j=i+1,sum_ax=0;j<lenth;j++)
sum_ax+=a[i][j]*b[j];
b[i]=(b[i]-sum_ax)/a[i][i];
}

}

void xiaoqu_u_l() //将行列式按Doolittle分解
{ int i,j,n,k;double temp;
for(i=1,j=0;i<lenth;i++)
a[i][j]=a[i][j]/a[0][0];
for(n=1;n<lenth;n++)
{ //求第n+1层的上三角矩阵部分即U
for(j=n;j<lenth;j++)
{ for(k=0,temp=0;k<n;k++)
temp+=a[n][k]*a[k][j];
a[n][j]-=temp;
}
for(i=n+1;i<lenth;i++) //求第n+1层的下三角矩阵部分即L
{ for(k=0,temp=0;k<n;k++)
temp+=a[i][k]*a[k][n];
a[i][n]=(a[i][n]-temp)/a[n][n];
}
}
}

int Doolittle_check(double temp_a[][Number],double temp_b[Number]) //若行列式不为零,将系数矩阵调整为顺序主子式大于零
{
int i,j,k,maxi;double lik,temp;

for(k=0;k<lenth-1;k++)
{
j=k;
for(maxi=i=k;i<lenth;i++)
if(temp_a[i][j]>temp_a[maxi][j]) maxi=i;
if(maxi!=k)
{ exchange_hang(k,maxi);
for(j=0;j<lenth;j++)
{ temp=temp_a[k][j];
temp_a[k][j]=temp_a[maxi][j];
temp_a[maxi][j]=temp;
}
}
for(i=k+1;i<lenth;i++)
{
lik=temp_a[i][k]/temp_a[k][k];
for(j=k;j<lenth;j++)
temp_a[i][j]=temp_a[i][j]-temp_a[k][j]*lik;
temp_b[i]=temp_b[i]-temp_b[k]*lik;
}
}

if(temp_a[lenth-1][lenth-1]==0) return 0;
return 1;
}

void exchange_hang(int m,int n) //交换a[][]中和b[]两行
{
int j; double temp;
for(j=0;j<lenth;j++)
{ temp=a[m][j];
a[m][j]=a[n][j];
a[n][j]=temp;

}
temp=b[m];
b[m]=b[n];
b[n]=temp;
}

void exchange(int m,int i) //交换A_y[m],A_y[i]
{ int temp;
temp=A_y[m];
A_y[m]=A_y[i];
A_y[i]=temp;
}

void exchange_lie(int j) //交换未知量b[]和第i列
{ double temp;int i;
for(i=0;i<lenth;i++)
{ temp=a[i][j];
a[i][j]=b[i];
b[i]=temp;
}
}

void exchange_a_lie(int m,int n) //交换a[]中的两列
{ double temp;int i;
for(i=0;i<lenth;i++)
{ temp=a[i][m];
a[i][m]=a[i][n];
a[i][n]=temp;
}
}

void exchange_x(int m,int n) //交换未知量x[m]与x[n]
{ char temp;
temp=x[m];
x[m]=x[n];
x[n]=temp;
}

void recovery() //用其中一种方法求解后恢复数据以便用其他方法求解
{
for(int i=0;i<lenth;i++)
for(int j=0;j<lenth;j++)
a[i][j]=_a[i][j];
for(i=0;i<lenth;i++)
b[i]=_b[i];
for(i=0;i<lenth;i++)
x[i]='a'+i;
a_sum=0;
lenth=_lenth;
}

㈢ 求c语言课程设计:用高斯列主元消元法解线性方程组

这里向你推荐一下克鲁特算法(其实就是对高斯列主元消元法进行优化,使之更适合于计算机编程),首先将矩阵A进行LU分解(将系数矩阵分解成一个上三角矩阵和一个下三角矩阵),分解的过程中用到了隐式的主元寻找法,同时利用克鲁特算法可以将两个n*n矩阵压缩到一个n*n矩阵中,大大节省了存储空间提高了计算速度。
方程可化为L*U*x=B,令U*x=y --->L*y=B
然后利用回代先求y,再利用y求x
因为该方法在求解过程中不涉及增广矩阵所以矩阵B几乎不参与什么运算,所以它的计算速度应该能够达到高斯列主元消元法的三倍,但原理与其基本一致。
而且我在程序中使用了动态数组方便你今后进行扩展。

以下程序按照《矩阵论第二版》和《C语言数值计算法方法大全》编写,LU分解部分程序主要参考了《C语言数值计算法方法大全》第二章的程序
如果你需要详细的理论讲解我可以将这两本书和源程序发给你,上面的论述相当详细足够你答辩用的了,我的邮箱[email protected]

计算结果:
A矩阵:
2 2 5
3 4 7
1 3 3
B矩阵:
5
6
5
解矩阵:
x 1=-7
x 2=0.333333
x 3=3.66667

Press any key to continue

#include <cmath>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <functional>
#include <vector>
#include <algorithm>
using namespace std;
#define TINY 1.0e-20 //A small number.
#define N 3
void ludcmp(vector<vector<float> > &a, int n, vector<int> &indx, float &d);//对矩阵进行LU分解
void lubksb(vector<vector<float> > &a, int n, vector<int> &indx, vector<float> &b);//对矩阵进行前向和后向回代
void root(vector<vector<float> > &x,vector<float> &col);//解方程结果保存在y中
void iniv(vector<vector<float> > &x,vector<float> line,int n);//对二维动态数组进行初始化
void main()
{
int i,j,n=N;//输入矩阵的维数
float A[N][N]={{2,2,5},{3,4,7},{1,3,3}};//左边A矩阵
float B[N]={5,6,5};//右边B矩阵
vector<vector<float> > x;//建立动态二维数组存放A,保证你的程序进行扩展时只改A,B,N
vector<float> line;
vector<float> y(n);//建立动态数组存放B
iniv(x,line,n);
y.clear();
for(i=0;i<n;i++)//将A赋给x,B赋给y
{
y.push_back(B[i]);
for(j=0;j<n;j++)
{
x[i].push_back(A[i][j]);
}
}
cout<<"A矩阵:"<<endl;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<setw(2)<<setiosflags(ios::left)<<setw(2)<<x[i][j]<<" ";
}
cout<<endl;
}
cout<<"B矩阵:"<<endl;
for(i=0;i<n;i++)
{
cout<<setw(2)<<setiosflags(ios::left)<<setw(2)<<y[i]<<endl;
}
root(x,y);//求根
cout<<"解矩阵:"<<endl;
for(i=0;i<n;i++)
{
cout<<setw(2)<<setiosflags(ios::left)<<"x"<<i+1<<"="<<y[i]<<endl;
}
cout<<endl;
}
void root(vector<vector<float> > &x,vector<float> &col)
{
int n=x.size(),i=0,j=0;
vector<int> index(n);//用于记录寻找主元素过程中对矩阵的初等变换
index.clear();
float m=1.0;//记录变换方式,此程序中无用
ludcmp(x,n,index,m);//进行LU分解
lubksb(x,n,index,col);//根据分解结果进行回带
}
//以下程序按照《矩阵论第二版》和《C语言数值计算法方法大全》编写,LU分解部分程序主要参考了《C语言数值计算法方法大全》第二章的程序
//如果你需要详细的理论讲解我可以将这两本书和源程序发给你,我的邮箱[email protected]
void ludcmp(vector<vector<float> > &a, int n, vector<int> &indx, float &d)
{

int i,imax,j,k;
float big=0,m=0,sum=0,temp=0;
vector<float> vv(n);
vv.clear();
d=1.0;
for (i=0;i<n;i++)
{
big=0.0;
for (j=0;j<n;j++)
if ((temp=fabs(a[i][j])) > big)
big=temp;
vv[i]=1.0/big;
}
for (j=0;j<n;j++)
{
for (i=0;i<j;i++)
{
sum=a[i][j];
for (k=0;k<i;k++)
sum -= a[i][k]*a[k][j];
a[i][j]=sum;
}
big=0.0;
for (i=j;i<n;i++)
{
sum=a[i][j];
for (k=0;k<j;k++)
sum -= a[i][k]*a[k][j];
a[i][j]=sum;
if ( (m=vv[i]*fabs(sum)) >= big)
{
big=m;
imax=i;
}
}
if (j != imax)
{
for (k=0;k<n;k++)
{
m=a[imax][k];
a[imax][k]=a[j][k];
a[j][k]=m;
}
d = -(d);
vv[imax]=vv[j];
}
indx[j]=imax;
if (a[j][j] == 0.0)
a[j][j]=TINY;
if (j != n)
{
m=1.0/(a[j][j]);
for (i=j+1;i<n;i++)
a[i][j] *= m;
}
}
}
void lubksb(vector<vector<float> > &a, int n, vector<int> &indx, vector<float> &b)
{
int i,ii=0,ip,j;
float sum;
for(i=0;i<n;i++)//按LU分解时寻找主元所进行的初等变换进行反边变换。
{
ip=indx[i];
sum=b[ip];
b[ip]=b[i];
b[i]=sum;
}
sum=0;
for (i=1;i<n;i++)
{
sum=0;
for(j=0;j<i;j++)
{
sum+=a[i][j]*b[j];
}
b[i]=b[i]-sum;
}
b[n-1]=b[n-1]/a[n-1][n-1];
for (i=n-2;i>=0;i--)
{
sum=0;
for(j=i+1;j<n;j++)
{
sum+=a[i][j]*b[j];
}
b[i]=(b[i]-sum)/a[i][i];
}
}
void iniv(vector<vector<float> > &x,vector<float> line,int n)
{
int i,j;
for(i=0;i<n;i++)
{
x.push_back(line);
for(j=0;j<n;j++)
{
x[i].clear();
}
}
}

㈣ 如何用编程实现高斯列主元消去法

用C语言编制以下程序:
#include <stdio.h>
#include <math.h>
void main()
{
int i,j,k,ik,n;
float max,t,a[10][10],x[10],sum;
printf("请输入方程组的阶数:");
scanf("%d",&n);
printf("请输入增广矩阵\n");
for (i=1;i<=n;i++)
for (j=1;j<=n+1;j++)
scanf("%f",&a[i][j]);
for (k=1;k<=n-1;k++)
{
max=0.0;
for (i=k;i<=n;i++)
if (max<fabs(a[i][k]))
{
max=fabs(a[i][k]);
ik=i;
}
if (max==0)
{
printf("A is singular");
break;
}
if (ik!=k)
for (j=k;j<=n+1;j++)
{
t=a[k][j];
a[k][j]=a[ik][j];
a[ik][j]=t;
}
for(i=k+1;i<=n;i++)
{
a[i][k]=a[i][k]/a[k][k];
for (j=k+1;j<=n+1;j++)
a[i][j]=a[i][j]-a[i][k]*a[k][j];
}
}
if (a[n][n]==0)
printf("A is singular");
else
x[n]=a[n][n+1]/a[n][n];
for (k=n-1;k>=1;k--)
{
sum=0.0;
for (j=k+1;j<=n;j++)
sum=sum+a[k][j]*x[j];
x[k]=(a[k][n+1]-sum)/a[k][k];
}
for (i=1;i<=n;i++)
printf("x[%d]=%f\n",i,x[i]);
}

㈤ 采用高斯先列主元消元法求解线性方程组AX=b,编写一个程序C语言,急需

这个程序我做过的。LZ检验下: // 高斯消元求矩阵逆。
#include<stdio.h>
#include<math.h>#define N 100//定义矩阵的最大行int n;//表示矩阵的行,列。
double matix[N][N];//矩阵的最大行,最大列不
double unit[N][N];bool findmax(int s)//从s到n行选择最大的,作为主元。
{
int i,j,k;
double mas,temp;
mas=fabs(matix[s][s]);k=s;
for(i=s+1;i<n;i++)
{
if(mas<fabs(matix[i][s])) {mas=fabs(matix[i][s]);k=i;}
}
if(mas==0) return false;
//交换两行
for(j=0;j<n;j++)
{
temp=matix[s][j];
matix[s][j]=matix[k][j];
matix[k][j]=temp;

temp=unit[s][j];
unit[s][j]=unit[k][j];
unit[k][j]=temp;
}
return true;
}void chuli(int s)
{
int i,j;
double mas=matix[s][s],r;
for(i=s+1;i<n;i++)
{
r=matix[i][s]/mas;
for(j=0;j<n;j++)
{
matix[i][j]=matix[i][j]-matix[s][j]*r;
unit[i][j]=unit[i][j]-unit[s][j]*r;
}
}
}void solve(int s)
{
int i,j;
double mas;
mas=matix[s][s];
for(i=s;i<n;i++)
matix[s][i]=matix[s][i]/mas;
for(i=0;i<n;i++)
unit[s][i]=unit[s][i]/mas;

for(i=s-1;i>=0;i--)
{
mas=matix[i][s];
matix[i][s]=0;
for(j=0;j<n;j++)
unit[i][j]=unit[i][j]-mas*unit[s][j];
}

}
int main()
{
int i,j;
//输入
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j) unit[i][j]=1;
else unit[i][j]=0;
scanf("%lf",&matix[i][j]);
}
}
//输出

//转成上三角
for(i=0;i<n-1;i++)
{
//每一次选一个绝对值最大的值作为aii
if(findmax(i))
{
chuli(i);
}
else
{
printf("该矩阵不可逆");
return 0;
}
}
//转成单位阵
for(i=n-1;i>=0;i--)
{
solve(i);
}

//其逆矩阵是
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%.2lf ",unit[i][j]);
printf("\n");
}
return 0;
}

㈥ 列主元消去法的介绍

列主元素消去法是为控制舍入误差而提出来的一种算法。

㈦ 用c语言编译 采用高斯先列主元消元法求解线性方程组AX=b

545

㈧ 请教编程题:编程实现高斯列主元消去法求解线性方程组,写出相应的程序或程序段,编程语言不限。

以下的都在我的网络空间,关于解答线性方程组的,可以去看看
http://hi..com/ycdoit/blog/item/832586b066955d5d082302ef.html
这里给你源代码
//解线性方程组

//By JJ,2008
#include<iostream.h>
#include<iomanip.h>
#include<stdlib.h>

//----------------------------------------------全局变量定义区
const int Number=15; //方程最大个数
double a[Number][Number],b[Number],_a[Number][Number],_b[Number]; //系数行列式
int A_y[Number]; //a[][]中随着横坐标增加列坐标的排列顺序,如a[0][0],a[1][2],a[2][1]...则A_y[]={0,2,1...};
int lenth,_lenth; //方程的个数
double a_sum; //计算行列式的值
char * x; //未知量a,b,c的载体

//----------------------------------------------函数声明区
void input(); //输入方程组
void print_menu(); //打印主菜单
int choose (); //输入选择
void cramer(); //Cramer算法解方程组
void gauss_row(); //Gauss列主元解方程组
void guass_all(); //Gauss全主元解方程组
void Doolittle(); //用Doolittle算法解方程组
int Doolittle_check(double a[][Number],double b[Number]); //判断是否行列式>0,若是,调整为顺序主子式全>0
void xiaoqu_u_l(); //将行列式Doolittle分解
void calculate_u_l(); //计算Doolittle结果
double & calculate_A(int n,int m); //计算行列式
double quanpailie_A(); //根据列坐标的排列计算的值,如A_y[]={0,2,1},得sum=a[0][ A_y[0] ] * a[1][ A_y[1] ] * a[2][ A_y[2] ]=a[0][0]*a[1][2]*a[2][1];
void exchange(int m,int i); //交换A_y[m],A_y[i]
void exchange_lie(int j); //交换a[][j]与b[];
void exchange_hang(int m,int n); //分别交换a[][]和b[]中的m与n两行
void gauss_row_xiaoqu(); //Gauss列主元消去法
void gauss_all_xiaoqu(); //Gauss全主元消去法
void gauss_calculate(); //根据Gauss消去法结果计算未知量的值
void exchange_a_lie(int m,int n); //交换a[][]中的m和n列
void exchange_x(int m,int n); //交换x[]中的x[m]和x[n]
void recovery(); //恢复数据

//主函数
void main()
{
int flag=1;
input(); //输入方程
while(flag)
{
print_menu(); //打印主菜单

flag=choose(); //选择解答方式
}

}

//函数定义区
void print_menu()
{
system("cls");
cout<<"------------方程系数和常数矩阵表示如下:\n";
for(int j=0;j<lenth;j++)
cout<<"系数"<<j+1<<" ";
cout<<"\t常数";
cout<<endl;
for(int i=0;i<lenth;i++)
{
for(j=0;j<lenth;j++)
cout<<setw(8)<<setiosflags(ios::left)<<a[i][j];
cout<<"\t"<<b[i]<<endl;
}
cout<<"-----------请选择方程解答的方案----------";
cout<<"\n 1. 克拉默(Cramer)法则";
cout<<"\n 2. Gauss列主元消去法";
cout<<"\n 3. Gauss全主元消去法";
cout<<"\n 4. Doolittle分解法";
cout<<"\n 5. 退出";
cout<<"\n 输入你的选择:";

}

void input()
{ int i,j;
cout<<"方程的个数:";
cin>>lenth;
if(lenth>Number)
{
cout<<"It is too big.\n";
return;
}
x=new char[lenth];
for(i=0;i<lenth;i++)
x[i]='a'+i;

//输入方程矩阵
//提示如何输入
cout<<"====================================================\n";
cout<<"请在每个方程里输入"<<lenth<<"系数和一个常数:\n";
cout<<"例:\n方程:a";
for(i=1;i<lenth;i++)
{
cout<<"+"<<i+1<<x[i];
}
cout<<"=10\n";
cout<<"应输入:";
for(i=0;i<lenth;i++)
cout<<i+1<<" ";
cout<<"10\n";
cout<<"==============================\n";

//输入每个方程
for(i=0;i<lenth;i++)
{
cout<<"输入方程"<<i+1<<":";
for(j=0;j<lenth;j++)
cin>>a[i][j];
cin>>b[i];
}

//备份数据
for(i=0;i<lenth;i++)
for(j=0;j<lenth;j++)
_a[i][j]=a[i][j];
for(i=0;i<lenth;i++)
_b[i]=b[i];
_lenth=lenth;
}

//输入选择
int choose()
{
int choice;char ch;
cin>>choice;
switch(choice)
{
case 1:cramer();break;
case 2:gauss_row();break;
case 3:guass_all();break;
case 4:Doolittle();break;
case 5:return 0;
default:cout<<"输入错误,请重新输入:";
choose();
break;
}
cout<<"\n是否换种方法求解(Y/N):";
cin>>ch;
if(ch=='n'||ch=='N') return 0;
recovery();
cout<<"\n\n\n";
return 1;

}

//用克拉默法则求解方程.
void cramer()
{
int i,j;double sum,sum_x;char ch;
//令第i行的列坐标为i
cout<<"用克拉默(Cramer)法则结果如下:\n";

for(i=0;i<lenth;i++)
A_y[i]=i;
sum=calculate_A(lenth,0);
if(sum!=0)
{
cout<<"系数行列式不为零,方程有唯一的解:";
for(i=0;i<lenth;i++)
{ ch='a'+i;
a_sum=0;
for(j=0;j<lenth;j++)
A_y[j]=j;
exchange_lie(i);
sum_x=calculate_A(lenth,0);
cout<<endl<<ch<<"="<<sum_x/sum;
exchange_lie(i);
}
}
else
{
cout<<"系数行列式等于零,方程没有唯一的解.";
}
cout<<"\n";
}

double & calculate_A(int n,int m) //计算行列式
{ int i;
if(n==1) {
a_sum+= quanpailie_A();
}
else{for(i=0;i<n;i++)
{ exchange(m,m+i);
calculate_A(n-1,m+1);
exchange(m,m+i);
}
}
return a_sum;
}

double quanpailie_A() //计算行列式中一种全排列的值
{
int i,j,l;
double sum=0,p;
for(i=0,l=0;i<lenth;i++)
for(j=0;A_y[j]!=i&&j<lenth;j++)
if(A_y[j]>i) l++;
for(p=1,i=0;i<lenth;i++)
p*=a[i][A_y[i]];
sum+=p*((l%2==0)?(1):(-1));
return sum;
}

//高斯列主元排列求解方程
void gauss_row()
{
int i,j;
gauss_row_xiaoqu(); //用高斯列主元消区法将系数矩阵变成一个上三角矩阵

for(i=0;i<lenth;i++)
{
for(j=0;j<lenth;j++)
cout<<setw(10)<<setprecision(5)<<a[i][j];
cout<<setw(10)<<b[i]<<endl;
}

if(a[lenth-1][lenth-1]!=0)
{

cout<<"系数行列式不为零,方程有唯一的解:\n";
gauss_calculate();
for(i=0;i<lenth;i++) //输出结果
{
cout<<x[i]<<"="<<b[i]<<"\n";
}
}
else
cout<<"系数行列式等于零,方程没有唯一的解.\n";
}

void gauss_row_xiaoqu() //高斯列主元消去法
{
int i,j,k,maxi;double lik;
cout<<"用Gauss列主元消去法结果如下:\n";
for(k=0;k<lenth-1;k++)
{
j=k;
for(maxi=i=k;i<lenth;i++)
if(a[i][j]>a[maxi][j]) maxi=i;
if(maxi!=k)
exchange_hang(k,maxi);//

for(i=k+1;i<lenth;i++)
{
lik=a[i][k]/a[k][k];
for(j=k;j<lenth;j++)
a[i][j]=a[i][j]-a[k][j]*lik;
b[i]=b[i]-b[k]*lik;
}
}
}

//高斯全主元排列求解方程
void guass_all()
{
int i,j;
gauss_all_xiaoqu();
for(i=0;i<lenth;i++)
{
for(j=0;j<lenth;j++)
cout<<setw(10)<<setprecision(5)<<a[i][j];
cout<<setw(10)<<b[i]<<endl;
}
if(a[lenth-1][lenth-1]!=0)
{

cout<<"系数行列式不为零,方程有唯一的解:\n";
gauss_calculate();

for(i=0;i<lenth;i++) //输出结果
{
for(j=0;x[j]!='a'+i&&j<lenth;j++);

cout<<x[j]<<"="<<b[j]<<endl;
}
}
else
cout<<"系数行列式等于零,方程没有唯一的解.\n";
}

void gauss_all_xiaoqu() //Gauss全主元消去法
{
int i,j,k,maxi,maxj;double lik;
cout<<"用Gauss全主元消去法结果如下:\n";

for(k=0;k<lenth-1;k++)
{

for(maxi=maxj=i=k;i<lenth;i++)
{
for(j=k;j<lenth;j++)
if(a[i][j]>a[maxi][ maxj])
{ maxi=i;
maxj=j;
}

}
if(maxi!=k)
exchange_hang(k,maxi);
if(maxj!=k)
{
exchange_a_lie(maxj,k); //交换两列
exchange_x(maxj,k);

}

for(i=k+1;i<lenth;i++)
{
lik=a[i][k]/a[k][k];
for(j=k;j<lenth;j++)
a[i][j]=a[i][j]-a[k][j]*lik;
b[i]=b[i]-b[k]*lik;
}
}
}

void gauss_calculate() //高斯消去法以后计算未知量的结果
{
int i,j;double sum_ax;
b[lenth-1]=b[lenth-1]/a[lenth-1][lenth-1];
for(i=lenth-2;i>=0;i--)
{
for(j=i+1,sum_ax=0;j<lenth;j++)
sum_ax+=a[i][j]*b[j];
b[i]=(b[i]-sum_ax)/a[i][i];
}
}

void Doolittle() //Doolittle消去法计算方程组
{
double temp_a[Number][Number],temp_b[Number];int i,j,flag;
for(i=0;i<lenth;i++)
for(j=0;j<lenth;j++)
temp_a[i][j]=a[i][j];
flag=Doolittle_check(temp_a,temp_b);
if(flag==0) cout<<"\n行列式为零.无法用Doolittle求解.";
xiaoqu_u_l();
calculate_u_l();
cout<<"用Doolittle方法求得结果如下:\n";
for(i=0;i<lenth;i++) //输出结果
{
for(j=0;x[j]!='a'+i&&j<lenth;j++);

cout<<x[j]<<"="<<b[j]<<endl;
}

}

void calculate_u_l() //计算Doolittle结果
{ int i,j;double sum_ax=0;
for(i=0;i<lenth;i++)
{
for(j=0,sum_ax=0;j<i;j++)
sum_ax+=a[i][j]*b[j];
b[i]=b[i]-sum_ax;
}

for(i=lenth-1;i>=0;i--)
{
for(j=i+1,sum_ax=0;j<lenth;j++)
sum_ax+=a[i][j]*b[j];
b[i]=(b[i]-sum_ax)/a[i][i];
}

}

void xiaoqu_u_l() //将行列式按Doolittle分解
{ int i,j,n,k;double temp;
for(i=1,j=0;i<lenth;i++)
a[i][j]=a[i][j]/a[0][0];
for(n=1;n<lenth;n++)
{ //求第n+1层的上三角矩阵部分即U
for(j=n;j<lenth;j++)
{ for(k=0,temp=0;k<n;k++)
temp+=a[n][k]*a[k][j];
a[n][j]-=temp;
}
for(i=n+1;i<lenth;i++) //求第n+1层的下三角矩阵部分即L
{ for(k=0,temp=0;k<n;k++)
temp+=a[i][k]*a[k][n];
a[i][n]=(a[i][n]-temp)/a[n][n];
}
}
}

int Doolittle_check(double temp_a[][Number],double temp_b[Number]) //若行列式不为零,将系数矩阵调整为顺序主子式大于零
{
int i,j,k,maxi;double lik,temp;

for(k=0;k<lenth-1;k++)
{
j=k;
for(maxi=i=k;i<lenth;i++)
if(temp_a[i][j]>temp_a[maxi][j]) maxi=i;
if(maxi!=k)
{ exchange_hang(k,maxi);
for(j=0;j<lenth;j++)
{ temp=temp_a[k][j];
temp_a[k][j]=temp_a[maxi][j];
temp_a[maxi][j]=temp;
}
}
for(i=k+1;i<lenth;i++)
{
lik=temp_a[i][k]/temp_a[k][k];
for(j=k;j<lenth;j++)
temp_a[i][j]=temp_a[i][j]-temp_a[k][j]*lik;
temp_b[i]=temp_b[i]-temp_b[k]*lik;
}
}

if(temp_a[lenth-1][lenth-1]==0) return 0;
return 1;
}

void exchange_hang(int m,int n) //交换a[][]中和b[]两行
{
int j; double temp;
for(j=0;j<lenth;j++)
{ temp=a[m][j];
a[m][j]=a[n][j];
a[n][j]=temp;

}
temp=b[m];
b[m]=b[n];
b[n]=temp;
}

void exchange(int m,int i) //交换A_y[m],A_y[i]
{ int temp;
temp=A_y[m];
A_y[m]=A_y[i];
A_y[i]=temp;
}

void exchange_lie(int j) //交换未知量b[]和第i列
{ double temp;int i;
for(i=0;i<lenth;i++)
{ temp=a[i][j];
a[i][j]=b[i];
b[i]=temp;
}
}

void exchange_a_lie(int m,int n) //交换a[]中的两列
{ double temp;int i;
for(i=0;i<lenth;i++)
{ temp=a[i][m];
a[i][m]=a[i][n];
a[i][n]=temp;
}
}

void exchange_x(int m,int n) //交换未知量x[m]与x[n]
{ char temp;
temp=x[m];
x[m]=x[n];
x[n]=temp;
}

void recovery() //用其中一种方法求解后恢复数据以便用其他方法求解
{
for(int i=0;i<lenth;i++)
for(int j=0;j<lenth;j++)
a[i][j]=_a[i][j];
for(i=0;i<lenth;i++)
b[i]=_b[i];
for(i=0;i<lenth;i++)
x[i]='a'+i;
a_sum=0;
lenth=_lenth;
}

㈨ 用列主元消去法,用c++编个程序

程序代码如下:

double* Gauss(double **a,double *b)
{
int i,j,k,flag;
double temp;
double *x;
x=new double[n];
for(i=0;i<n-1;i++)
{
max=0;
flag=0;
for(j=i;j<n;j++)
{
if(a[j][i]<0)
temp=-a[j][i];
else
temp=a[j][i];
if(max<temp)
{
max=temp;
row=j;
flag=1;
}
}
if(max==0)
{
cout<<"此题不能用列主元消去法做"<<endl;
exit(0);
}
if(flag==1)
{
for(j=0;j<n;j++)
{
temp=a[i][j];
a[i][j]=a[row][j];
a[row][j]=temp;
}
temp=b[i];
b[i]=b[row];
b[row]=temp;
}
for(j=i+1;j<n;j++)
{
temp=1.0*a[j][i]/a[i][i];
for(k=i;k<n;k++)
a[j][k]=a[j][k]-temp*a[i][k];
b[j]=b[j]-temp*b[i];
}
if(a[n-1][n-1]==0)
{
cout<<"此题不能用列主元消去法做"<<endl;
exit(0);
}
}
for(i=0;i<n;i++)
{
b[i]=b[i]/a[i][i];
for(j=i+1;j<n;j++)
a[i][j]=a[i][j]/a[i][i];
a[i][i]=1;
}
for(i=n-2;i>=0;i--)
for(j=i;j>=0;j--)
{
b[j]=b[j]-b[i+1]*a[j][i+1];
a[j][i+1]=0;
}
for(i=0;i<n;i++)
x[i]=b[i];
return(x);
}

使用程序时在main函数中调用x=Gauss(a,b),a为系数矩阵头指针,b为常数项头指针,程序返回一个double类型的数组x[n]即为解集.

热点内容
谷能压缩机 发布:2025-01-13 15:44:30 浏览:412
电脑电脑直连通讯ftp 发布:2025-01-13 15:38:03 浏览:717
nvm存储 发布:2025-01-13 15:36:19 浏览:552
京东架构师缓存经验 发布:2025-01-13 15:33:00 浏览:726
android图片颜色 发布:2025-01-13 15:26:09 浏览:268
国家税务总局电脑服务器 发布:2025-01-13 15:10:24 浏览:596
金立老款机的开机密码是多少 发布:2025-01-13 15:04:45 浏览:456
湖南网上办税初始密码多少 发布:2025-01-13 15:02:49 浏览:417
怎么使用笔记本连接服务器 发布:2025-01-13 15:02:48 浏览:705
长城cs75plus选哪个配置 发布:2025-01-13 14:54:05 浏览:22