2x2固有システムを解く


11

少し線形代数の背景を持つ人にとって、課題はこれと同じくらい簡単です:与えられた複素2x2行列の固有値と固有ベクトルを決定します。I / Oの詳細などのチャレンジに進んでください。固有システムについて少し復習する必要がある場合は、先に進んでください。

バックグラウンド

特性方程式行列のAは、によって定義されます。

det| A - λI | = 0

ここで、λは複素数(スカラー)パラメーター、Iは単位行列、det | ... | ある行列が。多項式左側の評価さλは特性多項式、2×2行列の場合には二次です。この特性方程式の解である固有値A我々のように表すであろう、λ 1及びλ 2

固有ベクトルは V IA満足を

A vi = λi vi

それぞれについてλ は、これは次の2つの未知数(のコンポーネントの2つの方程式系与えV 私は非常に簡単に解決することができます)、。システムは実際には指定不足であり、固有ベクトルの大きさは方程式によって決定されないことに気付くでしょう。通常、固有ベクトルは正規化されます。つまり、√(| x | 2 + | y | 2)= 1です。ここで、xyはベクトル成分、| x |です。2xに複素共役を掛けたものです。

注固有値が縮退であってもよいこと、すなわちλ 12。この場合、2つの線形独立な固有ベクトルを使用して、単一の連立方程式を満たすことができる場合とできない場合があります。

チャレンジ

複素数要素を含む2x2行列が与えられた場合、その2つの(おそらく同一の)固有値と、各固有値の正規化された固有ベクトルを決定します。結果の数値は、少なくとも3(10進数)有効数字まで正確でなければなりません。任意の行列要素の実数部と虚数部が[-1,1]の範囲にあると仮定できます。

STDIN、コマンドライン引数、プロンプトまたは関数引数を介して入力を取得して、関数またはプログラムを作成できます。結果をSTDOUT、ダイアログボックス、または関数の戻り値として出力できます。

入力および出力には、便利な(ただし明確な)文字列またはリスト形式を使用できます。個々の数値を表すために、フロートのペアまたは複合タイプから選択することもできます。

固有システム(Mathematica EigenvectorsEigensystem)や方程式ソルバーを解くために組み込み関数を使用しないでください。

これはコードゴルフなので、最短の回答(バイト単位)が勝ちです。

各例は、入力、固有値、対応する固有ベクトルが同じ順序で並んだ3行です。固有ベクトルはその位相までしか決定されず、縮退した固有値の場合、固有ベクトルは実際には任意であることに注意してください(最初の例のように)。

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

回答:


6

MATLAB、91

正規化されたベクトルを取得し、無駄な自由度を削除する標準的な手法は、ベクトルの要素をある角度のコサインとサインとして表現することです。

私はもともとPythonでコーディングしようとしましたが、その数学処理は脳にダメージを与えすぎることが判明しました。その数学関数は複素数値を受け入れることを拒否し、ゼロによる浮動小数点除算が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)]

最初に、2つの固有値が見出しの下に出力されL =ます。次に、対応するLの値の下で、2つの列ベクトルが出力されますv =。コードは、そうすることが可能な場合には線形に独立したベクトルを与えることに失敗するかもしれません(そのようなプログラムは通常壊れていると考えられます)が、Martinはそれが必要ではないと言いました。


8

Python 2、198バイト

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

入力は、STDINを介した4つの複素数のフラットリストです。たとえば、

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

Pythonは複素数のj代わりに使用することに注意してくださいi

出力は2つのリストです。最初のリストには固有値が含まれ、2番目のリストには固有ベクトルが含まれます。たとえば、

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

(わかりやすくするために改行を挿入)


3

Luaの、462の 455 431 427バイト

Luaには組み込みの複雑な数学はありません。ベクトル演算もありません。すべて手で巻かなければなりませんでした。

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

次の引数を使用してコマンドラインから実行します。

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

次の出力を生成します。

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の場合、入力行列の4つの成分、lambda1とlambda2は2つの固有値、v11、v21は最初の単位固有ベクトル、v12、v22は2番目の単位固有ベクトルです。例えば、

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

...生産...

1.6180339887499 0   -0.61803398874989   0
0.85065080835204    0   -0.52573111211913   0   0.52573111211913    0   0.85065080835204    0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.