Пусть экземпляр класса matrix задает систему линейных алгебраических уравнений python

Пусть экземпляр класса matrix задает систему линейных алгебраических уравнений python

NumPy : матрицы и операции над ними

Date:2022-02-08 09:00
summary:Библиотека NumPy
Status:published

В этом ноутбуке из сторонних библиотек нам понадобится только NumPy . Для удобства импортируем ее под более коротким именем:

Приведем несколько способов создания матриц в NumPy .

Самый простой способ — с помощью функции numpy.array(list, dtype=None, . ).

В качестве первого аргумента ей надо передать итерируемый объект, элементами которого являются другие итерируемые объекты одинаковой длины и содержащие данные одинакового типа.

Второй аргумент является опциональным и определяет тип данных матрицы. Его можно не задавать, тогда тип данных будет определен из типа элементов первого аргумента. При задании этого параметра будет произведена попытка приведения типов.

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

Второй способ создания — с помощью встроенных функций numpy.eye(N, M=None, . ), numpy.zeros(shape, . ), numpy.ones(shape, . ).

Первая функция создает единичную матрицу размера N times M; если M не задан, то M = N.

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

Примеры:

Обратите внимание: размерность массива задается не двумя аргументами функции, а одним — кортежем!

Вот так — np.ones(7, 5) — создать массив не получится, так как функции в качестве параметра shape передается 7 , а не кортеж (7, 5) .

И, наконец, третий способ — с помощью функции numpy.arange([start, ]stop, [step, ], . ), которая создает одномерный массив последовательных чисел из промежутка [start, stop) с заданным шагом step, и метода array.reshape(shape).

Параметр shape, как и в предыдущем примере, задает размерность матрицы (кортеж чисел). Логика работы метода ясна из следующего примера:

Более подробно о том, как создавать массивы в NumPy , см. документацию.

Для получения элементов матрицы можно использовать несколько способов. Рассмотрим самые простые из них.

Для удобства напомним, как выглядит матрица d:

Элемент на пересечении строки i и столбца j можно получить с помощью выражения array[i, j].

Обратите внимание: строки и столбцы нумеруются с нуля!

Из матрицы можно получать целые строки или столбцы с помощью выражений array[i, :] или array[:, j] соответственно:

Еще один способ получения элементов — с помощью выражения array[list1, list2], где list1, list2 — некоторые списки целых чисел. При такой адресации одновременно просматриваются оба списка и возвращаются элементы матрицы с соответствующими координатами. Следующий пример более понятно объясняет механизм работы такого индексирования:

Примеры использования слайсинга:

Более подробно о различных способах индексирования в массивах см. документацию.

Следующие два способа задания массива кажутся одинаковыми:

Однако, на самом деле, это задание одномерного массива (то есть вектора) и двумерного массива:

Обратите внимание: вектор (одномерный массив) и вектор-столбец или вектор-строка (двумерные массивы) являются различными объектами в NumPy , хотя математически задают один и тот же объект. В случае одномерного массива кортеж shape состоит из одного числа и имеет вид (n,), где n — длина вектора. В случае двумерных векторов в shape присутствует еще одна размерность, равная единице.

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

Все элементы в массиве numpy принадлежат одному типу. В этом плане массивы ближе к C, чем к привычным вам листам питона. Numpy имеет множество встренных типов, подходящих для решения большинства задач.

К массивам (матрицам) можно применять известные вам математические операции. Следут понимать, что при этом у элементов должны быть схожие размерности. Поведение в случае не совпадения размерностей хорошо описанно в документации numpy.

Напоминание теории. Операция умножения определена для двух матриц, таких что число столбцов первой равно числу строк второй.

Пусть матрицы A и B таковы, что A in mathbb^ и B in mathbb^ . Произведением матриц A и B называется матрица C, такая что c_ = sum_^ a_b_ , где c_ — элемент матрицы C, стоящий на пересечении строки с номером i и столбца с номером j.

В NumPy произведение матриц вычисляется с помощью функции numpy.dot(a, b, . ) или с помощью метода array1.dot(array2), где array1 и array2 — перемножаемые матрицы.

