Возведение матрицы в степень python

Возведение матрицы в степень python

В этом уроке мы разберём действия с матрицами в модуле NumPy в Python Питон.
NumPy это модуль для Python, предназначенный для научных расчётов. NumPy позволяет использовать в Питоне математические функции, такие как работа с матрицами, векторами, все тригонометрические функции, возведение в экспоненту и действия с логарифмами. NumPy в Питон позволяет работать с матрицами гораздо быстрее, чем стандартные алгоритмы работы с матрицами.
Для более удобного использования NumPy импортируем этот модуль, используя постфикс as np .
import numpy as np
as np означает, что когда мы вызываем процедуры и функции из NumPy в Python, перед названиями этих процедур и функций вместо numpy мы будем писать np . Это позволит не только удобнее писать код, но и быстрее читать его. Например, вместо numpy.array([1, 2]) мы будем писать np.array([1, 2]) .

Матрицы в NumPy в Питоне задаются с помощью команды np.array([]) . В круглых скобках находится сам массив, в квадратных скобках находятся элементы массива.
Пример. Задание одномерного массива в python
import numpy as np
arr = np.array([1, 2])
Матрица в Python задаётся с помощью двумерного массива. Матрица это таблица состоящая из строк и столбцов. Двумерный массив задаётся с помощью той же команды, что и одномерный массив.
Пример. Задание матрицы двумерного массива и вывод различных его элементов на экран в python
import numpy as np
matrix = np.array([ [‘first’, ‘second’], [‘third’, ‘fourth’] ])
print(matrix[0, 0])
print(matrix[1, 1])
print(matrix[0, 0]) выведет первый элемент из первого массива внутри – first . print(matrix[1, 1]) выведет второй элемент внутреннего второго массива – fourth .
NumPy в Питоне может выполнять различные действия с матрицами, такие как сложение, умножение, возведение матрицы в степень и вычисление определителя матрицы.

Для сложения матриц в Питоне не используются никакие команды, матрицы в Python складываются так же, как и числа.
Пример. Сложение матриц.
import numpy as np
matrix1 = np.array([ [3, 5, 1], [8, 7, 2] ])
matrix2 = np.array([ [5, 3, 4], [1, 10, 9] ])
total = matrix1 + matrix2
print(total)
NumPy в Питоне позволяет складывать только матрицы одинаковых размеров.
Матрицы складываются с помощью сложения всех элементов массива с одинаковыми индексами. Матрица с суммами этих элементов является результатом сложения.

Умножение матрицы на вектор в Python выполняется с помощью команды A.dot(B) , где A и B это матрицы. Для выполнения умножения в Питоне нужно, чтобы количество столбцов матрицы A было равно количеству строк матрицы B .
Пример. Умножение матрицы на вектор в python
import numpy as np
a = np.array([ [2, 1], [2, 2], [4, 3] ])
b = np.array([ [1], [3] ])
total = a.dot(b)
print(total)
Умножение вектора на матрицу определено только тогда, когда число столбцов матрицы равно числу строк вектора. В этом примере была рассмотрена матрица размером 3×2 и вектор-строка размером 2×1 . Число столбцов матрицы ( 2 ) равно числу строк вектора ( 2 ). В результате умножения матрицы на вектор получается вектор, у кторого число строк равно числу строк матрицы

Определитель матрицы в Python вычисляется с помощью с помощью команды

np.linalg.det(A) , где A это квадратная матрица. У квадратной матрицы количество строк равно количеству столбцов.
Пример. Вычисление определителя матрицы в python
import numpy as np
a = np.array([ [2, 1], [4, 3] ])
print(np.linalg.det(a))
Определитель может быть вычислен только для матриц с одинаковым количеством строк и столбцов – квадратных матриц. В этом примере с матрицей размерами 2×2 определитель матрицы равен разнице произведений диагоналей ( 2 * 3 – 1 * 4 = 2.0 )

