高斯列主元消去法_解线性方程组的直接解法
标签:计算方法实验
#include <stdio.h>
#include <math.h>
const int maxn = 15;
double a[maxn][maxn], b[maxn];
int main()
{
int n;
freopen("gauss.txt", "r", stdin); //读入数据
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++) scanf("%lf", &a[i][j]);
scanf("%lf", &b[i]);
}
/*打印数据文件
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++) printf("%10f", a[i][j]);
printf("%10f\n", b[i]);
}
printf("\n");
*/
for(int k = 1; k <= n - 1; k++) //n - 1列
{
int column = k;
double mainelement = a[k][k];
for(int i = k; i <= n; i++) //找主元素
if(fabs(a[i][k]) > mainelement)
{
mainelement = fabs(a[i][k]);
column = i;
}
for(int j = k; j <= n; j++) //交换两行
{
double atemp = a[k][j];
a[k][j] = a[column][j];
a[column][j] = atemp;
}
double btemp = b[k];
b[k] = b[column];
b[column] = btemp;
for(int i = k + 1; i <= n; i++) //消元过程
{
double Mik = a[i][k] / a[k][k];
for(int j = k; j <= n; j++) a[i][j] -= Mik * a[k][j];
b[i] -= Mik * b[k];
}
}
for(int i = 1; i <= n; i++) //经列主元高斯消去法得到的上三角阵(最后一列为常系数)
{
for(int j = 1; j <= n; j++) printf("%10f", a[i][j]);
printf("%10f\n", b[i]);
}
printf("\n");
b[n] /= a[n][n]; //回代过程
for(int i = n - 1; i >= 1; i--)
{
double sum = 0;
for(int j = i + 1; j <= n; j++) sum += a[i][j] * b[j];
b[i] = (b[i] - sum) / a[i][i];
}
for(int i = 1; i <= n; i++) printf("x%d = %10f\n", i, b[i]); //小优化b[]->x[]
return 0;
}
数据文件
实验结果