有理二次型的化简算法及程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有理二次型的化简算法及程序设计
摘要:二次型的化解过程是麻烦的,根据实对称方阵合同变换理论,设计出化简有理系数二次型的算法,编写出相应的c语言程序,给出了计算实例。
关键词:有理系数二次型;化简;算法;程序
二次型的化简在数学及物理研究中有重要的应用,然而人工实现却非常困难,并且已有的数学软件也没有直接的功能,因此我们设计了有理系数二次型化简的算法及程序。
关于二次型的理论请参见高等代数或线性代数书籍(如参考文献[1]),本文不多累赘.
有理数域是常用的数域,因此讨论有理数域上的二次型非常必要。我们用表示有理数域,并且为了说话方便,我们称有理数域上的二次型为有理二次型、理数域上的矩阵为有理矩阵。根据二次型的化简理论可知,任何有理二次型都经过非奇异线性变换化简为形如:
d1x12+d2x22+...+dnxn2(di∈q)
的标准形,所以我们重点研究了将有理二次型化简为有理标准型的算法及程序。
1. 算法设计
首先,根据二次型的理论,将有理二次型 q(x1,x2,...,xn)化简为有理标准型的关键是将其矩阵 a通过矩阵的合同变换变为
对角阵d ,而文献[1]的结论告诉我们,将 a合同变换变为对角阵
d的方法是:在对a 施行一对列初等变换和行初等变换的同时,仅对 n阶单位矩阵i 施行同样的列初等变换,那么当a 化为对角矩阵 b时,i 就化为p[1]352 。其次,因为计算机语言系统的四则运算建立在实数域上,所以要精确进行有理二次型的化简,就必须设计分数运算子程序。因此我们有:
1.1 有理二次型的化简算法
s1. 输入有理系数二次型 q(x1,x2,...,xn)的变量个数 n 及其系数。
s2. 根据二次型矩阵的对称性,将 q(x1,x2,...,xn)的系数转换为对称矩阵a ,设 a=(aij)。
s3. 生成n 阶单位矩阵i 。
s4. 对矩阵施行合同变换,同时对矩阵i 施行与 a相同的列初等变换,具体做法如下:
s41. 依此判断aii 是否为零( i=1,2,...,n)?若是则转
s42;若否则转s44。
s42. 判断 ai,i+1、 ai,i+2、…、 ai,n是否全为0,若是则i++ ,转s41;若否则转s43.
s43. 设aij≠0 ,则将a 的第 j列加到第i 列,且将 a的第 j 行加到第 i行,同时将单位矩阵i 的第j 列也加到第 i列,转s44. s44. 将 a的第 i列的-aij/aii 倍加于其第j ( j=i+1,2,...,n)列,使得ai,i+1 、ai,i+2 、…、 ain全化为零,且将 a的第 i行的-aij/aii 倍加于其第j (j=i+1,2,...,n )行,使
得aj,j+1 、aj,j+2 、…、 ajn全化为零,同时也将单位阵 i 的第i 列的 -aij/aii 倍加于其第j ( j=i+1,2,...,n )列. s45. i++ ,判断i 是否大于n .若是则转s5;否则转s41.
s5. 输出变换后的 a,亦即是输出所求的对角形矩阵d ;输出i 变换后的结果,亦即是输出合同变换矩阵p ;
s6. 据 a输出 q(x1,x2,...,xn)的标准型q(y1,y2,...,yn) .
1.2 基于分数运算的关键子算法
分数运算需要求最大公因数及约分算法,但其容易设计故不累赘。因为算法中的关键子算法是s43与s44,所以下面重点描述s43与s44基于分数运算的实现。
①、s43的实现:基于分数运算的行、列相加合同变换算法
s43是行、列相加的合同变换,若用a[i][j] 、 b[i][j]分别存放矩阵之元素的分子和分母,那么根据分数加法的运算规则,设计实现矩阵行、列相加合同变换的算法如下:
for i=1 to n △循环两分数相加
for k=i to n do
{ a[k][i]=a[k][i]*b[k][j]+a[k][j]*b[k][i];△第j 列加到第i 列,相加后的分子
b[k][i]=b[k][i]*b[k][j];△相加后的分母
a[i][k]=a[i][k]*b[j][k]+a[j][k]*b[i][k];△第j 行加到第i行,相加后的分子
b[i][k]=b[i][k]*b[j][k];△相加后的分母
huajian(&a[k][i],&b[k][i]);△调用约分函数进行简化huajian(&a[i][k],&b[i][k]);△调用约分函数进行简化
}②、 s44的实现:基于分数运算的行、列乘以某数后再相加的合同变换算法
s44是将行、列乘以某数后再相加的合同变换,若用、分别存放矩阵之元素的分子和分母,那么根据分数乘法与加法运算规则,设计实现行、列乘以某数后再相加的合同变换算法如下:
for i=0 to n do
for j=i+1 to n do
{ temp1[i][j]=-a[i][j]*b[i][i];
temp2[i][j]=b[i][j]*a[i][i];△循环取乘数 -aij/aii
for k=i to n do △用 -aij/aii 乘以的第 a列加到第i 列{ m=temp1[i][j]*a[k][i];
n=temp2[i][j]*b[k][i];△分子、分母分别相乘
a[k][j]=a[k][j]* n + m *b[k][j];△两分数相加
b[k][j]=b[k][j]* n;
huajian(&a[k][j],&b[k][j]);△简化
}
for k=i to n do △类似进行行变换
{ m=temp1[i][j] * a[i][k]; n=temp2[i][j]*b[i][k];
a[j][k]=a[j][k]* n +m *b[j][k]; b[j][k]=b[j][k]* n; ajian