14
VALOR DE UNA FUNCION MATEMATICA EN JAVA Para trabajos de programación aplicada, como por ejemplo para cálculos numéricos, aveces hacemos uso de funciones matematicas, ya sean lineales, cuadráticas, cubicas, trigonométricas etc. Y nos encontramos en la necesidad de poder analizar en valor de una función especifica, en el caso de ser una solo función no habría problemas, pero en el caso de ser cualquier función nos encontramos en la necesidad de quizás expresar la función de la forma mas conocida, como por ejemplo para funciones cuatraticas la podríamos escribir del siguiente modo: ' yf(x)=ax 2 +bx+c En un programa la escribiríamos del siguiente modo Yf(x)=ax ^2+bx+c O bien para una función trigonométrica Yf(x)=sen(ax ^2)+bx+tan c Para escribirlas de ese modo necesitamos una clase o algo parecido, que nos pueda aceptar tal expresión y poder calcular el valor de la función según el valor de x que le demos. En este post se describirá una clase que hace tal tarea, osea podemos eviarle a la clase una expresión como la anterior, con un valor de x, y que la misma me realice el calculo. El código a continuación es el código de la clase “Funcion”

Valor de Una Funcion a en Java

Embed Size (px)

Citation preview

Page 1: Valor de Una Funcion a en Java

VALOR DE UNA FUNCION MATEMATICA EN JAVA

Para trabajos de programación aplicada, como por ejemplo para cálculos numéricos, aveces hacemos uso de funciones matematicas, ya sean lineales,  cuadráticas, cubicas, trigonométricas etc. Y nos encontramos en la necesidad de poder analizar en valor de una función especifica, en el caso  de ser una solo función no habría problemas, pero en el caso de ser cualquier función nos encontramos en la necesidad de quizás expresar la función de la forma mas conocida, como por ejemplo para funciones cuatraticas la podríamos escribir del siguiente modo:

'

                     yf(x)=ax2+bx+c En un programa la escribiríamos del siguiente modo                     Yf(x)=ax ^2+bx+c O bien para una función trigonométrica                          Yf(x)=sen(ax ^2)+bx+tan c

Para escribirlas de ese modo necesitamos una clase o algo parecido, que nos pueda aceptar tal expresión y poder calcular el valor de la función según el valor de x que le demos. En este post se describirá una clase que hace tal tarea, osea podemos eviarle a la clase una expresión como la anterior, con un valor de x, y que la misma me realice el calculo. El código a continuación es el código de la clase “Funcion”

