Учебники

SciPy – Linalg

SciPy построен с использованием оптимизированных библиотек ATLAS LAPACK и BLAS . У этого есть очень быстрые возможности линейной алгебры. Все эти процедуры линейной алгебры ожидают объект, который может быть преобразован в двумерный массив. Результатом этих подпрограмм также является двумерный массив.

SciPy.linalg против NumPy.linalg

Scipy.linalg содержит все функции, которые есть в numpy.linalg. Кроме того, scipy.linalg также имеет некоторые другие расширенные функции, которых нет в numpy.linalg. Другое преимущество использования scipy.linalg перед numpy.linalg заключается в том, что он всегда компилируется с поддержкой BLAS / LAPACK, а для NumPy это необязательно. Поэтому версия SciPy может быть быстрее в зависимости от того, как был установлен NumPy.

Линейные уравнения

Функция scipy.linalg.solve решает линейное уравнение a * x + b * y = Z для неизвестных значений x, y.

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

x + 3y + 5z = 10

2x + 5y + z = 8

2x + 3y + 8z = 3

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

\ begin {bmatrix} x \\ y \\ z \ end {bmatrix} = \ begin {bmatrix} 1 & 3 & 5 \\ 2 & 5 & 1 \\ 2 & 3 & 8 \ end {bmatrix} ^ {-1} \ begin {bmatrix} 10 \\ 8 \\ 3 \ end {bmatrix} = \ frac {1} {25} \ begin {bmatrix} -232 \\ 129 \\ 19 \ end {bmatrix} = \ begin {bmatrix} -9.28 \\ 5.16 \\ 0.76 \ end {bmatrix}.

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

Функция решения принимает два входа «a» и «b», в которых «a» представляет коэффициенты, а «b» представляет соответствующее правое значение и возвращает массив решений.

Давайте рассмотрим следующий пример.

#importing the scipy and numpy packages
from scipy import linalg
import numpy as np

#Declaring the numpy arrays
a = np.array([[3, 2, 0], [1, -1, 0], [0, 5, 1]])
b = np.array([2, 4, -1])

#Passing the values to the solve function
x = linalg.solve(a, b)

#printing the result array
print x

Вышеуказанная программа сгенерирует следующий вывод.

array([ 2., -2., 9.])

Нахождение детерминанта

Определитель квадратной матрицы A часто обозначается как | A | и является величиной, часто используемой в линейной алгебре. В SciPy это вычисляется с использованием функции det () . Он принимает матрицу в качестве входных данных и возвращает скалярное значение.

Давайте рассмотрим следующий пример.

#importing the scipy and numpy packages
from scipy import linalg
import numpy as np

#Declaring the numpy array
A = np.array([[1,2],[3,4]])

#Passing the values to the det function
x = linalg.det(A)

#printing the result
print x

Вышеуказанная программа сгенерирует следующий вывод.

-2.0

Собственные значения и собственные векторы

Проблема собственных значений-собственных векторов является одной из наиболее часто используемых операций линейной алгебры. Мы можем найти собственные значения (λ) и соответствующие собственные векторы (v) квадратной матрицы (A), рассмотрев следующее соотношение:

Av = λv

scipy.linalg.eig вычисляет собственные значения из обычной или обобщенной задачи на собственные значения. Эта функция возвращает собственные значения и собственные векторы.

Давайте рассмотрим следующий пример.

#importing the scipy and numpy packages
from scipy import linalg
import numpy as np

#Declaring the numpy array
A = np.array([[1,2],[3,4]])

#Passing the values to the eig function
l, v = linalg.eig(A)

#printing the result for eigen values
print l

#printing the result for eigen vectors
print v

Вышеуказанная программа сгенерирует следующий вывод.

array([-0.37228132+0.j, 5.37228132+0.j]) #--Eigen Values
array([[-0.82456484, -0.41597356], #--Eigen Vectors
       [ 0.56576746, -0.90937671]])

Разложение по единственному значению

Разложение по сингулярным значениям (SVD) можно рассматривать как расширение задачи на собственные значения на матрицы, которые не являются квадратными.

Scipy.linalg.svd разлагает матрицу ‘a’ на две унитарные матрицы ‘U’ и ‘Vh’ и одномерный массив ‘s’ сингулярных значений (действительных, неотрицательных), таких что a == U * S * Vh, где ‘S’ – это матрица нулей подходящей формы с главной диагональю ‘s’.

Давайте рассмотрим следующий пример.

#importing the scipy and numpy packages
from scipy import linalg
import numpy as np

#Declaring the numpy array
a = np.random.randn(3, 2) + 1.j*np.random.randn(3, 2)

#Passing the values to the eig function
U, s, Vh = linalg.svd(a)

# printing the result
print U, Vh, s

Вышеуказанная программа сгенерирует следующий вывод.