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 #
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:
[40. 25. 30.]
float64
TrueMari kita bedah:
- Baris 4 (
x = np.linalg.solve(A, b)): fungsi menerima matriks koefisien dan vektor hasil, memfaktorkan A di balik layar, lalu mengembalikan solusi sebagai arrayfloat64. - Baris 5 (
print(x)): solusi tampil sebagai[40. 25. 30.]— angka bulat persis seperti kunci jawaban pada bagian pertama. - Baris 6 (
np.allclose(A @ x, b)): substitusi solusi kembali ke sistem mengembalikanTrue; 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:
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:
Pabrik A: 40 unit per hari
Pabrik B: 25 unit per hari
Pabrik C: 30 unit per hariDua baris kuncinya:
- Baris 6 (
zip(pabrik, x)): nama pabrik dan komponen solusi dipasangkan lalu diiterasi bersama, sehingga tiap baris laporan menghubungkan satu angka dengan satu lokasi. - Baris 7 (
f"...{unit:.0f}..."): format.0fmenampilkan 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:
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:
[40. 25. 30.]
True
TruePenjelasan singkat:
- Baris 5 (
np.linalg.inv(A) @ b): inverse dihitung penuh menjadi matriks 3x3, lalu dikalikan dengan b — dua operasi berat dibanding satu panggilansolve. - Baris 6 (
np.array_equal(...)):Trueberarti pada kasus kecil dan rapi ini kedua metode menghasilkan bitfloat64yang identik. - 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.
| Aspek | np.linalg.solve | np.linalg.inv(A) @ b |
|---|---|---|
| Komputasi | satu faktorisasi langsung | inverse penuh + perkalian ekstra |
| Stabilitas | lebih baik | menurun pada matriks ill-conditioned |
| Keluaran sampingan | hanya x | matriks A⁻¹ ikut tersimpan |
| Kapan dipakai | pilihan pertama hampir selalu | saat 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.