고유값 구하기 문제

컴퓨터를 이용해서 기계적으로 선형대수학 문제를 풀다 보면 흔히 만나는 문제가 고유값(Eigenvalue)구하기 문제이다. 그리고 이 문제를 풀다 보면 흔히 만나는 문제가 고유값의 순서이다.

컴퓨터는 답만 맞으면 되지? 하는 철학으로 구현된 계산 방법을 이용하는데, 그러다보니 행렬을 연속적인 변수로 만들어 냈을 때 고유값의 순서가 바뀌는 경우가 있다. 내가 풀어야 하는 문제는 고유값의 순서가 바뀌면 안되는 문제이고 이 문제를 어떻게 해결하느냐가 관건이다.

다음의 알고리즘을 참고하자.


http://snowall.tistory.com/2595

그리고 만든 것이 다음 프로그램이다.

import numpy

eig = numpy.linalg.eig

matrix = numpy.matrix

absn = numpy.abs

a0 = 0

a1 = 1

a2 = 2

for t2 in numpy.arange(-6.0, 6.1, 3.0):

file = open(“data”+str(t2)+”.txt”, ‘w’)

for t1 in numpy.arange(-r, r, stepping):

test=eig(massMatrix(t1, t2))

a2 = numpy.nonzero(test[0]==test[0].max())[0][0]

a0 = numpy.nonzero(test[0]==test[0].min())[0][0]

a1 = 2*(a0+a2)%3

file.write(

str(t1)+”\t”

+ str(t2)+”\t”

+ str(absn(test[0][a0]))+”\t”

+ str(absn(test[0][a1]))+”\t”

+ str(absn(test[0][a2]))+”\t”

+ str(absn(test[1][0, a0]))+”\t”

+ str(absn(test[1][0, a1]))+”\t”

+ str(absn(test[1][0, a2]))+”\t”

+ str(absn(test[1][1, a0]))+”\t”

+ str(absn(test[1][1, a1]))+”\t”

+ str(absn(test[1][1, a2]))+”\t”

+ str(absn(test[1][2, a0]))+”\t”

+ str(absn(test[1][2, a1]))+”\t”

+ str(absn(test[1][2, a2]))+”\t”

+ str(a0)+”\t”

+ str(a1)+”\t”

+ str(a2)+”\n”)

이중 massMatrix는 논문에 써야 하는 영업비밀이라 공개하기가 좀 그렇고, 3차 정사각 행렬을 되돌려 주는 함수라는 것만 알려둔다.

이런식으로 출력시키면 고유값이 끊기지 않고 부드럽게 이어져서 나온다.

이 문제는 내가 석사때도 마주쳤었는데, 그땐 복소수로 이루어진 3차 정사각 행렬의 고유값 계산하는 1000줄짜리 프로그램을 직접 만들어서 풀었었다. 내가 미쳤었나보다. -_-;

고유값 구하기 문제”에 대한 2개의 생각

  1. snowall

    매스매티카로 물론 가능합니다. 근데 중간에 고유값들 순서가 달라져서 그래프가 불연속적으로 그려지거든요

    그것때문에 수치적으로 대입해서 직접 찾고있었습니다

    응답

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.