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:
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:
Persamaan 1: 135.0 vs 135 -> cocok
Persamaan 2: 175.0 vs 175 -> cocok
Persamaan 3: 185.0 vs 185 -> cocokMari kita bedah:
- 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. - Baris 6 (
kiri = A[i] @ x): perkalian baris-vektor menghitung sisi kiri persamaan ke-i; hasilnya 135.0 (float) karena x bertipefloat64. - Baris 7 (
kiri == b[i]): perbandingan==di sini aman karena nilai-nilainya bilangan bulat kecil yang terwakili sempurna difloat64. Untuk data umum, gantilah dengannp.iscloseseperti 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:
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:
[0. 0. 0.]
0.0
True
16.000000000000007
3Penjelasan tiap baris:
- Baris 5 (
residual = b - A @ x): pengurangan dua vektor sepanjang tiga elemen menghasilkan[0. 0. 0.]— solusi memenuhi sistem tanpa selisih sama sekali. - Baris 6 (
np.linalg.norm(residual)): norma Euclidean merangkum seluruh residual menjadi satu skalar;0.0berarti tidak ada meleset. - Baris 7 (
np.allclose(residual, 0)): versi boolean dari pemeriksaan yang sama, siap dipakai sebagai assertion otomatis. - 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:
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:
2
LinAlgError: Singular matrixMari kita baca perilakunya:
- 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. - Baris 5-9 (
try/except):np.linalg.solvemenolak bekerja pada matriks singular dan melemparnp.linalg.LinAlgErrordengan 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.