1.- CÓDIGO FUENTE. Ahora implementamos el método de Jacobi para resolver un sistema de ecuaciones lineales de
n
aproximando la solución mediante varias iteraciones sucesivas. El
x n
lenguaje de programación utilizado será Java. Para ello, hemos modificado la clase Ma- que implementa el método en cuestión, además de algunos métodos auxiliares triz.java que para que el usuario ingrese las entradas de la matriz desde el teclado y ésta se imprima con un formato entendible, así como también unos métodos para restar vectores y hallar la norma de un vector, los cuales nos serán útiles a la hora de comprobar el criterio de detención. A continuación se muestra el código fuente: 1 2 import java.util.Scanner; 3 4 class Matriz { 5 6 int filas ; 7 int columnas ; 8 double m[][]; 9 public Matriz( double m[][]) { 10 11 this.m = m; 12 this.filas = m.lengt m.length h; 13 this.columnas = m[0]. length ; 14 15 } 16 17 set setFilas (int filas) { public void 18 this.filas = filas ; 19 } 20 21 set setColumnas (int columnas ) { public void 22 this.columnas = columnas ; 23 } 24 25 public int getFilas() { 26 return this.filas ; 27 } 28 29 public int getColumnas () { 30 return this.columnas ; 31 } 32 33 imprimirMatriz() { imprimirMatriz() public void 34 for (int i = 0; i < m.length; i++) { 35 for (int j = 0; j < m[i]. length ; j++) { 36 37 if (m[i][j] >= 0) { 38 System.out.printf("\t%s%.2f", " ", m[i][j]); 39 } else { 40 System.out.printf("\t%.2f", m[i][j]); 41 } 1
42 43 } 44 System. out.println(""); 45 } 46 System. out.println(""); 47 System. out.println(""); 48 } 49 50 llenarMatriz() { llenarMatriz() public void 51 Scanner entrada = new Scanner(System.in); 52 for (int i = 0; i < m.length; i++) { 53 for (int j = 0; j < m[i]. length ; j++) { 54 System. out.print("Ingrese el elemento [" + (i + 1) + "," + (j + 1) + "]: "); 55 m[i][j] = entrada.next Int(); 56 } 57 } 58 System. out.println(""); 59 } public void void llenarVector llenarVector (double double v v[]) { Scanner entrada = new Scanner (System .in); int i i=0; i for (int
System .out.println (""); }
public double[] restaVectores (double double v1 v1[], double double v2 v2[]) { double resta double resta [] = new double[v1.length ]; int i i=0; i for( for (int
public double double normaVector normaVector (double double v v[]) { double norma double norma = 0.0; double suma double suma = 0.0;
2
int i i=0; i for( for (int
norma = Math.sqrt(suma); return norma ; }
/** * Método que resuelve un sistema de ecuaciones mediante el método de Jacobi * @param b - Vector columna b. * @param epsilon - Criterio de detención. * @return - El vector de solución aproximado. */ public double[] jacobi(double double b b[], double double epsilon epsilon ) { int N int N = m.length ; //Inicializamos en vector de aproximacion inicial en 0.0. double X_Anterior double X_Anterior [] = new double[N]; int i i=0; i for( for (int
//Revisa si se cumple con el criterio de detención while((norma /normaVector (X_Actual )) >= epsilon ) { while(( sumaAux = 0.0; contadorIteraciones ++; System .out.println ("Iteración " + contadorIteraciones + ":"); //Actualizamos el vector de aproximación inicial int i i=0; i for( for (int
System .out.println ("X["+(i+1)+"]: " + X_Actual [i]); sumaAux = 0.0; } System .out.println (""); System .out.println ("");
norma = normaVector (restaVectores (X_Actual , X_Anterior )); }
System .out.println (""); return X_Actual ; }
public static void void main main(String [] args) { Scanner entrada = new Scanner (System .in); System .out.print("\nIngrese la dimensión de la matriz: " ); int dim int dim = entrada .nextInt (); double A double A[][] = new double [dim][dim]; Matriz matrix = new Matriz(A); matrix .llenarMatriz (); System .out.println ("\nLa matriz ingresada A es: \n" ); matrix .imprimirMatriz (); double b[] = new double [dim]; double b System .out.println ("\nIngrese el vector b: " ); matrix .llenarVector (b); double epsilon double epsilon ; System .out.print("\nIngrese el criterio de detención: " ); epsilon = entrada .nextDouble (); System .out.println ("\nAproximando la solución del sistema de ecuaciones " + "por el Método de Jacobi... " ); System .out.println ("\nEl vector de aproximación inicial es [0, 0, 0, 0]\n"); matrix .jacobi (b, epsilon ); }
2.- PRUEBA Y EJECUCIÓN. Probamos el algoritmo resolviendo el siguiente sistema de ecuaciones de 4x4:
10 − 1 + 2 + 0 = 6 −1 +11 − 1 + 3 = 25 2 − 1 −10 − 1 =−11 0 + 3 − 1 + 8 = 15 { 4
Durante la ejecución el programa solicita al usuario ingresar la dimensión del sistema de ecuaciones (4 en este caso), la matriz de coeficientes, los coeficientes del vector b, así como también el criterio de detención, que en este caso será de € = 1x10
5
-5:
Ahora el programa procederá a ejecutar el algoritmo de Jacobi, resolviendo el sistema para el vector b. Tomaremos como vector de aproximación inicial a (0,0,0,0). El programa imprimirá en pantalla todas las iteraciones sucesivas que se vayan obteniendo hasta llegar al criterio de detención.
6
7
Observemos que la factorización buscada es:
1 2 3 −1
1 1 −1 2
0 −1 −1 3
3 1 0 1 = 2 1 2 3 4 −1 − 1 −3
8
0 0 1 0
0 1 1 0 ∗ 0 −1 0 0 0 1 0 0
0 −1 3 0
3 −5 13 −13
Con la última iteración, observamos que la solución aproximada es:
X[1]: 0.999998155430544 X[2]: 2.00000292370118
2
≈
X[3]: -1.0000023015887396 X[4]: 1.0000034417997814
9
1
≈
-1
≈
1
≈