C语言求解非齐次线性方程组
非齐次线性方程组的一般形式为:
a11x1 + a12x2 + … + a1nxn = b1
a21x1 + a22x2 + … + a2nxn = b2
…
am1x1 + am2x2 + … + amnxn = bm
其中,a11、a12、…、amn为方程组的系数,b1、b2、…、bm为方程组的常数项,x1、x2、…、xn为未知数。
设A为系数矩阵,b为常数项向量,x为未知数向量,则非齐次线性方程组可以表示为:Ax = b。
解非齐次线性方程组的一般步骤为:
-
求出系数矩阵A的行列式值det(A)。
-
如果det(A)≠0,则A可逆,解为x = A-1b。
-
如果det(A)=0,则A不可逆,需要求出A的伴随矩阵adj(A)。
-
求出A的伴随矩阵adj(A)。
-
如果adj(A)b=0,则方程组有无穷多解。
-
如果adj(A)b≠0,则方程组无解。
下面是一个用C语言编写的求解非齐次线性方程组的程序:
#include <stdio.h>
#include <stdlib.h>
#define N 100
// 求解非齐次线性方程组Ax=b
void solve_equations(double A[N][N], double b[N], int n)
{
int i, j, k;
double det = 1;
double x[N], y[N], adj[N][N], inv[N][N];
// 求解行列式值
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (i != j) {
det *= A[i][i] - A[j][i] * A[i][j] / A[j][j];
}
}
}
// 判断A是否可逆
if (det == 0) {
printf("The matrix A is singular!\n");
return;
}
// 求解逆矩阵和伴随矩阵
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
y[j] = (i == j) ? 1 : 0;
for (k = 0; k < i; k++) {
y[j] -= A[i][k] * inv[k][j];
}
}
for (j = n - 1; j >= 0; j--) {
inv[i][j] = y[j];
for (k = i + 1; k < n; k++) {
inv[i][j] -= A[i][k] * inv[k][j];
}
inv[i][j] /= A[i][i];
adj[j][i] = ((i + j) % 2 == 0) ? det * inv[i][j] : -det * inv[i][j];
}
}
// 判断方程组是否有解
for (i = 0; i < n; i++) {
x[i] = 0;
for (j = 0; j < n; j++) {
x[i] += adj[i][j] * b[j];
}
if (adj[i][i] == 0 && b[i] != 0) {
printf("The equations have no solution!\n");
return;
}
}
// 输出解向量
printf("The solution is:\n");
for (i = 0; i < n; i++) {
printf("x[%d] = %lf\n", i, x[i]);
}
}
int main()
{
int n, i, j;
double A[N][N], b[N];
// 输入方程数目
printf("Input the number of equations: ");
scanf("%d", &n);
// 输入系数矩阵和常数项向量
printf("Input the matrix A and vector b:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%lf", &A[i][j]);
}
scanf("%lf", &b[i]);
}
// 求解非齐次线性方程组
solve_equations(A, b, n);
return 0;
}
原文地址: https://www.cveoy.top/t/topic/n9aN 著作权归作者所有。请勿转载和采集!