1 import numpy as np
2 from scipy.linalg import lu
3 A = np.array([[0.0, 2.0, 0.0, 1.0], [2.0, 2.0, 3.0, 2.0], [4.0, -3.0, 0.0, 1.0], [6.0, 1.0, -6.0, -5.0]])
4 P, L, U = lu(A)
5 print("SciPy LU-decomposition: P - Permutation Matrix \n", P)
6 print("SciPy LU-decomposition: L - Lower Triangular with unit diagonal elements \n", L)
7 print("SciPy LU-decomposition: U - Upper Triangular \n", U)
8 def forward(L, b):
9 y=np.zeros(np.shape(b),dtype=float)
10 for i in range(len(b)):
11 y[i]=np.copy(b[i])
12 for j in range(i):
13 y[i]=y[i]-(L[i, j]*y[j])
14 y[i] = y[i]/L[i, i]
15 return y
16 b = np.array([[6.0], [-7.0], [-2.0], [0.0]])
17 # b = np.array([[1.0], [4.0], [-3.0], [1.0]])
18 y=forward(L,b)
19 print("y vector from Ly=b by forward substitution :", np.transpose(y))
20 def backward(U, y):
21 x=np.zeros(np.shape(y),dtype=float)
22 ylen=len(y)-1
23 x[ylen] =y[ylen]/U[ylen, ylen] # Print the last stage x value
24 for i in range(ylen-1,-1,-1):
25 x[i]=np.copy(y[i])
26 for j in range(ylen,i,-1):
27 x[i]=x[i]-(U[i, j]*x[j])
28 x[i] = x[i]/U[i, i]
29 return x
30 x=backward(U,y)
31 print("x vector from Ux=y by backward substitution :", np.transpose(x))
|