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 语言中的晕眩效果:深入解析
Java数组元素:从基础到高级操作的深度解析
https://www.shuihudhg.cn/134539.html
PHP Web应用的安全基石:全面解析数据库SQL注入防御
https://www.shuihudhg.cn/134538.html
Python函数入门到进阶:用简洁代码构建高效程序
https://www.shuihudhg.cn/134537.html
PHP中解析与提取代码注释:DocBlock、反射与AST深度探索
https://www.shuihudhg.cn/134536.html
Python深度解析与高效处理.dat文件:从文本到二进制的实战指南
https://www.shuihudhg.cn/134535.html
热门文章
C 语言中实现正序输出
https://www.shuihudhg.cn/2788.html
c语言选择排序算法详解
https://www.shuihudhg.cn/45804.html
C 语言函数:定义与声明
https://www.shuihudhg.cn/5703.html
C语言中的开方函数:sqrt()
https://www.shuihudhg.cn/347.html
C 语言中字符串输出的全面指南
https://www.shuihudhg.cn/4366.html