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
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.
using LinearAlgebra
A = [1 2; 3 4]
B = [5 6; 7 8]
println(A * B)
println(A .* B)[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.
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)[1 3; 2 4]
false
1 - 2im
32
truePada 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 dengan menghitung . 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.
# 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))x = [1.0, 3.0]
verifikasi A*x = [5.0, 10.0]
det(A) = 5.0Keluaran 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 . Fungsi eigen(A) menghitung dekomposisi nilai eigen dan vektor eigen, lalu mengembalikan objek Eigen yang menyimpan hasilnya pada field values dan vectors.
using LinearAlgebra
A = [2 1; 1 3]
println(det(A))
println(inv(A))
println(norm([3, 4]))5.0
[0.6 -0.2; -0.2 0.4]
5.0using LinearAlgebra
A = [2 1; 1 3]
E = eigen(A)
println(E.values)
println(E.vectors)[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 . 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.
using LinearAlgebra
S = [1 2; 2 4]
try
println(S \ [1, 1])
catch e
println(typeof(e))
endSingularException- Menyelesaikan sistem dengan matriks singular yang barisnya kelipatan satu sama lain. Determinan nol menandakan solusi tidak tunggal, dan operator
\berhenti denganSingularException. Periksadet(A)terlebih dahulu atau susun ulang persamaannya. - Menganggap
'dantranspose()selalu sama. Pada matriks kompleks,'mengonjugasikan setiap elemen, sedangkantranspose()tidak. Gunakantranspose()apabila konjugasi tidak dimaksudkan, dan periksa tipe elemennya apabila hasil sebuah perhitungan terasa tidak cocok. - Mengganti
\denganinv(A) * b. Membentuk matriks balikan lebih lambat dan mengakumulasi error pembulatan, sedangkan\bekerja melalui dekomposisi yang lebih stabil. Bentukinvhanya 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,dotmenghitung perkalian titik, danImenyatakan identitas yang menyesuaikan ukurannya. - Operator
\menyelesaikan melalui dekomposisi tanpa membentuk matriks balikan, sehingga lebih disarankan daripadainv(A) * b. - Fungsi
det,inv,norm, daneigenmenyediakan determinan, balikan, panjang vektor, serta pasangan nilai eigen dan vektor eigen.
Referensi#
- LinearAlgebra — The Julia Language — Mendokumentasikan operator perkalian matriks, adjoint, backslash, eigen, dan norm.
- Mathematical Operations and Elementary Functions — The Julia Language — Mendaftar operator aritmetika dasar yang berlaku juga pada matriks dan vektor.