Löse ein 2x2 Eigensystem

11

Für diejenigen mit einem kleinen linearen Algebra-Hintergrund ist die Herausforderung so einfach: Bestimmen Sie die Eigenwerte und Eigenvektoren einer gegebenen komplexen 2x2-Matrix. Sie können mit The Challenge fortfahren, um E / A-Details usw. zu erhalten. Lesen Sie weiter, wenn Sie eine kleine Auffrischung der Eigensysteme benötigen.

Hintergrund

Die charakteristische Gleichung einer Matrix A ist definiert durch

det| A - λI | = 0

wobei λ ein komplexer (skalarer) Parameter ist, ist I die Identitätsmatrix und det | ... | ist die Determinante . Die linke Seite ergibt ein Polynom in λ , das charakteristische Polynom , das bei 2x2-Matrizen quadratisch ist. Die Lösungen dieser charakteristischen Gleichung sind die Eigenwerte von A , die wir als λ 1 und λ 2 bezeichnen werden .

Nun erfüllen die Eigenvektoren v i von A.

A vi = λi vi

Für jedes λ i erhalten Sie ein System aus zwei Gleichungen in zwei Unbekannten (den Komponenten von v i ), das recht einfach gelöst werden kann. Sie werden feststellen, dass das System tatsächlich unterbestimmt ist und die Größe der Eigenvektoren nicht durch die Gleichungen bestimmt wird. Wir wollen normalerweise, dass die Eigenvektoren normalisiert werden, dh √ (| x | 2 + | y ​​| 2 ) = 1 , wobei x und y die Vektorkomponenten | x | sind 2 ist x multipliziert mit seinem komplexen Konjugat.

Es ist zu beachten, dass die Eigenwerte entartet sein können, dh λ 1 = λ 2 . In diesem Fall können Sie möglicherweise das einzelne Gleichungssystem mit zwei linear unabhängigen Eigenvektoren erfüllen oder nicht.

Die Herausforderung

Bestimmen Sie bei einer 2x2-Matrix mit komplexen Elementen ihre zwei (möglicherweise identischen) Eigenwerte und einen normalisierten Eigenvektor für jeden Eigenwert. Die resultierenden Zahlen müssen auf mindestens 3 (dezimale) signifikante Stellen genau sein. Sie können davon ausgehen, dass der Real- und Imaginärteil eines Matrixelements im Bereich [-1,1] liegt .

Sie können eine Funktion oder ein Programm schreiben und Eingaben über STDIN, Befehlszeilenargument, Eingabeaufforderung oder Funktionsargument vornehmen. Sie können das Ergebnis an STDOUT, ein Dialogfeld oder als Funktionsrückgabewert ausgeben.

Sie können für die Eingabe und Ausgabe ein beliebiges geeignetes (aber eindeutiges) Zeichenfolgen- oder Listenformat verwenden. Sie können auch zwischen Float-Paaren oder komplexen Typen wählen, um die einzelnen Zahlen darzustellen.

Sie dürfen keine integrierten Funktionen zum Lösen von Eigensystemen (wie Mathematica Eigenvectorsoder Eigensystem) oder Gleichungslösern verwenden.

Dies ist Code Golf, daher gewinnt die kürzeste Antwort (in Bytes).

Beispiele

Jedes Beispiel besteht aus drei Zeilen: der Eingabe, den Eigenwerten und den entsprechenden Eigenvektoren in derselben Reihenfolge. Es ist zu beachten, dass die Eigenvektoren nur bis zu ihrer Phase bestimmt werden und dass im Fall von entarteten Eigenwerten die Eigenvektoren tatsächlich willkürlich sein können (wie im ersten Beispiel).

[[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
quelle

Antworten:

6

MATLAB, 91

Eine Standardtechnik, um einen normalisierten Vektor zu erhalten und den nutzlosen Freiheitsgrad zu entfernen, besteht darin, die Elemente des Vektors als Cosinus und Sinus eines bestimmten Winkels darzustellen.

Ich habe ursprünglich versucht, in Python zu codieren, aber die mathematische Handhabung erwies sich als zu hirngeschädigt. Seine mathematischen Funktionen lehnten es ab, komplexe Werte zu akzeptieren, und es versteht nicht, dass die Gleitkommadivision durch Null in Ordnung ist.

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

Zunächst werden die beiden Eigenwerte unter der Überschrift gedruckt L =. Dann werden zwei Spaltenvektoren unter den entsprechenden Werten von L unter gedruckt v =. Der Code kann in Fällen, in denen dies möglich ist, keine linear unabhängigen Vektoren liefern (ein solches Programm wird normalerweise als fehlerhaft angesehen), aber Martin sagte, es sei nicht erforderlich.

Feersum
quelle
8

Python 2, 198 Bytes

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

Die Eingabe ist eine flache Liste von 4 komplexen Zahlen über STDIN, z

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

Beachten Sie, dass Python janstelle von ifür komplexe Zahlen verwendet.

Die Ausgabe besteht aus zwei Listen, von denen die erste die Eigenwerte und die zweite die Eigenvektoren enthält, z

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

(Zeilenumbruch zur Verdeutlichung eingefügt)

Sp3000
quelle
3

Lua, 462 455 431 427 Bytes

In Lua gibt es keine eingebaute komplexe Mathematik. Auch keine Vektoroperationen. Alles musste von Hand gerollt werden.

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

Führen Sie die Befehlszeile mit den folgenden Argumenten aus:

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

Erzeugt die folgende Ausgabe:

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

... für a, b, c, d die 4 Komponenten der Eingangsmatrix, Lambda1 und Lambda2 die beiden Eigenwerte, v11, v21 der erste Einheitseigenvektor und v12, v22 der zweite Einheitseigenvektor. Beispielsweise,

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

... produziert ...

1.6180339887499 0   -0.61803398874989   0
0.85065080835204    0   -0.52573111211913   0   0.52573111211913    0   0.85065080835204    0
dann neun
quelle