用c语言代码举例题目16:n阶方阵求逆。输入是一个n(n<256)阶方阵A,输出是它的逆矩阵,要求还要再将得到的逆矩阵与原来的矩阵相乘,验证其结果是单位矩阵
时间: 2023-08-22 12:10:14 浏览: 78
N*N阶方阵求逆矩阵C代码
5星 · 资源好评率100%
以下是一个用 C 语言实现的 n 阶方阵求逆的代码。这里用到了高斯-约旦消元法进行求解:
```
#include <stdio.h>
#include <stdlib.h>
#define MAXN 256
double A[MAXN][MAXN*2]; // 扩展矩阵,用于存放原矩阵和单位矩阵
int n; // 矩阵的阶数
// 交换两行
void swap(int i, int j) {
for (int k = 0; k < n*2; k++) {
double temp = A[i][k];
A[i][k] = A[j][k];
A[j][k] = temp;
}
}
// 消元
void elimination(int row, int col) {
for (int i = row+1; i < n; i++) {
double factor = A[i][col] / A[row][col];
for (int j = col; j < n*2; j++) {
A[i][j] -= factor * A[row][j];
}
}
}
// 消元并回带
void back_substitution(int row, int col) {
double factor = A[row][col];
for (int j = col; j < n*2; j++) {
A[row][j] /= factor;
}
for (int i = row-1; i >= 0; i--) {
double factor = A[i][col];
for (int j = col; j < n*2; j++) {
A[i][j] -= factor * A[row][j];
}
}
}
int main() {
// 输入矩阵的阶数
printf("Please input the order of the matrix: ");
scanf("%d", &n);
// 输入原矩阵
printf("Please input the elements of the matrix:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%lf", &A[i][j]);
}
}
// 初始化扩展矩阵
for (int i = 0; i < n; i++) {
for (int j = n; j < n*2; j++) {
if (i == j-n) {
A[i][j] = 1.0;
} else {
A[i][j] = 0.0;
}
}
}
// 高斯-约旦消元求解逆矩阵
for (int i = 0; i < n; i++) {
// 查找主元
int pivot = i;
for (int j = i+1; j < n; j++) {
if (abs(A[j][i]) > abs(A[pivot][i])) {
pivot = j;
}
}
if (pivot != i) {
swap(i, pivot);
}
// 消元
elimination(i, i);
}
for (int i = n-1; i >= 0; i--) {
back_substitution(i, i);
}
// 输出逆矩阵
printf("The inverse matrix is:\n");
for (int i = 0; i < n; i++) {
for (int j = n; j < n*2; j++) {
printf("%.2lf ", A[i][j]);
}
printf("\n");
}
// 验证结果
printf("Verification:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
double sum = 0.0;
for (int k = 0; k < n; k++) {
sum += A[i][k+n] * A[k][j];
}
if (i == j) {
if (abs(sum - 1.0) > 1e-6) {
printf("Error!");
return -1;
}
} else {
if (abs(sum) > 1e-6) {
printf("Error!");
return -1;
}
}
}
}
printf("Correct!\n");
return 0;
}
```
注意,在实际使用中,由于计算机的精度限制,求逆矩阵并验证是否为单位矩阵时可能会出现误差,因此需要对误差进行一定的容忍。在上面的代码中,我们使用了 `1e-6` 作为误差容忍范围。
阅读全文