Método de Jacobi en Java

249  Descargar (0)

Texto completo

(1)

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 n 

  aproximando 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:

1

1 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.

(2)

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

(3)

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];];

}

}

}

(4)

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););

}

}

2.- PRUEBA Y EJECUCIÓN.

2.- PRUEBA Y EJECUCIÓN.

Probamos el algoritmo resolviendo el siguiente sistema de ecuaciones de 4x4:

Probamos el algoritmo resolviendo el siguiente sistema de ecuaciones de 4x4:

{{

10

10



−−11



++22



++00



== 66

−1

−1

22



+11

+11



−−11



++33



== 2525



−− 11



−10

−10



−−11



=−11

=−11

00



++ 33



−−11



++88



== 1515

(5)

Durante la ejecución el programa solicita al usuario ingresar la dimensión del sistema

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

de ecuaciones (4 en este caso), la matriz de coeficientes, los coeficientes del vector

b

b

,,

así como también el criterio de detención, que en este caso será de

(6)

Ahora el programa procederá a ejecutar el algoritmo de Jacobi, resolviendo el sistema

Ahora el programa procederá a ejecutar el algoritmo de Jacobi, resolviendo el sistema

para el vector

para el vector

b

b

. Tomaremos como vector de aproximación inicial a (0,0,0,0). El pro-

. Tomaremos como vector de aproximación inicial a (0,0,0,0). El

pro-grama imprimirá en pantalla todas las iteraciones sucesivas que se vayan obteniendo

grama imprimirá en pantalla todas las iteraciones sucesivas que se vayan obteniendo

hasta llegar al criterio de detención.

(7)
(8)

Observemos que la factorización buscada es:

Observemos que la factorización buscada es:

1 1 0 3

1 1 0 3

22 11 −−11 11

33 −−11 −−11 22

−−11 22 33 −−11

==

11 0 0

0 0 00

22 1 0

1 0 00

33 4 1

4 1 00

−−11 −−33 00 11

∗∗

11 1 0

1 0 33

00 −−11 −−11 −−55

00 00 33 1133

00 00 00 −−1133

(9)

Con la última iteración, observamos que la solución aproximada es:

Con la última iteración, observamos que la solución aproximada es:

X[1]: 0.999998155430544

X[1]: 0.999998155430544

≈≈

1

1

X[2]: 2.00000292370118

X[2]: 2.00000292370118

≈≈

2

2

X[3]: -1.0000023015887396

X[3]: -1.0000023015887396

≈≈

-1

-1

X[4]: 1.0000034417997814

X[4]: 1.0000034417997814

≈≈

 1

 1

Figure

Actualización...

Referencias

Actualización...

Related subjects :