行列式在Maxima

时间:2019-03-14 10:39:18

标签: matrix random moodle maxima determinants

我想生成一个带有随机条目的矩阵,以便使用Maxima对该矩阵的行列式不为零,并进一步在STACK for Moodle中实现这一点。我与Maxima(或与此相关的任何CAS)合作是全新的,所以我一直在浏览我在网上找到的各种示例,到目前为止,我们设法做到了:

生成具有0或1(出于简化原因)的2x2随机矩阵并计算其行列式:

g[i,j]:=1-random(2);
M1:genmatrix(g,2,2);
dM1:determinant(M1);

下一步,我想定义一个矩阵M2,如下所示:

M2:(if dM1#0 then M1 else ***)

如果矩阵M1的行列式已经不为零,那很好,我会继续做下去,但是我在其他方面很挣扎。我当时正在考虑创建一个循环,为g[i,j]生成新的随机数M1,直到得到行列式不为零的矩阵,但不确定如何执行或是否有其他选择。

此外:如前所述,这最终是我想在STACK中实现的目标(问题将是解决一个线性方程组,其中生成的矩阵是该系统的矩阵),所以我不知道如果在STACK中使用if和while循环有任何限制,那么如果有人知道已知问题,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

您可以说for ... do ... return(something)从for循环中产生something,该循环可以分配给变量。在这种情况下,它看起来像预期的那样工作:

(%i9) M2: for i thru 10
            do (genmatrix (lambda ([i, j], 1 - random(2)), 2, 2),
                if determinant(%%) # 0 then return(%%));
                            [ 1  0 ]
(%o9)                       [      ]
                            [ 0  1 ]
(%i10) M2: for i thru 10
            do (genmatrix (lambda ([i, j], 1 - random(2)), 2, 2),
                if determinant(%%) # 0 then return(%%));
                            [ 1  0 ]
(%o10)                      [      ]
                            [ 1  1 ]
(%i11) M2: for i thru 10
            do (genmatrix (lambda ([i, j], 1 - random(2)), 2, 2),
                if determinant(%%) # 0 then return(%%));
                            [ 1  1 ]
(%o11)                      [      ]
                            [ 0  1 ]

请注意,genmatrix的第一个参数是lambda表达式(即,未命名的函数)。如果在示例中放置诸如g之类的数组函数的名称,则不会产生预期的效果,因为在Maxima中,数组函数是记忆函数,为以前看过的输入提供存储的输出。显然,如果输出应该是随机的,那不是故意的。

还请注意,如果for循环运行完成而未找到非奇异矩阵,则会为M2分配done。我认为这很有用,因为您可以查看M2 # 'done是否可以确保获得结果。

最后请注意,使用“无局部变量的表达式组” (...)作为for循环的主体,而不是“具有局部变量的表达式组” block(...)有区别,因为在这两种情况下return的效果是不同的。