用列主元高斯消元法求解下列线性方程组的解和系数矩阵A的行列式值 要求: (1) 线性方程组的维数n、系数矩阵A的元素、列向量b的元素从键盘输入; (2) 将每一次消元过程得到的增广矩阵打印输出; (3) 最后输出方程组的解和系数矩阵A的行列式值。 C/C++实现
时间: 2023-12-10 21:37:36 浏览: 74
以下是用 C++ 实现的列主元高斯消元法的代码:
```cpp
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
const int MAXN = 100; // 线性方程组的最大维数
int n; // 线性方程组的维数
double a[MAXN][MAXN]; // 系数矩阵
double b[MAXN]; // 右端向量
int p[MAXN]; // 列主元数组
void input()
{
cout << "请输入线性方程组的维数n: ";
cin >> n;
cout << "请输入系数矩阵A: " << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
cout << "请输入右端向量b: " << endl;
for (int i = 0; i < n; i++) {
cin >> b[i];
}
}
void print()
{
cout << "增广矩阵为:" << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << setw(8) << setprecision(4) << a[i][j] << " ";
}
cout << "| " << setw(8) << setprecision(4) << b[i] << endl;
}
cout << endl;
}
void swap_row(int i, int j)
{
if (i != j) {
swap(b[i], b[j]);
for (int k = 0; k < n; k++) {
swap(a[i][k], a[j][k]);
}
}
}
void pivot(int k)
{
int max_id = k;
double max_val = abs(a[k][k]);
for (int i = k + 1; i < n; i++) {
if (abs(a[i][k]) > max_val) {
max_val = abs(a[i][k]);
max_id = i;
}
}
if (max_val < 1e-6) {
// 主元太小,无法进行消元,直接退出
cout << "主元太小,无法进行消元!" << endl;
exit(1);
}
swap_row(k, max_id);
p[k] = max_id;
}
void gauss()
{
// 初始化列主元数组
for (int i = 0; i < n; i++) {
p[i] = i;
}
// 消元过程
for (int k = 0; k < n - 1; k++) {
pivot(k);
for (int i = k + 1; i < n; i++) {
double factor = a[i][k] / a[k][k];
b[i] -= factor * b[k];
for (int j = k + 1; j < n; j++) {
a[i][j] -= factor * a[k][j];
}
}
print();
}
// 求解过程
for (int k = n - 1; k >= 0; k--) {
int idx = p[k];
for (int j = k + 1; j < n; j++) {
b[k] -= a[k][j] * b[j];
}
b[k] /= a[k][k];
}
}
double det()
{
double res = 1.0;
for (int i = 0; i < n; i++) {
res *= a[i][i];
}
return res;
}
void output()
{
cout << "方程组的解为:" << endl;
for (int i = 0; i < n; i++) {
cout << "x" << i + 1 << " = " << setw(8) << setprecision(4) << b[i] << endl;
}
cout << "系数矩阵A的行列式值为:" << det() << endl;
}
int main()
{
input();
print();
gauss();
output();
return 0;
}
```
注意,这里为了简化代码,省略了对输入数据的错误检查,实际使用时需要加上。
阅读全文