Умножение матрицы на матрицу в Питоне выполняется с помощью команды A.dot(B) , где A и B это матрицы. Умножение определено, если количество столбцов A равно количеству строк B .
Пример. Умножение матрицы на матрицу в python
import numpy as np
a = np.array([ [2, 1, 3], [2, 2, 4] ])
b = np.array([ [1, 1], [3, 2], [2, 4] ])
total = a.dot(b)
print(total)
Чтобы умножение было определено, количество столбцов первой матрицы должно быть равно количеству строк второй матрицы. В этом примере умножаются матрицы размерами 2×3 и 3×2 , результатом умножения является матрица размером 2×2 .

Возведение матрицы в степень в Питоне выполняется с помощью команды np.linalg.matrix_power(A, P) , где A – квадратная матрица, P – степень, в которую возводится матрица, допускаются только целочисленные степени. Возводить в степень можно только квадратные матрицы, так как количество строк должно быть равно количеству столбцов матрицы.
Пример. Возведение матрицы в степень в python
import numpy as np
a = np.array([[1, 3], [2, 1]])
result = np.linalg.matrix_power(a, 2)
print(result)

Читайте также:  Почему не сработал будильник на андроиде

Для решения системы двух линейных уравнений нужно задать два массива. Один массив будет содержать коэффициенты для x и y в каждом уравнении, второй массив будет содержать правые части уравнений. Для решения линейных уравнений используется команда в Python np.linalg.solve(матрица левой части, вектор правой части)
Решение системы линейных уравнений в python
import numpy as np
a = np.array([[1, 2], [3, 2]])
b = np.array([5, 6])
result = np.linalg.solve(a, b)
print(result)
Эта программа на Python решает два линейных уравнения.
1x + 2y = 5
3x + 2y = 6

Для вычисления экспоненты числа или массива в Питоне используется команда np.exp(A) , где A – число или массив. Если возводится в экспоненту массив, то все элементы массива будут возведены в экспоненту.
Пример. Возведение вектора в экспоненту.
import numpy as np
a = np.array([2, 1, 5])
print(np.exp(a))
В этом примере результатом будет вектор с элементами [e^2,e^1,e^5] , где e это основание натурального логарифма.

Вернуться к содержанию Следующая тема Графики функций и поверхностей в Python

Полезно почитать по теме матрицы и массивы в python:
Матрицы в python
Массивы в python

Когда дело доходит до математики и вычислений над какими-то наборами данных всегда появляется один итот же вопрос — что дороже, время потраченное на программную реализацию алгоритма вычислений или время компьютера, которое необходимо компьютеру для выполнения данной программы. Ответ очень прост, если за стеной вашего кабинета нет суперкомпьютера, то ваше время несомненно дороже. Да, знание ассемблера, C или Fortran позволит вам создавать очень быстрые программы, но на создание потребуется гораздо больше времени, чем в случае создания тех же программ на языке Python.

NumPy — это удачная попытка соединить скорость вычислений на языках C и Fortran со скоростью разработки программ на языке Python. Еще одним огромным достоинством NumPy является большой набор уже готовых математических функций, охватывающий многие разделы математики. Причём, большинство данных функций могут быть легко оптимизированы под конкретную задачу. А механизм транслирования NumPy позволяет избежать написания большого количества циклов, особенно вложенных, которые так часто встречаются при работе с многомерными массивами.

7.1. Базовые математические операции

Пожалуй, первое с чего стоит начать, так это с того, что массивы NumPy могут быть обычными операндами в математических выражениях:

Для выполнения таких операций на Python, мы были вынуждены писать циклы. Писать такие циклы в NumPy, нет никакой необходимости, потому что все операции и так выполняются поэлементно:

Точно так же обстоят дела и с математическими функциями:

Такие операции как += , -= , *= , /= и прочие подобные, могут применяться к массивам и так же выполняются поэлементно. Они не создают новый массив, а изменяют старый:

При работе с массивами разного типа, тип результирующего массива приводится к более общему:

