컴퓨터/파이썬

고유값 구하기 문제

snowall 2011. 7. 17. 08:00
컴퓨터를 이용해서 기계적으로 선형대수학 문제를 풀다 보면 흔히 만나는 문제가 고유값(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줄짜리 프로그램을 직접 만들어서 풀었었다. 내가 미쳤었나보다. -_-;