Rozwiąż Eigensystem 2x2

11

Dla osób z niewielkim tłem algebry liniowej wyzwanie jest tak proste: określić wartości własne i wektory własne danej złożonej macierzy 2x2. Możesz przejść do szczegółów wyzwania dla We / Wy itp. Dla tych, którzy potrzebują trochę odświeżenia na systemach eigensystem, czytaj dalej.

tło

Charakterystyczne równanie macierzy A jest określona

det| A - λI | = 0

gdzie λ jest parametrem złożonym (skalarnym), I jest macierzą tożsamości i det | ... | jest wyznacznikiem . Lewa strona ma postać wielomianu w λ , charakterystycznego wielomianu , który jest kwadratowy w przypadku macierzy 2x2. Rozwiązania tego charakterystycznego równania są wartości własne z A , które oznaczymy jako λ 1 i λ 2 .

Teraz wektory własne v I od A zaspokoić

A vi = λi vi

Dla każdego λ i daje to układ dwóch równań w dwóch niewiadomych (składowych v i ), które można rozwiązać dość łatwo. Zauważysz, że układ jest w rzeczywistości nieokreślony, a wielkość wektorów własnych nie jest określona przez równania. Zwykle chcemy, aby wektory własne były znormalizowane, to znaczy √ (| x | 2 + | y ​​| 2 ) = 1 , gdzie x i y są składowymi wektorowymi, | x | 2 jest x pomnożone przez jego złożony koniugat.

Zauważ, że wartości własne mogą być zdegenerowane, tj. Λ 1 = λ 2 . W takim przypadku możesz spełnić pojedynczy układ równań za pomocą dwóch liniowo niezależnych wektorów własnych.

Wyzwanie

Biorąc pod uwagę macierz 2x2 ze złożonymi elementami, określ jej dwie (prawdopodobnie identyczne) wartości własne i znormalizowany wektor własny dla każdej wartości własnej. Wynikowe liczby muszą być dokładne co najmniej 3 (dziesiętne) cyfry znaczące. Możesz założyć, że rzeczywiste i urojone części dowolnego elementu macierzy mieszczą się w przedziale [-1,1] .

Możesz napisać funkcję lub program, przyjmując dane wejściowe przez STDIN, argument wiersza poleceń, monit lub argument funkcji. Możesz wyprowadzić wynik do STDOUT, okna dialogowego lub jako wartość zwracaną przez funkcję.

Możesz użyć dowolnego dogodnego (ale jednoznacznego) formatu ciągu lub listy dla danych wejściowych i wyjściowych. Możesz także wybierać między parami liczb zmiennoprzecinkowych lub typami złożonymi, które reprezentują poszczególne liczby.

Nie wolno używać wbudowanych funkcji do rozwiązywania układów elektronicznych (takich jak Mathematica Eigenvectorslub Eigensystem) lub rozwiązywania równań.

To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).

Przykłady

Każdy przykład składa się z trzech linii: danych wejściowych, wartości własnych i odpowiadających im wektorów własnych w tej samej kolejności. Zauważ, że wektory własne są określane tylko do ich fazy, i że w przypadku zdegenerowanych wartości własnych, wektory własne mogą faktycznie być dowolne (jak w pierwszym przykładzie).

[[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
źródło

Odpowiedzi:

6

MATLAB, 91

Standardową techniką uzyskania znormalizowanego wektora i usunięcia niepotrzebnego stopnia swobody jest reprezentacja elementów wektora jako cosinus i sinus pod pewnym kątem.

Początkowo próbowałem napisać kod w Pythonie, ale jego obsługa matematyki okazała się zbyt uszkodzona przez mózg. Jego funkcje matematyczne odmawiały przyjęcia złożonych wartości i nie rozumie, że dzielenie zmiennoprzecinkowe przez zero jest 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)]

Najpierw dwie wartości własne są drukowane pod nagłówkiem L =. Następnie drukowane są dwa wektory kolumnowe pod odpowiednimi wartościami L poniżej v =. Kod może nie dać liniowo niezależnych wektorów w przypadkach, w których jest to możliwe (taki program normalnie można uznać za uszkodzony), ale Martin powiedział, że nie jest to wymagane.

feersum
źródło
8

Python 2, 198 bajtów

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

Dane wejściowe to płaska lista 4 liczb zespolonych za pośrednictwem STDIN, np

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

Zauważ, że Python używa jzamiast iliczb zespolonych.

Dane wyjściowe to dwie listy, pierwsza zawiera wartości własne, a druga zawiera wektory własne, np

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

(dodano nowy wiersz dla zachowania przejrzystości)

Sp3000
źródło
3

Lua, 462 455 431 427 bajtów

W Lua nie ma wbudowanej złożonej matematyki. Brak operacji wektorowych. Wszystko trzeba było zwinąć ręcznie.

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

Uruchom z wiersza polecenia, używając następujących argumentów:

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

Daje następujące dane wyjściowe:

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

... dla a, b, c, d 4 składowe macierzy wejściowej, lambda1 i lambda2, dwie wartości własne, v11, v21 pierwszy wektor własny, a v12, v22 drugi wektor własny. Na przykład,

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

... produkuje ...

1.6180339887499 0   -0.61803398874989   0
0.85065080835204    0   -0.52573111211913   0   0.52573111211913    0   0.85065080835204    0
thenumbernine
źródło