Применение логических операций к массивам, так же возможно и так же выполняется поэлементно. Результатом таких операций является массив булевых значений ( True и False ):

Мы уже знаем что массив и число могут быть операндами самых разных математических выражений:

Операндами могут быть даже несколько различных массивов, правда их размеры должны быть одинаковыми:

Хотя, если честно, их размеры должны быть не равны, а должны быть совместимыми. Если их размеры совместимы, т.е. один массив может быть растянут до размеров другого, то в дело включается механизм транслирования массивов NumPy. Этот механизм очень прост, но имеет весьма специфичные нюансы. Рассмотрим простой пример:

В данном примере массив b может быть растянут до размеров массива a и станет абсолютно идентичен массиву c. Транслирование массивов невероятно удобно, так как позволяет избежать создания множества вложенных и невложенных циклов. К тому же в NumPy этот механизм реализован для максимально быстрого выполнения. Так что используйте транслирование везде, где это возможно в ваших вычислениях.

Вычисление суммы всех элементов в массиве и прочие унарные операции в NumPy реализованы как методы класса ndarray :

По умолчанию, эти операции применяются к массиву как к обычному списку чисел, без учета его ранга (размерности). Но если указать в качестве параметра одну из осей axis , то вычисления будут производиться именно по ней:

7.1.1. Значения -inf, inf и nan

Возможно вы обратили внимание на то, что когда мы вычисляли натуральный логарифм массива, среди значений которого был ноль, не появилось абсолютно никакой ошибки, а сам логарифм стал равен значению -inf (минус бесконечность). Убедимся в этом еще раз:

Более того, в NumPy мы даже можем делить на ноль:

Читайте также:  Какая память лучше hynix или samsung

NumPy предупредил нас о том, что встретил деление на ноль, но тем не менее выдал ответ inf (плюс бесконечность). Дело в том, что с математической точки зрения все абсолютно верно — если вы что-то делите на бесконечно малое значение то в результате получете значение, которое окажется бесконечно большим. Если результатом математической операции является плюс или минус бесконечность, то логичнее выдать значение inf или -inf чем выдавать ошибку.

В NumPy есть еще одно специальное значение — nan . Данное значение выдается тогда, когда результат вычислений не удается определить:

Заметьте, что NumPy нас просто предупредил о том, что ему попалось недопустимое значение, но ошибки не возникло. Дело в том, что в реальных вычислениях значения nan , inf или -inf встречается очень часто, поэтому появление этого значения проще обрабатывать специальными методами (функции numpy.isnan() и numpy.isinf() ), чем постоянно лицезреть сообщения об ошибках.

Новичкам, довольно трудно привыкнуть, к тому что в недрах компьютера вся арифметика на самом деле является двоичной и с этим связано очень много казусов. Во первых не совсем понятно, когда ждать появления значений -inf и inf :

Число 1.633123935319537e+16 появилось потому что в NumPy выполняются арифметические, а не символьные вычисления, т. е. число π хранится в памяти компьютера не как знание о том, что это математическая константа с бесконечным количеством десятичных знаков после запятой, а как обычное число с десятичной точкой (десятичная дробь) равная числу π с очень маленькой, но все же, погрешностью:

NumPy отличает предельные случаи, когда вычисления выполнить невозможно, например, деление на ноль. В таких случаях появляются значения -inf , inf и nan . Если из-за самых незначительных погрешностей вычисления все же возможны, то NumPy их обязательно выполнит. В этих случаях вместо значений -inf или inf у вас будут появляться самые маленькие или самые большие числа, которые возможно представить на вашем компьютере.

Тем не менее и на этом сюрпризы не заканчиваются. Если число 1.633123935319537e+16 является самым больши, которое может появиться при вычислениях, оно вполне ожидаемо должно появиться в самых разных ситуациях. Например:

То, есть какая-то, длинная арифметика все же доступна — очень хорошая новость, для лбителей криптографии и теории чисел. Но иногда:

