power.py
1.18 KB
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
__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()