示例#1
0
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)
示例#2
0
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)
示例#3
0
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)
示例#4
0
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)
示例#5
0
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)
示例#6
0
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)
示例#7
0
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)
示例#8
0
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)
示例#9
0
文件: exacto.py 项目: rexemin/CAMEN
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
示例#10
0
文件: exacto.py 项目: rexemin/CAMEN
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