В заключение могу лишь сказать, что все предельные случаи требуют кардинальных решений. Некоторые решения имеются в самом NumPy, некоторые предоставляют другие пакеты. Если вам необходимы точные решения, то лучше обратиться к системам компьютерной алгебры и символьных вычислений, например пакету SymPy — маленький, но мощьный пакет Python для символьных вычислений. Если вы решили отправиться в самые дебри теории чисел, алгебры и криптографии, то лучшим решением окажется программа GAP. Программа GAP не является программой Python, но имеет Python интерфейс в замечательной программе Sage, которая определенно заслуживает вашего внмания.

7.2. Линейная алгебра

NumPy предоставляет не только возможности для манипулирования многомерными массивами и их обработки, но еще и множество полезных математических функций, в том числе и функции линейной алгебры.

Произведение одномерных массивов представляет собой скалярное произведение векторов:

Произведение двумерных массивов по правилам линейной алгебры так же возможно:

При этом размеры матриц (массивов) должны быть либо равны, а сами матрицы квадратными, либо быть согласованными, т.е. если размеры матрицы А равны [m,k], то размеры матрицы В должны быть равны [k,n]:

Так же по правилам умножения матриц, мы можем умножить матрицу на вектор (одномерный массив). При этом в таком умножении вектор столбец должен находиться справа, а вектор строка слева:

Квадратные матрицы можно возводить в степень n т.е. умнажать сами на себя n раз:

Довольно часто приходится вычислять ранг матриц:

Еще чаще приходится вычислять определитель матриц ,хотя результат вас может немного удивить:

В данном случае, из-за двоичной арифметики, результат не целое число и округлять до ближайшего целого прийдется вручную. Это связано с тем, что алгоритм вычисления определителя использует LU-разложение — это намного быстрее чем обычный алгоритм, но за скорость все же приходится немного заплатить ручным округлением (конечно, если таковое требуется):

Вычисление обратных матриц:

Решение систем линейных уравнений:

7.3. Статистика

Над данными в массивах можно производить определенные вычисления, однако, не менее часто требуется эти данные как-то анализировать. Зачастую, в этом случае мы обращаемся к статистике, некоторые функции которой тоже имеются в NumPy. Данные функции могут применять как ко всем элементам массива, так и к элементам, расположенным вдоль определенной оси.

Читайте также:  Пример кода на питоне

Элементарные статистические функции:

Средние значения элементов массива и их отклонения:

Корреляционные коэфициенты и ковариационные матрицы величин:

Так же NumPy предоставляет функции для вычисления гистограмм наборов данных различной размерности и некоторые другие статистичские функции.

7.4. Генерация случайных значений

Очень многие вычислительные методы требуют генерации случайных значений. В некоторых ситуациях, на генерируемые данные накладываются очень строгие и высокие требования. NumPy содержит функции для генерации простых случайных данных, функции генерации случайных перестановок, а так же большое количество функций для гернерации случайных чисел с всевозможными вероятностными распределениями.

Получение простых случайных данных:

NumPy предоставляет порядка 30 функций, позволяющих генерировать случайные числа с самыми разными вероятностными распределениями:

Вы так же имеете доступ к состоянию генератора случайных чисел, а так же можете управлять им:

7.5. Дискретное преобразование Фурье

Если данные в ваших массивах — это сигналы: звуки, изображения, радиоволны, котировки акций и т.д., то вам наверняка понадобится дискретное преобразование Фурье. В NumPy представлены методы быстрого дискретного преобразования Фурье для одномерных, двумерных и многомерных сигналов, а так же некоторые вспомогательные функции. Рассмотрим некоторые простые примеры.

Одномерное дискретное преобразование Фурье:

Двумерное дискретное преобразование Фурье:

Очень часто при спектральном анализе используются оконные функции (оконное преобразование Фурье), некоторые из которых так же представлены в NumPy

7.6. Прочие математические разделы

Помимо перечисленных выше математических возможностей NumPy, необходимо упомянуть о некоторых других математических функциях, которые довольно редко используются, но иногда оказываются очень полезными.

