Aljabar Linear

Operasi matriks dan vektor dari pustaka standar LinearAlgebra, meliputi perkalian, dekomposisi, dan penyelesaian sistem linear.

Daftar isi

Operasi aljabar linear di Julia disediakan oleh pustaka standar LinearAlgebra yang dimuat melalui using LinearAlgebra. Topik ini membahas perkalian matriks, transpos dan adjoint, perkalian titik (dot product), matriks identitas, penyelesaian sistem linear dengan operator \, serta fungsi det, inv, eigen, dan norm. Setelah topik ini dipraktikkan, operasi matriks harian dapat ditulis dengan notasi yang mendekati notasi matematisnya.

Perkalian matriks dan perkalian per elemen#

Operator * pada matriks merupakan perkalian aljabar linear, yaitu setiap elemen hasil dihitung dari jumlah hasil kali satu baris A dan satu kolom B. Untuk matriks A berukuran m×n dan B berukuran n×p, elemen hasilnya dinyatakan oleh

(AB)ij=∑r=1nAirBrj (AB)_{ij} = \sum_{r=1}^{n} A_{ir} B_{rj}

sedangkan .* tetap merupakan perkalian per elemen sebagaimana sintaks titik broadcasting pada umumnya. Karena kedua operator sama-sama sah untuk matriks persegi, maksud operasinya perlu diperiksa sebelum memilih salah satunya.

julia Contoh: * dan .* pada matriks yang sama
using LinearAlgebra
A = [1 2; 3 4]
B = [5 6; 7 8]
println(A * B)
println(A .* B)
text Keluaran
[19 22; 43 50]
[5 12; 21 32]

Perkalian A * B menghasilkan 19 pada sel pertama karena 1×5 + 2×7, sedangkan A .* B menghasilkan 5 karena 1×5 saja. Perkalian matriks hanya terdefinisi apabila banyak kolom A sama dengan banyak baris B, dan perhitungan yang melanggarnya berhenti dengan DimensionMismatch.

Bentuk argumen * tidak terbatas pada dua matriks persegi. Matriks berukuran m×n yang dikalikan vektor berukuran n menghasilkan vektor berukuran m, dan hasil A * B selalu berukuran m×p dengan mengikuti banyak baris A serta banyak kolom B. Ukuran itulah yang perlu diperiksa terlebih dahulu apabila sebuah perkalian ditolak dengan pesan error.

Transpos, adjoint, dan dot#

Operator ' menghasilkan adjoint, yaitu transpos yang disertai konjugasi kompleks pada setiap elemennya. Untuk matriks berisi bilangan riil, adjoint sama saja dengan transpos, sedangkan fungsi transpose() selalu memberikan transpos murni tanpa konjugasi. Fungsi dot(a, b) menghitung perkalian titik antara dua vektor, yaitu jumlah hasil kali elemen yang seletak.

