算法思想
(1) 线性方程组写成增广矩阵的形式;
(2) 找主元,对增广矩阵进行行变换,对元素,在第i列中及以下的元素选取绝对值最大的元素,将所有元素中最大的所在的行与第i行交换;
(3) 消元过程,然后采用高斯消元法使得新得到的第i行以下的元素均为零;
(4) 重复上述过程直到,从而得到上三角矩阵;
(5) 对上三角矩阵进行回代求解,即可以得到方程组的解。
1高斯列主元法解线性方程组源代码
double A[N][N], b[N], Aug[N][N + 1];
void equ(double A[N][N], double b[N], double x[N], int n) //定义equ函数
{
int i, i1, j, k;
double Aug[N][N + 1]; //定义增广矩阵
double max, temp, l, s;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++) //构建增广矩阵Aug
{
Aug[i][j] = A[i][j];
Aug[i][n] = b[i];
}
}
cout << "增广矩阵:" << endl;
for (i = 0;i< n; i++) //输出增广矩阵Aug
{
for (j = 0; j< n + 1; j++)
cout << Aug[i][j] << " ";
cout << endl;
}
for (i1 = 0; i1< n - 1; i1++) //求主元
{
max = fabs(Aug[i1][i1]);
k = i1;
for (i = i1; i < n; i++)
{
if (max < fabs(Aug[i][i1]))
{
max = fabs(Aug[i][i1]);
k = i;
}
}
cout << "最大元max=" << max << endl;
cout << endl;
for (j = i1; j< n + 1; j++) //换行(将最大元素行换到目标行)
{
temp = Aug[i1][j];
Aug[i1][j] = Aug[k][j];
Aug[k][j] = temp;
}
for (i = 0; i < n; i++)
{
for (j = 0; j< n + 1; j++)
cout << Aug[i][j] << " ";
cout << endl;
}
cout << "以" << max << "为列主元消去得到:" << endl;
for (k = i1 + 1; k < n; k++) //消元
{
l = -Aug[k][i1] / Aug[i1][i1];
for (j = i1; j < n + 1; j++)
Aug[k][j] = Aug[k][j] + l*Aug[i1][j];
}
for (i = 0; i < n; i++) //输出Aug
{
for (j = 0; j < n + 1; j++)
cout << Aug[i][j] << " ";
cout << endl;
}
}
x[n - 1] = Aug[n - 1][n] / Aug[n - 1][n - 1]; //回代求解
for (i = n - 2; i >= 0; i = i - 1)
{
s = 0;
for (j = i + 1; j < n; j++)
s = s + Aug[i][j] * x[j];
x[i] = (Aug[i][n] - s) / Aug[i][i];
}
int main()
{
void equ(double A[N][N], double b[N], double x[N], int n);
//声明调用函数
int i, j, n, z;
double A[N][N], b[N], x[N];
//定义系数矩阵、常数列向量、变量列向量
cout << "请输入变量个数n:";
cin >> n;
cout << "请输入系数矩阵A" << endl;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
cin >> A[i][j];
}
cout << "请输入b" << endl;
for (z = 0; z < n; z++)
cin >> b[z];
equ(A, b, x, n); //调用equ函数
for (i = n - 1; i >= 0 && i < n; i--)
cout << "x[" << i << "]=" << x[i] << endl;
system("pause");
return 0;
}