Siguiente Anterior

Sistema de ecuaciones lineales

Resolución de un sistema de ecuaciones lineales. Método de Gauss

El concepto de determinante de una matriz surge al resolver un sistema de ecuaciones lineales.

a 00 x 0 + a 01 x 1 +....+ a 0n1 x n1 = b 0 a 10 x 0 + a 11 x 1 +....+ a 1n1 x n1 = b 1 ......................... a n10 x 0 + a n11 x 1 +....+ a n1n1 x n1 = b n1

Que se expresa en forma matricial de la forma

A X=B                      (1)

donde A es la matriz de los coeficientes, B es la columna de términos constantes, y X la columna de las incógnitas. Si la matriz A es no singular, es decir, si

detA=| a 00 a 01 ... a 0n1 a 10 a 11 ... a 1n1 .... ... ... a n10 a n11 ... a n1n1 |0

el sistema de ecuaciones tiene solución única.

Si el determinante de A es no nulo, existe una matriz inversa A-1. Multiplicando a la izquierda ambos miembros de la ecuación (1) por A-1 obtenemos la columna X de las incógnitas, es decir, la solución del sistema.

A -1 AX= A -1 B X= A -1 B

Para realizar esta operación  precisamos definir nuevas funciones miembro de la clase Matriz, la que calcula el determinante, la que obtiene la matriz inversa de una dada, además de las ya definidas como el producto de una matriz por un vector.

La técnica más común para resolver el sistema de ecuaciones lineales es la de hacer uso de un procedimiento para la eliminación sucesiva de las incógnitas denominado método de Gauss. Describiremos la aplicación de este método para un sistema de cuatro ecuaciones con cuatro incógnitas, y posteriormente la generalizaremos para un sistema de n ecuaciones.

Como ya se ha mencionado, los arrays comienzan por el índice 0, en vez del índice 1 como es habitual en los libros de matemáticas, escribiremos el sistema de ecuaciones de la forma conveniente para su codificación.

a 00 x 0 + a 01 x 1 + a 02 x 2 + a 03 x 3 = b 0 a 10 x 0 + a 11 x 1 + a 12 x 2 + a 13 x 3 = b 1 a 20 x 0 + a 21 x 1 + a 22 x 2 + a 23 x 3 = b 2 a 30 x 0 + a 31 x 1 + a 32 x 2 + a 33 x 3 = b 3                  (2)

Despejamos x0 de la primera ecuación

x 0 = b 0 a 00 a 01 a 00 x 1 a 02 a 00 x 2 a 03 a 00 x 3

y la sustituimos en las restantes, quedando el sistema de tres ecuaciones con tres incógnitas

a 11 1 x 1 + a 12 1 x 2 + a 13 1 x 3 = b 1 1 a 21 1 x 1 + a 22 1 x 2 + a 23 1 x 3 = b 2 1 a 31 1 x 1 + a 32 1 x 2 + a 33 1 x 3 = b 3 1

con

a ij 1 = a ij a i0 a 0j a 00 b i 1 = b i a i0 b 0 a 00 (i,j1,2,3)

Despejamos, ahora, x1 de la primera ecuación

x 1 = b 1 1 a 11 1 a 12 1 a 11 1 x 2 a 13 1 a 11 1 x 3

y las sustituimos en las dos restantes, quedando un sistema de dos ecuaciones con dos incógnitas.

a 22 2 x 2 + a 23 2 x 3 = b 2 2 a 32 2 x 2 + a 33 2 x 3 = b 3 2

con

a ij 2 = a ij 1 a i1 1 a 1j 1 a 11 1 b i 2 = b i 1 a i1 1 b 1 1 a 11 1 (i,j2,3)

Despejamos ahora, x2 de la primera ecuación

x 2 = b 2 2 a 22 2 a 23 2 a 22 2 x 3

y la sustituimos en la ecuación restante, a partir de la cual podemos despejar x3

a 33 3 x 3 = b 3 3 x 3 = b 3 3 a 33 3

con

a ij 3 = a ij 2 a i2 2 a 2j 2 a 22 2 b i 3 = b i 2 a i2 2 b 2 2 a 22 2 (i,j3)