julia Contoh: adjoint, transpos kompleks, dot, dan identitas
using LinearAlgebra
M = [1 2; 3 4]
println(M')
println(M == M')
C = [1+2im 3; 4 5im]
println(C'[1, 1])
println(dot([1, 2, 3], [4, 5, 6]))
println(M * I == M)
text Keluaran
[1 3; 2 4]
false
1 - 2im
32
true

Pada contoh di atas, elemen pertama C' bernilai 1 - 2im karena konjugasi 1 + 2im, dan dot([1, 2, 3], [4, 5, 6]) bernilai 32 karena 1×4 + 2×5 + 3×6. Konstanta I menyatakan matriks identitas, tetapi bukan matriks biasa melainkan objek UniformScaling yang menyesuaikan ukurannya dengan matriks lain dalam operasi yang sama, sehingga M * I == M bernilai true tanpa perlu menentukan ukuran identitas.

Menyelesaikan sistem linear dengan backslash#

Operator \ menyelesaikan sistem persamaan Ax=b Ax = b dengan menghitung x=A\b x = A \backslash b . Operator ini tidak membentuk matriks balikan, melainkan menyusun dekomposisi A seperti LU, sehingga hasilnya lebih cepat dan lebih stabil secara numerik daripada menghitung inv(A) * b. Untuk sistem dua variabel dengan solusi bulat sederhana, prosesnya dapat diverifikasi dengan mengalikan kembali.

julia sistem-linear.jl
# sistem-linear.jl
# Menyelesaikan sistem linear dua variabel dengan operator backslash.

using LinearAlgebra

# Sistem: 2x + y = 5 dan x + 3y = 10
A = [2 1; 1 3]
b = [5, 10]

x = A \ b
println("x = ", x)
println("verifikasi A*x = ", A * x)
println("det(A) = ", det(A))
text Keluaran
x = [1.0, 3.0]
verifikasi A*x = [5.0, 10.0]
det(A) = 5.0

Keluaran menunjukkan x = [1.0, 3.0] yang memenuhi 2(1) + 3 = 5 dan 1 + 3(3) = 10. Nilai determinan 5.0 juga menegaskan bahwa A tidak singular, sehingga solusinya tunggal.

Dekomposisi yang dimaksud adalah penulisan A sebagai hasil kali matriks-matriks yang lebih sederhana, misalnya dekomposisi LU yang memecah A menjadi matriks segitiga bawah dan segitiga atas. Penyelesaian sistem lalu berlangsung sebagai dua tahap substitusi yang murah. Operator \ memilih bentuk dekomposisi yang sesuai dengan sifat A, sehingga pemanggilnya tidak perlu memilih sendiri.

Dekomposisi dan sifat matriks#

Fungsi det(A) menghitung determinan, inv(A) menghitung matriks balikan, dan norm(v) menghitung panjang vektor, yaitu akar jumlah kuadrat elemennya sebagaimana rumus ∥v∥2=v12+⋯+vn2 \lVert v \rVert_2 = \sqrt{v_1^2 + \cdots + v_n^2} . Fungsi eigen(A) menghitung dekomposisi nilai eigen dan vektor eigen, lalu mengembalikan objek Eigen yang menyimpan hasilnya pada field values dan vectors.

julia Contoh: det, inv, dan norm
using LinearAlgebra
A = [2 1; 1 3]
println(det(A))
println(inv(A))
println(norm([3, 4]))
text Keluaran
5.0
[0.6 -0.2; -0.2 0.4]
5.0
julia Contoh: nilai eigen dan vektor eigen
using LinearAlgebra
A = [2 1; 1 3]
E = eigen(A)
println(E.values)
println(E.vectors)
text Keluaran
[1.381966011250105, 3.618033988749895]
[-0.8506508083520399 0.5257311121191335; 0.5257311121191335 0.8506508083520399]

Kolom ke-r pada E.vectors adalah vektor eigen yang berpasangan dengan nilai eigen ke-r pada E.values, dan pasangan tersebut memenuhi hubungan Av=λv A v = \lambda v . Untuk matriks simetris seperti A di atas, seluruh nilai eigennya riil dan vektornya dapat dinormalisasi menjadi panjang satu.

Fungsi eigen bekerja pada matriks simetris maupun tidak simetris, dan angka-angka pada keluarannya ditampilkan penuh karena merupakan bilangan pecahan hasil perhitungan numerik. Pembulatan pada tampilan dapat dilakukan dengan round apabila laporannya memang membutuhkan bentuk ringkas. Pasangan nilai dan vektor eigen ini menjadi bahan dasar banyak analisis lanjutan, misalnya pemrosesan data berdimensi banyak.

Kesalahan umum#

Kesalahan berikut paling sering muncul saat operasi aljabar linear dipraktikkan. Yang pertama dapat direproduksi dan ditangkap pada contoh berikut.

julia Contoh: sistem dengan matriks singular
using LinearAlgebra
S = [1 2; 2 4]
try
    println(S \ [1, 1])
catch e
    println(typeof(e))
end
text Keluaran
SingularException
  • Menyelesaikan sistem dengan matriks singular yang barisnya kelipatan satu sama lain. Determinan nol menandakan solusi tidak tunggal, dan operator \ berhenti dengan SingularException. Periksa det(A) terlebih dahulu atau susun ulang persamaannya.
  • Menganggap ' dan transpose() selalu sama. Pada matriks kompleks, ' mengonjugasikan setiap elemen, sedangkan transpose() tidak. Gunakan transpose() apabila konjugasi tidak dimaksudkan, dan periksa tipe elemennya apabila hasil sebuah perhitungan terasa tidak cocok.
  • Mengganti \ dengan inv(A) * b. Membentuk matriks balikan lebih lambat dan mengakumulasi error pembulatan, sedangkan \ bekerja melalui dekomposisi yang lebih stabil. Bentuk inv hanya diperlukan apabila matriks balikan itu sendiri akan digunakan berulang kali.

Ringkasan#

  • * merupakan perkalian aljabar linear yang menjumlahkan hasil kali baris dan kolom, sedangkan .* mengalikan elemen yang seletak.
  • Operator ' menghasilkan adjoint berupa transpos dengan konjugasi kompleks, dot menghitung perkalian titik, dan I menyatakan identitas yang menyesuaikan ukurannya.
  • Operator \ menyelesaikan Ax=b Ax = b melalui dekomposisi tanpa membentuk matriks balikan, sehingga lebih disarankan daripada inv(A) * b.
  • Fungsi det, inv, norm, dan eigen menyediakan determinan, balikan, panjang vektor, serta pasangan nilai eigen dan vektor eigen.

Referensi#