求行列式的值C语言
一、运行结果展示:
二、求行列式值的方法:可以利用行列式的定义或代数余子式求值,这里是利用行列式的性质求值,主要有三条:1.如果行列式主对角线一侧(右上侧或左下侧)的元素全为0,那么该行列式的值等于其主对角线元素之积。并把这样的行列式称为三角行列式。2.给行列式的某一行(或一列)的所有元素都乘以常数k,加到另一行(或列)的对应元素上,行列式的值不变。3.交换行列式的任两行(或两列),行列式的值变号。三、举例: 1.求行列式 的值
1 2 3
2 3 1
3 1 2
解:1.给第一列元素都乘以 -2(因-2/1=-2),加到第二列对应元素上;再给第一列元素都乘以 -3(因-3/1=-3),加到第三列对应元素上得:
1 0 0
2 -1 -5
3 -5 -7
2.给第二列元素都乘以 -5(因 -(-5/-1)=-5),加到第三列对应元素上得:
1 0 0
2 -1 0
3 -5 -18
此时主对角线右上侧元素已经全为0。即变成了三角行列式。
3.求主对角线元素之积得 -18,所以,此行列式的值为-18.
四、求任意行列式的值:
a11 a12 a13 …… a1n
a21 a22 a23 …… a2n
a31 a32 a33 …… a3n
………………aii…ain
an1 an2 an3 …… ann
1. 先给第一列所有元素都乘以常数 -a12/a11,加到第二列对应元素上,则可以把a12 变成0;再给第一列所有元素都乘以 -a13/a11,加到第三列对应元素上,则可以把 a13 变成 0;……,给第一列所有元素都乘以 -a1n/a11,加到第n列对应元素上,则可以把 a1n 变成 0.
2.同理,给第二列所有元素都乘以常数 -a23/a22,加到第三列对应元素上,则可以把a23变成0;……,直到把a2n变成0.
3.以此类推,可把主对角线右上侧所有元素都变成0,使其成为三角行列式。
4.如果遇到主对角线上的元素 aii 本身是0时,就从它往后在同一行找到aij不是0的,把该j列元素与第i列元素全部对换,同时整个行列式值变负一次。最终把原行列式化成如下三角行列式:
a11 0 0 0 …… 0
a21 a22 0 0 …… 0
a31 a32 a33 0 …… 0
………………aii…… 0
an1 an2 an3 …… ann
则该行列式的值最后等于:a11*a22*a33*…aii…*ann.
五、求任意行列式的值用C语言编程如下:
//求n阶行列式的值(其中n为自然数,且n=2)
#include stdio.h
#define N 50 //常数N应大于行列式的阶数n
int main
{ int i,j,k,n; //循环变量i j k,行列式的阶数n
float hlshi(float[N][N],int);//求行列式值函数原型声明
float a[N][N]={},x0; //用数组a[N][N]保存行列式的n*n个系数,变量x0保存行列式的值
printf("请输入阶行列式的阶数n:");
scanf("%d",n);
printf("请输入阶行列式的n*n个元素(相互用空格隔开):\n");
for(i=1;i=n;i++)
{ for(j=1;j=n;j++) { scanf("%f",a[i][j]);}
printf("化简后的行列式为:\n");
x0=hlshi(a,n);//调用函数求行列式的值x0,这里a,n为实际参数
printf("此行列式的值为:%1.3f.\n",x0); //输出
//求行列式值的函数:
float hlshi(float b[N][N],int n) //函数首部行 ,这里b,n为形式参数
{ int i,j,k,m=1;//m标记交换次数(偶+ 奇-)
float q,t,x;
for(i=1;i=n;i++)
{ j=i; //主对角线元素行列标号相同
while(b[i][i]==0j!=n)//若主对角线元素b[i][i]=0,则与后列交换:
{ j++; m=-m;//看下一列,交换一次值变负
for(k=1;k=n;k++) {t=b[k][i];b[k][i]=b[k][j];b[k][j]=t;} //交换i j两列
for(j=i+1;j=n;j++) //使右上三角形(对角线元素右侧)全为0:
{ if(b[i][j]==0) continue; //已经是0的继续下一项
q=-b[i][j]/b[i][i]; //求权重因子q=-j(列)/i(列)
for(k=i;k=n;k++)
{ b[k][j]+=b[k][i]*q; //互为相反数的和为0(j-i*j/i=0)
//以下五行中的程序可输出化简成三角行列式的结果(如果不需要显示,可以删除):
for(j=1;j=n;j++)
{ printf("%9f ",b[i][j]);
printf("\n");
x=m; //确定正负号
for(i=1;i=n;i++) { x*=b[i][i];} //求主对角线之积
return (x); //返回行列式的值