# Name : Ananda Das;
# ID : 230241053;
# Lab : 3 , problem : 02;
def lu_decomposition(A, n):
L = [[0.0] * n for _ in range(n)]
U = [[0.0] * n for _ in range(n)]
for i in range(n):
L[i][i] = 1.0
for j in range(n):
for i in range(n):
if i <= j:
U[i][j] = A[i][j] - sum(L[i][k] * U[k][j] for k in range(i))
else:
if abs(U[j][j]) < 1e-10:
print("Matrix is singular or nearly singular. Cannot proceed with LU Decomposition.")
exit()
L[i][j] = (A[i][j] - sum(L[i][k] * U[k][j] for k in range(j))) / U[j][j]
return L, U
def forward_substitution(L, B, n):
Y = [0.0] * n
for i in range(n):
Y[i] = B[i] - sum(L[i][j] * Y[j] for j in range(i))
return Y
def backward_substitution(U, Y, n):
X = [0.0] * n
for i in reversed(range(n)):
if abs(U[i][i]) < 1e-10:
print("Zero on diagonal during backward substitution. No unique solution.")
exit()
X[i] = (Y[i] - sum(U[i][j] * X[j] for j in range(i + 1, n))) / U[i][i]
return X
def print_matrix(name, matrix):
print(f"[{name}]:")
for row in matrix:
print(" ".join(f"{val:.3f}" for val in row))
print()
def print_vector(name, vector):
print(f"[{name}]:", " ".join(f"{val:.3f}" for val in vector))
print()
# Main program
n = int(input("Enter the order of square matrix: "))
print("Enter matrix elements row-wise:")
A = [list(map(float, input().split())) for _ in range(n)]
B = list(map(float, input("Enter the constant terms: ").split()))
L, U = lu_decomposition(A, n)
Y = forward_substitution(L, B, n)
X = backward_substitution(U, Y, n)
print_matrix("L", L)
print_matrix("U", U)
print_vector("Y", Y)
print_vector("X", X)
IyBOYW1lIDogQW5hbmRhIERhczsKIyBJRCA6IDIzMDI0MTA1MzsKIyBMYWIgOiAzICwgcHJvYmxlbSA6IDAyOwpkZWYgbHVfZGVjb21wb3NpdGlvbihBLCBuKToKICAgIEwgPSBbWzAuMF0gKiBuIGZvciBfIGluIHJhbmdlKG4pXQogICAgVSA9IFtbMC4wXSAqIG4gZm9yIF8gaW4gcmFuZ2UobildCiAKICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgIExbaV1baV0gPSAxLjAKIAogICAgZm9yIGogaW4gcmFuZ2Uobik6CiAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6CiAgICAgICAgICAgIGlmIGkgPD0gajoKICAgICAgICAgICAgICAgIFVbaV1bal0gPSBBW2ldW2pdIC0gc3VtKExbaV1ba10gKiBVW2tdW2pdIGZvciBrIGluIHJhbmdlKGkpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgYWJzKFVbal1bal0pIDwgMWUtMTA6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoIk1hdHJpeCBpcyBzaW5ndWxhciBvciBuZWFybHkgc2luZ3VsYXIuIENhbm5vdCBwcm9jZWVkIHdpdGggTFUgRGVjb21wb3NpdGlvbi4iKQogICAgICAgICAgICAgICAgICAgIGV4aXQoKQogICAgICAgICAgICAgICAgTFtpXVtqXSA9IChBW2ldW2pdIC0gc3VtKExbaV1ba10gKiBVW2tdW2pdIGZvciBrIGluIHJhbmdlKGopKSkgLyBVW2pdW2pdCiAgICByZXR1cm4gTCwgVQogCmRlZiBmb3J3YXJkX3N1YnN0aXR1dGlvbihMLCBCLCBuKToKICAgIFkgPSBbMC4wXSAqIG4KICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgIFlbaV0gPSBCW2ldIC0gc3VtKExbaV1bal0gKiBZW2pdIGZvciBqIGluIHJhbmdlKGkpKQogICAgcmV0dXJuIFkKIApkZWYgYmFja3dhcmRfc3Vic3RpdHV0aW9uKFUsIFksIG4pOgogICAgWCA9IFswLjBdICogbgogICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobikpOgogICAgICAgIGlmIGFicyhVW2ldW2ldKSA8IDFlLTEwOgogICAgICAgICAgICBwcmludCgiWmVybyBvbiBkaWFnb25hbCBkdXJpbmcgYmFja3dhcmQgc3Vic3RpdHV0aW9uLiBObyB1bmlxdWUgc29sdXRpb24uIikKICAgICAgICAgICAgZXhpdCgpCiAgICAgICAgWFtpXSA9IChZW2ldIC0gc3VtKFVbaV1bal0gKiBYW2pdIGZvciBqIGluIHJhbmdlKGkgKyAxLCBuKSkpIC8gVVtpXVtpXQogICAgcmV0dXJuIFgKIApkZWYgcHJpbnRfbWF0cml4KG5hbWUsIG1hdHJpeCk6CiAgICBwcmludChmIlt7bmFtZX1dOiIpCiAgICBmb3Igcm93IGluIG1hdHJpeDoKICAgICAgICBwcmludCgiICIuam9pbihmInt2YWw6LjNmfSIgZm9yIHZhbCBpbiByb3cpKQogICAgcHJpbnQoKQogCmRlZiBwcmludF92ZWN0b3IobmFtZSwgdmVjdG9yKToKICAgIHByaW50KGYiW3tuYW1lfV06IiwgIiAiLmpvaW4oZiJ7dmFsOi4zZn0iIGZvciB2YWwgaW4gdmVjdG9yKSkKICAgIHByaW50KCkKIAojIE1haW4gcHJvZ3JhbQpuID0gaW50KGlucHV0KCJFbnRlciB0aGUgb3JkZXIgb2Ygc3F1YXJlIG1hdHJpeDogIikpCnByaW50KCJFbnRlciBtYXRyaXggZWxlbWVudHMgcm93LXdpc2U6IikKQSA9IFtsaXN0KG1hcChmbG9hdCwgaW5wdXQoKS5zcGxpdCgpKSkgZm9yIF8gaW4gcmFuZ2UobildCkIgPSBsaXN0KG1hcChmbG9hdCwgaW5wdXQoIkVudGVyIHRoZSBjb25zdGFudCB0ZXJtczogIikuc3BsaXQoKSkpCiAKTCwgVSA9IGx1X2RlY29tcG9zaXRpb24oQSwgbikKWSA9IGZvcndhcmRfc3Vic3RpdHV0aW9uKEwsIEIsIG4pClggPSBiYWNrd2FyZF9zdWJzdGl0dXRpb24oVSwgWSwgbikKIApwcmludF9tYXRyaXgoIkwiLCBMKQpwcmludF9tYXRyaXgoIlUiLCBVKQpwcmludF92ZWN0b3IoIlkiLCBZKQpwcmludF92ZWN0b3IoIlgiLCBYKQog