千里马中行列式不为零的随机矩阵

问题描述 投票:2回答:1

我想生成一个带有随机条目的矩阵,这样使用Maxima时该矩阵的行列式不为零,并且在MACK的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的行列式已经不是零,那很好,我会继续这样做,但我正在与其他部分斗争。我正在考虑创建一个循环,为g[i,j]生成新的随机数M1,直到我得到一个行列式不为零的矩阵,但我不确定如何做或者是否有其他选项。

另外:正如我所提到的,这最终是我想在STACK中为moodle实现的(问题是要解决一个线性方程组,生成的矩阵是这个系统的矩阵),所以我不知道是否有在STACK中使用if和while循环的任何限制,所以如果有人知道已知问题,我会很感激任何输入。

matrix random moodle maxima determinants
1个回答
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中,数组函数是memoizing函数,为之前看到的输入提供存储的输出。显然,如果输出应该是随机的,则无意。

还要注意,如果for循环运行完成而没有找到非奇异矩阵,则M2将被赋值为done。我认为这很有用,因为你可以看看M2 # 'done是否确保你确实获得了结果。

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

© www.soinside.com 2019 - 2024. All rights reserved.