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() | ... | ... |