C 语言求解线性方程组172


线性方程组是数学中常见的问题,可以应用于工程、物理、经济等众多领域。C 语言作为一门强大的编程语言,可以方便高效地求解线性方程组。

高斯-乔丹消元法

高斯-乔丹消元法是一种经典的线性方程组求解方法,思路是将系数矩阵化为阶梯形式,再进行回代求解。

消元步骤:



将主元素变为 1。
将主元素所在列的其他元素变为 0。
向下进行,重复上述操作。

具体代码如下:```c
#include
int main() {
int n;
float a[100][100], b[100], x[100];
printf("请输入方程组的阶数:");
scanf("%d", &n);
printf("请输入系数矩阵和常数列:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%f", &a[i][j]);
}
scanf("%f", &b[i]);
}
// 消元
for (int i = 0; i < n; i++) {
// 找主元
int max_row = i;
for (int j = i + 1; j < n; j++) {
if (fabs(a[j][i]) > fabs(a[max_row][i])) {
max_row = j;
}
}
// 交换主元所在行
for (int j = 0; j < n; j++) {
float temp = a[i][j];
a[i][j] = a[max_row][j];
a[max_row][j] = temp;
}
float temp = b[i];
b[i] = b[max_row];
b[max_row] = temp;
// 消去主元所在列其他元素
for (int j = i + 1; j < n; j++) {
float factor = a[j][i] / a[i][i];
for (int k = i; k < n; k++) {
a[j][k] -= factor * a[i][k];
}
b[j] -= factor * b[i];
}
}
// 回代求解
for (int i = n - 1; i >= 0; i--) {
x[i] = b[i];
for (int j = i + 1; j < n; j++) {
x[i] -= a[i][j] * x[j];
}
x[i] /= a[i][i];
}
// 输出解
printf("解为:");
for (int i = 0; i < n; i++) {
printf("x[%d] = %.2f", i + 1, x[i]);
}
return 0;
}
```

克拉默法则

克拉默法则只适用于系数矩阵为非奇异的方程组,其解法是利用行列式计算每个未知数。

解法步骤:



计算系数矩阵的行列式。
对于每个未知数,用包含该未知数列的行列式除以系数矩阵的行列式。

具体代码如下:```c
#include
int main() {
int n;
float a[100][100], b[100], x[100];
printf("请输入方程组的阶数:");
scanf("%d", &n);
printf("请输入系数矩阵和常数列:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%f", &a[i][j]);
}
scanf("%f", &b[i]);
}
// 计算系数矩阵的行列式
float det = 1;
for (int i = 0; i < n; i++) {
int max_row = i;
for (int j = i + 1; j < n; j++) {
if (fabs(a[j][i]) > fabs(a[max_row][i])) {
max_row = j;
}
}
if (a[max_row][i] == 0) {
det = 0;
break;
}
det *= a[max_row][i];
for (int j = 0; j < n; j++) {
float temp = a[i][j];
a[i][j] = a[max_row][j];
a[max_row][j] = temp;
}
float temp = b[i];
b[i] = b[max_row];
b[max_row] = temp;
for (int j = i + 1; j < n; j++) {
float factor = a[j][i] / a[i][i];
for (int k = i; k < n; k++) {
a[j][k] -= factor * a[i][k];
}
b[j] -= factor * b[i];
}
}
// 求未知数
if (det == 0) {
printf("方程组无解或有无穷多解。");
} else {
for (int i = 0; i < n; i++) {
// 构造包含未知数 i 的行列式
float det_i = det;
for (int j = 0; j < n; j++) {
a[j][i] = b[j];
}
// 计算行列式
for (int j = 0; j < n; j++) {
int max_row = j;
for (int k = j + 1; k < n; k++) {
if (fabs(a[k][j]) > fabs(a[max_row][j])) {
max_row = k;
}
}
if (a[max_row][j] == 0) {
det_i = 0;
break;
}
det_i *= a[max_row][j];
for (int k = 0; k < n; k++) {
float temp = a[j][k];
a[j][k] = a[max_row][k];
a[max_row][k] = temp;
}
float temp = b[j];
b[j] = b[max_row];
b[max_row] = temp;
for (int k = j + 1; k < n; k++) {
float factor = a[k][j] / a[j][j];
for (int l = j; l < n; l++) {
a[k][l] -= factor * a[j][l];
}
b[k] -= factor * b[j];
}
}
x[i] = det_i / det;
}
// 输出解
printf("解为:");
for (int i = 0; i < n; i++) {
printf("x[%d] = %.2f", i + 1, x[i]);
}
}
return 0;
}
```

2025-02-08


上一篇:C 语言基础(3):函数简介

下一篇:C 语言中的晕眩效果:深入解析