Un 'parser' para leer la función
Para graficar una función necesitamos
-
Leer la función
-
Calcular los pares
ordenados y unirlos con un segmento de recta
Para leer la función
debemos usar un 'parser', es decir una clase que nos permita leer y evaluar la
fórmula que define a la función. Aquí, en vez de implementar un 'parser' (que
sería bastante laborioso), vamos a usar uno que está disponible de manera
gratuita en internet: JEP (Java Expression Parser,http://sourceforge.net/projects/jep/.
Al momento de esta publicación, la versión actual es la 2.3.1
Primero vamos a
implementar un pequeño applet para ver como usar el evaluador
Los navegadores ya no brindan soporte para applets de java, este applet se ha deshabilitado
La manera fácil para poder usar JEP
con el IDE JCreator (http://www.jcreator.com/)
es descargar JEP y poner la carpeta 'org' (que viene en la subcarpeta
'build') en la subcarpeta 'classes' del proyecto.
Si usa
otro IDE, deberá hacer los cambios adecuados para que Java pueda encontrar el
archivo jep231.jar.
En nuestro programa, se deben importar dos
bibliotecas
import org.nfunk.jep.*;
import org.nfunk.jep.type.*;
La segunda biblioteca
nos permite un buen manejo de los números complejos, para trabajar con funciones
como
Para leer y evaluar
funciones se debe crear un objeto JEP con algunas características
private JEP miEvaluador = new JEP();
miEvaluador.addStandardFunctions();
miEvaluador.addStandardConstants();
miEvaluador.addComplex(); //habilitar 'sen'
miEvaluador.addFunction("sen", new org.nfunk.jep.function.Sine();
miEvaluador.addVariable("x", 0);
miEvaluador.setImplicitMul(true); //permite 2x en vez de 2*x |
Para evaluar, se asigna una función (al leer una
función, ésta se convierte en la función actual), se declara la variable y se
evalúa en algún valor. Todo esto lo hacemos con un método.
double evaluar(JEP Miparser,String
fun, double valorx)
{
Miparser.parseExpression(fun);
Miparser.addVariable("x", valorx);
errorEnExpresion = Miparser.hasError(); //hay error?
return Miparser.getValue();
}
|
el código completo es
Evaluador.java
|
import javax.swing.*;
import javax.swing.event.*;
//////////////////////
import java.awt.*;
import java.awt.event.*;
import org.nfunk.jep.*;
import org.nfunk.jep.type.*;
public class Evaluador extends JApplet
{
private JEP miEvaluador;
double vx;
boolean errorEnExpresion; //si hay error de
sintaxis en la función
boolean errorEnNumero ; //si hay error
de sintaxis en el valor x
JTextField Tfun;
//leer función
JTextField Tvalorx;
//leer valor x para evaluar
JButton BtnEvaluar;
JLabel Mensaje;
public void init()
{
Container content = getContentPane();
Tfun = new JTextField("2x^2-3x+sen(x)",10);
Tvalorx = new JTextField("4",3);
BtnEvaluar = new JButton("Evaluar");
Mensaje = new JLabel(""); //para imprimir
resultado de evaluación
content.setLayout(new FlowLayout());
content.add(Tfun);
content.add(Tvalorx);
content.add(BtnEvaluar);
content.add(Mensaje);
//Manejo de eventos
ManejadorDeEvento ManejadorDevt = new ManejadorDeEvento();
Tfun.addActionListener(ManejadorDevt);
Tvalorx.addActionListener(ManejadorDevt);
BtnEvaluar.addActionListener(ManejadorDevt);
//parser JEP
miEvaluador = new JEP();
miEvaluador.addStandardFunctions(); //agrega
las funciones comunes
miEvaluador.addStandardConstants();
miEvaluador.addComplex();
miEvaluador.addFunction("sen", new org.nfunk.jep.function.Sine());
miEvaluador.addVariable("x", 0);
miEvaluador.setImplicitMul(true); //permite
2x en vez de 2*x
}
private class ManejadorDeEvento implements ActionListener
{
public void actionPerformed (ActionEvent evt)
{
Object source = evt.getSource ();
// si se presiona el botón o se da
'enter' en algún campo de texto
if( source == BtnEvaluar || source == Tfun || source ==
Tvalorx)
LeerImprimir();
}
}//
void LeerImprimir()
{
try
{
Double dx = new Double( Tvalorx.getText() );
//leer el número
vx = dx.doubleValue();
errorEnNumero=false;
Tvalorx.setForeground(Color.black);
}catch(NumberFormatException e){ errorEnNumero=true;
//número incorrecto
Tvalorx.setForeground(Color.red);
}
vx=evaluar(miEvaluador,Tfun.getText(),vx);
if(!errorEnExpresion && !errorEnNumero)
{
Mensaje.setText(""+vx);
}else Mensaje.setText("Hay un error.");
}//
double evaluar(JEP Miparser,String fun, double valorx)
{
Miparser.parseExpression(fun);
Miparser.addVariable("x", valorx);
errorEnExpresion = Miparser.hasError();
//hay error?
return Miparser.getValue();
}//
}
|
Revista digital Matemática, Educación e Internet.
Derechos Reservados
|