PT Mebel Nusantara menjalankan tiga pabrik perakitan — sebut saja Pabrik A, Pabrik B, dan Pabrik C. Semua pabrik merakit produk yang sama, tetapi kebutuhan bahan bakunya tidak sama karena mesin dan metode perakitan di tiap lokasi berbeda. Gudang mencatat kebutuhan bahan per unit beserta total pemakaian hari ini seperti pada tabel berikut.
| Bahan baku | Pabrik A | Pabrik B | Pabrik C | Pemakaian hari ini |
|---|---|---|---|---|
| Papan (lembar) | 2 | 1 | 1 | 135 |
| Lem (liter) | 1 | 3 | 2 | 175 |
| Cat (liter) | 1 | 1 | 4 | 185 |
Tugas kita di bagian ini menerjemahkan tabel tersebut ke bentuk yang dipahami numpy.linalg. Mengikuti bab Penyelesaian Sistem Persamaan Linear, setiap baris tabel menjadi satu persamaan, setiap pabrik menjadi satu variabel, dan seluruh sistem ditulis ringkas sebagai A x = b. Mari kita bangun matriksnya.
Dari Soal Cerita ke Matriks #
Konvensi yang kita pakai sederhana: baris ke-i matriks A berisi kebutuhan bahan baku ke-i per satu unit produk di tiap pabrik, sedangkan kolom ke-j mewakili satu pabrik. Vektor b menampung total pemakaian bahan hari ini, dan vektor x — yang nilainya belum kita ketahui — berisi produksi tiap pabrik.
| Unsur soal | Bentuk array | Ukuran |
|---|---|---|
| Kebutuhan bahan per unit | A | 3x3 |
| Total pemakaian harian | b | (3,) |
| Produksi tiap pabrik | x | (3,) — dicari |
Berikut kode yang menyusun A dan b dari data soal:
import numpy as np
A = np.array([
[2, 1, 1],
[1, 3, 2],
[1, 1, 4],
])
b = np.array([135, 175, 185])
print(A)
print(b)
print(A.shape, b.shape)
print(A.dtype, b.dtype)Output yang Dihasilkan:
[[2 1 1]
[1 3 2]
[1 1 4]]
[135 175 185]
(3, 3) (3,)
int64 int64Mari kita bedah:
- Baris 3-7 (
np.array(...)): interpreter menyusun array 2-D berukuran 3x3; setiap list Python di dalam list luar menjadi satu baris matriks, persis mengikuti urutan bahan baku pada tabel soal. - Baris 8 (
b = np.array(...)): vektor total pemakaian dibuat sebagai array 1-D dengan tiga elemen, satu untuk tiap persamaan. - Baris 9-10 (
print(...)):shape(3, 3)dan(3,)menegaskan matriks koefisien persegi yang panjang vektornya cocok;dtypeint64muncul karena seluruh angka soal berupa bilangan bulat.
Menyusun Soal dari Solusi #
Ada satu hal yang perlu kita akui secara terbuka: soal di atas dirancang agar jawabannya rapi. Cara standar penyusun soal adalah bekerja dengan arah terbalik — tentukan dulu produksi yang diinginkan, lalu hitung total pemakaian lewat perkalian matriks-vektor (bab Matrix Multiplication). Dengan begitu soal dijamin punya solusi eksak yang enak dibaca, dan kita mendapat kunci jawaban untuk mengaudit hasil nanti:
import numpy as np
A = np.array([[2, 1, 1], [1, 3, 2], [1, 1, 4]])
produksi = np.array([40, 25, 30])
b_rancang = A @ produksi
print(b_rancang)
print(np.array_equal(b_rancang, np.array([135, 175, 185])))Output yang Dihasilkan:
[135 175 185]
TruePenjelasan tiap baris:
- Baris 3 (
produksi = ...): vektor desain berisi 40, 25, dan 30 unit — inilah kunci jawaban yang disembunyikan dari soal. - Baris 4 (
b_rancang = A @ produksi): operator@mengalikan matriks 3x3 dengan vektor 3 elemen sehingga menghasilkan tiga total pemakaian; baris pertama A dikalikan produksi memberi 2x40 + 1x25 + 1x30 = 135. - Baris 6 (
np.array_equal(...)): perbandingan bit-per-bit mengembalikanTrue, artinya angka pada tabel soal memang persis berasal dari produk matriks ini.
Cek Kelayakan: Determinan dan Rank #
Sebelum beranjak ke perhitungan solusi, kita pastikan dulu bahwa A layak diselesaikan. Determinan yang jauh dari nol dan rank penuh (3 dari 3) menandakan ketiga persamaan saling melengkapi, bukan saling meniru — dua konsep yang dibahas pada bab Determinant dan Matrix Rank:
import numpy as np
A = np.array([[2, 1, 1], [1, 3, 2], [1, 1, 4]])
print(np.linalg.det(A))
print(np.linalg.matrix_rank(A))
print(np.linalg.cond(A))Output yang Dihasilkan:
16.000000000000007
3
4.059145176318882Mari kita baca hasilnya:
- Baris 3 (
np.linalg.det(A)): determinan teoretisnya 16; angka 16.000000000000007 adalah jejak pembulatanfloat64dari perhitungan LU di balik layar. Nilai yang dimaksud tetap 16 dan jelas bukan nol. - Baris 4 (
np.linalg.matrix_rank(A)): rank 3 berarti ketiga baris A independen; tidak ada persamaan yang bisa diturunkan dari persamaan lain. - Baris 5 (
np.linalg.cond(A)): angka kondisi sekitar 4,06 tergolong kecil — tanda matriks ini stabil secara numerik. Skala pembandingnya dibahas pada bab Stabilitas Numerik.
Matriks koefisien dan vektor hasil sudah siap, dan kelayakannya terkonfirmasi. Bagian berikutnya menghitung solusinya.