Por tanto, el proceso de resolver un sistema lineal de ecuaciones por el método de Gauss se reduce a la construcción de un sistema equivalente que tenga una matriz triangular.

a 00 x 0 + a 01 x 1 + a 02 x 2 + a 03 x 3 = b 0 a 11 1 x 1 + a 12 1 x 2 + a 13 1 x 3 = b 1 1 a 22 2 x 2 + a 23 2 x 3 = b 2 2 a 33 3 x 3 = b 3 3

Determinante de una matriz cuadrada

El determinante de la matriz triangular vale

| a 00 a 01 a 02 a 03 0 a 11 1 a 12 1 a 13 1 0 0 a 22 2 a 23 2 0 0 0 a 33 3 |= a 00 a 11 1 a 22 2 a 33 3

Es evidente, que el procedimiento de Gauss es posible siempre que los elementos de la diagonal principal de la matriz transformada no sean nulos, a estos elementos se denominan pivotes. Un procedimiento mejorado detectará qué pivote es nulo y procederá a intercambiar una fila por otra para evitarlo, lo que no modifica el sistema de ecuaciones, pero si el signo del determinante.

Discutiremos, ahora, el código para reducir una matriz cualesquiera a su matriz triangular equivalente por el método de Gauss. Tenemos que traducir las siguientes fórmulas a código, para cualquiera que sea la dimensión n (en el ejemplo 4) de la matriz cuadrada

a ij 1 = a ij a i0 a 0j a 00 (i,j1,2,3)k=0 a ij 2 = a ij 1 a i1 1 a 1j 1 a 11 1 (i,j2,3)k=1 a ij 3 = a ij 2 a i2 2 a 2j 2 a 22 2 (i,j3)k=2

Necesitamos tres bucles anidados: el subíndice i es la fila y j la columna de la matriz y k el orden o número de veces que se repite el proceso

        for(int k=0; k<n-1; k++){
            for(int i=k+1; i<n; i++){
                for(int j=k+1; j<n; j++){
                    a.x[i][j]-=a.x[i][k]*a.x[k][j]/a.x[k][k];
                }
            }
        }

Una vez obtenida la matriz triangular, para calcular el determinante, simplemente hay que multiplicar los elementos de la diagonal principal.

        double deter=1.0;
        for(int i=0; i<n; i++){
            deter*=a.x[i][i];
        }
        return deter;

Si no deseamos modificar la matriz original this, obtenemos una copia a de la misma,  y realizamos las transformaciones en dicha matriz copia.

    Matriz a=(Matriz)clone();

El código completo de la función miembro determinante que calcula el determinante de una matriz cuadrada es

public double determinante(){
        Matriz a=(Matriz)clone();
        for(int k=0; k<n-1; k++){
            for(int i=k+1; i<n; i++){
                for(int j=k+1; j<n; j++){
                    a.x[i][j]-=a.x[i][k]*a.x[k][j]/a.x[k][k];
                }
            }
        }
        double deter=1.0;
        for(int i=0; i<n; i++){
            deter*=a.x[i][i];
        }
        return deter;
    }

Para calcular el determinante de una matriz dada escribimos

       	double[][] a1={{1, 2, 3},{-2, -4, -5},{3, 5, 6}};
	Matriz a=new Matriz(a1);
	System.out.println("Determinante "+a.determinante());

La matriz inversa

La inversa de una matriz dada es otra matriz tal que multiplicada a la derecha o a la izquierda por la matriz dada, da la matriz unidad. Veamos como se obtiene la matriz inversa de una matriz 4 x 4, y luego generalizaremos para una matriz cuadrada de dimensión n.

( a 00 a 01 a 02 a 03 a 10 a 11 a 12 a 13 a 20 a 21 a 22 a 23 a 30 a 31 a 32 a 33 )×( x 00 x 01 x 02 x 03 x 10 x 11 x 12 x 13 x 20 x 21 x 22 x 23 x 30 x 31 x 32 x 33 )=( b 00 b 01 b 02 b 03 b 10 b 11 b 12 b 13 b 20 b 21 b 22 b 23 b 30 b 31 b 32 b 33 )

El producto de las dos matrices da lugar a los siguientes sistemas de cuatro ecuaciones con cuatro icógnitas. Los términos independientes bij son todos ceros excepto los de la diagonal principal b00=b11=b22=b33=1

