日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言实现行列式计算

發(fā)布時間:2023/12/10 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言实现行列式计算 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

C語言實現(xiàn)行列式計算

前言

行列式的計算有多種方法,其中按行(列)展開法最為直觀,因此也最容易編寫為程序.本文提供兩種計算方法.

【方法一】
利用函數(shù)的遞歸,計算任意階行列式的值。注意:本程序中,在計算行列式之前,需輸入行列式的階數(shù).
C語言在數(shù)學計算領域有諸多不便之處,例如數(shù)組的長度不可更改,這一點對于行列式的計算來說是極不方便的,因為余子式的階數(shù)比原行列式的階數(shù)要小,而在遞歸的過程中涉及到數(shù)組的長度.為此,設立兩個函數(shù),第一個函數(shù)DET為計算的主要部分,第二個函數(shù)Minor專門用于計算余子式的值,而第二個函數(shù)中會調(diào)用第一個函數(shù).
【方法二】
利用高斯消元法把行列式化簡為上三角形,再累乘對角線元素即可.


代碼展示

【方法一】:

#include <stdio.h> #include <math.h> #define MAX 20 //最大計算階數(shù),可以更改//兩個函數(shù)的聲明 int DET(int arr1[MAX][MAX], int n); int Minor(int arr1[MAX][MAX], int i, int n);int DET(int arr1[MAX][MAX], int n) {int i, M, sum = 0;//i是第一行的列指標,M是余子式的值,sum是行列式的計算值if (n == 1)//一階行列式直接得出結(jié)果return arr1[0][0];else if (n > 1){for (i = 0; i < n; i++)//按第一行展開{M = Minor(arr1, i, n);sum += pow(-1, i + 2) * arr1[0][i] * M;}}return sum; }int Minor(int arr1[MAX][MAX],int i,int n) {int j, k,result;int arr2[MAX][MAX];//以下為構(gòu)造余子式的過程。由于C語言的特性,這個過程會比較復雜,需要觀察余子式與原行列式的關系。for (j = 0; j < n - 1; j++){for (k = 0; k < n - 1; k++){if (k < i)arr2[j][k] = arr1[j + 1][k];else if (k >= i)arr2[j][k] = arr1[j + 1][k + 1];}}return DET(arr2, n - 1);//構(gòu)造完后,余子式是一個新的行列式,返回DET函數(shù)進行計算。 }int main() {int arr1[MAX][MAX];int a,b,n;printf("請輸入行列式階數(shù):");scanf_s("%d", &n);printf("請輸入行列式:\n");for (a = 0; a < n; a++) {for (b = 0; b < n; b++) {scanf_s("%d", &arr1[a][b]);}}printf("%d", DET(arr1, n)); }

【方法二】
注:此方法中數(shù)據(jù)類型為double型.

#include <stdio.h> #define MAX 20void swap(double* a,double*b){double tmp = *a;*a = *b;*b = tmp; }void swaparr(double arr[MAX][MAX],int a,int b,int n){int i;for(i=0;i<n;i++)swap(&arr[i][a],&arr[i][b]); }int main(){int i,j,k;int n; //階數(shù) int sign=0; //行列式交換一次需要改變符號,此變量記錄交換次數(shù) double tmp; //暫存乘積因子 double arr[MAX][MAX];double sum=1.0; //結(jié)果 scanf("%d",&n);for(i=0;i<n;i++){for(j=0;j<n;j++)scanf("%lf",&arr[i][j]);}for(i=0;i<n-1;i++){k=1;while(arr[i][i]==0.0&&i+k<n){ //確保標準數(shù)不為0 swaparr(arr,i,i+(k++),n);sign++;}if(arr[i][i]==0.0&&i+k==n){ //整個一行都為0 printf("0");return 0;}for(j=i+1;j<n;j++){if(arr[j][i]==0.0) //如為0則那一行不用化簡 continue;else{tmp = -(double)arr[j][i]/arr[i][i]; //保存乘積因子 for(k=i;k<n;k++)arr[j][k] += (tmp*arr[i][k]);}}}for(i=0;i<n;i++)sum *= arr[i][i];if(sign%2==0) //交換偶數(shù)次符號仍為正 printf("%f",sum);elseprintf("-%f",sum); return 0; }

總結(jié)

以上是生活随笔為你收集整理的C语言实现行列式计算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。