求解线性方程组之Gauss-Jordan消去法求矩阵的逆
来源:互联网 发布:淘宝店铺粉丝怎么增加 编辑:程序博客网 时间:2024/05/02 01:42
//用具有最大主元素的Gauss-Jordan消去法求矩阵的逆
#include <iostream>
#include <math.h>
#include <fstream>
#include <process.h>
using namespace std;
class inverse
{
private:
int i, j, k, n, flag, scani, scanj, *row, *col;
double eps, sum, pivot, aijcolk, *y, **a, **b, **c;
public:
void inverse_input();
void inverse_jordan_reduction();
void inverse_output();
void inverse_check();
~inverse()
{
delete[] row, col, y;
for (i = 0; i < n; i++)
{
delete[] a[i];
}
delete[] a;
for (i = 0; i < n; i++)
{
delete[] b[i];
}
delete[] b;
for (i = 0; i < n; i++)
{
delete[] c[i];
}
delete[] c;
}
};
void main()
{
inverse inversion;
inversion.inverse_input();
inversion.inverse_jordan_reduction();
inversion.inverse_output();
inversion.inverse_check();
}
void inverse::inverse_input()
{
ifstream fin("inverse.txt");
fin >> n;
n = 3;
row = new int[n];
col = new int[n];
y = new double[n];
a = new double*[n];
for (i = 0; i < n; i++)
{
a[i] = new double[n];
}
b = new double*[n];
for (i = 0; i < n; i++)
{
b[i] = new double[n];
}
c = new double*[n];
for (i = 0; i < n; i++)
{
c[i] = new double[n];
}
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
fin >> a[i][j];
b[i][j] = a[i][j];
}
fin >> eps;
fin.close();
}
void inverse::inverse_jordan_reduction()
{
for (k = 0; k < n; k++)
{
pivot = 0.0;
for (i = 0; i < n; i++)
{
flag = 0;
for (j = 0; j < n; j++)
{
flag = 0;
if (k > 0)
{
for (scani = 0; scani <= (k-1); scani++)
for (scanj = 0; scanj <= (k-1); scanj++)
{
if ((i == row[scani]) || (j == col[scanj]))
{
flag = 1;
}
}
}
else
{
flag = 0;
}
if (flag == 0)
{
if (fabs(a[i][j]) > fabs(pivot))
{
pivot = a[i][j];
row[k] = i;
col[k] = j;
}
}
}
}
if (fabs(pivot) > eps)
{
for (j = 0; j < n; j++)
{
if (j == col[k])
{
a[row[k]][col[k]] = 1.0 / pivot;
}
else
{
a[row[k]][j] /= pivot;
}
}
for (i = 0; i < n; i++)
{
aijcolk = a[i][col[k]];
if (i != row[k])
{
for (j = 0; j < n; j++)
{
if (j == col[k])
{
a[i][col[k]] /= -pivot;
}
else
{
a[i][j] -= aijcolk * a[row[k]][j];
}
}
}
}
}
else
{
cout << "\n最大的主元素 = " << pivot << endl;
cout << "\n矩阵可能奇异,失败..." << endl;
exit(0);
}
}
for (j = 0; j < n; j++)
{
for (i = 0; i < n; i++)
{
y[col[i]] = a[row[i]][j];
}
for (i = 0; i < n; i++)
{
a[i][j] = y[i];
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
y[row[j]] = a[i][col[j]];
}
for (j = 0; j < n; j++)
{
a[i][j] = y[j];
}
}
}
void inverse::inverse_output()
{
ofstream fout("inverse.out");
fout << "\n逆矩阵是:" << endl;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
fout << "\na[" << i << "][" << j << "] = " << a[i][j] << endl;
}
fout.close();
}
void inverse::inverse_check()
{
ofstream fout("inverse_check.out");
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
sum = 0.0;
for (k = 0; k < n; k++)
{
sum += b[i][k]*a[k][j];
}
c[i][j] = sum;
}
fout << endl << "\n输入的矩阵与它的逆矩阵的乘积:" << endl;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
fout << "\nc[" << i << "][" << j << "] = " << c[i][j] << endl;
}
fout.close();
}
- 求解线性方程组之Gauss-Jordan消去法求矩阵的逆
- 计算方法Gauss-Jordan消去法求线性方程组的解
- Gauss-Jordan消去法中完全选主元法求解线性方程组
- Gauss消去法求解线性方程组
- Gauss消去法求线性方程组
- 选主元的高斯-约当(Gauss-Jordan)消元法解线性方程组和求逆矩阵
- 求解线性方程组之Gauss_Jordan消去法
- 计算方法之用高斯列主元消去法求线性方程组
- Gauss消去法解线性方程组(Matlab)
- 求解线性方程组--全主元消去法
- 全主元高斯消去法求解线性方程组
- 行主元素消去法求解线性方程组的Pascal代码
- 主元高斯消去法求解线性方程组 C#源码
- 求解线性方程组--高斯消去法
- 求解线性方程组--主元消去法
- Gauss消去法解线性方程组(C语言版)
- 列主元Gauss消去法解线性方程组(C语言)
- Gauss消去,LU分解法,追赶法解线性方程组
- 求解线性方程组之Gauss_Jordan消去法
- Learning D3.js(2) 让你的柱形图/直方图动起来
- 欧拉函数
- django 事务小结(ORM 事务以及raw sql,customize sql 事务处理)
- 乐呵一下——程序猿
- 求解线性方程组之Gauss-Jordan消去法求矩阵的逆
- UVA 11300 Spreading the Wealth 推导+中位数求解
- c语言字符串 数字转换函数大全
- ISO/IEC 14496(MPEG4) 文档内容简介
- nyoj-138-找球号(二)----hash算法之除留余数法+vector
- Ext.from.FormPanel
- Oracle中删除一列
- shell参数替换之##%%
- Android 事件触发机制学习