Primera columna:

a 00 x 00 + a 01 x 10 + a 02 x 20 + a 03 x 30 = b 00 a 10 x 00 + a 11 x 10 + a 12 x 20 + a 13 x 30 = b 10 a 20 x 00 + a 21 x 10 + a 22 x 20 + a 23 x 30 = b 20 a 30 x 00 + a 31 x 10 + a 32 x 20 + a 33 x 30 = b 30

Segunda columna:

a 00 x 01 + a 01 x 11 + a 02 x 21 + a 03 x 31 = b 01 a 10 x 01 + a 11 x 11 + a 12 x 21 + a 13 x 31 = b 11 a 20 x 01 + a 21 x 11 + a 22 x 21 + a 23 x 31 = b 21 a 30 x 01 + a 31 x 11 + a 32 x 21 + a 33 x 31 = b 31

Tercera columna

a 00 x 02 + a 01 x 12 + a 02 x 22 + a 03 x 32 = b 02 a 10 x 02 + a 11 x 12 + a 12 x 22 + a 13 x 32 = b 12 a 20 x 02 + a 21 x 12 + a 22 x 22 + a 23 x 32 = b 22 a 30 x 02 + a 31 x 12 + a 32 x 22 + a 33 x 32 = b 32

Cuarta columna

a 00 x 03 + a 01 x 13 + a 02 x 23 + a 03 x 33 = b 03 a 10 x 03 + a 11 x 13 + a 12 x 23 + a 13 x 33 = b 13 a 20 x 03 + a 21 x 13 + a 22 x 23 + a 23 x 33 = b 23 a 30 x 03 + a 31 x 13 + a 32 x 23 + a 33 x 33 = b 33

Para el cálculo de la matriz inversa, deberemos transformar la matriz a, los términos independientes b (cada una de las columnas de la matriz unidad), y calcular las n2 incógnitas x.

La matriz de los términos independientes b es la matriz unidad, cuyos elementos son todos cero, excepto los de la diagonal principal que son unos.

       Matriz b=new Matriz(n); 
       for(int i=0; i<n; i++){
            b.x[i][i]=1.0;
        }

El código de la transformación de los elementos de la matriz es el mismo que nos sirvió para calcular el determinante de una matriz cuadrada. Le añadimos el código de la transformación de los términos independientes ( a la derecha en las fórmulas que siguen) para cada uno de los cuatro sistemas de ecuaciones s=0, 1, 2, 3

a ij 1 = a ij a i0 a 0j a 00 b i 1 = b i a i0 b 0 a 00 (i,j1,2,3)k=0 a ij 2 = a ij 1 a i1 1 a 1j 1 a 11 1 b i 2 = b i 1 a i1 1 b 1 1 a 11 1 (i,j2,3)k=1 a ij 3 = a ij 2 a i2 2 a 2j 2 a 22 2 b i 3 = b i 2 a i2 2 b 2 2 a 22 2 (i,j3)k=2

        for(int k=0; k<n-1; k++){
            for(int i=k+1; i<n; i++){
//términos independientes
                for(int s=0; s<n; s++){
                    b.x[i][s]-=a.x[i][k]*b.x[k][s]/a.x[k][k];
                }
//elementos de la matriz
                for(int j=k+1; j<n; j++){
                    a.x[i][j]-=a.x[i][k]*a.x[k][j]/a.x[k][k];
                }
            }
        }

Una vez realizadas las transformaciones, se calcula las n2 incógnitas x en orden inverso y las guardamos en la matriz c . Primero, la última incógnita y luego todas las n-1 restantes. De nuevo, el índice s representa la columna de la matriz b de los términos independientes, y de la matriz c de las incógnitas.

x 3 = b 3 a 33 x 2 = b 2 a 22 a 23 a 22 x 3 x 1 = b 1 a 11 a 12 a 11 x 2 a 13 a 11 x 3 x 0 = b 0 a 00 a 01 a 00 x 1 a 02 a 00 x 2 a 03 a 00 x 3

        for(int s=0; s<n; s++){
            c.x[n-1][s]=b.x[n-1][s]/a.x[n-1][n-1];
            for(int i=n-2; i>=0; i--){
                c.x[i][s]=b.x[i][s]/a.x[i][i];
                for(int k=n-1; k>i; k--){
                    c.x[i][s]-=a.x[i][k]*c.x[k][s]/a.x[i][i];
                }
            }
        }

