用c语言编程:列选主元高斯消元法求解线性方程组: 用列选主元高斯消元法求解线性方程组Ax=b。输出消元后方程的排列、系数矩阵最后一列及解。选主元时,依次从列选,相等时取最大的第一个。 输入格式:第一行一个整数n,矩阵的行数(n<20) 接着n行,每行是矩阵的一行数据,按行顺序。每行n+1个实数,前n个实数是A的系数,最后一个是b的对应行的数。 输出格式: 第一行N个整数,消去结束后,方程顺序,比如3 4 2 1(数与数之间有空格,结束的位置没有空格),指第一次消元从原方程的第3个方程选主元,指第二次消元从原方程的第4个方程选主元,指第三次消元从原方程的第2个方程选主元,指第四次消元从原方程的第1个方程选主元。 第二行N个实数,消元结束时,系数矩阵最后一列的数,从第一行到最后一行,精确到小数点后3位,数与数之间有空格,结束的位置没有空格 第三行N个实数,具体的解,数与数之间有空格,结束的位置没有空格
时间: 2023-06-15 17:07:40 浏览: 114
用c语言实现高斯消元求解线性方程组的解
5星 · 资源好评率100%
很高兴为您解答,以下是C语言代码实现:
```
#include <stdio.h>
#include <stdlib.h>
#define N 20
int main()
{
int n, i, j, k, max_row;
double A[N][N+1], temp, max_val;
printf("请输入矩阵的行数n:");
scanf("%d", &n);
printf("请输入矩阵:\n");
for(i=0; i<n; i++)
{
for(j=0; j<=n; j++)
{
scanf("%lf", &A[i][j]);
}
}
int p[N]; //记录主元所在的行号
for(i=0; i<n; i++)
{
p[i] = i;
}
//列选主元高斯消元
for(k=0; k<n-1; k++)
{
//选主元
max_val = 0;
for(i=k; i<n; i++)
{
if(abs(A[p[i]][k]) > max_val)
{
max_val = abs(A[p[i]][k]);
max_row = i;
}
}
if(max_val == 0)
{
printf("矩阵为奇异矩阵,无解!\n");
return 0;
}
if(max_row != k)
{
//交换主元所在的行和第k行
temp = p[max_row];
p[max_row] = p[k];
p[k] = temp;
}
//消元
for(i=k+1; i<n; i++)
{
temp = A[p[i]][k] / A[p[k]][k];
for(j=k+1; j<=n; j++)
{
A[p[i]][j] -= temp * A[p[k]][j];
}
A[p[i]][k] = 0;
}
}
//输出消元后方程的排列
printf("排列:");
for(i=0; i<n; i++)
{
printf("%d ", p[i]+1);
}
printf("\n");
//输出消元后系数矩阵最后一列
printf("系数矩阵最后一列:");
for(i=0; i<n; i++)
{
printf("%.3f ", A[p[i]][n]);
}
printf("\n");
//回代求解
double x[N];
for(i=n-1; i>=0; i--)
{
x[i] = A[p[i]][n];
for(j=i+1; j<n; j++)
{
x[i] -= A[p[i]][j] * x[j];
}
x[i] /= A[p[i]][i];
}
//输出解
printf("解:");
for(i=0; i<n; i++)
{
printf("%.3f ", x[i]);
}
printf("\n");
return 0;
}
```
希望能对您有所帮助!
阅读全文