Commit 7d0297f3f8739a34b4b89b3ecc5deb3862e92d1a
1 parent
e5dbe416
Exists in
master
6 finished.
Showing
8 changed files
with
285 additions
and
4 deletions
Show diff stats
No preview for this file type
chap3/cholesky.py
... | ... | @@ -42,6 +42,14 @@ def gen_b(n, x=None): |
42 | 42 | return np.dot(gen_hilbert(n), x) |
43 | 43 | |
44 | 44 | |
45 | +def norm(l): | |
46 | + s = 0 | |
47 | + for item in l: | |
48 | + if np.absolute(item) > s: | |
49 | + s = np.absolute(item) | |
50 | + return s | |
51 | + | |
52 | + | |
45 | 53 | def cholesky(A): |
46 | 54 | n = len(A) |
47 | 55 | for j in range(n): |
... | ... | @@ -57,7 +65,7 @@ def cholesky(A): |
57 | 65 | return np.array(A) |
58 | 66 | |
59 | 67 | |
60 | -def calculate(n): | |
68 | +def calculate0(n): | |
61 | 69 | H = gen_hilbert(n) |
62 | 70 | b = gen_b(n) |
63 | 71 | L = cholesky(H) |
... | ... | @@ -68,6 +76,19 @@ def calculate(n): |
68 | 76 | return x, b - np.dot(H, x), [x[i] - 1.0 for i in range(n)] |
69 | 77 | |
70 | 78 | |
79 | +def calculate1(n): | |
80 | + H = gen_hilbert(n) | |
81 | + b = gen_b(n) | |
82 | + b_t = np.copy(b) | |
83 | + b_t[-1] += math.pow(10, -7) | |
84 | + L = cholesky(H) | |
85 | + y = calc_lower(L, b_t) | |
86 | + x = calc_upper(L.T, y) | |
87 | + # validate: | |
88 | + # print np.dot(H, x) - b | |
89 | + return x, b - np.dot(H, x), [x[i] - 1.0 for i in range(n)] | |
90 | + | |
91 | + | |
71 | 92 | def test(): |
72 | 93 | print gen_hilbert(3) |
73 | 94 | print gen_b(5) |
... | ... | @@ -83,10 +104,30 @@ def test(): |
83 | 104 | A = [[5, -1, -1], [-1, 3, -1], [-1, -1, 5]] |
84 | 105 | print cholesky(A) |
85 | 106 | |
86 | - x, r, delta = calculate(10) | |
87 | - print "%s\n%s\n%s\n" % (x, r, delta) | |
107 | + | |
108 | +def test1(): | |
109 | + print "[origin(n=10)]" | |
110 | + x, r, delta = calculate0(10) | |
111 | + print "x:%s\nr:%s\ndelta:%s\n" % (x, r, delta) | |
112 | + print "norm(r):%s\nnorm(delta):%s\n" % (norm(r), norm(delta)) | |
113 | + | |
114 | + print "[disturbed(n=10)]" | |
115 | + x, r, delta = calculate1(10) | |
116 | + print "x:%s\nr:%s\ndelta:%s\n" % (x, r, delta) | |
117 | + print "norm(r):%s\nnorm(delta):%s\n" % (norm(r), norm(delta)) | |
118 | + | |
119 | + print "[n=8]" | |
120 | + x, r, delta = calculate0(8) | |
121 | + print "x:%s\nr:%s\ndelta:%s\n" % (x, r, delta) | |
122 | + print "norm(r):%s\nnorm(delta):%s\n" % (norm(r), norm(delta)) | |
123 | + | |
124 | + print "[n=12]" | |
125 | + x, r, delta = calculate0(12) | |
126 | + print "x:%s\nr:%s\ndelta:%s\n" % (x, r, delta) | |
127 | + print "norm(r):%s\nnorm(delta):%s\n" % (norm(r), norm(delta)) | |
88 | 128 | |
89 | 129 | |
90 | 130 | if __name__ == '__main__': |
91 | - test() | |
131 | + # test() | |
132 | + test1() | |
92 | 133 | pass | ... | ... |
No preview for this file type
... | ... | @@ -0,0 +1,87 @@ |
1 | +__author__ = 'chunk' | |
2 | + | |
3 | +import numpy as np | |
4 | +import math | |
5 | + | |
6 | + | |
7 | +def gen_hilbert(n): | |
8 | + return np.array([1.0 / (i + j + 1) for i in range(n) for j in range(n)]).reshape((n, -1)) | |
9 | + | |
10 | + | |
11 | +def gen_b(n): | |
12 | + return np.array([1.0 / i for i in range(1, n + 1)]) | |
13 | + | |
14 | + | |
15 | +def norm(l): | |
16 | + s = 0 | |
17 | + for item in l: | |
18 | + if np.absolute(item) > s: | |
19 | + s = np.absolute(item) | |
20 | + return s | |
21 | + | |
22 | + | |
23 | +def jacobi(A, b, epsilon=0.0001, x=None): | |
24 | + n = len(A) | |
25 | + assert n == len(b) | |
26 | + | |
27 | + if x is None: | |
28 | + x = np.zeros(n, dtype=np.float32) | |
29 | + x_old = None | |
30 | + | |
31 | + D = np.diag(A) | |
32 | + R = A - np.diagflat(D) | |
33 | + | |
34 | + # for i in range(N): | |
35 | + iter = 0 | |
36 | + while x_old is None or norm(x - x_old) >= epsilon: | |
37 | + iter += 1 | |
38 | + x_old = np.copy(x) | |
39 | + x = (b - np.dot(R, x_old)) / D | |
40 | + print iter, x | |
41 | + return x | |
42 | + | |
43 | + | |
44 | +def SOR(A, b, omega, epsilon=0.0001, x=None): | |
45 | + n = len(A) | |
46 | + assert n == len(b) | |
47 | + | |
48 | + if x is None: | |
49 | + x = np.zeros(n, dtype=np.float32) | |
50 | + x_old = None | |
51 | + iter = 0 | |
52 | + while x_old is None or norm(x - x_old) >= epsilon: | |
53 | + iter += 1 | |
54 | + x_old = np.copy(x) | |
55 | + for i in range(n): | |
56 | + s = 0.0 | |
57 | + for j in range(n): | |
58 | + if j != i: | |
59 | + s += A[i][j] * x[j] | |
60 | + x[i] = (1 - omega) * x[i] + omega * (b[i] - s) / A[i][i] | |
61 | + | |
62 | + # print iter, x | |
63 | + return iter, x | |
64 | + | |
65 | + | |
66 | +def test(): | |
67 | + # A = [[10, 3, 1], [2, -10, 3], [1, 3, 10]] | |
68 | + # b = [14, -5, 14] | |
69 | + # print SOR(A, b, 1.25) | |
70 | + # print jacobi(A, b) | |
71 | + | |
72 | + n = 10 | |
73 | + A = gen_hilbert(n) | |
74 | + b = gen_b(n) | |
75 | + # print jacobi(A, b) | |
76 | + print SOR(A, b, 1) | |
77 | + | |
78 | + for w in np.linspace(0.5, 1.5, num=11): | |
79 | + iter, x = SOR(A, b, w) | |
80 | + # print "w:%f\titer:%d\tx:%s\t" % (w, iter, x) | |
81 | + # print "norm(delta):%s\n" % (norm(np.array([1.0] + [0.0] * (n - 1)) - x)) | |
82 | + print "w:%f\titer:%d\tnorm(delta):%s\n" % ( | |
83 | + w, iter, norm(np.array([1.0] + [0.0] * (n - 1)) - x)) | |
84 | + | |
85 | + | |
86 | +if __name__ == '__main__': | |
87 | + test() | ... | ... |
... | ... | @@ -0,0 +1 @@ |
1 | +__author__ = 'chunk' | ... | ... |
... | ... | @@ -0,0 +1,62 @@ |
1 | +__author__ = 'chunk' | |
2 | + | |
3 | +import numpy as np | |
4 | +import math | |
5 | + | |
6 | + | |
7 | +def norm(l): | |
8 | + s = 0 | |
9 | + for item in l: | |
10 | + if np.absolute(item) > s: | |
11 | + s = np.absolute(item) | |
12 | + return s | |
13 | + | |
14 | + | |
15 | +def norm_vec(l): | |
16 | + s = 0 | |
17 | + loc = 0 | |
18 | + i = -1 | |
19 | + for item in l: | |
20 | + i += 1 | |
21 | + if np.absolute(item) > s: | |
22 | + s = np.absolute(item) | |
23 | + loc = i | |
24 | + return l[loc], np.array(l, dtype=np.float32) / l[loc] | |
25 | + | |
26 | + | |
27 | +def power_method(A, epsilon=0.00001, v=None): | |
28 | + n = len(A) | |
29 | + if v == None: | |
30 | + v = np.random.rand(n) | |
31 | + u = np.copy(v) | |
32 | + lmbda = None | |
33 | + lmbda_old = None | |
34 | + | |
35 | + iter = 0 | |
36 | + while lmbda_old is None or np.absolute(lmbda - lmbda_old) >= epsilon: | |
37 | + iter += 1 | |
38 | + lmbda_old = lmbda | |
39 | + v = np.dot(A, u) | |
40 | + lmbda, u = norm_vec(v) | |
41 | + print iter, lmbda | |
42 | + | |
43 | + return lmbda, u | |
44 | + | |
45 | + | |
46 | +def test(): | |
47 | + ll = [0, 2, 0.5, 1, -3, 0.2] | |
48 | + ll2 = [i * 2 for i in ll] | |
49 | + print norm_vec(ll) | |
50 | + print norm_vec(ll2) | |
51 | + | |
52 | + A = [[3, 1], [1, 3]] | |
53 | + print power_method(A) | |
54 | + | |
55 | + A = [[5, -4, 1], [-4, 6, -4], [1, -4, 7]] | |
56 | + B = [[25, -41, 10, -6], [-41, 68, -17, 10], [10, -17, 5, -3], [-6, 10, -3, 2]] | |
57 | + print power_method(A) | |
58 | + print power_method(B) | |
59 | + | |
60 | + | |
61 | +if __name__ == '__main__': | |
62 | + test() | ... | ... |
... | ... | @@ -0,0 +1 @@ |
1 | +__author__ = 'chunk' | ... | ... |
... | ... | @@ -0,0 +1,89 @@ |
1 | +__author__ = 'chunk' | |
2 | + | |
3 | +import numpy as np | |
4 | +import math | |
5 | +import matplotlib.pyplot as plt | |
6 | +import seaborn as sns | |
7 | + | |
8 | +from chap3.cholesky import calc_upper, calc_lower, cholesky | |
9 | + | |
10 | +plt.ticklabel_format(style='sci', axis='both') | |
11 | + | |
12 | + | |
13 | +def fiiting(t, f, phi): | |
14 | + m, n = len(t), len(phi) | |
15 | + assert m == len(f) | |
16 | + | |
17 | + A = np.array([phi[j](t[i]) for i in range(m) for j in range(n)]).reshape(m, -1) | |
18 | + G = np.dot(A.T, A) | |
19 | + b = np.dot(A.T, f) | |
20 | + L = cholesky(G) | |
21 | + y = calc_lower(L, b) | |
22 | + x = calc_upper(L.T, y) | |
23 | + return x | |
24 | + | |
25 | + | |
26 | +def test0(): | |
27 | + t0 = [1, 2, 3, 4, 5] | |
28 | + f0 = [4, 4.5, 6, 8, 8.5] | |
29 | + phi = [lambda x: 1, lambda x: x] | |
30 | + coef = fiiting(t0, f0, phi) | |
31 | + print coef | |
32 | + | |
33 | + fit = lambda x: coef[0] + coef[1] * x * x | |
34 | + t1 = np.linspace(1, 8, num=1000).tolist() | |
35 | + f1 = [fit(i) for i in t1] | |
36 | + | |
37 | + plt.scatter(t0, f0) | |
38 | + plt.plot(t1, f1) | |
39 | + plt.show() | |
40 | + | |
41 | + | |
42 | +def test(): | |
43 | + # print np.linspace(1, 8, num=15).tolist() | |
44 | + | |
45 | + | |
46 | + | |
47 | + t = [1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0] | |
48 | + f = [33.40, 79.50, 122.65, 159.05, 189.15, 214.15, 238.65, 252.2, 267.55, 280.50, 296.65, | |
49 | + 301.65, 310.40, | |
50 | + 318.15, 325.15] | |
51 | + phi = [lambda x: 1, lambda x: x, lambda x: x * x] | |
52 | + coef = fiiting(t, f, phi) | |
53 | + print coef | |
54 | + fit = lambda x: coef[0] + coef[1] * x + coef[2] * x * x | |
55 | + t1 = np.linspace(1, 8, num=1000).tolist() | |
56 | + f1 = [fit(i) for i in t1] | |
57 | + | |
58 | + | |
59 | + ff = [np.log(i) for i in f] | |
60 | + print ff | |
61 | + phi2 = [lambda x: 1, lambda x: x] | |
62 | + coef2 = fiiting(t, ff, phi2) | |
63 | + print coef2 | |
64 | + fit2 = lambda x: np.exp(coef2[0]) * np.exp(coef2[1] * x) | |
65 | + t2 = np.linspace(1, 8, num=1000).tolist() | |
66 | + f2 = [fit2(i) for i in t2] | |
67 | + | |
68 | + tt = [1.0/i for i in t] | |
69 | + ff = [np.log(i) for i in f] | |
70 | + print ff | |
71 | + phi2 = [lambda x: 1, lambda x: x] | |
72 | + coef2 = fiiting(tt, ff, phi2) | |
73 | + print coef2 | |
74 | + fit2 = lambda x: np.exp(coef2[0]) * np.exp(coef2[1] * 1.0 / x) | |
75 | + t3 = np.linspace(1, 8, num=1000).tolist() | |
76 | + f3 = [fit2(i) for i in t3] | |
77 | + | |
78 | + plt.scatter(t, f) | |
79 | + plt.plot(t1, f1, label='polynomial') | |
80 | + plt.plot(t2, f2, label='exponential', linestyle='--') | |
81 | + plt.plot(t3, f3, label='exponential 1/t', linestyle='-') | |
82 | + plt.xlabel("t") | |
83 | + plt.ylabel("y") | |
84 | + plt.legend(loc=2) | |
85 | + plt.show() | |
86 | + | |
87 | + | |
88 | +if __name__ == '__main__': | |
89 | + test() | ... | ... |