Матрицы в NumPy можно умножать и на векторы:

Обратите внимание: операция * производит над матрицами покоординатное умножение, а не матричное!

Более подробно о матричном умножении в NumPy см. документацию.

Массивы можно Объединенять. Есть горизонтальное и вертикальное объединение.

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

Решите без использования циклов средставми NumPy (каждый пункт решается в 1-2 строчки)

  1. Создайте вектор с элементами от 12 до 42
  2. Создайте вектор из нулей длины 12, но его пятый елемент должен быть равен 1
  3. Создайте матрицу (3, 3), заполненую от 0 до 8
  4. Найдите все положительные числа в np.array([1,2,0,0,4,0])
  5. Умножьте матрицу размерности (5, 3) на (3, 2)
  6. Создайте матрицу (10, 10) так, чтобы на границе были 0, а внтури 1
  7. Создайте рандомный вектор и отсортируйте его
  8. Каков эквивалент функции enumerate для numpy массивов?
  9. *Создайте рандомный вектор и выполните нормализацию столбцов (из каждого столбца вычесть среднее этого столбца, из каждого столбца вычесть sd этого столбца)
  10. *Для заданного числа найдите ближайший к нему элемент в векторе
  11. *Найдите N наибольших значений в векторе

Напоминание теории. Транспонированной матрицей A^ называется матрица, полученная из исходной матрицы A заменой строк на столбцы. Формально: элементы матрицы A^ определяются как a^_ = a_ , где a^_ — элемент матрицы A^ , стоящий на пересечении строки с номером i и столбца с номером j.

В NumPy транспонированная матрица вычисляется с помощью функции numpy.transpose() или с помощью метода array.T, где array — нужный двумерный массив.

См. более подробно о numpy.transpose() и array.T в NumPy .

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

Напоминание теории. Для квадратных матриц существует понятие определителя.

Пусть A — квадратная матрица. Определителем (или детерминантом) матрицы A in mathbb^ назовем число

где alpha_, alpha_, dots, alpha_ — перестановка чисел от 1 до n, N(alpha_, alpha_, dots, alpha_) — число инверсий в перестановке, суммирование ведется по всем возможным перестановкам длины n.

Не стоит расстраиваться, если это определение понятно не до конца — в дальнейшем в таком виде оно не понадобится.

Например, для матрицы размера 2 times 2 получается:

Вычисление определителя матрицы по определению требует порядка n! операций, поэтому разработаны методы, которые позволяют вычислять его быстро и эффективно.

В NumPy определитель матрицы вычисляется с помощью функции numpy.linalg.det(a), где a — исходная матрица.

Рассмотрим одно интересное свойство определителя. Пусть у нас есть параллелограмм с углами в точках (0, 0), (c,d), (a+c, b+d), (a, b) (углы даны в порядке обхода по часовой стрелке). Тогда площадь этого параллелограмма можно вычислить как модуль определителя матрицы left( begin a & c \ b & d end right). Похожим образом можно выразить и объем параллелепипеда через определитель матрицы размера 3 times 3.

Напоминание теории. Рангом матрицы A называется максимальное число линейно независимых строк (столбцов) этой матрицы.

В NumPy ранг матрицы вычисляется с помощью функции numpy.linalg.matrix_rank(M, tol=None), где M — матрица, tol — параметр, отвечающий за некоторую точность вычисления. В простом случае можно его не задавать, и функция сама определит подходящее значение этого параметра.

С помощью вычисления ранга матрицы можно проверять линейную независимость системы векторов.

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

Напоминание теории. Системой линейных алгебраических уравнений называется система вида Ax = b, где A in mathbb^, x in mathbb^, b in mathbb^ . В случае квадратной невырожденной матрицы A решение системы единственно.

В NumPy решение такой системы можно найти с помощью функции numpy.linalg.solve(a, b), где первый аргумент — матрица A, второй — столбец b.

Убедимся, что вектор x действительно является решением системы:

Бывают случаи, когда решение системы не существует. Но хотелось бы все равно “решить” такую систему. Логичным кажется искать такой вектор x, который минимизирует выражение leftVert Ax - brightVert^ — так мы приблизим выражение Ax к b.

