Está en la página 1de 8

package co.edu.eafit.analisisnumerico.framework; import java.awt.event.

Acti
onEvent; import java.awt.event.ActionListener; import javax.swing.table.Defaul
tTableModel; import org.nfunk.jep.JEP; import co.edu.eafit.analisisnumeric
o.GUI.ResultadosInterfaz1; import co.edu.eafit.analisisnumerico.metodos.iterati
vos.Biseccion; import co.edu.eafit.analisisnumerico.metodos.iterativos.Busqueda
sIncrementales; import co.edu.eafit.analisisnumerico.metodos.iterativos.Newton;
import co.edu.eafit.analisisnumerico.metodos.iterativos.PuntoFijo; import co.
edu.eafit.analisisnumerico.metodos.iterativos.RaicesMultiples; import co.edu.ea
fit.analisisnumerico.metodos.iterativos.ReglaFalsa; import co.edu.eafit.analisi
snumerico.metodos.iterativos.Secante; import co.edu.eafit.analisisnumerico.meto
dos.sistemasecuaciones.Cholesky; import co.edu.eafit.analisisnumerico.metodos.s
istemasecuaciones.Croult; import co.edu.eafit.analisisnumerico.metodos.sistemas
ecuaciones.Dolytle; import co.edu.eafit.analisisnumerico.metodos.sistemasecuaci
ones.GaussSeidel; import co.edu.eafit.analisisnumerico.metodos.sistemasecuacion
es.GaussSimple; import co.edu.eafit.analisisnumerico.metodos.sistemasecuaciones
.Jacoby; import co.edu.eafit.analisisnumerico.metodos.sistemasecuaciones.LUParc
ial; import co.edu.eafit.analisisnumerico.metodos.sistemasecuaciones.LUSimple;
import co.edu.eafit.analisisnumerico.metodos.sistemasecuaciones.MatrizBanda; i
mport co.edu.eafit.analisisnumerico.metodos.sistemasecuaciones.PivoteoEscalonado
; import co.edu.eafit.analisisnumerico.metodos.sistemasecuaciones.PivoteoParcia
l; import co.edu.eafit.analisisnumerico.metodos.sistemasecuaciones.PivoteoTotal
; import co.edu.eafit.analisisnumerico.metodos.sistemasecuaciones.Relajacion;
/** * Clase Gestor Metodos. Posee la fabrica de metodos y la ejecucion dinam
ica de los mismos * @author Sebastian * */ public class GestorMetodos {
static MetodoUnidad1 mPadreU1; static MetodoUnidad2 mPadreU2;
private static String funciones; private static int modo;
private static final String TEXTOINICIO=""; private static final St
ring TEXTOFIN=":"; /**Variable global que contiene el metodo activo e
n el momento*/ public static int metodoEjecutandose; /**Nomb
res y orden de las variables (delta, iteraciones, etc) que pueden modificarse en
la salida*/ public static String[] variablesModificables;
/** * Ejecuta un metodo dinamicamente, de acuerdo a los parametros r
ecibidos * @param numMetodo: Constante del metodo a ejecutar
* @param modo: Indica si es modo consola o modo grafico * @param valo
resPredefinidos: Array con valores por defecto, o null, para pedirselos al usuar
io * @param strings: Lista de valores a solicitarle al usuario
*/ public static void ejecutar(int numMetodo, int modo, String titul
o, String funciones, String[] funcionesPredeterminadas, double[] valoresPredefin
idos, String...strings){ variablesModificables=strings;
metodoEjecutandose=numMetodo; MetodoUnidad1 mp = Gest
orMetodos.fabricaMetodosUnidad1(numMetodo); GestorMetodos.modo=
modo; GestorMetodos.mPadreU1=mp; GestorMetodos
.funciones=funciones; if(modo==Constantes.MODOCONSOLA){
if(funciones!=null&&funciones!=""){
crearFunciones(funcionesPredeterminadas); }
double[] entradas=null; if(valores
Predefinidos==null){ try {
entradas = solicitarListaDoubleConsola(strings);
} catch (AnalisisException e) {
} } else{
entradas=valoresPredefinidos; }
ejecutarMetodoUnidad1(entradas); }
else if(modo==Constantes.MODOGRAFICOINTERFAZ1){
boolean resul = validarFuncionesNecesarias(); i
f(resul){ GestorInterfaz1 gi1 = new GestorInter
faz1(); try {
gi1.pintar(numMetodo,titulo, funciones.split(",").length, funciones, st
rings); } catch (AnalisisException e) {}
} } } public static vo
id ejecutarSistemaEcuacion(final int numMetodo, final String titulo, final Objec
t[][] matriz, final double... valores){ if(!validarMatriz(matri
z)){ return; } Metodo
Unidad2 mp = null; try { mp = GestorMe
todos.fabricaMetodosUnidad2(numMetodo, matriz); } catch (Analis
isException e1) { return; }
if(mp==null)return; GestorMetodos.mPadreU2=mp;
String resultado=""; try { /*e
jecuta el metodo*/ resultado = mPadreU2.metodoSistema(v
alores); } catch (AnalisisException e) {
e.printStackTrace(); } String[] titulos;
if(mp.datos!=null){ titulos = new String
[mp.datos.size()]; for(int i=0;i<titulos.length;i++)tit
ulos[i]=""; } else{
titulos = new String[1]; for(int i=0;i<titulos.length;i
++)titulos[i]=""; } /*MUESTRA LA INTERFAZ DE S
ALIDA*/ final ResultadosInterfaz1 ri1= new ResultadosInterfaz1(
); ri1.tablaResultados.setModel(new DefaultTableModel(mp.genera
rMatrizSinTitulos(), titulos)); ri1.txtDatosGenerales.setText(g
enerarMatrizEnString(mp.matrizOriginal)); ri1.lblResultado.setT
ext("Resultado: "+resultado); //si los metodos no tienen param
etros, suerte, if(numMetodo!=Constantes.JACOBI&&numMetodo!=Con
stantes.GAUSSSEIDEL&&numMetodo!=Constantes.RELAJACION){
ri1.lblVariable1.setVisible(false); ri1.lblVariable2.s
etVisible(false); ri1.lblVariable3.setVisible(false);
ri1.lblVariable4.setVisible(false);
ri1.txtVariable1.setVisible(false); ri1.txtVariabl
e2.setVisible(false); ri1.txtVariable3.setVisible(false
); ri1.txtVariable4.setVisible(false);
ri1.jScrollPane3.setVisible(false); ri1.tblB.s
etVisible(false); ri1.lblVectorB.setVisible(false);
ri1.btnRecalcular.setVisible(false); }
else{ if(numMetodo!=Constantes.RELAJACIO
N){ ri1.lblVariable1.setText("Tolerancia: ");
ri1.lblVariable2.setText("Iteraciones: ");
ri1.lblVariable3.setVisible(false);
ri1.lblVariable4.setVisible(false);
ri1.txtVariable3.setVisible(false); ri1
.txtVariable4.setVisible(false); Object[][] dat
os = new Object[1][matriz.length]; String[] tit
ulosX = new String[matriz.length]; for(int i=0;
i<titulosX.length;i++){ titulosX[i]="X"
+(i+1); } ri1.
tblB.setModel(new DefaultTableModel(datos, titulosX));
ri1.btnRecalcular.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
double[] nuevosValores = new double[valores.length];
try{
nuevosValores[0]=Integer.parseInt(ri1.txtVariable1.getText
()); nuevosValores[1]=I
nteger.parseInt(ri1.txtVariable2.getText());
for(int i=0;i<matriz.length;i++){
nuevosValores[i+2]=Double.parseDouble(r
i1.tblB.getValueAt(0, i).toString());
} }catch(Excepti
on ex){ new AnalisisExc
eption("ENTRADA INVALIDA");
return; }
ri1.setVisible(false);
mPadreU2.resetDatos();
ejecutarSistemaEcuacion(numMetodo, titulo, matriz, nuevosValore
s); }
}); }
} ri1.setVisible(true); }
public static boolean validarMatriz(Object[][] matriz) {
if(matriz==null){ new AnalisisExcepti
on("Matriz nula"); return false;
} if(matriz.length==0||matriz[0].length==0){
new AnalisisException("Matriz nula");
return false; }
int i=0; int j=0; t
ry{ for(i=0;i<matriz.length;i++){
for(j=0;j<matriz.length;j++){
if(matriz[i][j]==null||matriz[i][j].toString()==""){
new AnalisisException("
Valor invalido en la posición "+(i+1+", "+(j+1)));
return false;
} Double.parseDouble(m
atriz[i][j].toString()); }
} } catch
(Exception e){ new AnalisisException("Valor inv
alido en la posición "+(i+1+", "+(j+1))); return
false; } return true;
} private static String generarMatrizEnString(DatoMatriz[][]
matrizOriginal) { StringBuffer buffer = new StringBuff
er(); buffer.append("Matriz Original: \n");
for(int i=0;i<matrizOriginal.length;i++){
for(int j=0;j<matrizOriginal[0].length;j++){
buffer.append(matrizOriginal[i][j].getValor()+"\t");
} buffer.append("\n");
} return buffer.toString();
} private static boolean validarFuncionesNecesari
as() { PrincipalUnidad1 p = PrincipalUnidad1.getInstanc
e(); boolean fOk = p.crearFuncionesNuevas();
if(!fOk)return false; String[] funciones
Necesarias = funciones.split(","); for(String s : funci
onesNecesarias){ if(s.equals("f")&&MetodoUnidad
1.getParserF()==null){ new AnalisisExce
ption("La Funcion f(x) es necesaria para este método y no se ha inicializado");
return false;
} else if(s.equals("g")&&MetodoUnidad1.ge
tParserG()==null){ new AnalisisExceptio
n("La Funcion g(x) es necesaria para este método y no se ha inicializado");
return false;
} else if(s.equals("fdev")&&MetodoUnidad1.get
ParserFdev()==null){ new AnalisisExcept
ion("La primera derivada de f(x) es necesaria para este método y no se ha iniciali
zado"); return false;
} else if(s.equals("fdd")&&Meto
doUnidad1.getParserFdd()==null){ new An
alisisException("La segunda derivada de f(x) es necesaria para este método y no se
ha inicializado"); return false;
} }
return true; } private static void ejecuta
rMetodoConsola(double... entradas) { String resultado="
"; try { resultado = m
PadreU1.metodo(entradas); } catch (AnalisisException e)
{} System.out.println("-------------------------------
"); System.out.println(resultado);
System.out.println("-------------------------------");
Object[][] resul = mPadreU1.generarMatriz(); UtilC
onsola.imprimir(resul); } @SuppressWarnings(
"static-access") public static void crearFunciones(String[] fun
cionesPredeterminadas) { String[] misFunciones = funcio
nes.split(","); for(int i=0;i<misFunciones.length;i++){
if(misFunciones[i].equalsIgnoreCase("f")){
boolean pedir=true;
JEP parser = new JEP();
parser.setImplicitMul(true); parser
.addStandardConstants(); parser.addStan
dardFunctions(); if(funcionesPredetermi
nadas!=null){ parser.addVariabl
e("x", 0); parser.parseExpressi
on(funcionesPredeterminadas[i]);
mPadreU1.setParserF(parser, funcionesPredeterminadas[i]);
}else{ try
{ String funcion="";
while(pedir){
pedir=false;
funcion = UtilConsola.leerS
tring("Ingrese f(x): ");
parser.addVariable("x", 0);
parser.parseExpression(funcion);
if(parser.hasError()){
new AnalisisException("
Por favor ingrese una funcion correcta");
pedir=true;
}
} mPadreU1.s
etParserF(parser, funcion); } c
atch (AnalisisException e) {} }
} else if(misFuncione
s[i].equalsIgnoreCase("g")){ boolean pe
dir=true; JEP parser = new JEP();
parser.setImplicitMul(true);
parser.addStandardConstants();
parser.addStandardFunctions();
if(funcionesPredeterminadas!=null){
parser.addVariable("x", 0);
parser.parseExpression(funcionesPredeterminadas[i]);
mPadreU1.setParserG(parser, funcionesPredeterm
inadas[i]); }else{
try {
String funcion="";
while(pedir){
pedir=false;
funcion = UtilConsola.leerString("Ingrese g(x): ");
parser.addVariable("x", 0);
parser.parseExpression(fu
ncion); if(pars
er.hasError()){
new AnalisisException("Por favor ingrese una funcion correcta");
pedir=true;
}
}
mPadreU1.setParserG(parser, funcion);
} catch (AnalisisException e) {}
} }
else if(misFunciones[i].equalsIgnoreCase("fd")||misFunciones[i].equ
alsIgnoreCase("fdev")){ boolean pedir=t
rue; JEP parser = new JEP();
parser.setImplicitMul(true);
parser.addStandardConstants();
parser.addStandardFunctions();
if(funcionesPredeterminadas!=null){
parser.addVariable("x", 0);
parser.parseExpression(funcionesPredeterminadas[i]);
mPadreU1.setParserFdev(parser, funcionesPredetermin
adas[i]); }else{
try {
String funcion="";
while(pedir){
pedir=false;
funcion = UtilConsola.leerString("Ingrese la primer derivada de f(x): ");
parser.addVariable
("x", 0); parse
r.parseExpression(funcion);
if(parser.hasError()){
new AnalisisException("Por favor ingrese una funcio
n correcta");
pedir=true;
} }
mPadreU1.setParserFdev(parser, funcion
); } catch (AnalisisException e
) {} }
} else if(misFunciones[i].equalsIgnoreCase("fd
d")){ boolean pedir=true;
JEP parser = new JEP();
parser.setImplicitMul(true);
parser.addStandardConstants(); parse
r.addStandardFunctions(); if(funcionesP
redeterminadas!=null){ parser.a
ddVariable("x", 0); parser.pars
eExpression(funcionesPredeterminadas[i]);
mPadreU1.setParserFdd(parser, funcionesPredeterminadas[i]);
}else{
try { String fu
ncion=""; while(pedir){
pedir=false;
funcion = UtilCo
nsola.leerString("Ingrese la segunda derivada de f(x): ");
parser.addVariable("x", 0);
parser.parseExpression(
funcion); if(pa
rser.hasError()){
new AnalisisException("Por favor ingrese una funcion correcta");
pedir=true;
}
}
mPadreU1.setParserFdd(parser, funcion);
} catch (AnalisisException e) {}
} }
} } /** * Fabrica
de metodos * @param metodo: Identificador del metodo a crear
* @return */ private stati
c MetodoUnidad1 fabricaMetodosUnidad1(int metodo) { if(
metodo==Constantes.BISECCION) return new Biseccion(); i
f(metodo==Constantes.BUSQUEDASINCREMENTALES) return new BusquedasIncrementales()
; if(metodo==Constantes.REGLAFALSA) return new ReglaFal
sa(); if(metodo==Constantes.NEWTON) return new Newton()
; if(metodo==Constantes.PUNTOFIJO) return new PuntoFijo
(); if(metodo==Constantes.SECANTE) return new Secante()
; if(metodo==Constantes.RAICESMULTIPLES) return new Rai
cesMultiples(); return null; }
/** * Fabrica de metodos * @par
am metodo: Identificador del metodo a crear * @return
*/ private static MetodoUnidad2 fabricaMetodosUnidad2
(int metodo, Object[][] matriz) throws AnalisisException {
if(metodo==Constantes.GAUSSSIMPLE) return new GaussSimple(matriz);
if(metodo==Constantes.PIVOTEOPARCIAL) return new PivoteoParcial(
matriz); if(metodo==Constantes.PIVOTEOTOTAL) return new
PivoteoTotal(matriz); if(metodo==Constantes.LUSIMPLE)
return new LUSimple(matriz); if(metodo==Constantes.LUPI
VOTEO) return new LUParcial(matriz); if(metodo==Constan
tes.PIVOTEOESCALONADO) return new PivoteoEscalonado(matriz);
if(metodo==Constantes.CROULT) return new Croult(matriz);
if(metodo==Constantes.CHOLESKY) return new Cholesky(matriz);
if(metodo==Constantes.DOOLITTLE) return new Dolytle(matriz);
if(metodo==Constantes.GAUSSSEIDEL) return new GaussSeidel(ma
triz); if(metodo==Constantes.MATRIZBANDA) return new Ma
trizBanda(matriz); if(metodo==Constantes.RELAJACION) re
turn new Relajacion(matriz); if(metodo==Constantes.JACO
BI) return new Jacoby(matriz); new AnalisisException("E
RROR DE PROGRAMACION: DEBE ADICIONAR EL METODO EN GESTOR METODOS: FABRICAMETODOS
UNIDAD 2"); return null; }
/** * Solicita por consola una serie de parametros Do
uble * @param strings: Lista de parametros a solicitar al usua
rio * @return: La lista de valores que el usuario ingresa
* @throws AnalisisException: En caso de entrada invalida
*/ private static double[] solicitarListaDoubleConso
la(String[] strings) throws AnalisisException { double[
] entradas = new double[strings.length]; for(int i=0;i<
strings.length;i++){ entradas[i]=UtilConsola.le
erDouble("Ingrese "+strings[i]+": "); }
return entradas; } public static b
oolean esFuncionCorrecta(String funcion){ JEP parser =
new JEP(); parser.setImplicitMul(true);
parser.addStandardConstants(); parser.addStan
dardFunctions(); parser.addVariable("x", 0);
parser.parseExpression(funcion); if(pars
er.hasError())return false; return true;
} public static void ejecutarMetodoUnidad1(double[] d)
{ if(modo==Constantes.MODOCONSOLA)ejecutarMetodoConsol
a(d); else if(modo==Constantes.MODOGRAFICOINTERFAZ1||mo
do==Constantes.MODOGRAFICOINTERFAZ2)ejecutarMetodoInterfaz(d);
} private static void ejecutarMetodoInterfaz(double... entr
adas) { String resultado=""; t
ry { resultado = mPadreU1.metodo(entradas);
} catch (AnalisisException e) {}
final ResultadosInterfaz1 ri1 = new ResultadosInterfaz1();
ri1.lblResultado.setText("Resultado: "+resultado);
Object[][] resul = mPadreU1.generarMatrizSinTitulos();
Object[] titulos = mPadreU1.getTitulos(); //ri1.tablaRe
sultados = new JTable(resul,titulos); ri1.tablaResult
ados.setModel(new DefaultTableModel(resul, titulos)); r
i1.txtDatosGenerales.setText(generarTextoReferenciaUnidad());
ri1.setVisible(true); /*seteo variables modifica
bles en interfaz*/ if(variablesModificables!=null&&vari
ablesModificables.length>0){ coordinarLabelsYTe
xtBoxVariablesModificables(ri1); }
ri1.tblB.setVisible(false); ri1.jScrollPane3.setVi
sible(false); ri1.lblVectorB.setVisible(false);
/*en caso de recalcular metodo, ejecuto la funcion again*/
ri1.btnRecalcular.addActionListener(new ActionListener() {
@Override p
ublic void actionPerformed(ActionEvent arg0) {
double[] d= new double[variablesModificables.length];
for(int i=0;i<variablesModificables.length;i++){
try{
if(i==0){
d[0] = Double.parseDouble(ri1.txtVariable1.getText());
}
else if(i==1){
d[1] = Double.parseDouble(ri1.txtVariable2.getTex
t()); }
else if(i==2){
d[2] = Double.parseDouble(ri1.txtVaria
ble3.getText()); }
else if(i==3){
d[3] = Double.parseDouble(r
i1.txtVariable4.getText());
} }
catch(Exception ex){
new AnalisisException("ENTRADA INVALIDA EN LA POSICION
"+(i+1)); return;
}
} ri1.setVisible(false);
mPadreU1.resetDatos();
ejecutarMetodoInterfaz(d); }
}); } private stati
c void coordinarLabelsYTextBoxVariablesModificables(
ResultadosInterfaz1 ri1) { switch(variablesModifi
cables.length){ case 1:
ri1.lblVariable1.setText(TEXTOINICIO+variablesModificables[0]+TEXTOFIN);
ri1.lblVariable2.setVisible(false);
ri1.txtVariable2.setVisible(false);
ri1.lblVariable3.setVisible(false); ri1.t
xtVariable3.setVisible(false); ri1.lblVariable4
.setVisible(false); ri1.txtVariable4.setVisible
(false); break; case 2
: ri1.lblVariable1.setText(TEXTOINICIO+variable
sModificables[0]+TEXTOFIN); ri1.lblVariable2.se
tText(TEXTOINICIO+variablesModificables[1]+TEXTOFIN);
ri1.lblVariable3.setVisible(false); ri1.
txtVariable3.setVisible(false); ri1.lblVariable
4.setVisible(false); ri1.txtVariable4.setVisibl
e(false); break; case
3: ri1.lblVariable1.setText(TEXTOINICIO+variabl
esModificables[0]+TEXTOFIN); ri1.lblVariable2.s
etText(TEXTOINICIO+variablesModificables[1]+TEXTOFIN);
ri1.lblVariable3.setText(TEXTOINICIO+variablesModificables[2]+TEXTOFIN);
ri1.lblVariable4.setVisible(false);
ri1.txtVariable4.setVisible(false);
break; case 4:
ri1.lblVariable1.setText(TEXTOINICIO+variablesModificables[0]+TEXTOFIN);
ri1.lblVariable2.setText(TEXTOINICIO+variablesMod
ificables[1]+TEXTOFIN); ri1.lblVariable3.setTex
t(TEXTOINICIO+variablesModificables[2]+TEXTOFIN);
ri1.lblVariable4.setText(TEXTOINICIO+variablesModificables[3]+TEXTOFIN);
break; }
} private static String generarTextoReferenciaUnidad() {
String salida = ""; if(MetodoUni
dad1.getParserF()!=null){ salida+="f(x)= "+Meto
doUnidad1.funcionF+"\n"; } if(
MetodoUnidad1.getParserG()!=null){ salida+="g(x
)= "+MetodoUnidad1.funcionF+"\n"; }
if(MetodoUnidad1.getParserFdev()!=null){
salida+="f'(x)= "+MetodoUnidad1.funcionFdev+"\n"; }
if(MetodoUnidad1.getParserFdd()!=null){
salida+="f''(x)= "+MetodoUnidad1.funcionFdd+"\n";
} return salida; }
}