2x2 Eigensystem'i çözün


11

Biraz doğrusal cebir arka planı olanlar için, meydan okuma bu kadar basittir: belirli bir karmaşık 2x2 matrisinin özdeğerlerini ve özvektörlerini belirleyin . G / Ç Mücadelesi ayrıntıları vb. İçin atlayabilirsiniz. Özsistemlerde biraz tazelenmeye ihtiyaç duyanlar için okumaya devam edin.

Arka fon

Karakteristik denklem , bir matris A tarafından tanımlanır

det| A - λI | = 0

burada λ karmaşık (skaler) bir parametredir, ben kimlik matrisi ve det | ... | olduğu belirleyici . Sol taraf, λ cinsinden bir polinomu , karakteristik polinomu , 2x2 matrislerinde kuadratik olarak değerlendirir. Bu karakteristik denklemin çözeltilerdir özdeğerler ve A biz ifade edecektir, λ 1 ve λ 2 .

Şimdi özvektörler v i arasında bir Tatmin

A vi = λi vi

Her λ i için , bu size iki bilinmeyenli iki denklemden oluşan bir sistem verir ( v i'nin bileşenleri ), ki bu kolayca çözülebilir. Sistemin gerçekten az belirtildiğini ve özvektörlerin büyüklüğünün denklemlerle belirlenmediğini fark edeceksiniz. Genellikle özvektörlerin normalleştirilmesini isteriz, yani √ (| x | 2 + | y ​​| 2 ) = 1 , burada x ve y vektör bileşenleri, | x | 2 , karmaşık konjugatı ile x çarpılır.

Not özdeğerler dejenere olabilir, yani, λ 1 = λ 2 . Bu durumda, doğrusal olarak bağımsız iki özvektör ile tek denklem sistemini tatmin edebilir veya edemeyebilirsiniz.

Meydan okuma

Karmaşık elementlere sahip 2x2'lik bir matris verildiğinde, iki (muhtemelen özdeş) özdeğerlerini ve her özdeğer için normalize edilmiş bir özvektörü belirleyin. Ortaya çıkan sayılar en az 3 (ondalık) anlamlı basamağa kadar doğru olmalıdır. Herhangi bir matris elemanının gerçek ve hayali kısımlarının [-1,1] aralığında olduğunu varsayabilirsiniz .

STDIN, komut satırı bağımsız değişkeni, bilgi istemi veya işlev bağımsız değişkeni ile girdi alarak bir işlev veya program yazabilirsiniz. Sonucu STDOUT, bir iletişim kutusu veya işlev dönüş değeri olarak çıktılayabilirsiniz.

Giriş ve çıkış için uygun (ancak kesin olmayan) bir dize veya liste biçimi kullanabilirsiniz. Bireysel sayıları temsil etmek için şamandıra çiftleri veya karmaşık tipler arasında seçim yapabilirsiniz.

Özsistemleri (Mathematica Eigenvectorsveya benzeri Eigensystem) veya denklem çözücüleri çözmek için yerleşik işlevleri kullanmamalısınız .

Bu kod golf, yani en kısa cevap (bayt cinsinden) kazanır.

Örnekler

Her örnek üç satırdır: giriş, özdeğerler ve karşılık gelen özvektörler aynı sırayla. Özvektörlerin sadece fazlarına kadar belirlendiğine ve dejenere özdeğerler söz konusu olduğunda, özvektörlerin gerçekten keyfi olabileceğine dikkat edin (ilk örnekte olduğu gibi).

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

Yanıtlar:


6

MATLAB, 91

Normalleştirilmiş bir vektör elde etmek ve işe yaramaz serbestlik derecesini kaldırmak için standart bir teknik, vektörün elemanlarını bir açının kosinüsü ve sinüsü olarak temsil etmektir.

Başlangıçta Python'da kod yazmayı denedim, ancak matematik kullanımı çok beyine zarar verdi. Matematik işlevleri karmaşık değerleri kabul etmeyi reddetti ve kayan nokta sıfıra bölmenin tamam olduğunu anlamıyor.

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

İlk önce iki özdeğer, başlığın altına yazdırılır L =. Daha sonra iki sütun vektörü karşılık gelen L değerleri altında yazdırılır v =. Kod, bunun mümkün olduğu durumlarda doğrusal olarak bağımsız vektörler veremeyebilir (böyle bir program normalde kırık olarak kabul edilir), ancak Martin bunun gerekli olmadığını söyledi.


8

Python 2, 198 bayt

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

Giriş, STDIN üzerinden 4 karmaşık sayının düz bir listesidir, ör.

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

Python'un karmaşık sayılar jyerine kullandığını unutmayın i.

Çıktı iki liste olup, birincisi özdeğerleri içerir ve ikincisi özvektörleri içerir, ör.

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

(netlik için yeni satır eklendi)


3

Lua, 462 455 431 427 bayt

Lua'da yerleşik bir matematik yoktur. Vektör işlemi de yok. Hepsinin elle yuvarlanması gerekiyordu.

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

Komut satırından aşağıdaki bağımsız değişkenlerle çalıştırın:

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

Aşağıdaki çıktıyı üretir:

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

a, b, c, d için giriş matrisinin 4 bileşeni olan lambda1 ve lambda2 için iki özdeğer, v11, v21 birinci birim özvektör ve v12, v22 ikinci birim özvektör. Örneğin,

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

... üretir ...

1.6180339887499 0   -0.61803398874989   0
0.85065080835204    0   -0.52573111211913   0   0.52573111211913    0   0.85065080835204    0
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.