В NumPy такое псевдорешение можно искать с помощью функции numpy.linalg.lstsq(a, b, . ), где первые два аргумента такие же, как и для функции numpy.linalg.solve(). Помимо решения функция возвращает еще три значения, которые нам сейчас не понадобятся.

Напоминание теории. Для квадратных невырожденных матриц определено понятие обратной матрицы.

Пусть A — квадратная невырожденная матрица. Матрица A^ называется обратной матрицей к A, если

где I — единичная матрица.

В NumPy обратные матрицы вычисляются с помощью функции numpy.linalg.inv(a), где a — исходная матрица.

Напоминание теории. Для квадратных матриц определены понятия собственного вектора и собственного числа.

Пусть A — квадратная матрица и A in mathbb^ . Собственным вектором матрицы A называется такой ненулевой вектор x in mathbb^ , что для некоторого lambda in mathbb выполняется равенство Ax = lambda x. При этом lambda называется собственным числом матрицы A. Собственные числа и собственные векторы матрицы играют важную роль в теории линейной алгебры и ее практических приложениях.

В NumPy собственные числа и собственные векторы матрицы вычисляются с помощью функции numpy.linalg.eig(a), где a — исходная матрица. В качестве результата эта функция выдает одномерный массив w собственных чисел и двумерный массив v, в котором по столбцам записаны собственные вектора, так что вектор v[:, i] соотвествует собственному числу w[i].

Обратите внимание: у вещественной матрицы собственные значения или собственные векторы могут быть комплексными.

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

p-норма (норма Гёльдера) для вектора x = (x_, dots, x_) in mathbb^ вычисляется по формуле:

В частных случаях при: * p = 1 получаем ell_ норму * p = 2 получаем ell_ норму

Далее нам понабится модуль numpy.linalg , реализующий некоторые приложения линейной алгебры. Для вычисления различных норм мы используем функцию numpy.linalg.norm(x, ord=None, . ), где x — исходный вектор, ord — параметр, определяющий норму (мы рассмотрим два варианта его значений — 1 и 2). Импортируем эту функцию:

ell_ норма (также известная как манхэттенское расстояние) для вектора x = (x_, dots, x_) in mathbb^ вычисляется по формуле:

Ей в функции numpy.linalg.norm(x, ord=None, . ) соответствует параметр ord=1.

ell_ норма (также известная как евклидова норма) для вектора x = (x_, dots, x_) in mathbb^ вычисляется по формуле:

Ей в функции numpy.linalg.norm(x, ord=None, . ) соответствует параметр ord=2.

Более подробно о том, какие еще нормы (в том числе матричные) можно вычислить, см. документацию.

Для двух векторов x = (x_, dots, x_) in mathbb^ и y = (y_, dots, y_) in mathbb^ ell_ и ell_ раccтояния вычисляются по следующим формулам соответственно:

Скалярное произведение в пространстве mathbb^ для двух векторов x = (x_, dots, x_) и y = (y_, dots, y_) определяется как:

Длиной вектора x = (x_, dots, x_) in mathbb^ называется квадратный корень из скалярного произведения, то есть длина равна евклидовой норме вектора:

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

где alpha in [0, pi] — угол между векторами x и y.

Напоминание теории. Комплексными числами называются числа вида x + iy, где x и y — вещественные числа, а i — мнимая единица (величина, для которой выполняется равенство i^ = -1). Множество всех комплексных чисел обозначается буквой mathbb (подробнее про комплексные числа см. википедию).

В питоне комплескные числа можно задать следующим образом (j обозначает мнимую единицу):

С комплексными числами в питоне можно производить базовые арифметические операции так же, как и с вещественными числами:

Рассмотрим сложную математическую функцию на отрезке [1, 15]:

f(x) = sin(x / 5) * exp(x / 10) + 5 * exp(-x / 2)

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

Как известно, многочлен степени n (то есть w_0 + w_1 x + w_2 x^2 + ldots + w_n x^n) однозначно определяется любыми n + 1 различными точками, через которые он проходит. Это значит, что его коэффициенты w_0, … w_n можно определить из следующей системы линейных уравнений:

где через x_1, . x_n, x_ обозначены точки, через которые проходит многочлен, а через f(x_1), . f(x_n), f(x_) — значения, которые он должен принимать в этих точках.

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

Видео:Решение 1 го нелинейного алгебраического уравнения в PythonСкачать

Решение 1 го нелинейного алгебраического уравнения в Python

NumPy: матрицы и операции над ними

Видео:Python ООП ► МЕТОДЫ ЭКЗЕМПЛЯРА КЛАССА (для чайников) ПРОГРАММИРОВАНИЕ ПО ПЛЕЙЛИСТАМ УРОК 23Скачать

Python ООП ► МЕТОДЫ ЭКЗЕМПЛЯРА КЛАССА  (для чайников) ПРОГРАММИРОВАНИЕ ПО ПЛЕЙЛИСТАМ УРОК 23

NumPy: матрицы и операции над ними

В этом ноутбуке из сторонних библиотек нам понадобится только NumPy. Для удобства импортируем ее под более коротким именем:

Видео:Метод Крамера за 3 минуты. Решение системы линейных уравнений - bezbotvyСкачать

Метод Крамера за 3 минуты. Решение системы линейных уравнений - bezbotvy

1. Создание матриц

Приведем несколько способов создания матриц в NumPy.

Самый простой способ — с помощью функции numpy.array(list, dtype=None, . ).

В качестве первого аргумента ей надо передать итерируемый объект, элементами которого являются другие итерируемые объекты одинаковой длины и содержащие данные одинакового типа.

Второй аргумент является опциональным и определяет тип данных матрицы. Его можно не задавать, тогда тип данных будет определен из типа элементов первого аргумента. При задании этого параметра будет произведена попытка приведения типов.

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

Второй способ создания — с помощью встроенных функций numpy.eye(N, M=None, . ), numpy.zeros(shape, . ), numpy.ones(shape, . ).

Первая функция создает единичную матрицу размера N×M ; если M не задан, то M = N .

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

Примеры:

Обратите внимание: размерность массива задается не двумя аргументами функции, а одним — кортежем!

Вот так — np.ones(7, 5) — создать массив не получится, так как функции в качестве параметра shape передается 7, а не кортеж (7, 5).

И, наконец, третий способ — с помощью функции numpy.arange([start, ]stop, [step, ], . ), которая создает одномерный массив последовательных чисел из промежутка [start, stop) с заданным шагом step, и метода array.reshape(shape).

Параметр shape, как и в предыдущем примере, задает размерность матрицы (кортеж чисел). Логика работы метода ясна из следующего примера:

Более подробно о том, как создавать массивы в NumPy, см. документацию.

Видео:Решение систем линейных матричных уравнений через формулы Крамера в PythonСкачать

Решение систем линейных матричных уравнений через формулы Крамера в Python

2. Индексирование

Для получения элементов матрицы можно использовать несколько способов. Рассмотрим самые простые из них.

Для удобства напомним, как выглядит матрица d:

Элемент на пересечении строки i и столбца j можно получить с помощью выражения array[i, j].

Обратите внимание: строки и столбцы нумеруются с нуля!

Из матрицы можно получать целые строки или столбцы с помощью выражений array[i, :] или array[:, j] соответственно:

Еще один способ получения элементов — с помощью выражения array[list1, list2], где list1, list2 — некоторые списки целых чисел. При такой адресации одновременно просматриваются оба списка и возвращаются элементы матрицы с соответствующими координатами. Следующий пример более понятно объясняет механизм работы такого индексирования:

Примеры использования слайсинга:

Более подробно о различных способах индексирования в массивах см. документацию.

Видео:Матрицы на пальцах. Основные операции с матрицами в Python [Математика для машинного обучения]Скачать

Матрицы на пальцах. Основные операции с матрицами в Python [Математика для машинного обучения]

3. Векторы, вектор-строки и вектор-столбцы

Следующие два способа задания массива кажутся одинаковыми:

Однако, на самом деле, это задание одномерного массива (то есть вектора) и двумерного массива:

