Solusi [40, 25, 30] sudah muncul di layar, tetapi dalam pekerjaan nyata kita tidak cukup percaya pada satu tampilan angka. Bagian ini mengaudit solusi dengan tiga lapis pemeriksaan yang saling melengkapi: substitusi balik ke setiap persamaan, pengukuran residual, dan analisis struktur matriks. Pola yang sama akan terasa familier bagi yang sudah membaca bab assert_allclose — perbedaannya, di sini pemeriksaan kita jalankan manual agar mekanismenya terlihat.

Substitusi Balik ke Setiap Persamaan #

Langkah paling transparan adalah memasukkan x kembali ke tiap persamaan lalu membandingkan hasilnya dengan total pemakaian yang dicatat 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)
for i in range(3):
    kiri = A[i] @ x
    cocok = "cocok" if kiri == b[i] else "berbeda"
    print(f"Persamaan {i + 1}: {kiri} vs {b[i]} -> {cocok}")

Output yang Dihasilkan:

text
Persamaan 1: 135.0 vs 135 -> cocok
Persamaan 2: 175.0 vs 175 -> cocok
Persamaan 3: 185.0 vs 185 -> cocok

Mari kita bedah:

  1. Baris 5 (for i in range(3)): setiap iterasi mengambil satu baris A dan satu elemen b, sehingga tiap persamaan diperiksa terpisah — bukan digabung sekaligus.
  2. Baris 6 (kiri = A[i] @ x): perkalian baris-vektor menghitung sisi kiri persamaan ke-i; hasilnya 135.0 (float) karena x bertipe float64.
  3. Baris 7 (kiri == b[i]): perbandingan == di sini aman karena nilai-nilainya bilangan bulat kecil yang terwakili sempurna di float64. Untuk data umum, gantilah dengan np.isclose seperti dibahas pada bab Floating Point Comparison.

Residual dan Norma Kesalahan #

Substitusi per persamaan itu meyakinkan, tetapi laporan numerik biasanya diringkas menjadi satu angka: residual r = b - A @ x. Residual mengukur seberapa jauh sisi kiri meleset dari b; untuk solusi eksak, vektornya nol semua. Bersamaan, kita mengecek kembali struktur soal lewat determinan dan rank:

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)
residual = b - A @ x
print(residual)
print(np.linalg.norm(residual))
print(np.allclose(residual, 0))
print(np.linalg.det(A))
print(np.linalg.matrix_rank(A))

Output yang Dihasilkan:

text
[0. 0. 0.]
0.0
True
16.000000000000007
3

Penjelasan tiap baris:

  1. Baris 5 (residual = b - A @ x): pengurangan dua vektor sepanjang tiga elemen menghasilkan [0. 0. 0.] — solusi memenuhi sistem tanpa selisih sama sekali.
  2. Baris 6 (np.linalg.norm(residual)): norma Euclidean merangkum seluruh residual menjadi satu skalar; 0.0 berarti tidak ada meleset.
  3. Baris 7 (np.allclose(residual, 0)): versi boolean dari pemeriksaan yang sama, siap dipakai sebagai assertion otomatis.
  4. Baris 8-9: determinan sekitar 16 dan rank 3 mengonfirmasi struktur soal — sistem punya solusi tunggal, dan solusi yang kita temukan memang layak disebut solusinya.

Menghadapi Sistem Singular #

Keandalan pemeriksaan perlu diuji pada kasus yang gagal. Bayangkan catatan gudang ternyata kurang informatif: baris kedua tabel persis dua kali baris pertama, sehingga persamaan lem tidak memberi informasi baru. Matriks seperti ini disebut singular — rank-nya jatuh di bawah jumlah variabel:

python
import numpy as np

A_sing = np.array([[1, 2, 3], [2, 4, 6], [1, 1, 1]])
b_sing = np.array([6, 12, 3])
print(np.linalg.matrix_rank(A_sing))
try:
    x = np.linalg.solve(A_sing, b_sing)
    print(x)
except np.linalg.LinAlgError as e:
    print("LinAlgError:", e)

Output yang Dihasilkan:

text
2
LinAlgError: Singular matrix

Mari kita baca perilakunya:

  1. Baris 3-4 (A_sing): baris kedua [2, 4, 6] tepat dua kali baris pertama [1, 2, 3], sehingga informasinya hanya setara dua persamaan; rank yang tercetak memang 2 dari 3 variabel.
  2. Baris 5-9 (try/except): np.linalg.solve menolak bekerja pada matriks singular dan melempar np.linalg.LinAlgError dengan pesan “Singular matrix”. Kita menangkapnya lalu mencetak pesan itu, sehingga script tetap berjalan dan perilaku errornya terdokumentasi.

Dengan tiga lapis pemeriksaan ini, solusi [40, 25, 30] bukan lagi sekadar angka yang tampak benar — ia sudah lolos audit. Bagian terakhir membandingkan metode-metode yang kita pakai, termasuk untuk kasus yang tidak bisa diselesaikan solve.