domingo, 17 de junio de 2007

Programando metodo de Cramer en Java

Primero que nada un poco de teoria para tratar de entender el metodo de Cramer, tambien denominado "El calculo de determinantes". Este se calcula sustituyendo el resultado de las ecuaciones en la columna 1 de la matriz de las ecuaciones, despues calculamos el determinante de esta nueva matriz y lo dividimos entre la matriz origial, asi obtenemos el primer valor para X1, repetimos el proceso para obtener X2...Xn. Veamos un ejemplo: Resolver el siguiente sistema de ecuaciones por metodo de Cramer:



Las fórmulas son :



Recordemos que la fórmula de los determinantes (3x3) es :

Como se puede observar , para que podamos utilizar el método de Cramer , el determinante de la matriz de los coeficientes no debe ser 0 para que el denominador de las fórmulas no se anule . Si diese 0 es que una de las incógnitas se puede poner en función de las otras , es decir , tendríamos parámetros . La forma de resolver este problema es pasar al otro miembro (al lado del término independiente) la incógnita que tomemos como parámetro y de esta forma tendremos un determinante que no se anula pero de menor grado . Al aplicar las fórmula de Cramer tendremos un parámetro en la columna de los términos independientes .

Bien ahora vamos a iniciar nuestro programa, en este caso es en Swing.

1)Hacemos un bosquejo de lo que queremos que haga nuestro pequeño programa y esta seria su estructura.

import java.io.*;
import javax.swing.*;

public class cramer {
public static void main(String args[]){
int tam=0;

//Pedimos el tamanyo de la matriz de ecuaciones
JOptionPane.showMessageDialog(null,"Metodo de Cramer para resolver sistemas de ecuaciones n * n");
tam=Integer.parseInt(JOptionPane.showInputDialog(null,"Cual es el tamanyo de la matriz?"));
//creamos nuestra matriz y nuestro vector con el que vamos a trabajar

int a[][]=new int[tam][tam]; //ecuacion

int b[]=new int[tam]; //resultado de a

//creamos un vector para las soluciones de X
float cmr[]=new float[tam];

//Pedimos los valores de las ecuaciones por renglo
JOptionPane.showMessageDialog(null,"Inserte los valores de la matriz de ecuaciones");
insertarM(a); //llamada a procedimiento para llenar una matriz

//Pedimos los valores de las soluciones
JOptionPane.showMessageDialog(null,"Inserte los valores del vector de soluciones");
insertarV(b);//llamada a procedimiento para llenar un vector

//Este es el procedimiento que resuelve las ecuaciones
cmr=cramer(a,b);

//Mostramos los resultados para las Xn
JOptionPane.showMessageDialog(null,"Los valores para las X's son:");
mostrarX(cmr);

}
//aqui van todos los procedimientos involucrados
}

Muy bien ahora vamos por partes.

2) Este seria el procedimiento para resolver por Cramer

//procedimiento cramer
public static float[] cramer(int a[][], int b[]){
float Rcramer[]=new float[b.length];
int det=determinante(a);
int detTemp;
int c[][]=new int[a.length][a.length];

/*
Verificamos que tenga solucion:
"Si el determinante de la matriz de ecuaciones original es 0
entonces, no tiene solucion"
*/

if(det==0){
JOptionPane.showMessageDialog(null,"No tiene solucion");
return Rcramer;
}

//En este ciclo se realiza el proceso de sustituir cada columna y calcular los determinantes
for(int i=0; i
c=sustituye(a,b,i); //sustituye una columna i
detTemp=determinante(c); //calcula el determinante

Rcramer[i]=(float)detTemp/(float)det;//Almacena la solucion de Xi
}
return Rcramer; //Retorna el vector de soluciones de Xn
}

3) Procedimiento sustituye(), para sustituir el vector de solucion de la ecuacion en una columna de la matriz de ecuaciones.

//sustituye los valores de b en a en la posicion pos
public static int [][] sustituye(int a[][], int b[], int pos){
//vector en donde se almacenaran los nuevos valores
int c[][] =new int[a.length][a.length];

for(int i=0;i
for(int j=0; j
//si es la posicion sustituir los valores de b
if(j==pos){
c[i][j]=b[i];
}
//sino los valores quedan iguales
else{
c[i][j]=a[i][j];
}
}
}

return c;//retorna la matriz ya modificada
}

4)Procedimiento determinante(), calcula el determinante de una matriz de n * n

//Calcula el determinante de una matriz de n x n
public static int determinante(int a[][]){
//Esta matriz la utilizamos para calcular el determinante
int c[][]=new int[a.length+(a.length-1)][a.length];
int det = 0;

//almacena los resultados parciales
int par[]=new int[a.length*2];


for(int i=0;i
for(int j=0; j
c[i][j]=a[i][j];
}

}
int k=0;
for(int i=a.length;i
for(int j=0; j
c[i][j]=a[k][j];

}
k++;
}

//calcula la suma de los productos y la inserta en par
k=0;
int temp=1;
int inc=1;

for (int i=0; i<>
for(int j=0; j
temp=temp*c[k][j];
k++;
}
k=inc;
par[i]=temp;
temp=1;
inc++;
}

//calcula la resta de los productos y la inserta en par
k=a.length-1;

temp=1;
inc=a.length-1;

int l=(par.length)/2;

for (int i=0; i<>
for(int j=0; j
temp=temp*c[k][j];
k--; //k=k-1;
}
par[l]=-temp;
temp=1;
inc++;
k=inc;
l++;
}

det=suma(par); //calcula la suma del vector

return det;
}

5) Muy bien hasta aqui espero que le hayan entendido al codigo de los procedimientos,ahora compilamos nuestro programa:

#javac cramer.java

Y lo ejecutamos

#java cramer


/*

El motivo de no subir todo el codigo es debido a que al tratar de publicar el blog con el codigo completo me marca errores el blog.


Por tal motivo les dejo el codigo completo en este link.

http://cid-c6f5df27ec379c89.skydrive.live.com/browse.aspx/P%C3%BAblico/BLOG/JAVA?uc=1

Tambien dejo disponible mi e-mail: cibercafe_montero@hotmail.com

Gracias por visitar mi blog.

*/