Обратите внимание: вектор (одномерный массив) и вектор-столбец или вектор-строка (двумерные массивы) являются различными объектами в NumPy, хотя математически задают один и тот же объект. В случае одномерного массива кортеж shape состоит из одного числа и имеет вид (n,), где n — длина вектора. В случае двумерных векторов в shape присутствует еще одна размерность, равная единице.

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

Видео:Решение систем линейных алгебраических уравнений методом Крамера.Скачать

Решение систем линейных алгебраических уравнений  методом Крамера.

4. Datatypes

Все элементы в массиве numpy принадлежат одному типу. В этом плане массивы ближе к C, чем к привычным вам листам питона. Numpy имеет множество встренных типов, подходящих для решения большинства задач.

Видео:#11. Произведение матриц и векторов, элементы линейной алгебры | NumPy урокиСкачать

#11. Произведение матриц и векторов, элементы линейной алгебры | NumPy уроки

5. Математические операции

К массивам (матрицам) можно применять известные вам математические операции. Следут понимать, что при этом у элементов должны быть схожие размерности. Поведение в случае не совпадения размерностей хорошо описанно в документации numpy.

Видео:Решение n го нелинейных алгебраических уравнений в PythonСкачать

Решение n го нелинейных алгебраических  уравнений в Python

6. Умножение матриц и столбцов

Напоминание теории. Операция умножения определена для двух матриц, таких что число столбцов первой равно числу строк второй.

Пусть матрицы A и B таковы, что A ∈ ℝ n×k и B ∈ ℝ k×m . Произведением матриц A и B называется матрица C , такая что cij = ∑ k r = 1 airbrj , где cij — элемент матрицы C , стоящий на пересечении строки с номером i и столбца с номером j .

В NumPy произведение матриц вычисляется с помощью функции numpy.dot(a, b, . ) или с помощью метода array1.dot(array2), где array1 и array2 — перемножаемые матрицы.

Матрицы в NumPy можно умножать и на векторы:

Обратите внимание: операция * производит над матрицами покоординатное умножение, а не матричное!

Более подробно о матричном умножении в NumPy см. документацию.

Видео:Решения системы линейных уравнений на Python (Sympy).Скачать

Решения системы линейных уравнений на Python (Sympy).

7. Объединение массивов

Массивы можно Объединенять. Есть горизонтальное и вертикальное объединение.

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

Задания: (Блок 1)

Задание 1:

Решите без использования циклов средставми NumPy (каждый пункт решается в 1-2 строчки)

  1. Создайте вектор с элементами от 12 до 42
  2. Создайте вектор из нулей длины 12, но его пятый елемент должен быть равен 1
  3. Создайте матрицу (3, 3), заполненую от 0 до 8
  4. Найдите все положительные числа в np.array([1,2,0,0,4,0])
  5. Умножьте матрицу размерности (5, 3) на (3, 2)
  6. Создайте матрицу (10, 10) так, чтобы на границе были 0, а внтури 1
  7. Создайте рандомный вектор и отсортируйте его
  8. Каков эквивалент функции enumerate для numpy массивов?
  9. *Создайте рандомный вектор и выполните нормализацию столбцов (из каждого столбца вычесть среднее этого столбца, из каждого столбца вычесть sd этого столбца)
  10. *Для заданного числа найдите ближайший к нему элемент в векторе
  11. *Найдите N наибольших значений в векторе

Задание 2:

Видео:2 - Решениt систем линейных алгебраических уравнений (СЛАУ) с помощью Matlab.Скачать

2 - Решениt систем линейных алгебраических уравнений (СЛАУ) с помощью Matlab.

8. Транспонирование матриц

Напоминание теории. Транспонированной матрицей A T называется матрица, полученная из исходной матрицы A заменой строк на столбцы. Формально: элементы матрицы A T определяются как a T ij = aji , где a T ij — элемент матрицы A T , стоящий на пересечении строки с номером i и столбца с номером j .

В NumPy транспонированная матрица вычисляется с помощью функции numpy.transpose() или с помощью метода array.T, где array — нужный двумерный массив.

