#matrix #random #moodle #maxima #determinants
#матрица #Случайный #moodle #максимумы #определители
Вопрос:
Я хочу сгенерировать матрицу со случайными записями таким образом, чтобы определитель этой матрицы не был равен нулю, используя Maxima, и в дальнейшем реализовать это в STACK для Moodle. Я совершенно новичок в работе с Maxima (или любым другим центром сертификации, если уж на то пошло), поэтому я просматривал различные примеры, которые я нашел в Интернете, и до сих пор мне удавалось получить это:
Генерация случайной матрицы 2×2 с 0 или 1 (по соображениям простоты) и вычисление ее определителя:
g[i,j]:=1-random(2);
M1:genmatrix(g,2,2);
dM1:determinant(M1);
Для следующего шага я хотел определить матрицу M2 следующим образом:
M2:(if dM1#0 then M1 else ***)
Если определитель матрицы M1 уже не равен нулю, хорошо, я соглашусь с этим, но у меня проблемы с частью else. Я думал о создании цикла, который генерирует новые случайные числа g[i,j]
для M1
тех пор, пока я не получу матрицу с определителем, отличным от нуля, но я не уверен, как это сделать или есть ли другие варианты.
Кроме того: как я упоминал, это в конечном счете то, что я хочу реализовать в STACK для moodle (вопрос будет заключаться в решении системы линейных уравнений с сгенерированной матрицей, являющейся матрицей этой системы), поэтому я не знаю, существуют ли какие-либо ограничения на использование циклов if и while в STACK, поэтому, если кто-то знает об известных проблемах, я был бы признателен за любой вклад.
Ответ №1:
Вы можете сказать, for ... do ... return(something)
чтобы получить something
результат из цикла for, который может быть присвоен переменной. В этом случае похоже, что это работает так, как задумано:
(%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
является лямбда-выражение (т. Е. безымянная функция). Если вы введете имя функции массива, такое как g
в вашем примере, это не будет иметь ожидаемого эффекта, потому что в Maxima функции массива являются функциями запоминания, предоставляя сохраненный вывод для ввода, который был просмотрен ранее. Очевидно, что это не предназначено, если выходные данные должны быть случайными.
Также обратите внимание, что она M2
будет назначена done
, если цикл for завершится без нахождения неособой матрицы. Я думаю, что это полезно, поскольку вы можете посмотреть, M2 # 'done
чтобы убедиться, что вы действительно получили результат.
Наконец, обратите внимание, что имеет значение использовать «группу выражений без локальных переменных» (...)
в качестве тела цикла for вместо «группы выражений с локальными переменными» block(...)
, потому что эффект return
в этих двух случаях разный.
Комментарии:
1. Большое вам спасибо! Кажется, что это решение работает для максимумов, но не для стека, но это, возможно, часть другого вопроса.
2. Я мало что знаю о стеке, возможно, вам придется найти форум, посвященный стеку, чтобы спросить об этом.