Giải quyết hệ thống Eigens 2x2


11

Đối với những người có một nền tảng đại số tuyến tính nhỏ, thách thức cũng đơn giản như sau: xác định các giá trị riêng và hàm riêng của một ma trận 2x2 phức tạp nhất định. Bạn có thể bỏ qua trước chi tiết Thử thách cho I / O, v.v ... Đối với những người cần làm mới một chút về hệ thống eigensystem, hãy đọc tiếp.

Lý lịch

Các phương trình đặc trưng của một ma trận A được xác định bởi

det| A - λI | = 0

Trong đó λ là một tham số (vô hướng) phức tạp, I là ma trận danh tính và det | ... | yếu tố quyết định . Phía bên trái ước lượng cho một đa thức trong λ , đa thức đặc trưng , là bậc hai trong trường hợp ma trận 2x2. Các giải pháp của phương trình đặc trưng này là giá trị riêng của A , mà chúng ta sẽ biểu thị là λ 1λ 2 .

Bây giờ các eigenvector v i của A thỏa mãn

A vi = λi vi

Với mỗi λ i , điều này cung cấp cho bạn một hệ thống gồm hai phương trình trong hai ẩn số (các thành phần của v i ), có thể được giải quyết khá dễ dàng. Bạn sẽ nhận thấy rằng hệ thống thực sự chưa được xác định rõ và độ lớn của các hàm riêng không được xác định bởi các phương trình. Chúng ta thường sẽ muốn các hàm riêng được chuẩn hóa, đó là (| x | 2 + | y ​​| 2 ) = 1 , trong đó xy là các thành phần vectơ, | x | 2x nhân với liên hợp phức tạp của nó.

Lưu ý rằng các giá trị riêng có thể bị suy biến, tức là λ 1 = 2 . Trong trường hợp này, bạn có thể hoặc không thể thỏa mãn hệ phương trình đơn với hai hàm riêng độc lập tuyến tính.

Các thách thức

Cho một ma trận 2x2 với các phần tử phức tạp, xác định hai giá trị riêng (có thể giống hệt nhau) của nó và một hàm riêng được chuẩn hóa cho mỗi giá trị riêng. Các số kết quả phải chính xác đến ít nhất 3 chữ số có nghĩa (thập phân). Bạn có thể giả định rằng phần thực và phần ảo của bất kỳ phần tử ma trận nào nằm trong phạm vi [-1,1] .

Bạn có thể viết một hàm hoặc một chương trình, lấy đầu vào qua STDIN, đối số dòng lệnh, dấu nhắc hoặc đối số hàm. Bạn có thể xuất kết quả sang STDOUT, hộp thoại hoặc làm giá trị trả về của hàm.

Bạn có thể sử dụng bất kỳ định dạng danh sách hoặc chuỗi thuận tiện (nhưng không rõ ràng) cho đầu vào và đầu ra. Bạn cũng có thể chọn giữa các cặp số float hoặc loại phức tạp để thể hiện các số riêng lẻ.

Bạn không được sử dụng các hàm dựng sẵn để giải các hệ thống eigensystem (như Mathicala's Eigenvectorshoặc Eigensystem) hoặc các bộ giải phương trình.

Đây là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.

Ví dụ

Mỗi ví dụ là ba dòng: đầu vào, giá trị riêng và các hàm riêng tương ứng theo cùng một thứ tự. Lưu ý rằng các hàm riêng chỉ được xác định theo pha của chúng và trong trường hợp các giá trị riêng bị suy biến, các hàm riêng có thể thực sự là tùy ý (như trong ví dụ đầu tiên).

[[1.0, 0.0], [0.0, 1.0]]
[1.0, 1.0]
[[1.0, 0.0], [0.0, 1.0]]

[[0.0, 0.4], [-0.1, -0.4]]
[-0.2, -0.2]
[[0.894427, -0.447214], [0.894427, -0.447214]]

[[0.3, 0.1], [0.4, -0.9]]
[-0.932456, 0.332456]
[[-0.0808731, 0.996724], [0.951158, 0.308703]]

[[0.5, -1.0], [0.8, -0.5]]
[0.74162i, - 0.74162i]
[[0.745356, 0.372678 - 0.552771i], [0.745356, 0.372678 + 0.552771i]]

[[-0.0539222 + 0.654836i, -0.016102 + 0.221334i], [0.739514 - 0.17735i, -0.0849216 + 0.77977i]]
[0.238781 + 0.984333i, -0.377625 + 0.450273i]
[[0.313668 + 0.322289i, 0.893164], [-0.236405 - 0.442194i, 0.865204]]

[[-0.703107 - 0.331792i, 0.286719 - 0.587305i], [-0.418476 + 0.396347i, -0.885934 + 0.50534i]]
[-1.13654 - 0.32678i, -0.4525 + 0.500329i]
[[0.833367, -0.248208 - 0.493855i], [-0.441133 - 0.408236i, 0.799215]]

[[-0.156312 + 0.788441i, 0.045056 - 0.579167i], [0.130741 - 0.97017i, 0.049183 - 0.590768i]]
[-0.181759 + 1.11738i, 0.0746298 - 0.919707i]
[[0.86955, -0.493846 + 0.000213145i], [0.318856 - 0.0181135i, 0.94763]]

Câu trả lời:


6

MATLAB, 91

Một kỹ thuật tiêu chuẩn để có được một vectơ chuẩn hóa và loại bỏ mức độ tự do vô dụng là đại diện cho các yếu tố của vectơ là cosin và sin của một số góc.

Ban đầu tôi đã thử viết mã bằng Python, nhưng việc xử lý toán học của nó tỏ ra quá hại não. Các hàm toán học của nó đã từ chối chấp nhận các giá trị phức tạp và không hiểu rằng phép chia dấu phẩy động bằng 0 là OK.

function[]=f(a,b,c,d)
L=(a+d+[1,-1]*((a-d)^2+4*b*c)^.5)/2
t=atan((L-a)/b);v=[cos(t);sin(t)]

Đầu tiên, hai giá trị riêng được in dưới tiêu đề L =. Sau đó, hai vectơ cột được in dưới các giá trị tương ứng của L, bên dưới v =. Mã có thể không cung cấp các vectơ độc lập tuyến tính trong trường hợp có thể làm như vậy (một chương trình như vậy thường được coi là bị hỏng), nhưng Martin nói rằng nó không bắt buộc.


8

Python 2, 198 byte

a,b,c,d=input()
H=(a+d)/2
D=(H*H-a*d+b*c)**.5
X,Y=H+D,H-D
p,q,r,s=[[1,0,0,1],[b,X-a,b,Y-a],[X-d,c,Y-d,c]][2*(c!=0)or(b!=0)]
A=abs
V=A(A(p)+A(q)*1j)
W=A(A(r)+A(s)*1j)
print[X,Y],[[p/V,q/V],[r/W,s/W]]

Đầu vào là một danh sách phẳng gồm 4 số phức thông qua STDIN, ví dụ:

[0.0+0j, 0.4+0j, -0.1+0j, -0.4+0j]

Lưu ý rằng Python sử dụng jthay vì icho số phức.

Đầu ra là hai danh sách, danh sách đầu tiên chứa giá trị riêng và danh sách thứ hai chứa hàm riêng, ví dụ:

[(-0.2+0j), (-0.2+0j)]
[[(0.8944271909999159+0j), (-0.4472135954999579+0j)], [(0.8944271909999159+0j), (-0.4472135954999579+0j)]]

(dòng mới được chèn cho rõ ràng)


3

Lua, 462 455 431 427 byte

Không có toán học phức tạp tích hợp trong Lua. Không có hoạt động vector hoặc. Tất cả phải được cuộn bằng tay.

a,b,c,d,e,f,g,h=...x=math.sqrt z=print i=a-g j=b-h
k=(i^2-j^2)/2+2*(c*e-d*f)m=x(k^2+(i*j+2*(c*f+d*e))^2)n=x(m+k)o=x(m-k)i=(a+g+n)/2
j=(b+h+o)/2 k=(a+g-n)/2 l=(b+h-o)/2 z(i,j,k,l)q=c^2+d^2 r=e^2+f^2 s=q+r if s==0
then z(1,0,0,0,0,0,1,0)else if r==0 then m,n,o,p=c,d,c,d c,d=i-a,j-b e,f=k-a,l-b
u=x(q+c^2+d^2)v=x(q+e^2+f^2)else m,n=i-g,j-h o,p=k-g,l-h c,d=e,f
u=x(r+m^2+n^2)v=x(r+o^2+p^2)end z(m/u,n/u,o/v,p/v,c/u,d/u,e/v,f/v)end

Chạy từ dòng lệnh với các đối số sau:

lua eigen.lua Re(a) Im(a) Re(b) Im(b) Re(c) Im(c) Re(d) Im(d)

Tạo đầu ra sau:

Re(lambda1) Im(lambda1) Re(lambda2) Im(lambda2)
Re(v11) Im(v11) Re(v12) Im(v12) Re(v21) Im(v21) Re(v22) Im(v22)

... cho a, b, c, d 4 thành phần của ma trận đầu vào, lambda1 và lambda2 hai giá trị riêng, v11, v21, hàm riêng của đơn vị thứ nhất và v12, v22, hàm riêng của đơn vị thứ hai. Ví dụ,

lua eigen.lua 1 0  1 0  1 0  0 0

... sản xuất ...

1.6180339887499 0   -0.61803398874989   0
0.85065080835204    0   -0.52573111211913   0   0.52573111211913    0   0.85065080835204    0
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.