См. более подробно о numpy.transpose() и array.T в NumPy.

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

Видео:Основы NumPy Python | Массивы, Матрицы И Операции Над НимиСкачать

Основы NumPy Python | Массивы, Матрицы И Операции Над Ними

9. Определитель матрицы

Напоминание теории. Для квадратных матриц существует понятие определителя.

Пусть A — квадратная матрица. Определителем (или детерминантом) матрицы A ∈ ℝ n×n назовем число

где α1, α2, …, αn — перестановка чисел от 1 до n , N(α1, α2, …, αn) — число инверсий в перестановке, суммирование ведется по всем возможным перестановкам длины n .

Не стоит расстраиваться, если это определение понятно не до конца — в дальнейшем в таком виде оно не понадобится.

Например, для матрицы размера 2×2 получается:

Вычисление определителя матрицы по определению требует порядка n! операций, поэтому разработаны методы, которые позволяют вычислять его быстро и эффективно.

В NumPy определитель матрицы вычисляется с помощью функции numpy.linalg.det(a), где a — исходная матрица.

Рассмотрим одно интересное свойство определителя. Пусть у нас есть параллелограмм с углами в точках (0, 0), (c, d), (a + c, b + d), (a, b) (углы даны в порядке обхода по часовой стрелке). Тогда площадь этого параллелограмма можно вычислить как модуль определителя матрицы ⎛ ⎜ ⎝ a c b d ⎞ ⎟ ⎠ . Похожим образом можно выразить и объем параллелепипеда через определитель матрицы размера 3×3 .

Видео:29 Вложенные списки PythonСкачать

29 Вложенные списки Python

10. Ранг матрицы

Напоминание теории. Рангом матрицы A называется максимальное число линейно независимых строк (столбцов) этой матрицы.

В NumPy ранг матрицы вычисляется с помощью функции numpy.linalg.matrix_rank(M, tol=None), где M — матрица, tol — параметр, отвечающий за некоторую точность вычисления. В простом случае можно его не задавать, и функция сама определит подходящее значение этого параметра.

С помощью вычисления ранга матрицы можно проверять линейную независимость системы векторов.

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

Видео:Система линейных уравнений. Метод обратной матрицы. Матричный метод.Скачать

Система линейных уравнений. Метод обратной матрицы. Матричный метод.

11. Системы линейных уравнений

Напоминание теории. Системой линейных алгебраических уравнений называется система вида Ax = b , где A ∈ ℝ n×m , x ∈ ℝ m×1 , b ∈ ℝ n×1 . В случае квадратной невырожденной матрицы A решение системы единственно.

В NumPy решение такой системы можно найти с помощью функции numpy.linalg.solve(a, b), где первый аргумент — матрица A , второй — столбец b .

Убедимся, что вектор x действительно является решением системы:

Бывают случаи, когда решение системы не существует. Но хотелось бы все равно “решить” такую систему. Логичным кажется искать такой вектор x , который минимизирует выражение ‖ Axb ‖ 2 — так мы приблизим выражение Ax к b .

В NumPy такое псевдорешение можно искать с помощью функции numpy.linalg.lstsq(a, b, . ), где первые два аргумента такие же, как и для функции numpy.linalg.solve(). Помимо решения функция возвращает еще три значения, которые нам сейчас не понадобятся.

Видео:VB.net Vs С++. СЛАУ Метод ГауссаСкачать

VB.net Vs С++. СЛАУ Метод Гаусса

12. Обращение матриц

Напоминание теории. Для квадратных невырожденных матриц определено понятие обратной матрицы.

Пусть A — квадратная невырожденная матрица. Матрица A − 1 называется обратной матрицей к A , если

где I — единичная матрица.

В NumPy обратные матрицы вычисляются с помощью функции numpy.linalg.inv(a), где a — исходная матрица.

Видео:Решение системы уравнений методом обратной матрицы - bezbotvyСкачать

Решение системы уравнений методом обратной матрицы - bezbotvy

13. Собственные числа и собственные вектора матрицы

Напоминание теории. Для квадратных матриц определены понятия собственного вектора и собственного числа.

