C语言实现非齐次线性方程组求解
非齐次线性方程组的一般形式为:
a11x1 + a12x2 + ... + a1nxn = b1 a21x1 + a22x2 + ... + a2nxn = b2 ... am1x1 + am2x2 + ... + amnxn = bm
其中,a11, a12, …, a1n, a21, a22, …, a2n, …, am1, am2, …, amn是系数,b1, b2, …, bm是常数项。
我们可以使用高斯消元法来求解该方程组的解。具体步骤如下:
- 将方程组写成增广矩阵的形式,即:
a11 a12 ... a1n | b1 a21 a22 ... a2n | b2 ... ... ... ... | ... am1 am2 ... amn | bm
- 通过初等行变换将增广矩阵化为行阶梯形矩阵。具体步骤如下:
a. 将第一行的第一个非零元素(如果存在)变为1,即将第一行除以a11。
b. 将第一行的第一个非零元素下面的所有元素变为0,即将第二行减去第一行的倍数,使得第二行的第一个元素为0。
c. 重复上述步骤,依次将第三行、第四行、…、第m行化为行阶梯形矩阵。
- 通过回带法求解方程组的解。具体步骤如下:
a. 从最后一行开始,求出该行的解x_n。
b. 依次向上求解x_n-1、x_n-2、…、x_1。
下面是C语言的程序实现:
#include <stdio.h>
int main()
{
int n; // 方程组的未知数个数
printf("请输入方程组的未知数个数:");
scanf("%d", &n);
double a[n][n+1]; // 增广矩阵
printf("请输入方程组的系数和常数项:\n");
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n+1; j++)
{
scanf("%lf", &a[i][j]);
}
}
// 高斯消元
for (int i = 0; i < n-1; i++)
{
// 将第i列的第i+1行至第n行中最大的元素移到第i行
double max = a[i][i];
int max_index = i;
for (int j = i+1; j < n; j++)
{
if (a[j][i] > max)
{
max = a[j][i];
max_index = j;
}
}
if (max_index != i)
{
for (int j = i; j < n+1; j++)
{
double temp = a[i][j];
a[i][j] = a[max_index][j];
a[max_index][j] = temp;
}
}
// 将第i列的第i+1行至第n行中的元素化为0
for (int j = i+1; j < n; j++)
{
double factor = -a[j][i] / a[i][i];
for (int k = i; k < n+1; k++)
{
a[j][k] += factor * a[i][k];
}
}
}
// 回带法求解解
double x[n];
for (int i = n-1; i >= 0; i--)
{
double sum = 0;
for (int j = i+1; j < n; j++)
{
sum += a[i][j] * x[j];
}
x[i] = (a[i][n] - sum) / a[i][i];
}
// 输出解
printf("方程组的解为:\n");
for (int i = 0; i < n; i++)
{
printf("x%d = %lf\n", i+1, x[i]);
}
return 0;
}
原文地址: https://www.cveoy.top/t/topic/ocNE 著作权归作者所有。请勿转载和采集!