package funciones; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; /**

Page 2: Valor de Una Funcion a en Java

* * @author RAFAEL */ public class Funcion { private String operacion; private String  resultadoConversion; private String  resultadoOperacion; private int  indiceIni; private int  indiceFin; private String valor; public Funcion() { } public String evaluar( String operacion, String valor){   this.operacion=operacion;   this.valor=valor;   this.resultadoConversion=analizaCadena(this.operacion);  this.resultadoConversion=reemplazaOperacionJS(this.resultadoConversion);   return this.resultadoOperacion=calculo(this.resultadoConversion); } private String analizaCadena(String cadena){   cadena=cadena.replaceAll("x", this.valor);   cadena=quitarEspacios(cadena);   cadena="-"+cadena;   char[] vectorCadena=cadena.toCharArray();   if(cadena.contains("^")){   cadena=reemplazaPotencia(vectorCadena, cadena);   }   vectorCadena=cadena.toCharArray();  if(cadena.contains("cos")){    cadena=reemplazaTrigonometrica(vectorCadena, cadena, ".co",'c');   }   vectorCadena=cadena.toCharArray();  if(cadena.contains("sen")){    cadena=reemplazaTrigonometrica(vectorCadena, cadena, ".si",'s');   }   vectorCadena=cadena.toCharArray();  if(cadena.contains("tan")){    cadena=reemplazaTrigonometrica(vectorCadena, cadena, ".ta",'t');   }   return cadena; } private String reemplazaParIzq(char[] cadena,int indice){   ArrayList<Character> lista1=new ArrayList<Character>();   ArrayList<Character> lista2=new ArrayList<Character>();   String res="";   int i;   for ( i = indice-1; i >=0; i--) {     if(cadena[i]==')'){       lista1.add(cadena[i]);     }     else     {      if(cadena[i]=='('){       lista2.add(cadena[i]);     }     }     res+=cadena[i];     if((lista1.size()==lista2.size())&&(i!=(indice-1))){       this.indiceIni=i;       return invertir(res);

Page 3: Valor de Una Funcion a en Java

    }   }   return null; }   private String reemplazaParDer(char[] cadena,int indice ){   ArrayList<Character> lista1=new ArrayList<Character>();   ArrayList<Character> lista2=new ArrayList<Character>();   String res="";   int i;   for ( i = indice+1; i <cadena.length ; i++) {     if(cadena[i]=='('){       lista1.add(cadena[i]);     }     else     {      if(cadena[i]==')'){       lista2.add(cadena[i]);     }     }     res+=cadena[i];     if((lista1.size()==lista2.size())&&(i!=(indice+1))){       this.indiceFin=i+1;       return res;     }   }   return null; } private String reemplazaNumIzq(char[] cadena,int indice){   Pattern exp= Pattern.compile("\\\\d|\\\\.");   Matcher expReg;   String resultadoBase ="";   String res = "";   for (int i = indice-1; i >=0; i--) {     res="";     res+=cadena[i];           expReg=exp.matcher(res);       if (expReg.find()){         resultadoBase+=cadena[i];         this.indiceIni=i;         }         else           {           break;          }   }   return invertir(resultadoBase); } private String reemplazaNumDer(char[] cadena,int indice){   Pattern exp= Pattern.compile("\\\\d|\\\\.");   Matcher expReg;   String resultadoBase ="";   String res = "";   for (int i = indice+1; i<cadena.length; i++) {     res="";     res+=cadena[i];           expReg=exp.matcher(res);       if (expReg.find()){         resultadoBase+=cadena[i];         this.indiceFin=i+1;         }         else           {           break;

Page 4: Valor de Una Funcion a en Java

         }   }   return resultadoBase; } private String invertir(String cadena){   char[] vector=cadena.toCharArray();   String res="";   for (int i = vector.length-1; i >=0; i--) {           res+=vector[i];   }   return res; } private String reemplazaPotencia(char[] vectorCadena,String cadena){       String resIzq="",resDer=""; for (int indice = 0; indice < vectorCadena.length; indice++) {     if (vectorCadena[indice]=='^') {       if (vectorCadena[indice - 1] == ')') {         resIzq =reemplazaParIzq(vectorCadena, indice);         }       else{         resIzq =reemplazaNumIzq(vectorCadena, indice);           }       if (vectorCadena[indice + 1] == '(') {         resDer =reemplazaParDer(vectorCadena, indice);         }           else{         resDer =reemplazaNumDer(vectorCadena, indice);           }          vectorCadena=(cadena.substring(0,this.indiceIni)+".po("                  +resIzq+","+resDer+")"+(cadena.substring(this.indiceFin,cadena.length()))).toCharArray();          cadena=(cadena.substring(0,this.indiceIni)+".po("                  +resIzq+","+resDer+")"+(cadena.substring(this.indiceFin,cadena.length())));          indice=0;     }   }       return cadena; } private String reemplazaTrigonometrica(char[] vectorCadena,Stringcadena,String operacion,char caracter){   String resDer="";   for (int indice = 0; indice < vectorCadena.length; indice++) {     if((vectorCadena[indice]==caracter)&&((vectorCadena)[indice-1]!='.')&&(indice!=0)){       if (vectorCadena[indice + 3] == '(') {         resDer =reemplazaParDer(vectorCadena, indice+2);         }          else{         resDer =reemplazaNumDer(vectorCadena, indice+2);           }          vectorCadena=(cadena.substring(0,indice)+operacion+"("                  +resDer+")"+(cadena.substring(this.indiceFin,cadena.length()))).toCharArray();          cadena=(cadena.substring(0,indice)+operacion+"("                  +resDer+")"+(cadena.substring(this.indiceFin,cadena.length())) );          indice=0;     }   }

Page 5: Valor de Una Funcion a en Java

  return  cadena; } public String getResultadoConversion() {   return this.resultadoConversion; } public String getResultadoOperacion() {   return resultadoOperacion; } private String  quitarEspacios(String sTexto){   String sCadenaSinBlancos="";   for (int x=0; x < sTexto.length(); x++) { if (sTexto.charAt(x) != ' ')   sCadenaSinBlancos += sTexto.charAt(x);   }   return sCadenaSinBlancos; } private String reemplazaOperacionJS(String operacion){   this.resultadoConversion=operacion.replaceAll(".po","Math.pow"); this.resultadoConversion=this.resultadoConversion.replaceAll(".co","Math.cos"); this.resultadoConversion=this.resultadoConversion.replaceAll(".si","Math.sin"); this.resultadoConversion=this.resultadoConversion.replaceAll(".ta","Math.tan"); return this.resultadoConversion.substring(1,this.resultadoConversion.length()); } private String calculo(String cadena) {   ScriptEngineManager script = new ScriptEngineManager();       ScriptEngine js = script.getEngineByName("JavaScript");       try{      return js.eval(cadena).toString();       }catch(Exception e){         return e.toString();       } } }

Procederemos a explicar sencillamente y grandes rasgos lo que hace cada método :

public String evaluar( String operacion, String valor)

Método que evalua la cadena "operacion" que contiene la funcion a analizar con el valor "valor", este al igual que el metodo acceso de la propiedad resultado