Пусть A — квадратная матрица и A ∈ ℝ n×n . Собственным вектором матрицы A называется такой ненулевой вектор x ∈ ℝ n , что для некоторого λ ∈ ℝ выполняется равенство Ax = λx . При этом λ называется собственным числом матрицы A . Собственные числа и собственные векторы матрицы играют важную роль в теории линейной алгебры и ее практических приложениях.

В NumPy собственные числа и собственные векторы матрицы вычисляются с помощью функции numpy.linalg.eig(a), где a — исходная матрица. В качестве результата эта функция выдает одномерный массив w собственных чисел и двумерный массив v, в котором по столбцам записаны собственные вектора, так что вектор v[:, i] соотвествует собственному числу w[i].

Обратите внимание: у вещественной матрицы собственные значения или собственные векторы могут быть комплексными.

Видео:Неоднородные системы линейных уравненийСкачать

Неоднородные системы линейных уравнений

14. Расстояния между векторами

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

p-норма

p-норма (норма Гёльдера) для вектора x = (x1, …, xn) ∈ ℝ n вычисляется по формуле:

В частных случаях при: * p = 1 получаем 1 норму * p = 2 получаем 2 норму

Далее нам понабится модуль numpy.linalg, реализующий некоторые приложения линейной алгебры. Для вычисления различных норм мы используем функцию numpy.linalg.norm(x, ord=None, . ), где x — исходный вектор, ord — параметр, определяющий норму (мы рассмотрим два варианта его значений — 1 и 2). Импортируем эту функцию:

1 норма

Ей в функции numpy.linalg.norm(x, ord=None, . ) соответствует параметр ord=1.

2 норма

2 норма (также известная как евклидова норма) для вектора x = (x1, …, xn) ∈ ℝ n вычисляется по формуле:

Ей в функции numpy.linalg.norm(x, ord=None, . ) соответствует параметр ord=2.

Более подробно о том, какие еще нормы (в том числе матричные) можно вычислить, см. документацию.

Видео:#3. Функции автозаполнения, создания матриц и числовых диапазонов | NumPy урокиСкачать

#3. Функции автозаполнения, создания матриц и числовых диапазонов  | NumPy уроки

15. Расстояния между векторами

Видео:34 Задача: Найти корни квадратного уравнения при помощи PythonСкачать

34 Задача: Найти корни квадратного уравнения при помощи Python

16. Скалярное произведение и угол между векторами

Длиной вектора x = (x1, …, xn) ∈ ℝ n называется квадратный корень из скалярного произведения, то есть длина равна евклидовой норме вектора:

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

где α ∈ [0, π] — угол между векторами x и y .

17. Комплексные числа в питоне

Напоминание теории. Комплексными числами называются числа вида x + iy , где x и y — вещественные числа, а i — мнимая единица (величина, для которой выполняется равенство i 2 = − 1 ). Множество всех комплексных чисел обозначается буквой ℂ (подробнее про комплексные числа см. википедию).

В питоне комплескные числа можно задать следующим образом (j обозначает мнимую единицу):

С комплексными числами в питоне можно производить базовые арифметические операции так же, как и с вещественными числами:

Задания: (Блок 2)

Задание 3:

Рассмотрим сложную математическую функцию на отрезке [1, 15]:

f(x) = sin(x / 5) * exp(x / 10) + 5 * exp(-x / 2)

Пусть экземпляр класса matrix задает систему линейных алгебраических уравнений python

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

Как известно, многочлен степени n (то есть w0 + w1x + w2x 2 + … + wnx n ) однозначно определяется любыми n + 1 различными точками, через которые он проходит. Это значит, что его коэффициенты w0 , … wn можно определить из следующей системы линейных уравнений:

Пусть экземпляр класса matrix задает систему линейных алгебраических уравнений python

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

Решение систем линейных уравнений с помощью Numpy в Python

Библиотеку Numpy можно использовать для выполнения множества математических и научных операций, таких как скалярное произведение, поиск значений синуса и косинуса, преобразование Фурье и т.д.

Что такое система линейных уравнений?

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

