np.linalg.solve() în NumPy

Algebră liniară NumPy 1.0+

Rezolvă un sistem de ecuații liniare A @ x = b și returnează soluția x; verifici rezultatul cu np.allclose.

Sintaxă
np.linalg.solve(a, b)

Ce face np.linalg.solve()

Un sistem de ecuații liniare se scrie ca A @ x = b: A conține coeficienții (câte un rând pentru fiecare ecuație), b conține termenii liberi, iar x necunoscutele. np.linalg.solve(A, b) returnează x.

A trebuie să fie pătrată (câte ecuații, atâtea necunoscute) și inversabilă. Dacă sistemul nu are soluție unică, funcția aruncă LinAlgError: Singular matrix. Rezultatul este float și poate avea erori mici de rotunjire; îl verifici cu np.allclose(A @ x, b).

Parametri

Parametru Descriere
a Matricea coeficienților, pătrată, forma (n, n).
b Termenii liberi: un vector de lungime n sau o matrice (n, k) pentru mai multe sisteme cu aceiași coeficienți.

Ce returnează

Soluția x, cu aceeași formă ca b.

Exemple

Exemplul 1: Bilete pentru adulți și copii

La un spectacol s-au vândut 120 de bilete și s-au încasat 3600 de lei. Un bilet de adult costă 40 de lei, unul de copil 20 de lei. Sistemul: a + c = 120 și 40a + 20c = 3600.

import numpy as np

A = np.array([[1, 1], [40, 20]])
b = np.array([120, 3600])
adulti, copii = np.linalg.solve(A, b)
print("Adulți:", round(float(adulti)), "Copii:", round(float(copii)))

Rezultat

Adulți: 60 Copii: 60

Exemplul 2: Sistem cu trei necunoscute și verificare

import numpy as np

# 2x + y - z = 8
# -3x - y + 2z = -11
# -2x + y + 2z = -3
A = np.array([[2, 1, -1], [-3, -1, 2], [-2, 1, 2]])
b = np.array([8, -11, -3])
x = np.linalg.solve(A, b)
print(x.round(6))
print(np.allclose(A @ x, b))

Rezultat

[ 2.  3. -1.]
True

Exemplul 3: Sistem fără soluție unică

A doua ecuație este prima înmulțită cu 2, deci matricea este singulară.

import numpy as np

A = np.array([[1.0, 2.0], [2.0, 4.0]])
b = np.array([5.0, 10.0])
try:
    np.linalg.solve(A, b)
except np.linalg.LinAlgError as e:
    print("Nu se poate rezolva:", e)

Rezultat

Nu se poate rezolva: Singular matrix

Greșeli frecvente

  • Pui coeficienții pe coloane în loc de rânduri: fiecare rând din A trebuie să fie o ecuație.
  • Verifici soluția cu A @ x == b și primești False din cauza rotunjirii. Folosește np.allclose(A @ x, b).
  • Dai un sistem cu mai multe ecuații decât necunoscute (A nepătrată): solve dă LinAlgError. Pentru o soluție aproximativă folosește np.linalg.lstsq().

Comenzi înrudite

  • np.linalg.inv(): Calculează inversa unei matrice pătrate; pentru o matrice singulară aruncă LinAlgError.
  • np.linalg.det(): Calculează determinantul unei matrice pătrate; rezultatul este float aproximativ, compară-l cu np.isclose sau rotunjește-l.
  • np.matmul() și operatorul @: Înmulțirea de matrice cu np.matmul sau operatorul @; diferența față de *, care înmulțește element cu element.
  • np.dot(): Calculează produsul scalar a doi vectori sau produsul matriceal a două matrice.