código del metodo gauss-seidel y jacobi
los metodos de gauss - seidel y jacobi nos permite resolver sistemas de ecuaciones lineales para conocer los valores de incognitas por medio de una secuencia iterativa donde se repite el proceso hasta que se cumpla un error establecido.
Nota: Esta vez el programa esta diseñado para matrices de 3 x 3.
para hacer mas amigable el programa para el usuario lo diseñe en netbeans
| Diseño de mi interfaz |
podemos ver que hay 4 zonas explicaremos de que consta cada una:
1- En la primera zona vemos 12 Textfield donde ingresaran los valores del sistema de ecuaciones, igualmente vemos que alado de cada textfield tenemos unos Jlabel para que el usuario identifique las variables que representan.
2- En esta segunda zona vemos 2 botones uno de "resolver" que inicia las iteraciones y otro de "limpiar" para borrar todos los textfield.
3- Aqui se reciben los valores inicales de cada variable y el valor de error hasta donde se desea calcular.
4- En esta ultima zona se muestra un TextArea donde se reflejaran los resultados de cada iteracion y tambien vemos un JComboBox donde selecciono el metodo con el cual calcular ya sea Gauss o jacobi.
codigo por dentro......
lo primero que haremos sera declara las variables que usaremos al igual que los arreglos
Nota: todo el codigo fue puesto en el mismo frame
double arreglo_x []= new double[10000]; // arreglos donde se guardaran
double arreglo_y []= new double[10000]; //los valores de x,y,z en cada
double arreglo_z []= new double[10000]; //en cada iteracion
int metodo; //guarda el numero de seleccion despeglable (pa saber q metodo elige el usuario gauss o jacobi)
int indice; //indice para recorrer los arreglos
double error; // variable pal error que ingrese el usuario
double errorX ; // arreglos donde almaceno los valores de errores de cada una
double errorY ; // de las incognitas X,Y,Z cada vez
double errorZ ;
double X1,X2,X3, Y1,Y2,Y3, Z1,Z2,Z3; // variables pa guardar los valores de los textfield
double val1,val2,val3; //variables de igualacion de la ecuacion; osea despues del signo igual
double arreglo_y []= new double[10000]; //los valores de x,y,z en cada
double arreglo_z []= new double[10000]; //en cada iteracion
int metodo; //guarda el numero de seleccion despeglable (pa saber q metodo elige el usuario gauss o jacobi)
int indice; //indice para recorrer los arreglos
double error; // variable pal error que ingrese el usuario
double errorX ; // arreglos donde almaceno los valores de errores de cada una
double errorY ; // de las incognitas X,Y,Z cada vez
double errorZ ;
double X1,X2,X3, Y1,Y2,Y3, Z1,Z2,Z3; // variables pa guardar los valores de los textfield
double val1,val2,val3; //variables de igualacion de la ecuacion; osea despues del signo igual
Despues pasamos a crear un metodo que recupere todos los valores de nuestro Frame.
public void getvalors (){
error = Double.parseDouble(valorerror.getText()); // guardadando el valor de error porcentual
X1 = Double.parseDouble(jTextField1.getText());
X2 = Double.parseDouble(jTextField2.getText());
X3 = Double.parseDouble(jTextField3.getText());
Y1 = Double.parseDouble(jTextField4.getText());
Y2 = Double.parseDouble(jTextField5.getText());
Y3 = Double.parseDouble(jTextField6.getText());
Z1 = Double.parseDouble(jTextField7.getText());
Z2 = Double.parseDouble(jTextField8.getText());
Z3 = Double.parseDouble(jTextField9.getText());
val1 = Double.parseDouble(jTextField10.getText());
val2 = Double.parseDouble(jTextField11.getText());
val3 = Double.parseDouble(jTextField12.getText());
X1 = Double.parseDouble(jTextField1.getText());
X2 = Double.parseDouble(jTextField2.getText());
X3 = Double.parseDouble(jTextField3.getText());
Y1 = Double.parseDouble(jTextField4.getText());
Y2 = Double.parseDouble(jTextField5.getText());
Y3 = Double.parseDouble(jTextField6.getText());
Z1 = Double.parseDouble(jTextField7.getText());
Z2 = Double.parseDouble(jTextField8.getText());
Z3 = Double.parseDouble(jTextField9.getText());
val1 = Double.parseDouble(jTextField10.getText());
val2 = Double.parseDouble(jTextField11.getText());
val3 = Double.parseDouble(jTextField12.getText());
//asigno en la primera posicion de los arreglos el valor que nos dan de inicio
arreglo_x [0] = Double.parseDouble(valx.getText());
arreglo_y [0] = Double.parseDouble(valy.getText());
arreglo_z [0] = Double.parseDouble(valz.getText());
arreglo_x [0] = Double.parseDouble(valx.getText());
arreglo_y [0] = Double.parseDouble(valy.getText());
arreglo_z [0] = Double.parseDouble(valz.getText());
//a variables error guardo el error porcentual +1
errorX = Double.parseDouble(valorerror.getText())+1;
errorY = Double.parseDouble(valorerror.getText())+1;
errorZ = Double.parseDouble(valorerror.getText())+1;
errorX = Double.parseDouble(valorerror.getText())+1;
errorY = Double.parseDouble(valorerror.getText())+1;
errorZ = Double.parseDouble(valorerror.getText())+1;
}//fin del metodo getvalors
ahora creamos el metodo de jacobi donde hara todo el proceso de despeje y calculo...
public void metodo_jacobi (){
indice = 1;
while (errorX > error || errorY > error || errorZ > error){
while (errorX > error || errorY > error || errorZ > error){
//despejo y guardo el valor nuevo de cada variable en el arreglo correspondiente
arreglo_x [indice] = (val1-(Y1*arreglo_y[indice-1])-(Z1*arreglo_z[indice-1]))/X1;
arreglo_x [indice] = (val1-(Y1*arreglo_y[indice-1])-(Z1*arreglo_z[indice-1]))/X1;
arreglo_y [indice] = (val2-(X2*arreglo_x[indice-1])-(Z2*arreglo_z[indice-1]))/Y2;
arreglo_z [indice] = (val3-(X3*arreglo_x[indice-1])-(Y3*arreglo_y[indice-1]))/Z3;
//calculamos los errorres de cada variables
errorX = Math.abs((arreglo_x[indice] - arreglo_x[indice-1])/arreglo_x[indice])*100;
errorY = Math.abs((arreglo_y[indice] - arreglo_y[indice-1])/arreglo_y[indice])*100;
errorZ = Math.abs((arreglo_z[indice] - arreglo_z[indice-1])/arreglo_z[indice])*100;
//aqui solo se manda a imprimir en TextArea los resultado de esta iteracion
resultado.append("iteracion numero <-----> " + indice +"\n");
resultado.append("valor de 'x' = "+ arreglo_x[indice]+"\n");
resultado.append("valor de 'y' = "+ arreglo_y[indice]+"\n");
resultado.append("valor de 'z' = "+ arreglo_z[indice]+"\n\n");
resultado.append("el error de x es = " + errorX +"\n");
resultado.append("el error de y es = " + errorY +"\n");
resultado.append("el error de z es = " + errorZ +"\n");
resultado.append("------------------------------------\n\n");
++indice;
errorY = Math.abs((arreglo_y[indice] - arreglo_y[indice-1])/arreglo_y[indice])*100;
errorZ = Math.abs((arreglo_z[indice] - arreglo_z[indice-1])/arreglo_z[indice])*100;
//aqui solo se manda a imprimir en TextArea los resultado de esta iteracion
resultado.append("iteracion numero <-----> " + indice +"\n");
resultado.append("valor de 'x' = "+ arreglo_x[indice]+"\n");
resultado.append("valor de 'y' = "+ arreglo_y[indice]+"\n");
resultado.append("valor de 'z' = "+ arreglo_z[indice]+"\n\n");
resultado.append("el error de x es = " + errorX +"\n");
resultado.append("el error de y es = " + errorY +"\n");
resultado.append("el error de z es = " + errorZ +"\n");
resultado.append("------------------------------------\n\n");
++indice;
}//fin del ciclo mientras
} // fin del metodo de calculo jacobi
public void gauss_seidel{
indice = 1;
while (errorX > error || errorY > error || errorZ > error){
arreglo_x [indice] = (val1-(Y1*arreglo_y[indice-1])-(Z1*arreglo_z[indice-1]))/X1;
arreglo_y [indice] = (val2-(X2*arreglo_x[indice])-(Z2*arreglo_z[indice-1]))/Y2;
arreglo_z [indice] = (val3-(X3*arreglo_x[indice])-(Y3*arreglo_y[indice]))/Z3;
errorX = Math.abs((arreglo_x[indice] - arreglo_x[indice-1])/arreglo_x[indice])*100;
errorY = Math.abs((arreglo_y[indice] - arreglo_y[indice-1])/arreglo_y[indice])*100;
errorZ = Math.abs((arreglo_z[indice] - arreglo_z[indice-1])/arreglo_z[indice])*100;
resultado.append("iteracion numero <-----> " + indice +"\n");
resultado.append("valor de 'x' = "+ arreglo_x[indice]+"\n");
resultado.append("valor de 'y' = "+ arreglo_y[indice]+"\n");
resultado.append("valor de 'z' = "+ arreglo_z[indice]+"\n\n");
resultado.append("el error de x es = " + errorX +"\n");
resultado.append("el error de y es = " + errorY +"\n");
resultado.append("el error de z es = " + errorZ +"\n");
resultado.append("------------------------------------\n\n");
++indice;
}// fin del mientras
while (errorX > error || errorY > error || errorZ > error){
arreglo_x [indice] = (val1-(Y1*arreglo_y[indice-1])-(Z1*arreglo_z[indice-1]))/X1;
arreglo_y [indice] = (val2-(X2*arreglo_x[indice])-(Z2*arreglo_z[indice-1]))/Y2;
arreglo_z [indice] = (val3-(X3*arreglo_x[indice])-(Y3*arreglo_y[indice]))/Z3;
errorX = Math.abs((arreglo_x[indice] - arreglo_x[indice-1])/arreglo_x[indice])*100;
errorY = Math.abs((arreglo_y[indice] - arreglo_y[indice-1])/arreglo_y[indice])*100;
errorZ = Math.abs((arreglo_z[indice] - arreglo_z[indice-1])/arreglo_z[indice])*100;
resultado.append("iteracion numero <-----> " + indice +"\n");
resultado.append("valor de 'x' = "+ arreglo_x[indice]+"\n");
resultado.append("valor de 'y' = "+ arreglo_y[indice]+"\n");
resultado.append("valor de 'z' = "+ arreglo_z[indice]+"\n\n");
resultado.append("el error de x es = " + errorX +"\n");
resultado.append("el error de y es = " + errorY +"\n");
resultado.append("el error de z es = " + errorZ +"\n");
resultado.append("------------------------------------\n\n");
++indice;
}// fin del mientras
} // fin del metodo gauss
public void clean () { // para limpiar todos los campos
jTextField1.setText("");
jTextField2.setText("");
jTextField3.setText("");
jTextField4.setText("");
jTextField5.setText("");
jTextField6.setText("");
jTextField7.setText("");
jTextField8.setText("");
jTextField9.setText("");
jTextField10.setText("");
jTextField11.setText("");
jTextField12.setText("");
valorerror.setText("");
valx.setText("");
valy.setText("");
valz.setText("");
resultado.setText("");
indice = 1;
jTextField2.setText("");
jTextField3.setText("");
jTextField4.setText("");
jTextField5.setText("");
jTextField6.setText("");
jTextField7.setText("");
jTextField8.setText("");
jTextField9.setText("");
jTextField10.setText("");
jTextField11.setText("");
jTextField12.setText("");
valorerror.setText("");
valx.setText("");
valy.setText("");
valz.setText("");
resultado.setText("");
indice = 1;
} // fin del metodo clean
ya creados los metodos lo que resta es poner en los botones el llamdo de los metodos para que efectue las acciones de calculo
// agregar un evento de mouseclicked al boton de limpiar
private void cleanMouseClicked(java.awt.event.MouseEvent evt) {
clean();
}
clean();
}
//evento itemstate para el combobox
private void metodoselectedItemStateChanged(java.awt.event.ItemEvent evt) {
//recuperamos el indice del combobox y lo guardamos en la variable metodo
//recuperamos el indice del combobox y lo guardamos en la variable metodo
metodo = metodoselected.getSelectedIndex();
resultado.setText("");
}
resultado.setText("");
}
//evento mousclicked para el boton resolver
private void iterarMouseClicked(java.awt.event.MouseEvent evt) {
getvalors(); //llamo al metodo para recuperar los valores primero
if (metodo == 0){
metodojacobi();
}else{
gauss_seidel();
}
}
getvalors(); //llamo al metodo para recuperar los valores primero
if (metodo == 0){
metodojacobi();
}else{
gauss_seidel();
}
}
creado by:
shan rules