?? gauss列主元消去法1.c
字號(hào):
#include<stdio.h>
#include<math.h>
#define MAX_N 20
main()
{
int i,j,k;
int n;
int i_k; //列主元所在行的指標(biāo)
double m; //列主元的值
double a,b; //換行時(shí)做終結(jié)制值
double D=1; //行列式的值
double A[MAX_N][MAX_N];
double B[MAX_N];
// double M[MAX_N][MAX_N];
printf("請(qǐng)輸入系數(shù)矩陣的階數(shù)n:\n");
scanf("%d",&n);
printf("請(qǐng)輸入系數(shù)矩陣A:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%lf",&A[i][j]);
printf("請(qǐng)輸入右端項(xiàng)b:\n");
for(i=0;i<n;i++)
scanf("%lf",&B[i]);
for(k=0;k<n-1;k++) //最后一行就不用選了
{
m=0; //開(kāi)始按列選主元
i_k=k;
for(i=k;i<n;i++)
{
if(fabs(A[i][k])>m)
{
m=fabs(A[i][k]);
i_k=i; //記錄主元所在行的指標(biāo)
} //if
} //for i
if(m==0)
{
printf("系數(shù)矩陣奇異!\ndetA=0\n");
break;
} //if
else if(i_k!=k)
{
for(j=k;j<n;j++) //換行 書(shū)上的算法這里錯(cuò)了!!!
{
a=A[i_k][j];
A[i_k][j]=A[k][j];
A[k][j]=a;
} //for j
b=B[i_k];
B[i_k]=B[k];
B[k]=b;
D=(-1)*D; //換行,行列式變號(hào)
} //else if
D=D*A[k][k];
for(i=k+1;i<n;i++) //計(jì)算乘子
{
A[i][k]=A[i][k]/A[k][k];
} //for i
for(i=k+1;i<n;i++) //消元
{
for(j=k+1;j<n;j++)
{
A[i][j]=A[i][j]-A[i][k]*A[k][j];
} //for j
B[i]=B[i]-A[i][k]*B[k];
} //for i
} //for k
for(i=n-1;i>=0;i--) //回代;臨時(shí)用b來(lái)存儲(chǔ)這里的和
{
b=0;
for(j=i+1;j<n;j++)
{b+=A[i][j]*B[j];}
B[i]=(B[i]-b)/A[i][i];
} //for i
D=D*A[n-1][n-1]; //在k進(jìn)行循環(huán)的時(shí)候只循環(huán)到了n-2 (也可以在上面讓k循環(huán)到n-1)
printf("系數(shù)矩陣行列式的值為%lf。\n",D);
printf("解為x_i=\n");
for(i=0;i<n;i++)
printf("%lf\n",B[i]);
return 0;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -