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