Page 6: Valor de Una Funcion a en Java

"getResultado" nos devuelve el valor de la funcion matematica expresada en "operacion"

private String analizaCadena(String cadena)

Método que me analiza la cadea recibida del constructor, en este se evalua el contenido de la misma, es decir si existe una potencia, o una función trigonométrica.

private String reemplazaParIzq(char[] cadena,int indice)

Recibe un array conteniendo la operación y a partir del índice recibido de evalua hasta donde es el alcance de la operación contenida dentro de los parentesis. Es decir si recibe una array conteniendo  (sen (1)-2+3) ^8  devuelve (sen(1)2+3)

private String reemplazaParDer(char[] cadena,int indice )

Igual a la anterior pero evalua el alcance pero por la derecha, es decir en una potencia devuelve el exponente.

private String reemplazaNumIzq(char[] cadena,int indice)

En el caso de no haber paréntesis, evalua el alcance pero de los números que contiene la operación, por ejemplo si la operación es 233.4^8 devuelve 233.4

private String reemplazaNumDer(char[] cadena,int indice)

Page 7: Valor de Una Funcion a en Java

Igual a la anterior pero devuelve el alcance de la operación por la derecha.

private String invertir(String cadena)

invierte una cadena.

private String reemplazaPotencia(char[] vectorCadena,String cadena)

Si existe una potencia, este método es el indicado para realizar la conversión,es decir Si en la cadena existe 233.4^8 lo reemplaza  por .po(233.4,8) para ser evaluada luego.

private String reemplazaTrigonometrica(char[] vectorCadena,String cadena,String operacion,char caracter)

Reemplaza las funciones trigonométricas, es decir si en la operación llega sen (3), la reemplaza por .si(3), para luego ser evaluada.

private String  quitarEspacios(String sTexto)

Quita espacios en blanco.

private String reemplazaOperacionJS(String operacion)

para este caso Utilizamos la libreria de JavaScript incorporada en java, asi que reemplazamos para que este lenguaje la pueda analizar, como ser si

Page 8: Valor de Una Funcion a en Java

viene en la cadena .si (3), lo reemplazamos por Math.sin(3)

private String calculo(String cadena)

una vez analizada toda la cadena, se procede con este metodo a realizar el calculo, para ello hacemos uso de javascript (ver este post para mas informacion). La sintaxis para utilizar esta clase es la siguiente

Ahora crearemos un proyecto Java en Netbeans,y en nuestro Main incluimos las siguientes líneas para probar las funciones escritas anteriormente. En todos los ejemplos observamos que instanciamos la clase Funcion, llamamos el metodo evaluar, y luego mostramos por la salida estándar  la conversión que realiza la clase y el valor de la función. El constructor es inicializado, con la cadena que contiene la operación, mas el valor que le vamos a dar al valor de x. Probamos la potencia

import javax.script.ScriptException; public class Main {

Page 9: Valor de Una Funcion a en Java

    public static void main(String[] args) throws ScriptException {       String cadena="3^x+32+4^(2+x)";//       Funcion f=new Funcion();       f.evaluar(cadena, "2");       System.out.println(f.getResultadoConversion());       System.out.println(f.getResultadoOperacion());     } }  

El resultado es

Probamos la raíz

import javax.script.ScriptException; public class Main {     public static void main(String[] args) throws ScriptException {       String cadena="x^(1/2)";       Funcion f=new Funcion();       f.evaluar(cadena, "144");       System.out.println(f.getResultadoConversion());       System.out.println(f.getResultadoOperacion());       System.out.println(Math.cos(1));     } }

Page 10: Valor de Una Funcion a en Java

La salida es

Probamos las trigonométricas

import javax.script.ScriptException; public class Main {     public static void main(String[] args) throws ScriptException {       String cadena="sen(34*2)+tan x";       Funcion f=new Funcion();       f.evaluar(cadena, "1");       System.out.println(f.getResultadoConversion());       System.out.println(f.getResultadoOperacion());       System.out.println(Math.cos(1));     } }  

La salida es

Page 11: Valor de Una Funcion a en Java

Probamos una mezcla de las anteriores

import javax.script.ScriptException; public class Main {     public static void main(String[] args) throws ScriptException {       String cadena="sen (34*x)+tan 1+32+x^(2+4-cos 3)";       Funcion f=new Funcion();       f.evaluar(cadena, "1.5");       Syste m .out.println(f.getResultadoConversion());       System.out.println(f.getResultadoOperacion());       System.out.println(Math.cos(1));     } }

El resultado obtenido

Page 12: Valor de Una Funcion a en Java

Bien con esto terminamos, vimos la clase Funcion que nos puede resolver problemas que nos pueden aparecer como mencionamos en los métodos

numéricos… hasta pronto…  

'