一、運行結果展示:
二、關鍵詞:C語言,解n元線性方程組,用行列式法
三、摘要:本文闡述了用C語言編程,通過求n階行列式的值,解n元線性方程組的方法,并特别把程序附在後面。
四、解法:
解n元線性方程組:
a11*x1 a12*x2 ……a1n*xn=b1
a21*x1 a22*x2 ……a2n*xn=b2
…………
an1*x1 an2*x2 ……ann*xn=bn
為便于叙述把其中的某一方程記為:ai1*x1 ai2*x2 ……ain*xn=bi,其中i從1到n.
1)求n階行列式的值:要用到的性質有三條:a.當行列式主對角線的右上角(或左下角)元素全為0時,該行列式的值等于其主對角線元素的乘積。b.給行列式的某一列(或行)元素都乘以常數k,加到另一列(或行)的對應元素上,行列式的值不變。c.交換行列式的任意兩列(或兩行),行列式的值變号。
現設主對角線上某一元素aii≠0(如果aii=0,則需要在同一行aii的右邊找一個不為0的元素,把這一列與aii所在列進行交換),它右邊的元素為aij,則得權重因子q=-aij/aii,隻要給第i列的每個元素分别乘以q,加到第j列對應元素上,就可以使aij變成0,且不會改變行列式的值。用此方法就能把本行aii右邊的每一個aij(j從i 1到n)都變成0。
從a11開始重複進行以上操作,就能把每一個aii右邊的所有元素全變成0,也就是把主對角線右上角的元素全變成了0.
再求出主對角線元素的積,也就求出了行列式的值。
2)編寫換列函數:每次都要把原系數行列式數組a傳遞進換列函數,再把傳進來的數組a複制一個副本數組f,然後把這個副本f中的第j列換成常數項,最後調用行列式求值函數求換列後行列式的值dj。
3)在求行列式值時,為了保證原系數行列式保持不變,始終要用副本行列式進行計算。
五、C語言用行列式解n元線性方程組程序如下:
//用行列式解n元線性方程組
#include <stdio.h>
#define N 30 //常數N應大于方程組的元數n
int main()
{ int i,j,k,n,h; //方程組的元數n,需要換的列h
double hlshi(double[N][N],int); //求行列式值函數原型聲明
double huanlie(double[N][N],double[N],int,int);//行列式換列函數原型聲明
double a[N][N]={},f[N][N]={},b[N]={},x0,xj; //系數行列式a,換列行列式f,常數項行列式b;系數行列式的值x0,其它行列式的值xj
printf("請輸入方程組的元數n及n個常數項(相互用空格隔開):"); printf("n b[1] b[2] …b[n]:");
scanf("%d",&n); //讀入方程的元數n
for(i=1;i<=n;i ) { scanf("%lf",&b[i]);} //讀入每個常數項
printf("請輸入未知數的n*n個系數(相互用空格隔開):\n");
for(i=1;i<=n;i )
{ for(j=1;j<=n;j )
{ scanf("%lf",&a[i][j]); //讀入系數
f[i][j]=a[i][j]; //複制系數行列式
}
}
x0=hlshi(f,n); //調用函數求系數行列式的值x0,其中f,n為實參
if(x0!=0)
{ printf("此方程組的解為:\n");
for(h=1;h<=n;h ) //用常數項替換各列:
{ xj=huanlie(a,b,n,h); //調用函數,求換列後各行列式的值xj:
printf("x%d=%e\n",h,xj/x0); //輸出方程組的解
}
}
else printf("此方程組無解或有無數解.\n");
}
//行列式換列函數:
double huanlie(double a[N][N],double b[N],int n,int h) //換列函數首部行,這裡a,b,n,h為形參
{ double f[N][N];
int i,j,k;
for(i=1;i<=n;i ) //把a行列式複制到f行列式:
{ for(j=1;j<=n;j ) { f[i][j]=a[i][j];}
}
for(i=1;i<=n;i ) { f[i][h]=b[i];} //把第h列換成常數項:
double hlshi(double [N][N],int); //求行列式值函數原型聲明
double xj;
xj=hlshi(f,n); //調用函數求h列換成常數項後各行列式的值xj
return (xj); //返回換列後行列式的值xj
}
//求行列式值的函數:
double hlshi(double f[N][N],int n) //函數首部行,這裡f,n為形式參數
{ int i,j,k,m=1;
double q,t,x;
for(i=1;i<=n;i )
{ j=i; //主對角線元素行列标号相同
while(f[i][i]==0&&j<n) //若f[i][i]=0,則與後列交換:
{ j ;m=-m; //換列1次值取反
for(k=1;k<=n;k ) { t=f[k][i];f[k][i]=f[k][j];f[k][j]=t;}//交換i,j兩列
}
for(j=i 1;j<=n;j ) //使行列式的右上三角形全為0:
{ if(f[i][j]==0) continue; //已經是0的繼續下一個
q=-f[i][j]/f[i][i]; //求權重因子q=-j(列)/i(列)
for(k=i;k<=n;k ) { f[k][j] =f[k][i]*q;} //使f[i][i]右邊各項全為0
}
}
x=f[1][1]*m; //确定首項正負
for(i=2;i<=n;i ) { x*=f[i][i];} //求主對角線之積
return (x); //返回行列式的值
}
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!