Phân rã Jordan


18

Lưu ý quan trọng : Vì thử thách này chỉ áp dụng cho ma trận vuông, bất cứ khi nào tôi sử dụng thuật ngữ "ma trận", giả định rằng tôi đang đề cập đến một ma trận vuông. Tôi đang rời khỏi mô tả "hình vuông" vì lợi ích của sự ngắn gọn.

Lý lịch

Nhiều hoạt động liên quan đến ma trận, như tính toán định thức, giải hệ phương trình tuyến tính hoặc mở rộng các hàm có giá trị vô hướng thành ma trận được thực hiện dễ dàng hơn bằng cách sử dụng ma trận đường chéo (một phần tử không nằm trên đường chéo chính là 0) tương tự đối với ma trận gốc (nghĩa là đối với ma trận đầu vào Avà ma trận đường chéo D, tồn tại một số ma trận khả nghịch Pnhư vậy D = P^(-1) * A * P, đồng thời, DAchia sẻ một số thuộc tính quan trọng, như giá trị riêng, định thức và dấu vết). Đối với các ma trận có giá trị riêng biệt (gốc của đa thức đặc trưng của ma trận, được đưa ra bằng cách giải det(A-λI) = 0cho λ, trong đó Ima trận nhận dạng có cùng kích thước như A), đường chéo là đơn giản:Dlà một ma trận có các giá trị riêng trên đường chéo chính và Plà một ma trận được hình thành từ các hàm riêng tương ứng với các giá trị riêng đó (theo cùng một thứ tự). Quá trình này được gọi là eigendecro .

Tuy nhiên, ma trận với các giá trị riêng lặp đi lặp lại không thể được chéo theo cách này. May mắn thay, dạng bình thường của Jordan của bất kỳ ma trận nào có thể được tính toán khá dễ dàng và không khó để làm việc hơn so với ma trận đường chéo thông thường. Nó cũng có một đặc tính tốt là, nếu các giá trị riêng là duy nhất, thì phân tách Jordan giống hệt với phân tách.

Jordan phân tích giải thích

Đối với một ma trận vuông Acó giá trị riêng đều có bội số hình học là 1, quá trình phân tách Jordan có thể được mô tả như sau:

  1. Hãy λ = {λ_1, λ_2, ... λ_n}là danh sách các giá trị riêng của A, với bội số, với các giá trị riêng lặp đi lặp lại xuất hiện liên tiếp.
  2. Tạo một ma trận đường chéo Jcó các phần tử là các phần tử của λ, theo cùng một thứ tự.
  3. Đối với mỗi giá trị riêng có bội số lớn hơn 1, đặt a 1bên phải của mỗi lần lặp lại của giá trị riêng trong đường chéo chính của J, ngoại trừ cuối cùng.

Ma trận kết quả Jlà một dạng bình thường của Jordan A(có thể có nhiều dạng Jordan bình thường cho một ma trận nhất định, tùy thuộc vào thứ tự của các giá trị riêng).

Một ví dụ làm việc

Hãy Alà ma trận sau:

Một ma trận

Các giá trị riêng của A, với bội số, là λ = {1, 2, 4, 4}. Bằng cách đặt chúng vào một ma trận đường chéo, chúng ta có được kết quả này:

bước 2

Tiếp theo, chúng tôi đặt 1s ở bên phải của tất cả, ngoại trừ một trong những giá trị riêng được lặp lại. Vì 4là giá trị riêng lặp đi lặp lại duy nhất, chúng tôi đặt một cái duy nhất 1bên cạnh 4 đầu tiên:

hình thức jordan

Đây là một dạng bình thường của Jordan A(một ma trận đơn lẻ có khả năng có thể có một số dạng bình thường Jordan hợp lệ, nhưng tôi đang che đậy chi tiết đó cho mục đích giải thích).

Nhiệm vụ

