def gestionGaussJordan (matriz, matriz_inversa, vector_b, tolerancia, cifras, iteraciones, area_texto): try: maximo_iteraciones = (int)(iteraciones) tolerancia_soluciones = abs((float)(tolerancia)) cifras_redondeo = (int)(cifras) area_texto.insert('end', "\nSe continuará con el proceso.\n") area_texto.insert('end', '\n') soluciones = calcularSolucionesGJ(matriz, matriz_inversa, vector_b, tolerancia_soluciones, cifras_redondeo, maximo_iteraciones, area_texto) area_texto.insert('end', '\n') area_texto.insert('end', "Soluciones del sistema.") area_texto.insert('end', '\n') imprimirMatriz(soluciones, area_texto) area_texto.insert('end', '\n') except ValueError: area_texto.insert('end', "Ha ocurrido un error al leer alguno de los datos. Por favor revise los campos de texto.") except NumeroCifrasRedondeoExcepcion as exc: area_texto.insert('end', exc.mensaje) except NoHaySolucionUnicaExcepcion as exc2: area_texto.insert('end', exc2.mensaje) except DimensionNoCompatibleExcepcion as exc3: area_texto.insert('end', exc3.mensaje) except IteracionesInvalidasExcepcion as exc4: area_texto.insert('end', exc4.mensaje) except MetodoFallidoExcepcion as exc5: area_texto.insert('end', exc5.mensaje) except Exception as exc6: area_texto.insert('end', "Ha ocurrido un error: " + exc6.message)
def gestionGaussSeidel (matriz, vector_b, iteraciones, tolerancia, area_texto): try: maximo_iteraciones = (int)(iteraciones) tolerancia_soluciones = abs((float)(tolerancia)) area_texto.insert('end', "\nSe continuará con el proceso.\n") area_texto.insert('end', '\n') soluciones = gaussSeidel(matriz, vector_b, tolerancia_soluciones, maximo_iteraciones, area_texto) area_texto.insert('end', '\n') area_texto.insert('end', "Soluciones del sistema original.") area_texto.insert('end', '\n') imprimirMatriz(soluciones, area_texto) area_texto.insert('end', '\n') except ValueError: area_texto.insert('end', "Ha ocurrido un error al leer alguno de los datos. Por favor revise los campos de texto.") except NoHaySolucionUnicaExcepcion as exc: area_texto.insert('end', exc.mensaje) except DimensionNoCompatibleExcepcion as exc2: area_texto.insert('end', exc2.mensaje) except IteracionesInvalidasExcepcion as exc3: area_texto.insert('end', exc3.mensaje) except MetodoFallidoExcepcion as exc4: area_texto.insert('end', exc4.mensaje) except Exception as exc5: area_texto.insert('end', "Ha ocurrido un error: " + exc5.message)
def gestionGaussPivoteo (matriz, area_texto): try: area_texto.insert('end', "\nSe continuará con el proceso.\n") #Separa la matriz aumentada en la matriz asociada al SEL y el vector b de términos independientes. vector_b = [[matriz[i][len(matriz)]] for i in range(0, len(matriz))] for i in range(0, len(matriz)): del matriz[i][len(matriz)] area_texto.insert('end', '\n') soluciones = sustitucionHaciaAtras(matriz, vector_b) area_texto.insert('end', '\n') area_texto.insert('end', "Soluciones del sistema original.") area_texto.insert('end', '\n') imprimirMatriz(soluciones, area_texto) area_texto.insert('end', '\n') except ValueError: area_texto.insert('end', "Ha ocurrido un error al leer alguno de los datos. Por favor revise los campos de texto.") except Exception as exc: area_texto.insert('end', "Ha ocurrido un error: " + exc.message)
def gestionVerificacionDominanciaDiagonal (archivo, area_texto): area_texto.delete('1.0', 'end') #El bloque se encarga de cerrar automáticamente el archivo pase lo que pase. try: with open(archivo, 'r') as archivo_matriz: numero_ecuaciones = int(archivo_matriz.readline()) if numero_ecuaciones >= 1: matriz = [list(map(float,line.split(' '))) for line in archivo_matriz if line.strip() != ""] area_texto.insert('end', "Sistema con ", str(numero_ecuaciones), " ecuaciones.") area_texto.insert('end', "Matriz capturada.") area_texto.insert('end', '\n') imprimirMatriz(matriz, area_texto) area_texto.insert('end', '\n') #Separa la matriz aumentada en la matriz asociada al SEL y el vector b de términos independientes. vector_b = [[matriz[i][numero_ecuaciones]] for i in range(0, numero_ecuaciones)] for i in range(0, len(matriz)): del matriz[i][numero_ecuaciones] if verificarDominanciaDiagonal(matriz, vector_b): area_texto.insert('end', "La matriz está bien condicionada.\n") area_texto.insert('end', "Matriz luego de la verificación:\n") imprimirMatriz(matriz, area_texto) else: mostrarAviso("La matriz no es diagonalmente dominante.\nSi quiere continuar, introduzca el máximo de iteraciones y oprima el botón.") return matriz, vector_b else: area_texto.insert('end', "El número de ecuaciones capturado es menor a 1, por favor revise su archivo de texto.") except IOError: area_texto.insert('end', "Ha ocurrido un error al manejar el archivo de texto. Puede ser que el archivo no exista o haya faltado la extensión .txt. ") area_texto.insert('end', "Por favor revise el campo de texto.") except ValueError: area_texto.insert('end', "Ha ocurrido un error al leer alguna de las entradas de la matriz o alguno de los datos de los campos. Se detectó un valor no numérico. ") area_texto.insert('end', "Por favor revise el archivo de texto.") except Exception as exc4: area_texto.insert('end', "Ha ocurrido un error: " + exc4.message)
def gestionGaussSimple (archivo, tolerancia, cifras, iteraciones, area_texto): area_texto.delete('1.0', 'end') #El bloque se encarga de cerrar automáticamente el archivo pase lo que pase. try: tolerancia_soluciones = abs((float)(tolerancia)) cifras_redondeo = (int)(cifras) maximo_iteraciones = (int)(iteraciones) with open(archivo, 'r') as archivo_matriz: numero_ecuaciones = int(archivo_matriz.readline()) if numero_ecuaciones >= 1: matriz = [list(map(float,line.split(' '))) for line in archivo_matriz if line.strip() != ""] area_texto.insert('end', '\n') area_texto.insert('end', "Sistema con ", str(numero_ecuaciones), " ecuaciones. \nMatriz capturada.") area_texto.insert('end', '\n') imprimirMatriz(matriz, area_texto) area_texto.insert('end', '\n') redondearEntradasMatriz(matriz, cifras_redondeo) area_texto.insert('end', "Matriz capturada con redondeo aplicado a cada entrada.\n") imprimirMatriz(matriz, area_texto) area_texto.insert('end', '\n') #Separa la matriz aumentada en la matriz asociada al SEL y el vector b de términos independientes. vector_b = [[matriz[i][numero_ecuaciones]] for i in range(0, numero_ecuaciones)] for i in range(0, len(matriz)): del matriz[i][numero_ecuaciones] solucion = eliminacionGaussianaSimple(matriz, vector_b, tolerancia_soluciones, cifras_redondeo, maximo_iteraciones, area_texto) area_texto.insert('end', "\nSoluciones del sistema:\n") imprimirMatriz(solucion, area_texto) else: area_texto.insert('end', "El número de ecuaciones capturado es menor a 1, por favor revise su archivo de texto.") except IOError: area_texto.insert('end', "Ha ocurrido un error al manejar el archivo de texto. Puede ser que el archivo no exista o haya faltado la extensión .txt. ") area_texto.insert('end', "Por favor revise el campo de texto.") except ValueError: area_texto.insert('end', "Ha ocurrido un error al leer alguna de las entradas de la matriz o alguno de los datos de los campos. Se detectó un valor no numérico.") area_texto.insert('end', "Por favor revise el archivo de texto.") except NoHaySolucionUnicaExcepcion as exc: area_texto.insert('end', exc.mensaje) except DimensionNoCompatibleExcepcion as exc2: area_texto.insert('end', exc2.mensaje) except NumeroCifrasRedondeoExcepcion as exc3: area_texto.insert('end', exc3.mensaje) except IteracionesInvalidasExcepcion as exc4: area_texto.insert('end', exc4.mensaje) except MetodoFallidoExcepcion as exc5: area_texto.insert('end', exc5.mensaje) except Exception as exc6: area_texto.insert('end', "Ha ocurrido un error: " + exc6.message)
def gestionVerificacionDeterminante (archivo, tolerancia, area_texto): area_texto.delete('1.0', 'end') #El bloque se encarga de cerrar automáticamente el archivo pase lo que pase. try: with open(archivo, 'r') as archivo_matriz: numero_ecuaciones = int(archivo_matriz.readline()) if numero_ecuaciones >= 1: matriz = [list(map(float,line.split(' '))) for line in archivo_matriz if line.strip() != ""] area_texto.insert('end', "Sistema con ", str(numero_ecuaciones), " ecuaciones.\nMatriz capturada.\n") imprimirMatriz(matriz, area_texto) area_texto.insert('end', '\n') escalarMatriz(matriz) area_texto.insert('end', "\nMatriz escalada.\n") imprimirMatriz(matriz, area_texto) area_texto.insert('end', '\n') tolerancia_determinante = (float)(tolerancia) """ 1. Devuelve la matriz triangular superior. 2. Devuelve el numero de intercambios de renglon. """ matriz_ts = eliminacionGaussianaPivoteoParcial(matriz) area_texto.insert('end', "\nMatriz triangular superior luego de ser aplicada eliminación gaussiana con pivoteo parcial.\n") imprimirMatriz(matriz_ts[0], area_texto) area_texto.insert('end', '\n') determinante = calcularDeterminanteTriangular(matriz_ts[0], matriz_ts[1]) area_texto.insert('end', "\nEl determinante de la matriz triangular superior es: " + str(determinante) + "\n") if abs(determinante) < tolerancia_determinante: mostrarAviso("El sistema está mal condicionado. Si de todos modos quiere continuar con el proceso, oprima el botón Calcular.") return matriz_ts[0] else: area_texto.insert('end', "El número de ecuaciones capturado es menor a 1, por favor revise su archivo de texto.") except IOError: area_texto.insert('end', "Ha ocurrido un error al manejar el archivo de texto. Puede ser que el archivo no exista o haya faltado la extensión .txt. ") area_texto.insert('end', "Por favor revise el campo de texto.") except ValueError: area_texto.insert('end', "Ha ocurrido un error al leer alguna de las entradas de la matriz o alguno de los datos de los campos. Se detectó un valor no numérico. ") area_texto.insert('end', "Por favor revise el archivo de texto.") except NoHaySolucionUnicaExcepcion as exc: area_texto.insert('end', exc.mensaje) except Exception as exc2: area_texto.insert('end', "Ha ocurrido un error: " + exc2.message)
def gestionFactorizacion (archivo, area_texto): area_texto.delete('1.0', 'end') #El bloque se encarga de cerrar automáticamente el archivo pase lo que pase. try: with open(archivo, 'r') as archivo_matriz: numero_ecuaciones = int(archivo_matriz.readline()) if numero_ecuaciones >= 1: matriz = [list(map(float,line.split(' '))) for line in archivo_matriz if line.strip() != ""] tolerancia_cercania_cero = 0.0001 area_texto.insert('end', "Sistema con ", str(numero_ecuaciones), " ecuaciones.") area_texto.insert('end', "\nMatriz capturada.") area_texto.insert('end', '\n') imprimirMatriz(matriz, area_texto) area_texto.insert('end', '\n') #Separa la matriz aumentada en la matriz asociada al SEL y el vector b de términos independientes. vector_b = [[matriz[i][numero_ecuaciones]] for i in range(0, numero_ecuaciones)] for i in range(0, len(matriz)): del matriz[i][numero_ecuaciones] factorizacion = doolittle(matriz, vector_b, tolerancia_cercania_cero) matriz_l = factorizacion[0] matriz_u = factorizacion[1] area_texto.insert('end', '\n') area_texto.insert('end', "Matriz triangular inferior (L)") area_texto.insert('end', '\n') imprimirMatriz(matriz_l, area_texto) area_texto.insert('end', '\n') area_texto.insert('end', '\n') area_texto.insert('end', "Matriz triangular superior (U)") area_texto.insert('end', '\n') imprimirMatriz(matriz_u, area_texto) area_texto.insert('end', '\n') vector_y = sustitucionHaciaAdelante(matriz_l, vector_b) area_texto.insert('end', '\n') area_texto.insert('end', "Soluciones del sistema LY = b.") area_texto.insert('end', '\n') imprimirMatriz(vector_y, area_texto) area_texto.insert('end', '\n') soluciones = sustitucionHaciaAtras(matriz_u, vector_y) area_texto.insert('end', '\n') area_texto.insert('end', "Soluciones del sistema original.") area_texto.insert('end', '\n') imprimirMatriz(soluciones, area_texto) area_texto.insert('end', '\n') else: area_texto.insert('end', "El número de ecuaciones capturado es menor a 1, por favor revise su archivo de texto.") except IOError: area_texto.insert('end', "\nHa ocurrido un error al manejar el archivo de texto. Puede ser que el archivo no exista o haya faltado la extensión .txt. ") area_texto.insert('end', "Por favor revise el campo de texto.") except ValueError: area_texto.insert('end', "\nHa ocurrido un error al leer alguna de las entradas de la matriz o alguno de los datos de los campos. Se detectó un valor no numérico.") area_texto.insert('end', "Por favor revise el archivo de texto.") except NoHaySolucionUnicaExcepcion as exc: area_texto.insert('end', exc.mensaje) except DimensionNoCompatibleExcepcion as exc2: area_texto.insert('end', exc2.mensaje) except MetodoFallidoExcepcion as exc3: area_texto.insert('end', exc3.mensaje) except Exception as exc4: area_texto.insert('end', "\nHa ocurrido un error: " + exc4.message)
def gestionVerificacionIdentidad (archivo, cifras, tolerancia, area_texto): area_texto.delete('1.0', 'end') #El bloque se encarga de cerrar automáticamente el archivo pase lo que pase. try: with open(archivo, 'r') as archivo_matriz: numero_ecuaciones = int(archivo_matriz.readline()) if numero_ecuaciones >= 1: matriz = [list(map(float,line.split(' '))) for line in archivo_matriz if line.strip() != ""] cifras_redondeo = (int)(cifras) redondearEntradasMatriz(matriz, cifras_redondeo) area_texto.insert('end', "Sistema con ", str(numero_ecuaciones), " ecuaciones.") area_texto.insert('end', "Matriz capturada con redondeo aplicado a cada entrada.") area_texto.insert('end', '\n') imprimirMatriz(matriz, area_texto) area_texto.insert('end', '\n') escalarMatrizRedondeo(matriz, cifras_redondeo) area_texto.insert('end', "Matriz escalada.") area_texto.insert('end', '\n') imprimirMatriz(matriz, area_texto) area_texto.insert('end', '\n') #Separa la matriz aumentada en la matriz asociada al SEL y el vector b de términos independientes. vector_b = [[matriz[i][numero_ecuaciones]] for i in range(0, numero_ecuaciones)] for i in range(0, len(matriz)): del matriz[i][numero_ecuaciones] matriz_inversa = invertirMatrizRedondeo(matriz, cifras_redondeo) area_texto.insert('end', "Matriz inversa.") area_texto.insert('end', '\n') imprimirMatriz(matriz_inversa, area_texto) area_texto.insert('end', '\n') tolerancia_acondicionamiento = (float)(tolerancia) identidad = multiplicarMatricesRedondeo(matriz_inversa, matriz, cifras_redondeo) area_texto.insert('end', "Matriz identidad.") area_texto.insert('end', '\n') imprimirMatriz(identidad, area_texto) area_texto.insert('end', '\n') if verificarErrorIdentidad(identidad, tolerancia_acondicionamiento, cifras_redondeo): area_texto.insert('end', "La matriz está bien condicionada.\n") else: mostrarAviso("La matriz está mal condicionada.\nSi quiere continuar, introduzca el máximo de iteraciones y la tolerancia del error en las soluciones, y oprima el botón Calcular.") return matriz, matriz_inversa, vector_b else: area_texto.insert('end', "El número de ecuaciones capturado es menor a 1, por favor revise su archivo de texto.") except IOError: area_texto.insert('end', "Ha ocurrido un error al manejar el archivo de texto. Puede ser que el archivo no exista o haya faltado la extensión .txt. ") area_texto.insert('end', "Por favor revise el campo de texto.") except ValueError: area_texto.insert('end', "Ha ocurrido un error al leer alguna de las entradas de la matriz o alguno de los datos de los campos. Se detectó un valor no numérico. ") area_texto.insert('end', "Por favor revise el archivo de texto.") except NumeroCifrasRedondeoExcepcion as exc: area_texto.insert('end', exc.mensaje) except NoHaySolucionUnicaExcepcion as exc2: area_texto.insert('end', exc2.mensaje) except Exception as exc4: area_texto.insert('end', "Ha ocurrido un error: " + exc4.message)
def eliminacionGaussianaSimple(matriz, vector_b, tolerancia, cifras_redondeo, maximo_iteraciones, area_texto): if maximo_iteraciones < 1: raise IteracionesInvalidasExcepcion if cifras_redondeo < 2: raise NumeroCifrasRedondeoExcepcion matriz_auxiliar = copiarMatriz( matriz) #Guarda la matriz original para su uso posterior. vector_b_auxiliar = copiarMatriz(vector_b) vector_soluciones = [[0] for renglon in matriz] vector_soluciones_aux = [[0] for renglon in matriz] for numero_iteraciones in range(1, maximo_iteraciones + 1): #Realiza la eliminación simple. for i in range(0, len(matriz) - 1): p = encontrarRenglonMenor(matriz, i) if p == -1: raise NoHaySolucionUnicaExcepcion elif p != i: permutarRenglones(matriz, i, p, len(matriz) + 1) permutarRenglones(vector_b, i, p, len(matriz) + 1) for j in range(i + 1, len(matriz)): multiplicador = redondear( redondear(matriz[j][i], cifras_redondeo) / redondear(matriz[i][i], cifras_redondeo), cifras_redondeo) operacionElementalRenglonRedondeo(matriz, j, -multiplicador, i, cifras_redondeo) operacionElementalRenglonRedondeo(vector_b, j, -multiplicador, i, cifras_redondeo) # !!!!!! area_texto.insert( 'end', "Matriz después de eliminación simple en la iteración " + str(numero_iteraciones) + ".\n") imprimirMatriz(matriz, area_texto) area_texto.insert( 'end', "Términos independientes después de eliminación simple en la iteración " + str(numero_iteraciones) + ".\n") imprimirMatriz(vector_b, area_texto) if matriz[len(matriz) - 1][len(matriz) - 1] == 0: raise NoHaySolucionUnicaExcepcion vector_soluciones_aux = sustitucionHaciaAtrasRedondeo( matriz, vector_b, cifras_redondeo) #Calcula el vector b aproximado. for i in range(0, len(vector_soluciones_aux)): vector_soluciones[i][0] = vector_soluciones_aux[i][0] # !!!! vector_b_aproximado = multiplicarMatricesRedondeo( matriz_auxiliar, vector_soluciones, cifras_redondeo) vector_errores = restarMatricesRedondeo(vector_b_aproximado, vector_b_auxiliar, cifras_redondeo) area_texto.insert( 'end', "\nAproximación de las soluciones del SEL actual en la iteración " + str(numero_iteraciones) + "\n") imprimirMatriz(vector_soluciones, area_texto) area_texto.insert('end', "\nVector de errores de la iteración actual:\n") imprimirMatriz(vector_errores, area_texto) if encontrarNumeroMayorMatriz(vector_errores) <= tolerancia: return vector_soluciones #Resetea la matriz. matriz = copiarMatriz(matriz_auxiliar) #Reemplaza los términos independientes de la matriz actual con los errores nuevos. for i in range(0, len(vector_b)): vector_b[i][0] = vector_errores[i][0] area_texto.insert( 'end', "\nMatriz que se usará en la siguiente iteración.\n") imprimirMatriz(matriz, area_texto) area_texto.insert('end', '\n') raise MetodoFallidoExcepcion
def calcularSolucionesGJ(matriz, matriz_inversa, vector_independiente, tolerancia, cifras_redondeo, maximo_iteraciones, area_texto): if cifras_redondeo < 2: raise NumeroCifrasRedondeoExcepcion if maximo_iteraciones < 1: raise IteracionesInvalidasExcepcion #A^(-1)b = x. soluciones = multiplicarMatricesRedondeo(matriz_inversa, vector_independiente, cifras_redondeo) #Ax = b vector_b_aproximado = multiplicarMatricesRedondeo(matriz, soluciones, cifras_redondeo) vector_errores = restarMatricesRedondeo(vector_b_aproximado, vector_independiente, cifras_redondeo) area_texto.insert('end', "\nIteración 1.\n") area_texto.insert('end', "Aproximación actual a las soluciones:\n") imprimirMatriz(soluciones, area_texto) area_texto.insert('end', "Vector de términos independientes actual:\n") imprimirMatriz(vector_b_aproximado, area_texto) area_texto.insert('end', "Vector de errores actual:\n") imprimirMatriz(vector_errores, area_texto) area_texto.insert('end', '\n') if (encontrarNumeroMayorMatriz(vector_errores) <= tolerancia): return soluciones for iteracion in range(2, maximo_iteraciones + 1): soluciones_auxiliares = multiplicarMatricesRedondeo( matriz_inversa, vector_errores, cifras_redondeo) soluciones = restarMatricesRedondeo(soluciones, soluciones_auxiliares, cifras_redondeo) vector_b_aproximado = multiplicarMatricesRedondeo( matriz, soluciones, cifras_redondeo) vector_errores = restarMatricesRedondeo(vector_b_aproximado, vector_independiente, cifras_redondeo) area_texto.insert('end', "\nIteración " + str(iteracion) + ".\n") area_texto.insert('end', "Aproximación actual a las soluciones:\n") imprimirMatriz(soluciones, area_texto) area_texto.insert('end', "Vector de términos independientes actual:\n") imprimirMatriz(vector_b_aproximado, area_texto) area_texto.insert('end', "Vector de errores actual:\n") imprimirMatriz(vector_errores, area_texto) area_texto.insert('end', '\n') if (encontrarNumeroMayorMatriz(vector_errores) <= tolerancia): return soluciones raise MetodoFallidoExcepcion