NLA-1.2

1080 days 전, jhlee2chn 작성

Algorithm 1.2.1  (Gaussian Elimination with complete pivoting)

from numpy import * A = array([[1.0, 4.0, 7.0], [2.0, 5.0, 8.0], [3.0, 6.0, 10.0]]) n = A.shape[0] # 행렬의 행의 크기 print "A = " print A u=zeros(n) v=zeros(n) print for i in range(n-1): p, q = unravel_index(abs(A[i:n, i:n]).argmax(), A[i:n, i:n].shape) # 절대값이 제일 큰 원소의 위치 파악(pivoting) p = p+i q = q+i A[[i,p], :] = A[[p,i], :] # 행 교환 A[:, [i,q]] = A[:, [q,i]] # 열 교환 u[i] = p # 교환한 행 기억 v[i] = q # 교환한 열 기억 print A print print u print v if A[i,i] != 0: A[i+1:n,i] = A[i+1:n,i]/A[i,i] A[i+1:n,i+1:n] = A[i+1:n,i+1:n] - dot(array([A[i+1:n,i]]).transpose(), array([A[i,i+1:n]])) print A print else: print ("Matrix is singular!") break 
       
A = 
[[  1.   4.   7.]
 [  2.   5.   8.]
 [  3.   6.  10.]]

[[ 10.   6.   3.]
 [  8.   5.   2.]
 [  7.   4.   1.]]

[ 2.  0.  0.]
[ 2.  0.  0.]
[[ 10.    6.    3. ]
 [  0.8   0.2  -0.4]
 [  0.7  -0.2  -1.1]]

[[ 10.    3.    6. ]
 [  0.7  -1.1  -0.2]
 [  0.8  -0.4   0.2]]

[ 2.  2.  0.]
[ 2.  2.  0.]
[[ 10.           3.           6.        ]
 [  0.7         -1.1         -0.2       ]
 [  0.8          0.36363636   0.27272727]]
A = 
[[  1.   4.   7.]
 [  2.   5.   8.]
 [  3.   6.  10.]]

[[ 10.   6.   3.]
 [  8.   5.   2.]
 [  7.   4.   1.]]

[ 2.  0.  0.]
[ 2.  0.  0.]
[[ 10.    6.    3. ]
 [  0.8   0.2  -0.4]
 [  0.7  -0.2  -1.1]]

[[ 10.    3.    6. ]
 [  0.7  -1.1  -0.2]
 [  0.8  -0.4   0.2]]

[ 2.  2.  0.]
[ 2.  2.  0.]
[[ 10.           3.           6.        ]
 [  0.7         -1.1         -0.2       ]
 [  0.8          0.36363636   0.27272727]]

Algorithm 1.2.2  (Gaussian Elimination with partial pivoting)

from numpy import * A = array([[1.0, 4.0, 7.0], [2.0, 5.0, 8.0], [3.0, 6.0, 10.0]]) n = A.shape[0] # 행렬의 행의 크기 print "A = " print A u=zeros(n) print for i in range(n-1): p = abs(A[i:n, i]).argmax() # 절대값이 제일 큰 원소의 위치 파악(pivoting) p = p+i A[[i,p], :] = A[[p,i], :] # 행 교환 u[i] = p # 교환한 행 기억 print A print print u if A[i,i] != 0: A[i+1:n,i] = A[i+1:n,i]/A[i,i] A[i+1:n,i+1:n] = A[i+1:n,i+1:n] - dot(array([A[i+1:n,i]]).transpose(), array([A[i,i+1:n]])) print A print else: print ("Matrix is singular!") break 
       
A = 
[[  1.   4.   7.]
 [  2.   5.   8.]
 [  3.   6.  10.]]

[[  3.   6.  10.]
 [  2.   5.   8.]
 [  1.   4.   7.]]

[ 2.  0.  0.]
[[  3.           6.          10.        ]
 [  0.66666667   1.           1.33333333]
 [  0.33333333   2.           3.66666667]]

[[  3.           6.          10.        ]
 [  0.33333333   2.           3.66666667]
 [  0.66666667   1.           1.33333333]]

[ 2.  2.  0.]
[[  3.           6.          10.        ]
 [  0.33333333   2.           3.66666667]
 [  0.66666667   0.5         -0.5       ]]
A = 
[[  1.   4.   7.]
 [  2.   5.   8.]
 [  3.   6.  10.]]

[[  3.   6.  10.]
 [  2.   5.   8.]
 [  1.   4.   7.]]

[ 2.  0.  0.]
[[  3.           6.          10.        ]
 [  0.66666667   1.           1.33333333]
 [  0.33333333   2.           3.66666667]]

[[  3.           6.          10.        ]
 [  0.33333333   2.           3.66666667]
 [  0.66666667   1.           1.33333333]]

[ 2.  2.  0.]
[[  3.           6.          10.        ]
 [  0.33333333   2.           3.66666667]
 [  0.66666667   0.5         -0.5       ]]