2x2 고유 시스템 풀기


11

선형이 적은 대수적 배경을 가진 사람들에게는 다음과 같이 간단합니다. 주어진 복잡한 2x2 행렬 의 고유 값과 고유 벡터 를 결정합니다 . I / O 세부 정보 등의 문제로 넘어갈 수 있습니다. 고유 시스템에 대해 약간의 새로 고침이 필요한 경우 계속 읽으십시오.

배경

행렬 A특성 방정식다음 과 같이 정의됩니다.

det| A - λI | = 0

여기서 λ는 복잡한 (스칼라) 매개 변수이고, I는 단위 행렬이고 DET가 | ... | 는 IS 결정은 . 다항식의 좌측 평가하여 λ는 상기 특성 다항식 , 2 × 2 행렬의 경우와 이차된다. 이 특성 방정식의 해는 A고유 값 으로 , λ 1λ 2 로 표시됩니다 .

이제 A고유 벡터 v i 가 충족됩니다

A vi = λi vi

λ i 에 대해 이것은 두 개의 미지수 ( vi i 의 성분)로 된 두 개의 방정식 시스템을 제공하며 , 이는 매우 쉽게 풀 수 있습니다. 시스템이 실제로 지정되어 있지 않으며 고유 벡터의 크기는 방정식에 의해 결정되지 않습니다. 우리는 일반적으로 고유 벡터가 정규화되기를 원할 것이다. 즉 √ (| x | 2 + | y ​​| 2 ) = 1. 여기서 xy 는 벡터 성분이다. | x | 2x 의 복소 공액이 곱해집니다.

고유 값은 변성, 즉 λ 1 = λ 2 일 수 있습니다. 이 경우 두 개의 선형 독립 고유 벡터를 사용하여 단일 방정식 시스템을 만족시킬 수도 있고 그렇지 않을 수도 있습니다.

도전

복소수 요소를 가진 2x2 행렬이 주어지면 두 고유 값 (각각 동일한 고유 값)과 각 고유 값에 대해 정규화 된 고유 벡터를 결정합니다. 결과 숫자는 3 자리 이상의 10 진수로 정확해야합니다. 행렬 요소의 실수 부와 허수 부가 [-1,1] 범위에 있다고 가정 할 수 있습니다 .

STDIN, 명령 줄 인수, 프롬프트 또는 함수 인수를 통해 입력을 받아 함수 나 프로그램을 작성할 수 있습니다. 결과를 대화 상자 또는 함수 반환 값으로 STDOUT에 출력 할 수 있습니다.

입력 및 출력에 편리한 (모호하지 않은) 문자열 또는 목록 형식을 사용할 수 있습니다. 플로트 쌍 또는 복소수 유형 중에서 선택하여 개별 숫자를 나타낼 수도 있습니다.

고유 시스템 (예 : Mathematica Eigenvectors또는 Eigensystem) 또는 방정식 솔버 를 푸는 데 내장 함수를 사용해서는 안됩니다 .

이것은 코드 골프이므로 가장 짧은 대답 (바이트)이 이깁니다.

각 예는 입력, 고유 값 및 해당 고유 벡터의 순서대로 세 줄입니다. 고유 벡터는 위상까지만 결정되며 고유 값이 변하는 경우 고유 벡터는 실제로 임의적 일 수 있습니다 (첫 번째 예에서와 같이).

[[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으로 코딩하려고했지만 수학 처리가 너무 손상되었습니다. 수학 함수는 복잡한 값을 받아들이기를 거부했으며 부동 소수점을 0으로 나누는 것이 괜찮다는 것을 이해하지 못합니다.

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

먼저 두 고유 값이 제목 아래에 인쇄됩니다 L =. 그런 다음 L의 해당 값 아래에 두 개의 열 벡터가 인쇄됩니다 v =. 코드는 그렇게 할 수있는 경우에 선형 적으로 독립적 인 벡터를 제공하지 못할 수 있지만 (이러한 프로그램은 정상적으로 중단 된 것으로 간주 됨) Martin은 필요하지 않다고 말했습니다.


8

파이썬 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]

파이썬은 복소수 j대신에 사용 i합니다.

출력은 두 개의 목록으로, 첫 번째는 고유 값을 포함하고 두 번째는 고유 벡터를 포함합니다. 예 :

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

(명확성을 위해 줄 바꿈 삽입)


3

루아, 462 455 431 427 바이트

루아에는 복잡한 수학이 내장되어 있지 않습니다. 벡터 연산도 없습니다. 모두 손으로 굴려야했다.

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는 두 고유 값 v11, v21은 첫 번째 단위 고유 벡터이고 v12, v22는 두 번째 고유 값입니다. 예를 들어

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.