当前位置:文档之家› 线代编程之求解行列式1

线代编程之求解行列式1

线代编程报告
过程14—卓越班
2014010624
万利锋
【实践活动】:
编写程序计算阶数大于10的行列式的值
【活动目的】:
通过学生自主编写程序,培养学生主动获取和综合运用知识的能力以及动手能力,培养学生的创新意识、程序编写能力、逻辑能力。

【活动要求】:
能根据需要编写程序,在编写程序的过程中必须考虑程序运行的时间和占用内存的大小,考虑尽量简单的编写指令。

反复“程序运行——结果检验——改进提高”这一过程,并最终形成合理的程序。

【考核形式与要求】:
以程序运行效果为主要参考依据,程序编写为辅助依据。

看程序是否有逻辑错误,是否有BUG,计算结果是否准确。

看程序的时空复杂度。

看源代码的可读性,注释是否完整。

【求解方法】
行列式的计算灵活多变,需要有较强的技巧。

当然,任何一个n阶行列式都可以由它的定义去计算其值。

但由定义可知,n阶行列式的展开式有n!项,计算量很大,一般情况下不用此法,但如果行列式中有许多零元素,可考虑此法。

值的注意的是:在应用定义法求非零元素乘积项时,不一定从第1行开始,哪行非零
元素最少就从哪行开始。

计算行列式的两种最基本方法――化三角形法和按行(列)展开法。

化三角形法是将原行列式化为上(下)三角形行列式或对角形行列式计算的一种方法。

这是计算行列式的基本方法重要方法之一。

因为利用行列式的定义容易求得上(下)三角形行列式或对角形行列式的性质将行列式化为三角形行列式计算。

原则上,每个行列式都可利用行列式的性质化为三角形行列式。

但对于阶数高的行列式,在一般情况下,计算往往较繁。

因此,在许多情况下,总是先利用行列式的性质将其作为某种保值变形,再将其化为三角形行列式。

按行(列)展开法可以将一个n阶行列式化为n个n-1阶行列式计算。

若继续使用按行(列)展开法,可以将n阶行列式降阶直至化为许多个2阶行列式计算,这是计算行列式的又一基本方法。

但一般情况下,按行(列)展开并不能减少计算量,仅当行列式中某一行(列)含有较多零元素时,它才能发挥真正的作用。

因此,应用按行(列)展开法时,应利用行列式的性质将某一行(列)化为有较多的零元素,再按该行(列)展开。

【程序】:
#define N 11 //可设置不同的N值
#include <stdio.h>
#include <stdlib.h>
void main()
{
int i,j,m,n,s,t,k=1; //定义变量
double a[N][N],f=1,c,x,sn; //定义变量
for (i=1;i<N;i++)
for (j=1;j<N;j++)
scanf ("%lf",&a[i][j]); //从键盘上输入N阶行列式for (i=1,j=1;i<N&&j<N;i++,j++) //对角线
{
if (a[i][j]==0)
{
for (m=i;a[m][j]==0;m++);
if (m==N)
{
sn=0;
printf("detA=%lf\n",sn);
exit(0);
}
else
for (n=j;n<N;n++)
{
c=a[i][n];
a[i][n]=a[m][n];
a[m][n]=c;
}
k*=(-1);
}
for (s=N-1;s>i;s--)
{
x=a[s][j];
for (t=j;t<N;t++)
a[s][t]-=a[i][t]*(x/a[i][j]); }
}
for (i=1;i<N;i++)
f*=a[i][i];
sn=k*f;
printf ("detA=%lf\n",sn);
}
【运行结果】:
【思考】:
一个题目有时候要由多种解法并用,或一个题可由多种方法独自解出,这就需看灵活应用程度,能否
找出一个最简便的方法解出其值。

相关主题