1.- CÓDIGO FUENTE.
1.- CÓDIGO FUENTE.
Ahora implementamos el
Ahora implementamos el
método de Jacobi
método de Jacobi
para resolver un sistema de ecuaciones
para resolver un sistema de ecuaciones
lineales de
lineales de
nn x x n naproximando la solución mediante varias iteraciones sucesivas. El
aproximando la solución mediante varias iteraciones sucesivas. El
lenguaje de programación utilizado será Java. Para ello, hemos modificado la clase
lenguaje de programación utilizado será Java. Para ello, hemos modificado la clase
Ma-
Ma-
triz.java
triz.java
que implementa el método en cuestión, además de
que implementa el método en cuestión, además de algunos métodos auxiliares
algunos métodos auxiliares
para que el usuario ingrese las entradas de la matriz desde
para que el usuario ingrese las entradas de la matriz desde el teclado y ésta se imprima
el teclado y ésta se imprima
con un formato entendible, así como también unos métodos para restar vectores y hallar
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
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:
detención. A continuación se muestra el código fuente:
11 2
2 importimport java.util.Scanner; java.util.Scanner; 3
3 4
4 classclass Matriz {Matriz { 5
5 6
6 intint filasfilas;; 7
7 intint columnascolumnas;; 8
8 doubledouble m[][]; m[][]; 9
9 10
10 public public Matriz( Matriz(doubledouble m[][]) { m[][]) { 11
11 thisthis.m = m;.m = m; 12
12 thisthis..filasfilas = = m.lengt m.lengthh;; 13
13 thisthis..columnascolumnas = m[0]. = m[0].lengthlength;; 14 14 15 } 15 } 16 16 17
17 public public void void set setFilasFilas((intint filasfilas) {) { 18
18 thisthis..filasfilas = = filasfilas;;
19 }
19 }
20 20 21
21 public public void void set setColumnasColumnas((intint columnascolumnas) {) { 22
22 thisthis..columnascolumnas = = columnascolumnas;;
23 }
23 }
24 24 25
25 public public intint get getFilasFilas() {() {
26 return
26 return thisthis..filasfilas;;
27 }
27 }
28 28 29
29 public public intint get getColumnasColumnas() {() {
30 return
30 return thisthis..columnascolumnas;;
31 }
31 }
32 32 33
33 public public void void imprimirMatriz() { imprimirMatriz() { 34
34 forfor ( (intint i = 0; i < i = 0; i < m.length m.length; i++) {; i++) { 35
35 forfor ( (intint j = 0; j < m[i]. j = 0; j < m[i].lengthlength; j++) {; j++) { 36
36 37
37 ifif (m[i][j] >= 0) { (m[i][j] >= 0) {
38 System.
38 System.outout.pr.printintf("\t%s%.2f", " ", m[i][j]);f("\t%s%.2f", " ", m[i][j]);
39 }
39 } elseelse { {
40 System.
42 42
43 }
43 }
44 System.
44 System.outout.pr.printintln("");ln("");
45 }
45 }
46 System.
46 System.outout.pr.printintln("");ln("");
47 System.
47 System.outout.pr.printintln("");ln("");
48 }
48 }
49 49 50
50 public public void void llenarMatriz() { llenarMatriz() { 51
51 Scanner Scanner entrada entrada == newnew Scanner(System.in); Scanner(System.in); 52
52 forfor ( (intint i = 0; i < i = 0; i < m.length m.length; i++) {; i++) { 53
53 forfor ( (intint j = 0; j < m[i]. j = 0; j < m[i].lengthlength; j++) {; j++) {
54 System.
54 System.outout.pr.printint("Ingrese el elemento [" + (i + 1) +("Ingrese el elemento [" + (i + 1) + "," + (j + 1) + "]: ");
"," + (j + 1) + "]: "); 55
55 m[i][j] m[i][j] = = entrada.nextentrada.nextIntInt();();
56 }
56 }
57 }
57 }
58 System.
58 System.outout.pr.printintln("");ln("");
59 }
59 }
public
public voidvoid llenarVector llenarVector((doubledouble v v[])[]) {{
Scanner entrada
Scanner entrada == newnew Scanner Scanner((SystemSystem..inin););
for
for ((intint i i==00;; i i < <vv..lengthlength;; i i++)++) {{
System
System..outout..printprint(("Ingrese el elemento [""Ingrese el elemento ["+(+(ii++11)+)+"]: ""]: "););
v
v[[ii]] == entrada entrada..nextDoublenextDouble();();
}
}
System
System..outout..printlnprintln((""""););
}
}
public
public doubledouble[][] restaVectores restaVectores((doubledouble v1 v1[],[], doubledouble v2 v2[])[]) {{
double
double resta resta[][] == newnew doubledouble[[v1v1..lengthlength];];
for
for((intint i i==00;; i i < <restaresta..lengthlength;; i i++)++) {{
resta
resta[[ii]] == v1 v1[[ii]] -- v2 v2[[ii];];
}
}
return
return resta; resta;
}
}
public
public doubledouble normaVector normaVector((doubledouble v v[])[]) {{
double
double norma norma == 0.00.0;;
double
for
for((intint i i==00;; i i < <vv..lengthlength;; i i++)++) {{
suma
suma +=+= Math Math..powpow((vv[[ii],], 22););
}
}
norma
norma == Math. Math.sqrtsqrt((sumasuma););
return
return norma; norma;
}
}
/**
/**
* Método que resuelve un sistema de ecuaciones mediante el método de
* Método que resuelve un sistema de ecuaciones mediante el método de
Jacobi
Jacobi
*
* @param @param b b - - Vector Vector columna columna b.b.
* @param epsilon - Criterio de detención.
* @param epsilon - Criterio de detención.
* @return - El vector de solución aproximado.
* @return - El vector de solución aproximado.
*/
*/
public
public doubledouble[][] jacobi jacobi((doubledouble b b[],[], doubledouble epsilon) epsilon) {{
int
int N N == m m..lengthlength;;
//Inicializamos en vector de aproximacion inicial en 0.0.
//Inicializamos en vector de aproximacion inicial en 0.0.
double
double X_Anterior X_Anterior[][] == newnew doubledouble[[NN];];
for
for((intint i i==00;; i i < <X_AnteriorX_Anterior..lengthlength;; i i++)++) {{
X_Anterior
X_Anterior[[ii]] == 0.00.0;;
}
}
double
double X_Actual X_Actual[][] == newnew doubledouble[[NN];];
for
for((intint i i==00;; i i < <X_ActualX_Actual..lengthlength;; i i++)++) {{
X_Actual
X_Actual[[ii]] == 0.00.0;;
}
}
double
double norma norma == 1.01.0;;
double
double sumaAux sumaAux;;
int
int contadorIteraciones contadorIteraciones == 00;;
//Revisa si se cumple con el criterio de detención
//Revisa si se cumple con el criterio de detención
while
while((((normanorma//normaVectornormaVector((X_ActualX_Actual)))) >=>= epsilon epsilon)) {{
sumaAux
sumaAux == 0.00.0;;
contadorIteraciones contadorIteraciones++;++;
System
System..outout..printlnprintln(("Iteración ""Iteración " ++ contadorIteraciones contadorIteraciones ++ ":"":"););
//Actualizamos el vector de aproximación inicial
//Actualizamos el vector de aproximación inicial
for
for((intint i i==00;; i i < <X_AnteriorX_Anterior..lengthlength;; i i++)++) {{
X_Anterior
X_Anterior[[ii]] == X_Actual X_Actual[[ii];];
}
}
for
for((intint i i==00;; i i <= <=NN--11;; i i++)++) {{
for
for((intint j j==00;; j j <= <=NN--11;; j j++)++) {{
if
if((jj !=!= i i)) {{
sumaAux
sumaAux +=+= m m[[ii][][jj]*]*X_AnteriorX_Anterior[[jj];];
}
}
}
System
System..outout..printlnprintln(("X[""X["+(+(ii++11)+)+"]: ""]: " ++ X_Actual X_Actual[[ii]);]);
sumaAux
sumaAux == 0.00.0;;
}
}
System
System..outout..printlnprintln((""""););
System
System..outout..printlnprintln((""""););
norma
norma == normaVector normaVector((restaVectoresrestaVectores((X_ActualX_Actual,, X_Anterior X_Anterior));));
}
}
System
System..out.out.printlnprintln((""""););
return
return X_Actual X_Actual;;
}
}
public
public staticstatic voidvoid main main((StringString[][] args args)) {{
Scanner entrada
Scanner entrada == newnew Scanner Scanner((SystemSystem..inin););
System
System..outout..printprint(("\nIngrese la dimensión de la matriz: ""\nIngrese la dimensión de la matriz: "););
int
int dim dim == entrada entrada..nextIntnextInt();();
double
double A A[][][][] == newnew doubledouble[[dimdim][][dimdim];];
Matriz matrix
Matriz matrix == newnew Matriz Matriz((AA););
matrix
matrix..llenarMatrizllenarMatriz();();
System
System..outout..printlnprintln(("\nLa matriz ingresada A es: \n""\nLa matriz ingresada A es: \n"););
matrix
matrix..imprimirMatrizimprimirMatriz();();
double
double b b[][] == newnew doubledouble[[dimdim];];
System
System..outout..printlnprintln(("\nIngrese el vector b: ""\nIngrese el vector b: "););
matrix
matrix..llenarVectorllenarVector((bb););
double
double epsilon epsilon;;
System
System..out.out.printprint(("\nIngrese el criterio de detención: ""\nIngrese el criterio de detención: "););
epsilon
epsilon == entrada entrada..nextDoublenextDouble();();
System
System..outout..printlnprintln(("\nAproximando la solución del sistema de ecua-"\nAproximando la solución del sistema de
ecua-ciones "
ciones "
+
+ "por el Método de Jacobi... ""por el Método de Jacobi... "););
System
System..out.out.printlnprintln(("\nEl vector de aproximación inicial es [0, 0,"\nEl vector de aproximación inicial es [0, 0,
0, 0]\n"
0, 0]\n"););
matrix
matrix..jacobi(jacobi(bb,, epsilon epsilon););
}
}