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
在这两种情况下是不同的。
我想使用 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
在这两种情况下是不同的。