c语言编写克莱姆法则,求克莱姆法则解方程组的c语言代码,能正确运行的
滿意答案
用C語言設(shè)計(jì)克萊姆法則的計(jì)算程序
【摘要】 本文以線性代數(shù)中的克萊姆法則為依據(jù),討論其計(jì)算程序的設(shè)計(jì)方法,并給出在微機(jī)上運(yùn)行的模擬人工解題的計(jì)算程序和應(yīng)用示例。
關(guān)鍵詞 克萊姆法則 程序
一、引 言
我們知道,在代數(shù)課的教學(xué)中無論是工科院校的線代數(shù)還是數(shù)學(xué)專業(yè)的高等代數(shù)都離不開克萊姆法則。由于該法則涉及到行列式的計(jì)算,在教學(xué)中只是挑選一些簡(jiǎn)單的例子進(jìn)行教學(xué),作業(yè)也比較少,致使學(xué)生練習(xí)不夠充分。現(xiàn)在計(jì)算機(jī)已普及,但線性代數(shù)的教學(xué)并沒有與算法語言的教學(xué)聯(lián)系起來,而現(xiàn)有文獻(xiàn)所研究的都是一些數(shù)值解法,從來不涉及象克萊姆法則這樣的概念?,F(xiàn)在已有按照行列式的定義計(jì)算行列式的計(jì)算程序[1,2],本文將在該程序的基礎(chǔ)上進(jìn)行擴(kuò)展,編寫出與克萊姆法則相對(duì)應(yīng)的程序。
二、克萊姆法則簡(jiǎn)述
設(shè)A=(aij)是一個(gè)n×n矩陣,設(shè)D=det A≠0那么方程組
有唯一解
這里Dj是用方程組右邊的常數(shù)項(xiàng)代替矩陣A中第j列所構(gòu)成的矩陣的行列式。
三、程序設(shè)計(jì)步
從克萊姆法則知,首先要把方程組的系數(shù)aij及bi( i,j=1,…,n)輸入計(jì)算機(jī),計(jì)算出Dj(j=1,2,…,n)最后算出xj(j=1,2,…,n),具體方法述于下。
1. 方程的個(gè)數(shù)N及方程組的系數(shù)與數(shù)組間的關(guān)系簡(jiǎn)述
由于克萊姆法則的計(jì)算工作量是很大的,方程組的個(gè)數(shù)n也不可能取的很大,又由于C編譯程序中二維數(shù)組的行是從0行開始,每行元素編號(hào)也從0開始,這樣用二維數(shù)組a來代表數(shù)學(xué)中的(aij),其對(duì)應(yīng)關(guān)系為a[i-1][j-1]對(duì)應(yīng)aij (i,j=1,…,n)。
2. 計(jì)算D和Dj (j=1,…,n).
由⑴和⑵式看出,對(duì)行列式的計(jì)算程序要使用n+1次,將該部分程序?qū)懺谥鞒绦蛑谐绦蝻@得很長(zhǎng),不便于閱讀和維護(hù)。為此,將計(jì)算行列式的程序段寫成一個(gè)函數(shù)并命名為int det (int n),以便計(jì)算D與Dj(j=1,…,n)時(shí)調(diào)用,在調(diào)用該函數(shù)計(jì)算出A的行列式D后再用一偱環(huán)來調(diào)用該函數(shù)計(jì)算Dj(j=1,…,n)。
調(diào)用函數(shù)det()計(jì)算出A 的行列式D。
在計(jì)算Dj之前,先把A中的第j列元素存入數(shù)組c中,然后用常數(shù)bi(i=1,…,n)代替a中的第j列元素,調(diào)用函數(shù)det(),計(jì)算出Dj,當(dāng)j≠n時(shí)恢復(fù)A數(shù)組,重復(fù)這一過程直到算出全部Dj,(j=1,…,n)為止。
3.計(jì)算xj(j=1,…,n)
按⑵式進(jìn)行。
4.det()函數(shù)
在該函數(shù)中j0,j1,j2,j3,j4,j5,j6是循環(huán)變量,每個(gè)循環(huán)確定一個(gè)行列式定義中元素的列下標(biāo),并將這個(gè)下標(biāo)存在數(shù)組k中,以便計(jì)算行列式的項(xiàng)時(shí)使用,當(dāng)各下標(biāo)均確定好后調(diào)用term()函數(shù)計(jì)算出行列式的一個(gè)項(xiàng)。
四、計(jì)算程序
#define N 7
static int a[N][N] ,b[N];
int di[N],c[N];
double x[N];
int term (int n, int k[])
{
int p,q,t=1;
for (p=1; p)
for(q=0; q)
if(k[q]>k[p]) t=-t;)
for (p=0;p
t*=a[p][k[p]];
return (t);
}
int det(int n)
{
int j0,j1,j2,j3,j4,j5,j6,d,k[N];
d=0;
for (j0=0;j0
if(a[0][j0]==0) continue;
k[0]=j0;
for (j1=0;j1
if(j1==j0) continue;
if(a[1][j1]==0) continue;
k[1]=j1;
if(n==2) d+=term(n,k);
for (j2=0;j2
if(j2==j0) continue;
if(j2==j1) continue;
if(a[2][j2]==0) continue;
k[2]=j2;
if(n==3) d+=term(n,k);
for (j3=0; j3
if(j3==j0) continue;
if(j3==j1) continue;
if(j3==j2) continue;
if(a[3][j3]==0) continue;
k[3]=j3;
if(n==4) d+=term(n,k);
for(j4=0; j4
if(j4==j0) continue;
if(j4==j1) continue;
if(j4==j2) continue;
if(j4==j3) continue;
if(a[4][j4]==0) continue;
k[4]=j4;
if(n==5) d+=term(n,k);
for(j5=0;j5
if(j5==j0) continue;
if(j5==j1) continue;
if(j5==j2) continue;
if(j5==j3) continue;
if(j5==j4) continue;
if(a[5][j5]==0) continue;
k[5]=j5;
if(n==6) d+=term(n,k);
for(j6=0;j6
if(j6==j0) continue;
if(j6==j1) continue;
if(j6==j2) continue;
if(j6==j3) continue;
if(j6==j4) continue;
if(j6==j5) continue;
if(a[6][j6]==0) continue;
k[6]=j6;
d+=term(n,k);
}
}
}
}
}
}
}
return (d);
}
#include "stdio.h"
main()
{
int i,j,n,d;
printf("n=2,3,...,7\n");
printf("n=");
scanf("%d",&n);
for (i=0;i
for(j=0;j
printf("a[%d][%d]=",i+1,j+1);
scanf("%d",&a[i][j]);
}
printf("b[%d]=",i+1);
scanf("%d",&b[i]);
printf("\n");
}
printf("elements of det:\n");
for (i=0;i
for (j=0;j
printf("%d\t",a[i][j]);
printf("%d\t",b[i]);
printf("\n");
}
printf("computing D and Di ...\n");
d=det(n);
printf("D = %d\n",d);
for (j=0;j
for (i=0;i
c[i]=a[i][j];
a[i][j]=b[i];
}
di[j]=det(n);
printf("D%d= %d\n",j+1,di[j]);
for(i=0;i
a[i][j]=c[i];
}
for (i=0;i
x[i]=(0.0+di[i])/d;
printf("x%d=%f\t",i+1,x[i]);
}
printf("\nend!\n");
}
五、程序運(yùn)行時(shí)的屏幕信息介紹及程序運(yùn)行示例
在運(yùn)行中,計(jì)算機(jī)屏幕上顯示“n=2,3, …,7”的信息是告訴用戶該程序可計(jì)算二元、…、七元一次線性方程組。“n=”的信息是請(qǐng)用戶輸入要解的方程組中方程的個(gè)數(shù),這里為2到7的任何整數(shù)。
屏幕上顯示“a[i][j]=”時(shí),是請(qǐng)用戶輸入第i個(gè)方程中xj的系數(shù)aij,輸入aij后按一下回車鍵;屏幕上顯示“b[i]=”時(shí),是請(qǐng)用戶輸入第i個(gè)方程等號(hào)右邊的常數(shù)bi,輸入bi后按一下回車鍵;這里i,j為小于或等于n的正整數(shù),當(dāng)輸入完畢后,屏幕上將以方陣的形式顯示所輸入的數(shù)據(jù)及計(jì)算結(jié)果。
例 計(jì)算四元一次線方程組
的過程入下
n=2,3,…,7
n=4
a[1][1]=2 a[2][1]=1 a[3][1]=0 a[4][1]=1 b[1]=8
a[1][2]=1 a[2][2]=-3 a[3][2]=2 a[4][2]=4 b[2]=9
a[1][3]=-5 a[2][3]=0 a[3][3]=-1 a[4][3]=-7 b[3]=-5
a[1][4]=1 a[2][4]=-6 a[3][4]=2 a[4][4]=6 b[4]=0
輸入的數(shù)椐以方陣的格式顯示在屏幕上(本文從略)
computing…
D=27 D1=81 D2=-108 D3=-27 D4=27
X1=3 x2=-4 x3=-1 x4=1 (按(2)式計(jì)算時(shí)以實(shí)數(shù)形式輸出)
End!
00分享舉報(bào)
總結(jié)
以上是生活随笔為你收集整理的c语言编写克莱姆法则,求克莱姆法则解方程组的c语言代码,能正确运行的的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yum mysql 5.1 innodb
- 下一篇: 【黑群晖】搭建共享存储云盘系统