Lewati ke konten
Panduan Varlig
Beranda Varlig

Vektor dan matriks

Vektor adalah daftar angka satu dimensi, misalnya arah dalam ruang atau sekumpulan besaran. Matriks adalah daftar yang berisi baris-baris. Halaman ini membahas perkalian titik dan silang, perkalian matriks, determinan dan invers, penyelesaian beberapa persamaan linear sekaligus, serta alat numerik aljabar linear: nilai eigen dan dekomposisi QR, LU, serta nilai singular.

Gunakan fitur ini untuk tugas aljabar linear, geometri dan transformasi, atau masalah dengan beberapa variabel tak diketahui yang saling terhubung melalui persamaan linear. Vektor dan matriks adalah daftar biasa, sehingga semua fitur dalam Daftar dan statistik, termasuk pengindeksan, juga berlaku.

Vektor

calc
dot([1, 2, 3], [4, 5, 6]) menghasilkan 32
dot([3, 4], [4, -3]) menghasilkan 0
cross([1, 0, 0], [0, 1, 0]) menghasilkan [0, 0, 1]
cross([1, 2, 3], [4, 5, 6]) menghasilkan [-3, 6, -3]
v = [3, 4]
sqrt(dot(v, v)) menghasilkan 5

dot mengalikan elemen yang bersesuaian lalu menjumlahkan hasilnya. Hasil kali titik nol berarti kedua vektor saling tegak lurus, seperti [3, 4] dan [4, -3]. cross menghasilkan vektor yang tegak lurus terhadap kedua vektor masukan: perkalian silang arah x dengan arah y menghasilkan arah z. Panjang vektor adalah akar kuadrat hasil kali titik vektor tersebut dengan dirinya sendiri.

dot membutuhkan dua vektor dengan panjang yang sama, dan cross membutuhkan dua vektor dari tiga elemen. Untuk menambahkan vektor atau menskalakannya, gunakan aritmatika daftar biasa: [1, 2] + [3, 4] adalah [4, 6] dan 2 * [3, 4] adalah [6, 8].

Menulis dan mengalikan matriks

Tulis matriks sebagai daftar baris, setiap baris dalam tanda kurung perseginya sendiri:

calc
shape([[1, 2, 3], [4, 5, 6]]) menghasilkan [2, 3]
transpose([[1, 2, 3], [4, 5, 6]]) menghasilkan [[1, 4], [2, 5], [3, 6]]
identity(3) menghasilkan [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
[[1, 2], [3, 4]] * [[5, 6], [7, 8]] menghasilkan [[19, 22], [43, 50]]

shape memberikan [rows, columns]. transpose menukar baris dan kolom. identity(n) adalah matriks n kali n yang meninggalkan matriks lain tidak berubah saat Anda mengalikannya.

* antara dua matriks adalah perkalian matriks, yang membutuhkan matriks kiri untuk memiliki kolom sebanyak matriks kanan memiliki baris. Untuk mengalikan matriks dengan vektor, tulis vektor sebagai kolom, satu elemen per baris:

calc
# Rotate the point (3, 1) by 90° anticlockwise
rotate = [[0, -1], [1, 0]]
rotate * [[3], [1]] menghasilkan [[-1], [3]]
rotate * rotate menghasilkan [[-1, 0], [0, -1]]

Memutar dua kali dengan 90° memberikan setengah putaran, itulah sebabnya rotate * rotate membalik kedua tanda. Daftar datar seperti [3, 1] tidak diterima di sebelah kanan matriks. Jika Anda memiliki daftar datar dalam sebuah nama, transpose([v]) mengubahnya menjadi kolom.

Matriks dengan bentuk yang sama dapat ditambahkan dan dikurangi, dan dikalikan atau dibagi dengan nilai numerik, seperti daftar lainnya.

Beberapa aturan berlaku untuk setiap operasi matriks:

  • Setiap baris harus memiliki jumlah elemen yang sama.
  • Elemen harus berupa angka biasa. Unit dan uang tidak diterima.
  • Sebuah matriks dapat memiliki paling banyak 32 baris dan 32 kolom.
  • Tidak ada singkatan titik koma. Tulis [[1, 2], [3, 4]], bukan [1, 2; 3, 4].

Determinan, invers, trace, dan rank

calc
M = [[2, 1], [5, 3]]
det(M) menghasilkan 1
inverse(M) menghasilkan [[3, -1], [-5, 2]]
M * inverse(M) menghasilkan [[1, 0], [0, 1]]
trace(M) menghasilkan 5
inverse([[2, 1], [1, 3]]) menghasilkan [[0.6, -0.2], [-0.2, 0.4]]
det([[1, 2], [2, 4]]) menghasilkan 0
rank([[1, 2, 3], [2, 4, 6]]) menghasilkan 1

det, inverse, dan trace (jumlah elemen diagonal) memerlukan matriks persegi. Determinan nol berarti matriks tersebut singular: baris-barisnya tidak saling bebas, sehingga tidak memiliki invers dan inverse([[1, 2], [2, 4]]) menghasilkan kesalahan. rank menghitung jumlah baris yang saling bebas dan juga menerima matriks yang tidak persegi. Pada baris terakhir, baris kedua adalah dua kali baris pertama, sehingga rank-nya 1.

Keempat fungsi ini menggunakan pecahan eksak, bukan desimal. Karena itu, M * inverse(M) menghasilkan matriks identitas secara tepat.

Selesaikan sistem linear

Misalkan tiga kopi dan dua teh berharga £13,50, dan satu kopi dan empat teh berharga £11,50. Masukkan jumlah setiap minuman dalam satu baris per persamaan, dengan kolom dalam urutan tetap (kopi, teh), dan total dalam daftar yang cocok:

calc
solve_system([[3, 2], [1, 4]], [13.5, 11.5]) menghasilkan [3.1, 2.1]

Urutan jawaban sama dengan urutan kolom: harga kopi £3.10 dan teh £2.10. Jangan sertakan simbol mata uang, karena elemen matriks harus berupa angka biasa.

solve_system(A, b) menyelesaikan A * x = b untuk mencari x. Fungsi ini memerlukan matriks persegi dengan satu baris untuk setiap variabel tak diketahui, serta daftar satu dimensi berisi nilai ruas kanan dengan panjang yang sama. Perhitungannya menggunakan pecahan eksak, sehingga jawabannya bebas dari kesalahan pembulatan.

Jika persamaan tidak menentukan tepat satu jawaban, muncul kesalahan yang menyatakan bahwa sistem tidak memiliki solusi tunggal. Misalnya, solve_system([[1, 2], [2, 4]], [3, 6]) gagal karena persamaan kedua hanyalah dua kali persamaan pertama. solve_system hanya menangani persamaan linear; untuk persamaan seperti x^2 = 2, gunakan solve dari Penjumlahan, penyelesaian persamaan, dan kalkulus.

Nilai Eigen

calc
eigenvalues([[2, 1], [1, 2]]) menghasilkan [1, 3]
eigenvalues([[4, 1], [2, 3]]) menghasilkan [5, 2]
eigenvalues([[0, -1], [1, 0]]) menghasilkan [i, -i]

eigenvalues menerima matriks persegi dan mengembalikan daftar satu dimensi. Rotasi 90° tidak mempertahankan arah mana pun, sehingga nilai eigennya adalah pasangan kompleks i dan -i; lihat Bilangan kompleks. Jangan mengandalkan urutan elemen dalam daftar.

Dekomposisi: QR, LU dan SVD

Setiap dekomposisi mengembalikan daftar matriks. Gunakan indeks untuk menarik bagian-bagiannya:

calc
A = [[3, 0], [4, 5]]
parts = qr(A)
q = parts[0] menghasilkan [[0.6, -0.8], [0.8, 0.6]]
r = parts[1] menghasilkan [[5, 4], [0, 3]]
q * r menghasilkan [[3, 0], [4, 5]]

Mengalikan kembali semua faktor menghasilkan A, sehingga dekomposisi dapat diperiksa sekilas. Perhitungan floating point biner menyisakan galat pembulatan sangat kecil, sekitar 10⁻¹⁵, yang ditampilkan Varlig sebagai 0 dalam daftar dan matriks. Nilai yang tersimpan tetap mempertahankan semua digitnya. Karena itu, bandingkan hasil dekomposisi secara visual atau dengan memeriksa selisihnya, bukan dengan ==.

calc
lu([[2, 1], [4, 3]]) menghasilkan [[[0, 1], [1, 0]], [[1, 0], [0.5, 1]], [[4, 3], [0, -0.5]]]

lu mengembalikan [P, L, U], di mana P mencatat setiap pertukaran baris dan P * A sama dengan L * U. Di sini baris ditukar sehingga angka yang lebih besar, 4, digunakan terlebih dahulu.

calc
B = [[3, 1], [4, 7]]
f = svd(B)
u = f[0]
s = f[1]
vt = f[2]
u * [[s[0], 0], [0, s[1]]] * vt menghasilkan [[3, 1], [4, 7]]
svd([[3, 4]]) menghasilkan [[[1]], [5], [[0.6, 0.8]]]

svd mengembalikan [U, s, Vt], dengan s berupa daftar satu dimensi berisi nilai singular dari yang terbesar. Dalam buku teks, B sama dengan U * diag(s) * Vt. Fungsi diag tidak tersedia, jadi susun sendiri matriks diagonalnya, seperti pada [[s[0], 0], [0, s[1]]].

Fungsi Apa yang dibutuhkan dan dikembalikan
identity(n) Matriks identitas berukuran n × n
shape(A) [rows, columns]
transpose(A) Baris dan kolom ditukar
det(A) Determinan matriks persegi
inverse(A) Invers matriks persegi dengan determinan tidak nol
trace(A) Jumlah elemen diagonal matriks persegi
rank(A) Jumlah baris independen; matriks persegi panjang apa pun
solve_system(A,b) Solusi A * x = b untuk matriks persegi dengan solusi tunggal
eigenvalues(A) Nilai eigen dari matriks persegi, mungkin kompleks, tanpa urutan tertentu
qr(A) [Q, R] dengan Q * R kira-kira A; matriks persegi panjang apa pun
lu(A) [P, L, U] dengan P * A kira-kira L * U; matriks persegi
svd(A) [U, s, Vt], di mana s adalah daftar datar; matriks persegi panjang apa pun

Untuk matriks yang tidak persegi, qr dan svd mengembalikan faktor tipis: untuk matriks 3 kali 2, Q juga 3 kali 2 daripada 3 kali 3.

Hasil yang eksak dan masukan yang ditolak

Penjumlahan, pengurangan, dan perkalian matriks, perkalian matriks dengan angka, serta transpose, det, dan inverse dihitung menggunakan pecahan eksak untuk setiap matriks yang diterima Varlig. Tidak ada pembulatan saat nilai dibaca atau diteruskan ke perhitungan lain. Karena itu, perkalian matriks dengan inversnya menghasilkan matriks identitas secara tepat:

calc
[[1, 2], [3, 4]] + [[10, 20], [30, 40]] menghasilkan [[11, 22], [33, 44]]
[[1, 2], [3, 4]] - [[1, 1], [1, 1]] menghasilkan [[0, 1], [2, 3]]
3 * [[1, 2], [3, 4]] menghasilkan [[3, 6], [9, 12]]
[[1, 2], [3, 4]] * [[0, 1], [1, 0]] menghasilkan [[2, 1], [4, 3]]
det([[1, 2], [3, 4]]) menghasilkan -2
inverse([[1, 2], [3, 4]]) menghasilkan [[-2, 1], [1.5, -0.5]]
inverse([[1, 2], [3, 4]]) * [[1, 2], [3, 4]] menghasilkan [[1, 0], [0, 1]]

Setiap kondisi diperiksa sebelum jawaban muncul, dan pesan mengatakan mana yang gagal:

calc
det([[1, 2, 3], [4, 5, 6]]) menghasilkan Unsupported: Expected a square matrix
inverse([[1, 2], [2, 4]]) menghasilkan Unsupported: Singular matrix has no inverse
[[1, 2], [3, 4]] + [[1, 2, 3], [4, 5, 6]] menghasilkan Unsupported: List dimensions do not match
[[1, 2, 3], [4, 5, 6]] * [[1, 2], [3, 4]] menghasilkan Unsupported: Matrix inner dimensions do not match

Entri matriks adalah angka biasa. Sebuah unit, sejumlah uang atau nilai kompleks dalam setiap entri menghentikan perhitungan daripada dibawa melaluinya, karena tidak ada operasi matriks yang akan mempertahankannya:

calc
det([[1 kg, 2], [3, 4]]) menghasilkan Unsupported: Matrix entries must be plain numbers; units, money and complex values are not supported

Hanya daftar baris yang dibaca sebagai matriks. Daftar datar mempertahankan maknanya sendiri, jadi [1, 2] + [3, 4] masih merupakan item demi item [4, 6], dan [1, 2] * [3, 4] masih merupakan kesalahan yang menunjuk ke dot.

Untuk aturan ketepatan di seluruh persamaan, matriks, dan statistik di satu tempat, lihat Apa yang dijamin mesin.

Algoritma dan batasan

det, inverse, rank dan solve_system bekerja dengan pecahan yang tepat, dalam batas kalkulator pada ukuran nilai numerik. eigenvalues, qr, lu dan svd bekerja dalam floating point biner, sehingga jawaban mereka adalah perkiraan yang dekat. Iterasi mereka berhenti setelah 10.000 langkah.

Matriks yang baris-barisnya hampir bergantung secara linear, seperti [[1, 1], [1, 1.0000001]], disebut berkondisi buruk. Saat matriks semacam ini diolah, galat pembulatan kecil dapat membesar. Akibatnya, dekomposisi dan nilai eigennya dapat kehilangan ketelitian. Dalam kasus yang sangat ekstrem, perhitungan dapat melampaui batas numerik dan menghasilkan kesalahan.

Aturan lengkap tersedia dalam referensi matematika lanjutan.

Menggabungkan semuanya

Tiga tanda terima dari kios pasar mencantumkan berapa banyak apel, pisang, dan jeruk yang dibeli dan total yang dibayarkan, tetapi bukan harga individual:

calc
# Each row: apples, bananas, oranges
baskets = [[2, 3, 1], [1, 2, 3], [4, 1, 2]]
paid = [2.15, 2.70, 3.05]
det(baskets) menghasilkan 25
prices = solve_system(baskets, paid) menghasilkan [0.4, 0.25, 0.6]
# Check the prices against every receipt
baskets * transpose([prices]) menghasilkan [[2.15], [2.7], [3.05]]
# What would 5 apples, 2 bananas and 4 oranges cost?
dot([5, 2, 4], prices) menghasilkan 4.9

Determinan yang tidak nol memastikan bahwa data pada struk cukup untuk menentukan satu kombinasi harga: apel 40p, pisang 25p, dan jeruk 60p. Mengalikan matriks keranjang belanja dengan harga dalam bentuk kolom menghasilkan kembali total pada struk. Dengan dot, harga keranjang baru dihitung sebesar £4,90.