我想生成一个带有随机条目的矩阵,以便使用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循环有任何限制,那么如果有人知道已知问题,我将不胜感激。
答案 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
的效果是不同的。