linalg::wiedemannРешение линейных систем алгоритмом Видемана
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразуют Notebook MuPAD в Live скрипты MATLAB.
linalg::wiedemann(A, b, <mult>, <prob>)
linalg::wiedemann(A, b, mult, ...) попытки найти вектор
, который удовлетворяет уравнению
при помощи алгоритма Видемана.
Параметр mult должна быть функция, таким образом что результат mult(A,y) равняется
для каждого n - размерный вектор-столбец
. Параметр y имеет тот же доменный тип как A. Аргумент mult не должен обрабатывать другие типы параметров, и при этом это не должно обрабатывать другие матрицы, чем A.
linalg::wiedemann использует вероятностный алгоритм. Поскольку детерминированный вариант вводит FALSE для дополнительного параметра prob.
Если система
не имеет решения, то linalg::wiedemann возвращает FAIL.
Если система
имеет больше чем одно решение, то случайный возвращен.
Из-за вероятностной природы алгоритма Видемана, расчет может перестать работать с маленькой вероятностью. В этом случае FAIL возвращен. Если детерминированный вариант выбран, то алгоритм может быть медленнее для небольшого количества матриц.
Векторный b должен быть задан по звонку компонента A.
Содействующий звонок A должно быть поле, т.е. область категории Cat::Field.
Рекомендуется использовать linalg::wiedemann только если mult использование значительно меньше, чем O (n 2) деятельность на местах.
Мы задаем матрицу и вектор-столбец по конечному полю с 29 элементами:
MatZ29 := Dom::Matrix(Dom::IntegerMod(29)): A := MatZ29([[1, 2, 3], [4, 7, 8], [9, 12, 17]]); b := MatZ29([1, 2, 3])


Начиная с A не имеет специальной формы, которая позволила бы быстрое матричное векторное умножение, мы просто используем _mult. Алгоритм Видемана работает в этом случае, несмотря на то, что это менее эффективно, чем Исключение Гаусса:
linalg::wiedemann(A, b, _mult)

Теперь давайте зададим другую матрицу, которая имеет специальную форму:
MatZ29 := Dom::Matrix(Dom::IntegerMod(29)): A := MatZ29([[1, 0, 0], [0, 1, 2], [0, 0, 1]]); b := MatZ29(3, 1, [1, 2, 3]):

Для этой конкретной матрицы легко задать эффективный метод умножения:
mult := proc(dummy, y)
begin
y[2]:=y[2]+2*y[3];
y
end:
linalg::wiedemann(A, b, mult)
|
n ×n матрица области категории |
|
n - размерный вектор-столбец, т.е. n ×1 матрица области категории |
|
Метод матричного векторного умножения: функционируйте или функциональное выражение; значение по умолчанию: |
|
|
Любой список [x, TRUE] если решение для системы
было найдено, или список [x, FALSE] если ненулевое решение для соответствующей гомогенной системы
было найдено, или значение FAIL (см. ниже).
Ожидаемым временем выполнения для вероятностного алгоритма является O (n 2 + n M), и временем выполнения для детерминированного варианта является O (n 2 M) в худшем случае, но только O (n 2 + n M) в среднем. Здесь, M является количеством деятельности на местах что стандартная программа матричного векторного умножения mult использование.
Основная идея об алгоритме состоит в том, чтобы решить линейную систему
путем нахождения минимального полиномиального f (y), который решает
. Если постоянный коэффициент c = f (0) является ненулевым и g (y): = f (y) - c, равенство
подразумевает, что это
- решение.
Полиномиальный f найден путем поиска минимального полиномиального h, удовлетворяющего
для некоторого случайным образом выбранного вектора-строки
. Это может дать к h ≠ f в неудачных случаях, но в целом вероятность для этого мала.
[1] Дуглас Видеман: “Решая Разреженные Линейные уравнения по Конечным Полям”, Транзакции IEEE на Теории информации, издании 32, № 1, январь 1986.