Đưa ra một ma trận vuông Alàm đầu vào, xuất ra một dạng Jordan bình thường hợp lệ A.

  • Đầu vào và đầu ra có thể ở bất kỳ định dạng hợp lý nào (mảng 2D / danh sách / bất cứ thứ gì, danh sách / mảng / bất cứ thứ gì của vectơ cột hoặc hàng, kiểu dữ liệu ma trận dựng sẵn, v.v.).
  • Các phần tử và giá trị riêng của Asẽ luôn là các số nguyên trong phạm vi [-200, 200].
  • Để đơn giản, tất cả các giá trị riêng sẽ có bội số hình học là 1 (và do đó quá trình trên giữ).
  • A nhiều nhất sẽ là ma trận 10x10 và ít nhất là ma trận 2x2.
  • Không được phép xây dựng các phép tính toán giá trị riêng và / hoặc hàm riêng hoặc thực hiện phân tách, phân tách Jordan hoặc bất kỳ loại phân tách / đường chéo nào khác. Số học ma trận, đảo ngược ma trận và các nội dung ma trận khác được cho phép.

Các trường hợp thử nghiệm

[[1, 0], [0, 1]] -> [[1, 1], [0, 1]]
[[3, 0], [0, 3]] -> [[1, 1], [0, 1]]
[[4, 2, 2], [1, 2, 2],[0, 3, 3]] -> [[6, 0, 0], [0, 3, 0], [0, 0, 0]]
[[42, 48, 40, 64, 64], [41, 47, 31, 58, 42], [-55, -47, -27, -74, -46], [-46, -58, -46, -70, -68], [30, 20, 12, 34, 18]] -> [[10, 0, 0, 0, 0], [0, -18, 0, 0, 0], [0, 0, 6, 1, 0], [0, 0, 0, 6, 1], [0, 0, 0, 0, 6]]

Câu trả lời:


4

Toán học, 140 139 105 byte

Total[DiagonalMatrix@@@{{#},{1-Sign[Differences@#^2],1}}]&@(x/.Solve[#~CharacteristicPolynomial~x==0,x])&

Tôi vừa tìm thấy nội dung DiagonalMatrixcho phép một cách dễ dàng để đặt 0 và 1 dọc theo siêu đường chéo.

Sử dụng

Thí dụ


Thế còn Last@JordanDecomposition@#&? Hay là gian lận?
Ruslan

@Ruslan Có, một trong những quy tắc là các nội dung thực hiện phân tách Jordan không được phép. Cảm ơn mặc dù.
dặm

2

Sage, 79 byte

lambda A:block_diagonal_matrix([jordan_block(*r)for r in A.charpoly().roots()])

Dùng thử trực tuyến

Vì không ai khác đang đăng giải pháp, tôi cũng có thể tiếp tục và đăng một giải pháp.

A.charpoly.roots()tính toán các gốc (và bội số đại số) của đa thức đặc trưng của A(còn gọi là giá trị riêng và bội số). jordan_blockxây dựng một khối Jordan từ gốc và bội số đã cho. block_diagonal_matrixtạo thành một ma trận với các khối Jordan trên đường chéo, đó chính xác là định nghĩa của dạng bình thường Jordan.


2

J , 78 71 byte

1(#\.|."_1#{."1],.2=/\,&_)@>@{[:p.@>[:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\

Hãy thử trực tuyến!

Hai phần đầy thách thức của nhiệm vụ này, nhận các giá trị riêng và thực hiện đường chéo, kết thúc cả hai đều có cùng số byte. Các quy tắc này không được phép nhưng trong trường hợp có bất kỳ sự tò mò nào, J đã tích hợp sẵn để phân tách QR ( 128!:0) cũng như các addon LAPACK có thể được sử dụng để tìm giá trị riêng.

Giải thích (lỗi thời)

Có hai phần chính của động từ này: tìm giá trị riêng và thực hiện đường chéo. Đầu tiên, để tìm giá trị riêng, gốc của đa thức đặc trưng cho ma trận đầu vào sẽ phải được tìm thấy. Sử dụng cùng một ma trận đầu vào từ ví dụ,

   ] m =: _4 ]\ 5 4 2 1 0 1 _1 _1 _1 _1 3 0 1  1 _1 2
 5  4  2  1
 0  1 _1 _1
_1 _1  3  0
 1  1 _1  2

Đa thức đặc trưng cho ma trận M có thể được tìm thấy bằng cách sử dụng | M - I | = 0 nơi tôi là ma trận sắc với kích thước tương tự như M . Biểu thức M - λI có thể được mô hình hóa trong J bằng cách đấm từng phần tử trong M với -1 nếu nó nằm trên đường chéo khác nếu không 0. Mỗi hộp biểu thị một đa thức ở dạng hệ số.

   (],&.>[:-@=#\) m
┌────┬────┬────┬────┐
│5 _1│4 0 │2 0 │1 0 │
├────┼────┼────┼────┤
│0 0 │1 _1│_1 0│_1 0│
├────┼────┼────┼────┤
│_1 0│_1 0│3 _1│0 0 │
├────┼────┼────┼────┤
│1 0 │1 0 │_1 0│2 _1│
└────┴────┴────┴────┘

-/ .*Tuy nhiên, định thức trong J là hoạt động trên các số, không phải là đa thức đóng hộp. Thay vì nhân, sản phẩm đa thức là cần thiết có thể được tìm thấy bằng cách sử dụng tích chập ( [:+//.*/). Phép trừ gấp vẫn được sử dụng và cả hai động từ này cần phải hoạt động trong các hộp để dưới ( &.) unbox ( >) được sử dụng.

   ([:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\) m0
┌───────────────┐
│32 _64 42 _11 1│
└───────────────┘

Đây là các hệ số của đa thức đặc trưng. Các gốc có thể được tìm thấy bằng cách sử dụng p.chuyển đổi biểu diễn đa thức giữa các hệ số và dạng rễ.

   ([:p.@>[:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\) m0
┌─┬───────┐
│1│4 4 2 1│
└─┴───────┘

Rễ [4, 4, 2, 1]và đó là những giá trị riêng của M .

Thứ hai, đường chéo phải được thực hiện. Mỗi cặp giá trị liên tục được kiểm tra tính bằng nhau.

   (2=/\]) 4 4 2 1
1 0 0

Một số 0 được nối thêm và các giá trị này được tô màu cùng với các giá trị riêng.

   (],.0,~2=/\]) 4 4 2 1
4 1
4 0
2 0
1 0

Sau đó, mỗi hàng được đệm với cùng độ dài với số lượng giá trị riêng để tạo thành một ma trận vuông.

   (#{."1],.0,~2=/\]) 4 4 2 1
4 1 0 0
4 0 0 0
2 0 0 0
1 0 0 0

Cuối cùng, mỗi hàng được dịch chuyển sang phải với các giá trị rơi xuống bên phải và các số 0 được đẩy vào bên trái. Hàng đầu tiên được dịch chuyển 0 lần, lần thứ hai một lần, lần thứ ba hai lần, v.v.

   (-@i.@#|.!.0"_1#{."1],.0,~2=/\]) 4 4 2 1
4 1 0 0
0 4 0 0
0 0 2 0
0 0 0 1

Kết quả là Jordan phân hủy của M .



1

MATL , 29 byte, không cạnh tranh

1$Yn1$ZQYotdUZS~0hXdF1hYSwXd+

Hãy thử trực tuyến!

Đây là lần gửi MATL đầu tiên của tôi vì vậy chắc chắn sẽ có những cải tiến. Tôi đã dành một chút thời gian để học nó và cuối cùng tôi mới nhớ rằng nó có thể không hoạt động khi sử dụng MATL từ ngày 7 tháng 5 năm 2016. Chắc chắn, tôi đã kiểm tra cam kết áp chót cho đến ngày đó và nó không chạy.

Tôi muốn sử dụng diagnhưng có vẻ như MATL chỉ hỗ trợ phiên bản đối số duy nhất. Đối số thứ hai sẽ là cần thiết để đặt các giá trị dọc theo siêu đường chéo (hoặc bất kỳ đường chéo nào khác cho các vấn đề khác nhau).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.