Случайная матрица с определителем, отличным от нуля в максимумах - PullRequest
2 голосов
/ 14 марта 2019

Я хочу сгенерировать матрицу со случайными записями, чтобы детерминант этой матрицы отличался от нуля, используя Maxima, и далее реализовать это в STACK для Moodle. Я абсолютно новичок в работе с Maxima (или любым другим CAS в этом отношении), поэтому я просматривал различные примеры, которые нашел в Интернете, и до сих пор сумел получить это:

Генерация случайной матрицы 2x2 с 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 уже не равен нулю, хорошо, я пойду с этим, но я борюсь с остальной частью. Я думал о создании цикла, который генерирует новые случайные числа g[i,j] для M1, пока я не получу матрицу с определителем, не равным нулю, но я не уверен, как это сделать или есть ли другие варианты.

Кроме того: как я уже говорил, это в конечном итоге то, что я хочу реализовать в STACK для Moodle (вопрос будет состоять в том, чтобы решить систему линейных уравнений с сгенерированной матрицей, являющейся матрицей этой системы), поэтому я не знаю, если есть какие-либо ограничения на использование циклов if и while в STACK, поэтому, если кто-то знает об известных проблемах, я был бы признателен за любой ввод.

1 Ответ

2 голосов
/ 14 марта 2019

Вы можете сказать 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 различен в этих двух случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...