【作者声明】


  本文所有文字均为作者原创,所有图片均为作者本人真实拍摄或制作。

  版权所有,仅供阅读欣赏,严禁任何单位或个人以任何形式转载、复制、引用、抄袭、截图、模仿、翻译本评测的部分或全部内容(包括但不限于文字、图片)。

  作者保留所有权利。

  请尊重作者劳动成果,谢谢合作。


前言

  fx-5800P是CASIO在2006年发布的一款可编程的科学计算器,拥有许多高级的函数计算功能,具备比较完整的类BASIC语言,广泛应用在各个领域。其中的矩阵计算功能可以定义并计算Mat A~Mat F六个最大10×10的矩阵,然而由于上市时间较早,且一直没有更新的缘故,其矩阵计算也只有行列式(det)、转置(Trn)、逆矩阵等简单的功能,没有最常用的矩阵化简(Rref)功能。比fx-5800P更高级的fx-9750GII、fx-9860系列、fx-CG系列等图形计算器均具备这一功能,且能够直接对矩阵施行初等行变换操作。了解线性代数的朋友都知道,将矩阵变为行最简形的过程,能够在求逆矩阵、矩阵的秩、解线性方程组、向量组的线性相关性、求解特征向量等等场合都要用到,而fx-5800P的矩阵功能能够计算矩阵的大小和数量比较可观,却没有Rref功能,实在可惜。有鉴于此,我们在这里给出fx-5800P简化矩阵的程序算法,以供参考。

数学基础

对于任意的矩阵A[m×n],总能够经过有限次的初等行变换将其化为行最简形矩阵,即非零行的第一个非零元都是1,且这些非零元所在的列的其他元素都是0。行最简形矩阵是通过矩阵的初等行变换得来的,矩阵的初等行变换包含以下三种:

(1)对调矩阵的两行,例如对调i,j两行,记为ri↔rj;
(2)以一个不为0的数k乘以某一行中的所有元素,例如第i行乘k,记作ri×k;
(3)将某一行的所有元素乘以k之后,然后加到另一行对应的元素上,例如第j行乘以k加到第i行,记作ri+k×rj。

  三种初等行变换都是可逆的,且逆变换都是同一类型的初等变换。

  例如我们求解线性方程组,直接根据方程组写出增广矩阵:

然后对增广矩阵作初等行变换:

根据行最简形矩阵,我们可以直接写出方程组的解(其中k为任意常数):

x={x1, x2, x3, x4}={k+4, k+3, k, -3}

程序算法

  fx-5800P现有的矩阵相关的功能除了上面所列举的,在程序中还可以直接输入矩阵,以及调用、修改矩阵的元素。有了这些关键的功能,我们就能够在程序中实现矩阵的简化了。

(1)矩阵的定义
  我们可以直接在计算模式下的[FUNCTION]-[MATRIX]菜单中的“EDIT”选择矩阵Mat A定义,也可以直接在程序中对Mat A赋值一个矩阵。由于fx-5800P没有Dim指令,没有办法获取矩阵的行数和列数的信息,因此需要在程序开头提示输入行数与列数,分别赋值给变量R和C。

(2)施行第一类初等行变换——交换
  初等变换的过程可以机械化,从第1行第1列的元素开始,按列的顺序进行初等行变换,不需要额外考虑像上例中第一步“r1↔r2”这样的交换过程。但是如果在简化过程中遇到非零行中本应该是第一个非零元的元素是0的时候,这时候就要去寻找所在的列上有没有不为0的元素,然后和找到的这个元素所在的行进行对换,这样就对应了第一类初等行变换操作。如果某一列的元素都是0,那么就继续化简下一列,目标非零元所在的行不变。

(3)施行第二类初等行变换——归一
  在(2)的条件下,找到非零行的第一个非零元之后,这一行的所有元素都乘以这个非零元的倒数,完成第二类初等行变换操作。

(4)施行第三类初等行变换——化零
  完成(3)之后,便可以找到对应列上不为0的元素,用这个元素的相反数作为系数,乘上已经化为1的非零行,加到这个元素对应的这一行上去,使其变为0,这样就简化完一列元素了,当处理的列数和行数相等的时候,结束程序,否则回到第(2)步简化下一列,目标非零元所在的行数加一。

计算器程序

程序名:MAT-RREF

  源矩阵统一定义在Mat A中,用于变换的矩阵是Mat F。依照上述算法,即有下面的程序(For循环较多,加入缩进表示更直观):

Lbl 0
"MAT IS ALREADY  DEFINED?"(询问矩阵是否已定义好)
"1:YES   2:NO  "?→F
If F≠1 And F≠2
    Then Goto 0
IfEnd
"ROW="?→R(输入行数)
"COL="?→C(输入列数)
If F=2
    Then "MAT=[[,][]...]"?→Mat A(没有定义好矩阵的时候,可以直接在程序中以线性形式输入矩阵)
IfEnd
Mat A→Mat F
1→I
For 1→J To C
    For 1→N To R-I
        If Mat F[I,J]=0(交换)
            Then For 1→E To C
                     Mat F[I+N,E]→T
                     Mat F[I,E]→Mat F[I+N,E]
                     T→Mat F[I,E]
                 Next
        IfEnd
    Next
    If Mat F[I,J]≠0(归一)
        Then 1/Mat F[I,J]→S
        For 1→E To C
            S×Mat F[I,E]→Mat F[I,E]
        Next
        For 1→K To R(化零)
            If K≠I
                Then -Mat F[K,J]→S
                For 1→E To C
                    S×Mat F[I,E]+Mat F[K,E]→Mat F[K,E]
                Next
            IfEnd
        Next
        Isz I
    IfEnd
    If I=R+1
        Then Mat F[R,J]=1⇒Break
        Dsz I
    IfEnd
Next
Mat F

运行效果

  运行程序“MAT-RREF”,这里选择未定义矩阵,直接在运行过程中输入矩阵。先输入行数4、列数5,然后按下图的方式输入矩阵,这里使用的是前面例子里面的增广矩阵。

输入完之后按[EXE],等待一会即可得到矩阵计算的结果,按方向键查看完整的矩阵:

总结

  这一程序不仅填补了fx-5800P无法简化矩阵的功能空缺,整个程序的算法也是值得借鉴的,可以在各种可编程的计算器上实现(前提是拥有矩阵计算功能)。如果将矩阵变量替换为二维数组,稍加修改之后还能应用到各类计算机程序语言中,处理更大的矩阵以及更复杂的线性方程组求解等问题。