В математике система линейных уравнений (или линейная система) – это набор двух или более линейных уравнений, включающих один и тот же набор переменных.

Конечная цель решения системы линейных уравнений – найти значения неизвестных переменных. Вот пример системы линейных уравнений с двумя неизвестными переменными x и y:

Чтобы решить указанную выше систему линейных уравнений, нам нужно найти значения переменных x и y. Есть несколько способов решить такую систему, например, исключение переменных, правило Крамера, метод сокращения строк и матричное решение.

В матричном решении решаемая система линейных уравнений представлена в виде матрицы AX = B. Например, мы можем представить уравнение 1 в виде матрицы следующим образом:

Чтобы найти значение переменных x и y в уравнении 1, нам нужно найти значения в матрице X. Для этого мы можем взять скалярное произведение обратной матрицы A и матрицы B, как показано ниже:

Если вы не знакомы с тем, как найти обратную матрицу, взгляните на эту ссылку, чтобы понять, как вручную найти обратную матрицу.

Решение

Из предыдущего раздела мы знаем, что для решения системы линейных уравнений нам необходимо выполнить две операции: обращение и скалярное произведение матрицы. Библиотека Numpy от Python поддерживает обе операции. Если вы еще не установили библиотеку Numpy, вы можете сделать это с помощью следующей команды pip:

Давайте теперь посмотрим, как решить систему линейных уравнений с помощью библиотеки Numpy.

Использование методов inv() и dot()

Сначала мы найдем матрицу, обратную матрице A, которую мы определили в предыдущем разделе.

Давайте сначала создадим матрицу A на Python. Для создания матрицы можно использовать метод массива модуля Numpy. Матрицу можно рассматривать как список списков, где каждый список представляет собой строку.

В следующем скрипте мы создаем список с именем m_list, который дополнительно содержит два списка: [4,3] и [-5,9]. Эти списки представляют собой две строки в матрице A. Чтобы создать матрицу A с помощью Numpy, m_list передается методу массива, как показано ниже:

Чтобы найти обратную матрицу, которая передается методу linalg.inv() модуля Numpy:

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

Чтобы найти точечный продукт с помощью библиотеки Numpy, используется функция linalg.dot(). Следующий скрипт находит скалярное произведение между обратной матрицей A и B, которая является решением уравнения 1.

Здесь 2 и 4 – соответствующие значения для неизвестных x и y в уравнении 1. Чтобы убедиться, что если вы подставите 2 вместо неизвестного x и 4 вместо неизвестного y в уравнении 4x + 3y, вы увидите что результат будет 20.

Давайте теперь решим систему трех линейных уравнений, как показано ниже:

Вышеупомянутое уравнение можно решить с помощью библиотеки Numpy следующим образом:

В приведенном выше скрипте методы linalg.inv() и linalg.dot() связаны вместе. Переменная X содержит решение уравнения 2 и печатается следующим образом:

Значения неизвестных x, y и z равны 5, 3 и -2 соответственно. Вы можете подставить эти значения в уравнение 2 и проверить их правильность.

resolve()

В двух предыдущих примерах мы использовали методы linalg.inv() и linalg.dot() для поиска решения системы уравнений. Однако библиотека Numpy содержит метод linalg.solve(), который можно использовать для непосредственного поиска решения системы линейных уравнений:

Вы можете видеть, что результат такой же, как и раньше.

Пример

Давайте посмотрим, как систему линейных уравнений можно использовать для решения реальных задач.

Предположим, продавец фруктов продал 20 манго и 10 апельсинов за один день на общую сумму 350 долларов. На следующий день он продал 17 манго и 22 апельсина за 500 долларов. Если цены на фрукты оставались неизменными в оба дня, какова была цена одного манго и одного апельсина?

Эту задачу легко решить с помощью системы двух линейных уравнений.

Допустим, цена одного манго равна x, а цена апельсина – y. Вышеупомянутую проблему можно преобразовать так:

Решение для указанной выше системы уравнений показано здесь:

И вот результат:

Выходные данные показывают, что цена одного манго составляет 10 долларов, а цена одного апельсина – 15 долларов.

Поделиться или сохранить к себе: