Vektörler ve matrisler
Vektör, uzaydaki bir yön veya miktarlar kümesi gibi tek boyutlu bir sayı listesidir. Matris ise satırlardan oluşan bir listedir. Bu sayfa skaler ve vektörel çarpımı, matris çarpımını, determinant ve ters matrisi, birden çok doğrusal denklemi birlikte çözmeyi ve doğrusal cebirin sayısal araçlarını açıklar: özdeğerler ile QR, LU ve tekil değer ayrışımları.
Bu araçları doğrusal cebir derslerinde, geometri ve dönüşüm problemlerinde veya doğrusal denklemlerle birbirine bağlı birden çok bilinmeyen olduğunda kullanın. Vektör ve matrisler normal listelerdir; bu nedenle Listeler ve istatistikler bölümündeki indeksle erişim gibi kurallar burada da geçerlidir.
Vektörler
dot([1, 2, 3], [4, 5, 6]) sonucu 32dot([3, 4], [4, -3]) sonucu 0cross([1, 0, 0], [0, 1, 0]) sonucu [0, 0, 1]cross([1, 2, 3], [4, 5, 6]) sonucu [-3, 6, -3]v = [3, 4]sqrt(dot(v, v)) sonucu 5dot, karşılıklı öğeleri çarpıp sonuçları toplar. Skaler çarpımın sıfır olması, [3, 4] ve [4, -3] örneğindeki gibi vektörlerin dik olduğunu gösterir. cross, her iki girdisine dik bir vektör verir: x yönünün y yönüyle vektörel çarpımı z yönüdür. Vektörün uzunluğu, kendisiyle skaler çarpımının kareköküdür.
dot iki aynı uzunlukta vektöre ihtiyaç duyar ve cross üç eleman içeren iki vektöre ihtiyaç duyar. Vektörleri eklemek veya ölçeklendirmek için normal liste aritmetiğini kullanın: [1, 2] + [3, 4] [4, 6] olur ve 2 * [3, 4] [6, 8] olur.
Matris yazma ve çarpma
Her satır kendi köşeli parantez içinde bir satır listesi olarak bir matris yazın:
shape([[1, 2, 3], [4, 5, 6]]) sonucu [2, 3]transpose([[1, 2, 3], [4, 5, 6]]) sonucu [[1, 4], [2, 5], [3, 6]]identity(3) sonucu [[1, 0, 0], [0, 1, 0], [0, 0, 1]][[1, 2], [3, 4]] * [[5, 6], [7, 8]] sonucu [[19, 22], [43, 50]]shape, [rows, columns] verir. transpose, satırlarla sütunların yerini değiştirir. identity(n), başka bir matrisi onunla çarptığınızda değiştirmeyen, n × n boyutunda birim matristir.
İki matris arasındaki *, sol matrisin sağ matrisin satırları kadar sütuna sahip olmasını gerektiren matris çarpımıdır. Bir matrisi bir vektörle çarpmak için, vektörü bir sütun olarak, satır başına bir eleman olarak yazın:
# Rotate the point (3, 1) by 90° anticlockwiserotate = [[0, -1], [1, 0]]rotate * [[3], [1]] sonucu [[-1], [3]]rotate * rotate sonucu [[-1, 0], [0, -1]]90° döndürmek iki kez döndürmek, yarım dönüş sağlar, bu yüzden rotate * rotate her iki işareti de çevirir. [3, 1] gibi düz bir liste bir matrisin sağ tarafında kabul edilmez. Bir isimde düz bir listeniz varsa, transpose([v]) onu bir sütuna dönüştürür.
Aynı şekle sahip matrisler eklenebilir ve çıkarılabilir ve diğer listeler gibi sayısal bir değerle çarpılabilir veya bölünebilir.
Her matris işlemi için birkaç kural geçerlidir:
- Her satır aynı sayıda öğeye sahip olmalıdır.
- Elemanlar düz sayılar olmalıdır. Birimler ve para kabul edilmez.
- Bir matris en fazla 32 satır ve 32 sütuna sahip olabilir.
- Noktalı virgülle kısa yazım desteklenmez.
[1, 2; 3, 4]yerine[[1, 2], [3, 4]]yazın.
Determinant, ters, iz ve rank
M = [[2, 1], [5, 3]]det(M) sonucu 1inverse(M) sonucu [[3, -1], [-5, 2]]M * inverse(M) sonucu [[1, 0], [0, 1]]trace(M) sonucu 5inverse([[2, 1], [1, 3]]) sonucu [[0.6, -0.2], [-0.2, 0.4]]det([[1, 2], [2, 4]]) sonucu 0rank([[1, 2, 3], [2, 4, 6]]) sonucu 1det, inverse ve trace (ana köşegendeki öğelerin toplamı) kare matris gerektirir. Determinant sıfırsa matris tekildir: satırları bağımsız değildir, dolayısıyla tersi yoktur. Bu nedenle inverse([[1, 2], [2, 4]]) hata verir. rank, bağımsız satır sayısını bulur ve kare olmayan matrisleri de kabul eder. Son satırda ikinci satır birincinin iki katı olduğundan rank 1'dir.
Bu dört işlem ondalık yaklaşımlar yerine kesirlerle tam hesaplama yapar. Bu yüzden M * inverse(M) sonucu tam olarak birim matristir.
Doğrusal denklem sistemi çözme
Üç kahve ve iki çayın 13,50 sterlin, bir kahve ve dört çayın ise 11,50 sterlin olduğunu varsayalım. Her içeceğin sayısını denklem başına bir satıra, sütunlar sabit bir sırayla (kahve, çay) ve toplamları eşleşen bir listede koyun:
solve_system([[3, 2], [1, 4]], [13.5, 11.5]) sonucu [3.1, 2.1]Cevap sütunlarla aynı sıradadır: bir kahve 3,10 sterlin ve bir çay 2,10 sterlindir. Para birimi sembollerini kapalı bırakın, çünkü matris elemanları düz sayılar olmalıdır.
solve_system(A, b), A * x = b denklemini x için çözer. Her bilinmeyen için bir satır içeren kare matris ve aynı uzunlukta sağ taraf değerleri listesi gerektirir. Kesirlerle tam hesaplama yaptığı için sonuçta yuvarlama hatası olmaz.
Denklemler tek bir çözüm belirlemiyorsa sistemin tek çözümü olmadığını belirten hata alırsınız. Örneğin solve_system([[1, 2], [2, 4]], [3, 6]) hata verir; çünkü ikinci denklem birincinin iki katıdır. solve_system, yalnızca doğrusal denklemleri çözer. x^2 = 2 gibi bir denklem için Toplamlar, denklem çözümü ve kalkülüs bölümündeki solve fonksiyonunu kullanın.
Özdeğerler
eigenvalues([[2, 1], [1, 2]]) sonucu [1, 3]eigenvalues([[4, 1], [2, 3]]) sonucu [5, 2]eigenvalues([[0, -1], [1, 0]]) sonucu [i, -i]eigenvalues kare bir matris alır ve düz bir liste döndürür. 90° dönüş hiçbir yönü değişmeden bırakmaz, bu nedenle özdeğerleri karmaşık çift i ve -idir; bkz. Karmaşık sayılar. Listenin sırasına güvenmeyin.
Ayrışımlar: QR, LU ve SVD
Her ayrışma bir matris listesi döndürür. Parçaları çıkarmak için dizinleri kullanın:
A = [[3, 0], [4, 5]]parts = qr(A)q = parts[0] sonucu [[0.6, -0.8], [0.8, 0.6]]r = parts[1] sonucu [[5, 4], [0, 3]]q * r sonucu [[3, 0], [4, 5]]Çarpanları yeniden çarpmak A matrisini verir; böylece ayrışımı kolayca kontrol edebilirsiniz. İkili kayan nokta hesabı, yaklaşık 10⁻¹⁵ düzeyinde küçük yuvarlama artıkları bırakır. Varlig bunları liste ve matrislerde 0 olarak gösterir. Saklanan değerler tüm basamakları korur; bu nedenle ayrışım sonuçlarını == ile değil, gözle veya aralarındaki farkı inceleyerek karşılaştırın.
lu([[2, 1], [4, 3]]) sonucu [[[0, 1], [1, 0]], [[1, 0], [0.5, 1]], [[4, 3], [0, -0.5]]]lu, [P, L, U] döndürür, burada P herhangi bir satır değişimini kaydeder ve P * A L * Ue eşittir. Burada satırlar değiştirildi, böylece önce daha büyük sayı olan 4 kullanıldı.
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 sonucu [[3, 1], [4, 7]]svd([[3, 4]]) sonucu [[[1]], [5], [[0.6, 0.8]]]svd [U, s, Vt] döndürür, burada s en büyükten başlayarak sıralanmış düz bir tekil değerler listesidir. Ders kitaplarında B, U * diag(s) * Vt'ye eşittir. diag fonksiyonu yoktur, bu nedenle [[s[0], 0], [0, s[1]]] örneğinde olduğu gibi köşegen matrisi kendiniz oluşturun.
| Fonksiyon | Gerektirdiği ve döndürdüğü değer |
|---|---|
identity(n) |
n × n birim matris |
shape(A) |
[rows, columns] |
transpose(A) |
Satır ve sütunlar yer değiştirmiş hâli |
det(A) |
Kare matrisin determinantı |
inverse(A) |
Determinantı sıfır olmayan kare matrisin tersi |
trace(A) |
Kare matrisin ana köşegenindeki öğelerin toplamı |
rank(A) |
Bağımsız satır sayısı; herhangi bir dikdörtgen matris |
solve_system(A,b) |
Tek çözümü olan kare matris için A * x = b çözümü |
eigenvalues(A) |
Kare matrisin özdeğerleri; karmaşık olabilir, belirli bir sıraları yoktur |
qr(A) |
Q * R çarpımı yaklaşık olarak A olan [Q, R]; herhangi bir dikdörtgen matris |
lu(A) |
P * A çarpımı yaklaşık olarak L * U olan [P, L, U]; kare matris |
svd(A) |
s düz bir liste olmak üzere [U, s, Vt]; herhangi bir dikdörtgen matris |
Kare olmayan bir matris için, qr ve svd ince faktörler döndürür: 3'e 2 matris için, Q ayrıca 3'e 3 yerine 3'e 2'dir.
Tam sonuç veren ve kabul edilmeyen durumlar
Varlig'in kabul ettiği tüm matrislerde toplama, çıkarma, matris çarpımı, bir sayıyla çarpma, transpose, det ve inverse işlemleri kesirlerle tam olarak hesaplanır. Girdiler veya başka hesaplamaya aktarılan değerler yuvarlanmaz. Bu nedenle matrisle tersini çarpmak tam olarak birim matrisi verir:
[[1, 2], [3, 4]] + [[10, 20], [30, 40]] sonucu [[11, 22], [33, 44]][[1, 2], [3, 4]] - [[1, 1], [1, 1]] sonucu [[0, 1], [2, 3]]3 * [[1, 2], [3, 4]] sonucu [[3, 6], [9, 12]][[1, 2], [3, 4]] * [[0, 1], [1, 0]] sonucu [[2, 1], [4, 3]]det([[1, 2], [3, 4]]) sonucu -2inverse([[1, 2], [3, 4]]) sonucu [[-2, 1], [1.5, -0.5]]inverse([[1, 2], [3, 4]]) * [[1, 2], [3, 4]] sonucu [[1, 0], [0, 1]]Bir cevap görünmeden önce her koşul kontrol edilir ve mesaj hangisinin başarısız olduğunu söyler:
det([[1, 2, 3], [4, 5, 6]]) sonucu Unsupported: Expected a square matrixinverse([[1, 2], [2, 4]]) sonucu Unsupported: Singular matrix has no inverse[[1, 2], [3, 4]] + [[1, 2, 3], [4, 5, 6]] sonucu Unsupported: List dimensions do not match[[1, 2, 3], [4, 5, 6]] * [[1, 2], [3, 4]] sonucu Unsupported: Matrix inner dimensions do not matchMatris girişleri düz sayılardır. Herhangi bir girişteki bir birim, bir miktar para veya karmaşık bir değer, hesaplamanın içinden taşınmak yerine hesaplamayı durdurur, çünkü hiçbir matris işlemi onları korumaz:
det([[1 kg, 2], [3, 4]]) sonucu Unsupported: Matrix entries must be plain numbers; units, money and complex values are not supportedYalnızca satırlardan oluşan liste matris olarak yorumlanır. Tek boyutlu liste kendi anlamını korur: [1, 2] + [3, 4] hâlâ öğe öğe toplamayla [4, 6] verir. [1, 2] * [3, 4] ise hâlâ dot kullanımını öneren bir hata verir.
Denklemler, matrisler ve istatistikler arasındaki kesinlik kuralları için tek bir yerde Motorun ne garanti ettiğini bakın.
Algoritmalar ve sınırlar
det, inverse, rank ve solve_system, sayısal bir değerin boyutundaki hesap makinesinin sınırları dahilinde tam kesirlerle çalışır. eigenvalues, qr, lu ve svd ikili kayan noktada çalışır, bu nedenle cevapları yakın yaklaşımlardır. Yinelemeleri 10.000 adımdan sonra durur.
Satırları neredeyse bağımlı olan [[1, 1], [1, 1.0000001]] gibi matrislere kötü koşullu matrisler denir. Bunlarla işlem yaparken küçük yuvarlama hataları büyür, bu nedenle bu tür matrislerin ayrıştırmaları ve özdeğerleri doğruluklarını kaybedebilir ve çok uç durumlarda sayısal sınırları aşarak hata üretebilir.
Kuralların tamamı ileri matematik referansı'dedir.
Hepsini bir araya getirme
Bir pazar tezgahından alınan üç makbuz, kaç elma, muz ve portakalın satın alındığını ve toplam ödendiğini listeler, ancak bireysel fiyatları listelemez:
# Each row: apples, bananas, orangesbaskets = [[2, 3, 1], [1, 2, 3], [4, 1, 2]]paid = [2.15, 2.70, 3.05]det(baskets) sonucu 25prices = solve_system(baskets, paid) sonucu [0.4, 0.25, 0.6]# Check the prices against every receiptbaskets * transpose([prices]) sonucu [[2.15], [2.7], [3.05]]# What would 5 apples, 2 bananas and 4 oranges cost?dot([5, 2, 4], prices) sonucu 4.9Sıfırdan farklı determinant, fişlerin tek bir fiyat kümesini bulmaya yeterli olduğunu doğrular: elma 40p, muz 25p ve portakal 60p. Sepet matrisini sütun olarak yazılan fiyatlarla çarpmak fiş toplamlarını yeniden verir. dot ise yeni bir sepetin fiyatını £4,90 olarak hesaplar.