Matriks A dan vektor b dari bagian pertama sudah siap di tangan. Kita mencari vektor x sehingga A @ x = b, dan numpy.linalg menyediakan satu fungsi yang dirancang khusus untuk pekerjaan ini: np.linalg.solve. Mengikuti bab Pengenalan numpy.linalg, fungsi ini tidak menghitung inverse secara eksplisit; ia memfaktorkan matriks lewat rutinitas LAPACK lalu menyelesaikan sistem dalam satu langkah yang efisien.

Menyelesaikan dengan np.linalg.solve #

python
import numpy as np

A = np.array([[2, 1, 1], [1, 3, 2], [1, 1, 4]])
b = np.array([135, 175, 185])
x = np.linalg.solve(A, b)
print(x)
print(x.dtype)
print(np.allclose(A @ x, b))

Output yang Dihasilkan:

text
[40. 25. 30.]
float64
True

Mari kita bedah:

  1. Baris 4 (x = np.linalg.solve(A, b)): fungsi menerima matriks koefisien dan vektor hasil, memfaktorkan A di balik layar, lalu mengembalikan solusi sebagai array float64.
  2. Baris 5 (print(x)): solusi tampil sebagai [40. 25. 30.] — angka bulat persis seperti kunci jawaban pada bagian pertama.
  3. Baris 6 (np.allclose(A @ x, b)): substitusi solusi kembali ke sistem mengembalikan True; ini bukti pertama bahwa x memenuhi ketiga persamaan sekaligus.

Membaca Makna Setiap Komponen Solusi #

x bukan sekadar deret angka; setiap komponennya adalah jawaban untuk satu pabrik, mengikuti urutan kolom A. Kita tampilkan solusi sebagai laporan singkat yang siap dikirim ke tim gudang:

python
import numpy as np

A = np.array([[2, 1, 1], [1, 3, 2], [1, 1, 4]])
b = np.array([135, 175, 185])
x = np.linalg.solve(A, b)
pabrik = ["Pabrik A", "Pabrik B", "Pabrik C"]
for nama, unit in zip(pabrik, x):
    print(f"{nama}: {unit:.0f} unit per hari")

Output yang Dihasilkan:

text
Pabrik A: 40 unit per hari
Pabrik B: 25 unit per hari
Pabrik C: 30 unit per hari

Dua baris kuncinya:

  1. Baris 6 (zip(pabrik, x)): nama pabrik dan komponen solusi dipasangkan lalu diiterasi bersama, sehingga tiap baris laporan menghubungkan satu angka dengan satu lokasi.
  2. Baris 7 (f"...{unit:.0f}..."): format .0f menampilkan 40.0 sebagai 40 karena produksi memang bilangan bulat.

Cek cepat terhadap persamaan pertama: 2x40 + 1x25 + 1x30 = 135 lembar papan, cocok dengan catatan gudang. Persamaan lem dan cat lolos dengan hitungan yang sama mudah.

Jalan Alternatif lewat Inverse Matriks #

Secara aljabar, x = A⁻¹b. NumPy mengizinkan kita menulis persis seperti itu dengan np.linalg.inv (bab Inverse Matriks). Menarik untuk membandingkan hasilnya dengan solve — bahkan secara bit-per-bit:

python
import numpy as np

A = np.array([[2, 1, 1], [1, 3, 2], [1, 1, 4]])
b = np.array([135, 175, 185])
x = np.linalg.solve(A, b)
x_inv = np.linalg.inv(A) @ b
print(x_inv)
print(np.array_equal(x, x_inv))
print(np.allclose(x, x_inv))

Output yang Dihasilkan:

text
[40. 25. 30.]
True
True

Penjelasan singkat:

  1. Baris 5 (np.linalg.inv(A) @ b): inverse dihitung penuh menjadi matriks 3x3, lalu dikalikan dengan b — dua operasi berat dibanding satu panggilan solve.
  2. Baris 6 (np.array_equal(...)): True berarti pada kasus kecil dan rapi ini kedua metode menghasilkan bit float64 yang identik.
  3. Baris 7 (np.allclose(...)): jaring pengaman untuk kasus lain. Pada sistem yang lebih besar atau kurang rapi, kedua jalur bisa berbeda di digit ke belakang; bab Floating Point Comparison menjelaskan mengapa perbandingan ketat jarang bisa diandalkan.
Aspeknp.linalg.solvenp.linalg.inv(A) @ b
Komputasisatu faktorisasi langsunginverse penuh + perkalian ekstra
Stabilitaslebih baikmenurun pada matriks ill-conditioned
Keluaran sampinganhanya xmatriks A⁻¹ ikut tersimpan
Kapan dipakaipilihan pertama hampir selalusaat A⁻¹ memang dibutuhkan berulang kali

Solusi sudah ada di tangan dan satu jalur alternatif sudah ditempuh. Bagian berikutnya mengauditnya lebih jauh sebelum kita percaya penuh.