power.py 1.18 KB
__author__ = 'chunk'

import numpy as np
import math


def norm(l):
    s = 0
    for item in l:
        if np.absolute(item) > s:
            s = np.absolute(item)
    return s


def norm_vec(l):
    s = 0
    loc = 0
    i = -1
    for item in l:
        i += 1
        if np.absolute(item) > s:
            s = np.absolute(item)
            loc = i
    return l[loc], np.array(l, dtype=np.float32) / l[loc]


def power_method(A, epsilon=0.00001, v=None):
    n = len(A)
    if v == None:
        v = np.random.rand(n)
    u = np.copy(v)
    lmbda = None
    lmbda_old = None

    iter = 0
    while lmbda_old is None or np.absolute(lmbda - lmbda_old) >= epsilon:
        iter += 1
        lmbda_old = lmbda
        v = np.dot(A, u)
        lmbda, u = norm_vec(v)
        print iter, lmbda

    return lmbda, u


def test():
    ll = [0, 2, 0.5, 1, -3, 0.2]
    ll2 = [i * 2 for i in ll]
    print norm_vec(ll)
    print norm_vec(ll2)

    A = [[3, 1], [1, 3]]
    print power_method(A)

    A = [[5, -4, 1], [-4, 6, -4], [1, -4, 7]]
    B = [[25, -41, 10, -6], [-41, 68, -17, 10], [10, -17, 5, -3], [-6, 10, -3, 2]]
    print power_method(A)
    print power_method(B)


if __name__ == '__main__':
    test()