7.6.1. Множества

В случаях, козда массивы содержат очень много элементов, среди которых есть одинаковые, возникает задача поиска уникальных элементов, количества их вхождений в исходный массив:

В двумерных и многомерных массивах уникальные массивы можно искать как по всему множеству его значений так и по отдельным осям:

Функция unique() так же позволяет получить индексы входного массива с первым вхождением уникальных элементов, а так же индексы уникального массива которые восстанавливают исходный массив:

Так же имеется ряд других полезных функций:

7.6.2. Логические операции

Логические функции NumPy, условно, можно разделить на два множества: первое — позволяет определять специфику элементов массива и самого массива; второе — обычные логические операции которые действуют над массивами поэлементно.

Иногда, возникает потребность определить тип элементов:

Привычные нам логические операции выполняются над массивами булевых значений (массивы из значений True и False ):

Помимо всего прочего, NumPy позволяет производить различные сравнения:

7.6.3. Многочлены

Многочлены, довольно часто, встречаются в самых разных областях: физика, инженерное дело, теория приближений, криптография, теория вероятностей, комбинаторика и т.д. Многочлены определенного вида выделяются в особые классы, каждый из которых имеет свою нишу применения. В NumPy представлены функции для работы с классами многочленов Чебышёва, Лежандра, Лагерра и Эрмита. Помимо прочего, NumPy предоставляет широкий набор функций для работы с полиномами в общем виде, т.е. полиномы любого вида (Бернулли, Гегенбауэра, Шапиро, Якоби, Роджерса в том числе) могут быть легко сконструированы пользователем самостоятельно.

Рассмотрим базовые функции для работы с полиномами:

Иногда бывает крайне удобно создавать полиномы не указывая их коэфициенты, а указывая их корни:

Получить полиномы специального вида, можно разными способами, но мы рассмотрим самый простой — создание с помощью указания коэфициентов:

9432 просмотра

1 ответ

83 Репутация автора

Я пытаюсь построить сложную матрицу в Python и столкнулся с некоторыми проблемами. Я использую scipy.linalg.expm функцию, и у меня появляется довольно странное сообщение об ошибке при попытке следующего кода:

Ошибка при запуске второго эксперимента:

Это кажется действительно странным, поскольку все, что я изменил, — это диапазон, который t я использовал. Это потому, что гамильтониан диагональн? В общем, гамильтонианов не будет, но я также хочу, чтобы он работал для диагональных. Я на самом деле не знаю механику expm , поэтому любая помощь будет принята с благодарностью.

Ответы (1)

3 плюса

48935 Репутация автора

Это интересно. Одно могу сказать, что проблема специфична для np.matrix подкласса. Например, следующее прекрасно работает:

Если углубиться в трассировку, то возникает исключение, _fragment_2_1 в scipy.sparse.linalg.matfuncs.py частности эти строки :

Сообщение об ошибке

предполагает, что это exp_diag[k] должен быть скаляр, но вместо этого он возвращает вектор (и вы не можете назначить вектор X[k, k] , который является скаляром).

Установка точки останова и проверка формы этих переменных подтверждает это:

Ссылка на основную публикацию
Виндовс 10 видит принтер но не печатает
Windows 10 не видит принтер Плановая переустановка Виндовс 7 на 10: мошенники против пенсионеров Полноэкранная реклама от Windows - раздражающая...
Бортовой компьютер гамма ошибки
Приветствую, пользователи!Купил я авто, в нем стоял бк gamma gf415t. Что я заметил по мере эксплуатации, в правом верхнем углу...
В ворде пишет нелицензированный продукт
Microsoft Office является золотым стандартом офисных приложений. Хотя существует множество удивительных бесплатных альтернатив Microsoft Office, ни одна из них не...
Внутренняя программная ошибка src defaultfontmetrics cpp 55
Abbyy Finereader – программа для распознавания текста с изображениями. Источником картинок, как правило, является сканер или МФУ. Прямо из окна...
Adblock detector