Blame view

chap5/power.py 1.18 KB
7d0297f3   Chunk   6 finished.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
__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():
763affb7   Chunk   staged.
47
48
49
50
    ll = [0, 2, 0.5, 1, -3, 0.2]
    ll2 = [i * 2 for i in ll]
    print norm_vec(ll)
    print norm_vec(ll2)
7d0297f3   Chunk   6 finished.
51

763affb7   Chunk   staged.
52
53
    A = [[3, 1], [1, 3]]
    print power_method(A)
7d0297f3   Chunk   6 finished.
54
55
56
57

    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)
763affb7   Chunk   staged.
58
    print power_method(B)
7d0297f3   Chunk   6 finished.
59
60
61
62


if __name__ == '__main__':
    test()