Функция linalg.solve
Функция linalg.solve решает систему линейных уравнений
вида A * x = b, где A - квадратная матрица
коэффициентов, b - вектор или матрица правых частей.
Первый параметр функции - матрица коэффициентов A,
второй параметр - правая часть b. Матрица A
должна быть квадратной и невырожденной.
Синтаксис
np.linalg.solve(A, b)
Пример
Решим простую систему двух уравнений с двумя неизвестными:
import numpy as np
A = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])
res = np.linalg.solve(A, b)
print(res)
Результат выполнения кода:
[2. 3.]
Решением системы является вектор x = [2, 3], что
соответствует уравнениям: 3*2 + 1*3 = 9 и 1*2 + 2*3 = 8.
Пример
Решим систему трёх уравнений с тремя неизвестными:
import numpy as np
A = np.array([
[2, 1, -1],
[-3, -1, 2],
[-2, 1, 2]
])
b = np.array([8, -11, -3])
res = np.linalg.solve(A, b)
print(res)
Результат выполнения кода:
[2. 3. -1.]
Пример
Решим систему с несколькими правыми частями, передавая
матрицу b с несколькими столбцами:
import numpy as np
A = np.array([
[4, 1],
[2, 3]
])
b = np.array([
[1, 2],
[3, 4]
])
res = np.linalg.solve(A, b)
print(res)
Результат выполнения кода:
[[0. 0.2]
[1. 1.2]]
Каждый столбец матрицы b решается независимо.
Пример
Сравним решение системы с использованием обратной матрицы:
import numpy as np
A = np.array([
[3, 1],
[1, 2]
])
b = np.array([9, 8])
res_solve = np.linalg.solve(A, b)
res_inv = np.linalg.inv(A) @ b
print("solve:", res_solve)
print("inv: ", res_inv)
Результат выполнения кода:
"solve: [2. 3.]"
"inv: [2. 3.]"
Оба метода дают одинаковый результат, но solve
работает быстрее и численно более устойчив.
Пример
При попытке решить систему с вырожденной матрицей
возникает ошибка LinAlgError:
import numpy as np
A = np.array([
[1, 2],
[2, 4]
])
b = np.array([3, 6])
try:
res = np.linalg.solve(A, b)
print(res)
except np.linalg.LinAlgError as e:
print("Error:", e)
Результат выполнения кода:
"Error: Singular matrix"