150
Mon Oct 09 2023 00:47:38 GMT+0000 (Coordinated Universal Time)
#Author: John Lawrence F. Quiñones #Subject: CMSC 150 B-4L #Author's note: Please set the working directory of R Studio to the directory of the extracted zip # file containing "QuiñonesEx04.R" and "QuiñonesEx03.R" in order for this program to work source('QuiñonesEx03.R') VA= function(x1, x2, x3, x4, x5, x6, x7, x8, x9) 4 * x1 + -1 * x2 + 0 * x3 + -1 * x4 + 0 * x5 + 0 * x6 + 0 * x7 + 0 * x8 + 0 * x9 + -80; VB= function(x1, x2, x3, x4, x5, x6, x7, x8, x9) -1 * x1 + 4 * x2 + -1 * x3 + 0 * x4 + -1 * x5 + 0 * x6 + 0 * x7 + 0 * x8 + 0 * x9 + -30; VC= function(x1, x2, x3, x4, x5, x6, x7, x8, x9) 0 * x1 + -1 * x2 + 4 * x3 + 0 * x4 + 0 * x5 + -1 * x6 + 0 * x7 + 0 * x8 + 0 * x9 + -80; VD= function(x1, x2, x3, x4, x5, x6, x7, x8, x9) -1 * x1 + 0 * x2 + 0 * x3 + 4 * x4 + -1 * x5 + 0 * x6 + -1 * x7 + 0 * x8 + 0 * x9 + -50; VE= function(x1, x2, x3, x4, x5, x6, x7, x8, x9) 0 * x1 + -1 * x2 + 0 * x3 + -1 * x4 + 4 * x5 + -1 * x6 + 0 * x7 + -1 * x8 + 0 * x9 + 0; VF= function(x1, x2, x3, x4, x5, x6, x7, x8, x9) 0 * x1 + 0 * x2 + -1 * x3 + 0 * x4 + -1 * x5 + 4 * x6 + 0 * x7 + 0 * x8 + -1 * x9 + -50; VG= function(x1, x2, x3, x4, x5, x6, x7, x8, x9) 0 * x1 + 0 * x2 + 0 * x3 + -1 * x4 + 0 * x5 + 0 * x6 + 4 * x7 + 0 * x8 + 0 * x9 + -70; VH= function(x1, x2, x3, x4, x5, x6, x7, x8, x9) 0 * x1 + 0 * x2 + 0 * x3 + 0 * x4 + 0 * x5 + 0 * x6 + -1 * x7 + 4 * x8 + -1 * x9 + -70; VI= function(x1, x2, x3, x4, x5, x6, x7, x8, x9) 0 * x1 + 0 * x2 + 0 * x3 + 0 * x4 + 0 * x5 + -1 * x6 + 0 * x7 + -1 * x8 + 4 * x9 + -120; ls = list(eq1=VA, eq2=VB, eq3=VC, eq4=VD, eq5=VE, eq6=VF, eq7=VG, eq8=VH, eq9=VI) lbldList = AugCoeffMatrix(ls) print(lbldList) findPivotRow = function(n, mat){ for (i in 1:n){ #finding the pivot row pivotRow = NA for (j in i:n){ if(is.na(pivotRow)){ pivotRow = j }else{ if(mat[pivotRow, 1] < mat[j, 1]){ print("Pivot:") print(pivotRow) print("Eval:") print(j) print(mat[pivotRow, 1]) print("is less than") print(mat[j, 1]) pivotRow = j } } } #print("Pivot row:") #print(pivotRow) } return(pivotRow) } getRowArrangement = function(i, n, pivotRow, mat){ rowArrangement = c() #dynamically getting the row names arrangement but with i and pivotRow swapped positions #print("Row Arrangement: ") for (k in 1:n){ if(k == i){ rowArrangement = c(rowArrangement, rownames(mat)[pivotRow]) }else if(k == pivotRow){ rowArrangement = c(rowArrangement, rownames(mat)[i]) }else{ rowArrangement = c(rowArrangement, rownames(mat)[k]) } #print(rowArrangement) } return(rowArrangement) } GaussianMethod= function(ls){ variables = ls[[2]] mat = ls[[1]] n = nrow(mat) for (i in 1:(n-1)){ pivotRow = findPivotRow(n, mat) #if the first element of the pivot row is zero, return NA if((mat[pivotRow, i] == 0) & i != (n-1)){ print("No solution for: ") print(mat) print("Pivot row: ") print(mat[pivotRow, ]) return(NA) } #print("Initial Matrix:") #print(mat) rowArrangement = getRowArrangement(i, n, pivotRow, mat) #pivoted matrix mat = mat[match(rowArrangement, rownames(mat)), ] #print("pivoted matrix:") #print(mat) for (l in (i+1):n){ pivotElement = mat[i, i] #print("Pivot element: ") #print(pivotElement) multiplier = (mat[l, i])/pivotElement #print("multiplier: ") #print(multiplier) normalizedRow = multiplier * mat[i, ] #print("Normalized Row:") #print(normalizedRow) differenceRow = mat[l, ] - normalizedRow #fix this part Mr. AI mat[l, ] <- differenceRow #print("difference:") #print(differenceRow) #print("Resulting Matrix:") #print(mat) } } #backwards substitution varValues = c() #getting the value of x[n] xSubN = mat[n, ncol(mat)] / mat[n,n] #initialize x vector with 0 as initial values x = c() for (i in 1:n){ x <- c(x, 0) } #putting xSubN in x[n] x[n] <- xSubN for (i in (n-1): 1){ sum = 0 for (j in (i+1):n){ prod = mat[i,j] * x[j] sum <- prod + sum } diff = mat[i, ncol(mat)] - sum quo = diff/mat[i,i] x[i] = quo } retVal = list(variables=variables, augcoeffmatrix = round(mat, digits=4), solution = x) return(retVal) } GaussJordanMethod = function(ls){ variables = ls[[2]] mat = ls[[1]] n = nrow(mat) for (i in 1:n){ if (i != n){ pivotRow = findPivotRow(n, mat) #if the first element of the pivot row is zero, return NA if((mat[pivotRow, i] == 0) & i != (n-1)){ print("No solution!") return(NA) } rowArrangement = c() #dynamically getting the row names arrangement but with i and pivotRow swapped positions #print("Row Arrangement: ") for (k in 1:n){ if(k == i){ rowArrangement = c(rowArrangement, rownames(mat)[pivotRow]) }else if(k == pivotRow){ rowArrangement = c(rowArrangement, rownames(mat)[i]) }else{ rowArrangement = c(rowArrangement, rownames(mat)[k]) } #print(rowArrangement) } #pivoted matrix mat = mat[match(rowArrangement, rownames(mat)), ] #print("pivoted matrix:") #print(mat) } #print("Row to be normalized: ") #print(mat[i, ]) #print("Divisor: ") #print(mat[i, i]) #normalizing the pivot row mat[i, ] <- mat[i, ] / mat[i, i] #print("NORMALIZED: ") #print(mat) #subtracting the normalized row to mat[j, ] to create a diagonal matrix and extract the unknown variables for (j in 1:n){ if (i == j){ next } normalizedRow = mat[j, i] * mat[i, ] mat[j, ] <- mat[j, ] - normalizedRow #print("Resulting matrix with normalized row: ") #print(mat) } } #print("Final matrix: ") #print(mat) #saving the rhs values (solutions) to a vector x = c() for (i in 1:n){ x[i] <- mat[i, ncol(mat)] } #print("Solutions: ") #print(x) retVal = list(variables=variables, augcoeffmatrix = round(mat), solution = x) return(retVal) } GaussianMethod(lbldList) GaussJordanMethod(lbldList)
working code for exer 4
Comments