Este proyecto implementa un analizador sintáctico y léxico utilizando Bison y Flex para resolver ecuaciones no lineales mediante dos métodos numéricos: Método de Newton-Raphson y Método de Punto Fijo. El código está diseñado para leer una entrada desde un archivo de texto (entrada.txt
), procesarla, y luego escribir los resultados en otro archivo de texto (salida.txt
).
El código está dividido en varias secciones principales:
- Se incluyen las bibliotecas necesarias y se definen constantes para los métodos numéricos (
METODO_NEWTONRAPH
yMETODO_PUNTOFIJO
). - Se declaran variables globales como
x
,fx
,fdx
,gx
, yerror_esperado
, que se utilizan para almacenar los valores durante el proceso de iteración. - Se definen los tokens y las reglas gramaticales para el analizador sintáctico.
- Las reglas gramaticales definen cómo se deben interpretar las expresiones matemáticas. Estas reglas incluyen operaciones básicas como suma, resta, multiplicación, división, y funciones matemáticas como seno, coseno, tangente, logaritmo y raíz cuadrada.
- Las reglas también manejan la asignación de valores a las variables
x
,fx
,fdx
, ygx
dependiendo del método seleccionado.
asignarValores
: Esta función asigna los valores iniciales parax
,fx
,fdx
,gx
, yerror_esperado
dependiendo del método seleccionado.yyerror
yyywarning
: Estas funciones manejan los errores y advertencias durante el análisis sintáctico.
- La función principal lee la entrada desde
entrada.txt
, realiza el análisis sintáctico, y luego ejecuta el método numérico seleccionado (Newton-Raphson o Punto Fijo) para encontrar la raíz de la ecuación. - El proceso se repite hasta que el error sea menor que el error esperado.
- Los resultados de cada iteración se imprimen en el archivo
resultados.txt
.
El método de Newton-Raphson es un algoritmo iterativo para encontrar la raíz de una función. Se basa en la siguiente fórmula:
Donde:
- x es el valor actual.
- f(x) es el valor de la función en x.
- f'(x) es la derivada de la función en x.
El método de Punto Fijo es otro algoritmo iterativo que encuentra la raíz de una función transformando la ecuación original f(x) = 0 en una ecuación de la forma x = g(x). La iteración se realiza mediante:
Donde:
- x es el valor actual.
- g(x) es la función de iteración.
Para compilar el código, asegúrate de tener instalados Bison y Flex. Luego, ejecuta los siguientes comandos en la terminal:
flex.exe –oparsermet.h parsermet.l
bison.exe -y -v --defines=parsermetTok.h -oparsermet_yac.h parsermet.y
Estos comandos generarán 3 archivos de cabecera. Si quieres generar un .h y un .c para poder realizar pruebas en consola necesitas ejecutar:
flex.exe –oparsermet.h parsermet.l
bison.exe -d –oparsermet_yac.c parsermet.y
Crea un archivo llamado entrada.txt
en el mismo directorio que el ejecutable. El archivo debe contener la definición de la ecuación y los parámetros iniciales. Por ejemplo:
nt{
x = -2.0
f(x) = x^2 - 2
fd(x) = 2*x
error = 0.01
}
Esto indica que se utilizará el método de Newton-Raphson con un valor inicial de x = -2.0, la función:
, su derivada:
y un error esperado de 0.01.
Ejecuta el programa compilado si aplica.
Los resultados se imprimirán en un archivo llamado resultados.txt
.
Iteración X f(X) g(X) Error
---------- ------------ ------------ ------------ ------------
1 0.400000 2.000000 0.400000 0.400000
2 0.469404 0.347022 0.469404 0.069404
3 0.498600 0.145980 0.498600 0.029196
4 0.512893 0.071462 0.512893 0.014292
5 0.520361 0.037343 0.520361 0.007469
...
- División por Cero: El código maneja la división por cero lanzando una advertencia.
- Precisión: El algoritmo se detiene cuando el error es menor que el error esperado.
- Reinicio: Después de cada ejecución, las variables globales se reinician a sus valores iniciales.
Si deseas contribuir a este proyecto, siéntete libre de hacer un fork y enviar un pull request con tus mejoras. Asegúrate de seguir las buenas prácticas de codificación y de documentar cualquier cambio importante.
Este proyecto está bajo la licencia MIT. Consulta el archivo LICENSE
para más detalles.
¡Gracias por revisar este proyecto! Si tienes alguna pregunta o sugerencia, no dudes en abrir un issue en el repositorio.
- Joan Pablo Alvarado Garfias
- Jeremy Osorio Ramos