Using the LU Matrix for Multiple Right-Hand Sides

Phyton Code:
    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))