Si queremos mantener la matriz original d, hacemos una copia a de dicha matriz en el cuerpo de la función inversa y realizamos las operaciones con la matriz copia dejando la original sin modificar.

        Matriz a=(Matriz)d.clone();

El código completo de esta función estática inversa que halla la matriz inversa de una matriz cuadrad es el siguiente.

    public static Matriz inversa(Matriz d){
        int n=d.n;  			//dimensión de la matriz
        Matriz a=(Matriz)d.clone();	//La matriz a es una copia de d
        Matriz b=new Matriz(n);   	//matriz de los términos independientes
        Matriz c=new Matriz(n);   	//matriz de las incógnitas
//matriz unidad
        for(int i=0; i<n; i++){
            b.x[i][i]=1.0;
        }
//transformación de la matriz y de los términos independientes
        for(int k=0; k<n-1; k++){
            for(int i=k+1; i<n; i++){
//términos independientes
                for(int s=0; s<n; s++){
                    b.x[i][s]-=a.x[i][k]*b.x[k][s]/a.x[k][k];
                }
//elementos de la matriz
                for(int j=k+1; j<n; j++){
                    a.x[i][j]-=a.x[i][k]*a.x[k][j]/a.x[k][k];
                }
            }
        }
//cálculo de las incógnitas, elementos de la matriz inversa
        for(int s=0; s<n; s++){
            c.x[n-1][s]=b.x[n-1][s]/a.x[n-1][n-1];
            for(int i=n-2; i>=0; i--){
                c.x[i][s]=b.x[i][s]/a.x[i][i];
                for(int k=n-1; k>i; k--){
                    c.x[i][s]-=a.x[i][k]*c.x[k][s]/a.x[i][i];
                }
            }
        }
        return c;
    }

Sistema de ecuaciones lineales

El sistema de ecuaciones (2) se puede escribir de forma matricial

( a 00 a 01 a 02 a 03 a 10 a 11 a 12 a 13 a 20 a 21 a 22 a 23 a 30 a 31 a 32 a 33 )×( x 0 x 1 x 2 x 3 )=( b 0 b 1 b 2 b 3 )

A la izquierda tenemos la matriz A de los coeficientes, el vector X de los incógnitas, y a la derecha, el vector B de los términos independientes. Para obtener el vector de las incógnitas, basta calcular la matriz inversa de la matriz de los coeficientes y multiplicarla por el vector de los términos independientes.

X= A -1 B

Sea el siguiente sistema lineal de tres ecuaciones con tres incógnitas

3 x 0 x 1 =5 2 x 0 + x 1 + x 2 =0 2 x 0 x 1 +4 x 2 =15

        //coeficientes de las incógnitas
	double[][] m1={{3, -1, 0}, {-2, 1, 1}, {2, -1, 4}};
        Matriz coef=new Matriz(m1);
	//términos independientes
        double[] n1={5, 0, 15};
        Vector ter=new Vector(n1);
        Vector solucion=Matriz.producto(Matriz.inversa(coef), ter);
        System.out.println("solución "+solucion);

Resolver el siguiente sistema lineal de cuatro ecuaciones con cuatro incógnitas

7.9 x 0 +5.6 x 1 +5.7 x 2 7.2 x 3 =6.68 8.5 x 0 4.8 x 1 +0.8 x 2 +3.5 x 3 =9.95 4.3 x 0 +4.2 x 1 3.2 x 2 +9.3 x 3 =8.6 3.2 x 0 1.4 x 1 8.9 x 2 +3.3 x 3 =1

        double[][] m2={{7.9, 5.6, 5.7, -7.2}, {8.5, -4.8, 0.8, 3.5},
		{4.3, 4.2, -3.2, 9.3}, {3.2, -1.4, -8.9, 3.3}};
        coef=new Matriz(m2);
        double[] n2={6.68, 9.95, 8.6, 1};
        ter=new Vector(n2);
        solucion=Matriz.producto(Matriz.inversa(coef), ter);
        System.out.println("solución "+solucion);
Siguiente Anterior