tft每日頭條

 > 生活

 > c語言求解二元一次方程組

c語言求解二元一次方程組

生活 更新时间:2024-08-16 08:13:40

一、運行結果展示:

c語言求解二元一次方程組(用行列式解線性方程組及C語言實現)1

二、關鍵詞: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. 解法根據(克萊姆法則):把系數行列式的值記作d,把系數行列式的第j列換成常數項後所得行列式的值記作dj,如果系數行列式的值d≠0,則行列式有唯一解xj=dj/d,(其中j從1到n)
  2. 解法的關鍵:一是怎麼編寫求n階行列式值的函數;二是怎麼用常數項列換掉方程組中某一未知數的系數列;三是怎麼保證函數調用後原系數行列式不變。
  3. 解法步驟:

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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved