我想生成一个带有随机条目的矩阵,这样使用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循环的任何限制,所以如果有人知道已知问题,我会很感激任何输入。
你可以说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
的效果在这两者中是不同的案例。