Maxima 中行列式不为零的随机矩阵

Random matrix with determinant not zero in Maxima

我想使用 Maxima 生成一个包含随机条目的矩阵,以便该矩阵的行列式不为零,并进一步在 Moodle 的 STACK 中实现它。我对使用 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 的行列式已经不为零,那好吧,我会接受它,但我正在努力处理其他部分。我正在考虑创建一个循环,为 M1 生成新的随机数 g[i,j],直到我得到一个行列式不为零的矩阵,但我不确定该怎么做,或者是否还有其他选择。

此外:正如我提到的,这最终是我想在 Moodle 的 STACK 中实现的(问题是求解线性方程组,生成的矩阵是该系统的矩阵),所以我不不知道在 STACK 中使用 if 和 while 循环是否有任何限制,所以如果有人知道已知问题,我将不胜感激。

你可以说 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 以确保您确实得到了结果。

最后请注意,使用 "group of expressions without local variables" (...) 作为 for 循环的主体而不是 "group of expressions with local variables" block(...) 会有所不同,因为效果return 在这两种情况下是不同的。