您的位置:首页 > 编程语言 > C语言/C++

高斯(列)消去 C++实现

2013-04-04 21:47 381 查看
简单的实现了一下数值计算课上的一个高斯消去求解多元方程的算法。代码如下

#include<iostream>
#include<cmath>
using namespace std;
const int N=10;
const int N1=100;
double BMatrix
;
class Matrix{
int size;//矩阵的大小
double matrix[N1][N1];//增广矩阵
double solution[N1];//方程的解
public:
Matrix(int k);//构造系数矩阵
void disPlay();//显示增广矩阵
void setAugmetMatrix(double *BMatrix);//生成增广矩阵
bool solveMatrix();//解矩阵,其中有消元和回代的过程
int getSize();//获取矩阵的大小
double* getSolution();//获得解的数组
double* getFirstMatrix();//获取矩阵第一行第一列元素
int getMaxMainElement(int currentCol);//获取最大主元所在的行
void exchangTwoRow(int row1,int row2);//交互矩阵中的两行
};
bool Matrix::solveMatrix(){
for (int i = 1; i <= size; i++)//最外层循环遍历整个矩阵
{
if (getMaxMainElement(i)>0 &&i!=getMaxMainElement(i))
{
exchangTwoRow(getMaxMainElement(i),i);//交换行
}
cout<<"第"<<i<<"变换"<<endl;
disPlay();
cout<<endl;
for (int j = i+1; j <= size; j++)//第二层循环遍历与上一层相邻的层
{
double temp=matrix[j][i];//将在第k次消去的主元的第一个元素赋给temp临时变量
matrix[j][i]=0;//将第一元素置0
for (int k = i+1; k <=size+1; k++)//第三层循环遍历矩阵的列
{
matrix[j][k]=matrix[j][k]-(temp/matrix[i][i])*matrix[i][k];//根据矩阵消去公式依次肖元,成为上三角矩阵
}
}

}
if (matrix[size][size]!=0)//预先判断消去后的矩阵是否有确定解,然后进行回代
{
double temp;
solution[1]=matrix[size][size+1]/matrix[size][size];//解得xn存入solution数组
for (int i =2; i <=size; i++)
{
double A=matrix[size-i+1][size+1];//将bi赋给变量A
for (int k = 1,j=1; k <i; j++,k++)
{
temp=A-solution[j]*matrix[size-i+1][size-k+1];//做减法
A=temp;//赋值使上面等式可连减
}
solution[i]=temp/matrix[size-i+1][size-i+1];//除以主对角线上的系数,得到xi
}
return true;
}

return false;
}
Matrix::Matrix(int n){
size=n;
cout<<"请输入方程的系数矩阵"<<endl;
for(int i=1;i<=n;i++)
for (int j = 1; j <=n; j++)
{
cin>>matrix[i][j];//录入矩阵
}
}
double* Matrix::getFirstMatrix(){
double*p=& matrix[1][1];
return p;
}
double* Matrix::getSolution(){
return solution;
}
int Matrix::getSize(){
return size;
}
void Matrix::disPlay(){
for (int k = 1; k <= size; k++)
{
for (int m = 1; m <=size+1; m++)
{
if (m==size+1)
{
cout<<matrix[k][m]<<endl;//
}
else
{
cout<<matrix[k][m]<<"\t";
}
}
}
}
void Matrix::setAugmetMatrix(double*BMatrix){
for (int i = 1; i <=size; i++)
{
matrix[i][size+1]=BMatrix[i];//录入常数列
}
}
int Matrix::getMaxMainElement(int currentCol){
double temp=0;
int maxRowMain=0;
for (int i = currentCol; i <= size; i++)
{
if (temp<matrix[i][currentCol])
{
temp=matrix[i][currentCol];
maxRowMain=i;
}
}
return maxRowMain;
}
void Matrix::exchangTwoRow(int row1,int row2){
double tempMatrix=0;
for (int i = 1; i <=size+1; i++)
{
tempMatrix=matrix[row1][i];
matrix[row1][i]=matrix[row2][i];
matrix[row2][i]=tempMatrix;
}
}
int main()
{
int n;
cout<<"请输入你方程系数矩阵的阶"<<endl;
std::cin>>n;
Matrix m(n);
double*p=m.getFirstMatrix();
if (*p==0)
{
cout<<"第一行第一列元素不能为0"<<endl;
return 0;
}
cout<<"请输入常数项向量"<<endl;
for (int i = 1; i <= n; i++)
{
cin>>BMatrix[i];
}
m.setAugmetMatrix(BMatrix);
if(m.solveMatrix()){;
/*m.disPlay();*///该方法有测试矩阵运算是否正确之用
double* solute=m.getSolution();
cout<<"方程的解为:"<<endl;
for (int i =0; i < m.getSize(); i++)
{
cout<<"x"<<i+1<<"="<<solute[m.getSize()-i]<<endl;
}
}
else
{
cout<<"此方程无解或无准确解。"<<endl;
}
return 0;
}


高斯消去比高斯列消去少了两行代码,即在每次消去时,选取列中最大元,并与此时用来消去其他行的行进行交换。

在列主消元中,找到列最大元,再与消去行互换,似的在消去过程中,不会因为除数过小,而造成计算结果产生较大误差。高斯列消去法还是无法避免,在一些矩阵上出现由于,计算机本身精度,而造成数据的误差,就我碰到的几个矩阵,程序求解与手工求解,误差在百分之五左右,四舍五入一下就是机器运算的结果。

程序运行样例:

X1+X2- 4X4=1

-X1+X2+X3+3X4=-2

X1+3X2+5X3-4X4=-4

X2+2X3-X4=-2

可知矩阵为

1 1 0 -4

-1 1 1 3

1 3 5 -4

0 1 2 -1

常数项向量为

(1,-2,-4,-2)



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: