Selesaikan Sistem 2x Eigens

11

Bagi mereka dengan latar belakang aljabar linier kecil, tantangannya sesederhana ini: menentukan nilai eigen dan vektor eigen dari matriks 2x2 kompleks yang diberikan. Anda dapat langsung beralih ke Tantangan untuk perincian I / O, dll. Bagi mereka yang membutuhkan sedikit penyegaran pada sistem eigens, baca terus.

Latar Belakang

The persamaan karakteristik dari matriks A didefinisikan oleh

det| A - λI | = 0

di mana λ adalah parameter kompleks (skalar), I adalah matriks identitas dan det | ... | adalah penentu . Sisi kiri mengevaluasi ke polinomial dalam λ , polinom karakteristik , yang kuadratik dalam kasus matriks 2x2. Solusi dari persamaan karakteristik ini adalah nilai eigen dari A , yang akan kami nyatakan sebagai λ 1 dan λ 2 .

Sekarang vektor eigen v i dari A memuaskan

A vi = λi vi

Untuk setiap λ i , ini memberi Anda sistem dua persamaan dalam dua tidak diketahui (komponen v i ), yang dapat diselesaikan dengan mudah. Anda akan melihat bahwa sistem sebenarnya kurang ditentukan, dan besarnya vektor eigen tidak ditentukan oleh persamaan. Kami biasanya ingin vektor eigen dinormalisasi, yaitu √ (| x | 2 + | y ​​| 2 ) = 1 , di mana x dan y adalah komponen vektor, | x | 2 adalah x dikalikan dengan konjugat kompleks.

Perhatikan bahwa nilai eigen mungkin menurun, yaitu λ 1 = λ 2 . Dalam hal ini, Anda mungkin atau mungkin tidak dapat memenuhi sistem persamaan tunggal dengan dua vektor eigen yang bebas linear.

Tantangan

Dengan matriks 2x2 dengan elemen kompleks, tentukan dua nilai eigennya (mungkin identik) dan vektor eigen yang dinormalisasi untuk setiap nilai eigen. Angka-angka yang dihasilkan harus akurat setidaknya 3 (desimal) digit signifikan. Anda dapat mengasumsikan bahwa bagian nyata dan imajiner dari setiap elemen matriks berada dalam kisaran [-1,1] .

Anda dapat menulis fungsi atau program, mengambil input melalui STDIN, argumen baris perintah, prompt atau argumen fungsi. Anda dapat menampilkan hasilnya ke STDOUT, kotak dialog atau sebagai nilai pengembalian fungsi.

Anda dapat menggunakan string atau format daftar yang mudah digunakan (tetapi tidak ambigu) untuk input dan output. Anda juga dapat memilih antara pasangan pelampung atau tipe kompleks untuk mewakili angka individual.

Anda tidak boleh menggunakan fungsi bawaan untuk menyelesaikan sistem eigens (seperti Mathematica Eigenvectorsatau Eigensystem) atau pemecah persamaan.

Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.

Contohnya

Setiap contoh adalah tiga baris: input, nilai eigen dan vektor eigen yang sesuai dalam urutan yang sama. Perhatikan bahwa vektor eigen hanya ditentukan hingga fase mereka, dan bahwa dalam kasus penurunan nilai eigen, vektor eigen sebenarnya dapat berubah-ubah (seperti dalam contoh pertama).

[[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]]
Martin Ender
sumber

Jawaban:

6

MATLAB, 91

Teknik standar untuk mendapatkan vektor yang dinormalisasi dan menghilangkan derajat kebebasan yang tidak berguna mewakili elemen-elemen vektor sebagai kosinus dan sinus dari beberapa sudut.

Saya awalnya mencoba kode dengan Python, tetapi penanganan matematikanya terbukti terlalu rusak otak. Fungsi matematika menolak untuk menerima nilai-nilai kompleks, dan tidak mengerti bahwa pembagian floating-point dengan nol adalah 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)]

Pertama, dua nilai eigen dicetak di bawah tajuk L =. Kemudian dua vektor kolom dicetak di bawah nilai L yang sesuai, di bawah v =. Kode mungkin gagal untuk memberikan vektor independen linear dalam kasus di mana dimungkinkan untuk melakukannya (program seperti itu biasanya dianggap rusak), tetapi Martin mengatakan itu tidak diperlukan.

feersum
sumber
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]]

Input adalah daftar datar dari 4 angka kompleks melalui STDIN, misalnya

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

Perhatikan bahwa penggunaan Python jbukan iuntuk bilangan kompleks.

Output adalah dua daftar, yang pertama berisi nilai eigen dan yang kedua berisi vektor eigen, misalnya

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

(baris baru disisipkan untuk kejelasan)

Sp3000
sumber
3

Lua, 462 455 431 427 byte

Tidak ada matematika kompleks bawaan di Lua. Juga tidak ada operasi vektor. Semua harus digulung dengan tangan.

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

Jalankan dari baris perintah dengan argumen berikut:

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

Menghasilkan output berikut:

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

... untuk a, b, c, d 4 komponen dari matriks input, lambda1 dan lambda2 dua nilai eigen, v11, v21 vektor eigen unit pertama, dan v12, v22 vektor eigen unit kedua. Sebagai contoh,

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

... menghasilkan ...

1.6180339887499 0   -0.61803398874989   0
0.85065080835204    0   -0.52573111211913   0   0.52573111211913    0   0.85065080835204    0
lalunomor
sumber