SlideShare a Scribd company logo
1 of 184
Métodos numéricos y su implementación
en software
Elabora: Benjamín Joaquín Martínez
https://www.linkedin.com/in/benja
minjoaquinmartinez/
Índice
No.Pagina
Introducción 4
Antecedentes 4
Objetivos 6
Metodología 6
Recursos 7
Cronograma 8
Programación de analizador léxicoy
herramientade redondeo
13
Análisisléxico 13
Redondeo 19
Soluciónde ecuaciones 20
Punto fijo 20
Análisis 20
Diseño 22
Implementación 24
Pruebas 31
Bisección 33
Análisis 33
Diseño 34
Implementación 38
Pruebas 49
Falsa posición 51
Análisis 51
Diseño 52
Implementación 56
Pruebas 64
NewtonRaphson 66
Análisis 66
Diseño 68
Implementación 70
Pruebas 76
Secante 77
Análisis 77
Diseño 78
Implementación 82
Pruebas 89
Sistemasde ecuaciones 91
Métodode Jacobi 91
Análisis 91
Diseño 93
Implementación 95
Pruebas 109
Métodode Gauss- Seidel 110
Análisis 110
Diseño 111
Implementación 112
Pruebas 126
Integración y derivaciónnumérica 128
Integración numérica 128
Métododel trapecio 128
Análisis 128
Diseño 131
Implementación 132
Pruebas 139
Metodode simpson 141
Análisis 141
Diseño 142
Implementación 143
Pruebas 151
Derivaciónnumérica 152
Análisis 152
Diseño 153
Implementación 154
Pruebas 167
Ajuste de datos 169
Regresiónlineal por mínimoscuadrados 169
Análisis 169
Diseño 171
Implementación 172
Pruebas 181
Integración de los módulosdel programa 182
Bibliografía 184
Introducción
Este proyecto surge de la necesidad de crear una herramienta de software en la que se puedan
implementar los métodos numéricos a través de una interfaz en la que un usuario pueda
introducir una función matemática y elegir que método numérico utilizar para el propósito
que sea requerido.
Antecedentes.
Muchos problemas de cómputo en el área de matemáticas pueden ser divididos en pequeños
módulos de cálculos bien conocidos, como solución de sistemas de ecuaciones lineales,
transformadas de Fourier, etc. Por consecuencia, usualmente los programadores sólo tienen
que escribir una rutina pequeña para el problema particular que se tenga, porque ya existe
software para resolver las subtareas del problema. Facilitando así el no tener que programar
los procedimientos matemáticos una y otra vez.
Para crear proyectos relacionados con el cálculo matemático existe ya software desarrollado
como por ejemplo:
Matlab
Es un programa de cálculo numérico, orientado a matrices y vectores. Por tanto desde el
principio hay que pensar que todo lo que se pretenda hacer con él, será mucho más rápido y
efectivo si se piensa en términos de matrices y vectores.
Derive
Es un potente programa para el cálculo matemático avanzado: variables, expresiones
algebraicas, ecuaciones, funciones, vectores, matrices, trigonometría, etc. También tiene
capacidades de calculadora científica, y puede representar funciones gráficas en dos y tres
dimensiones en varios sistemas coordenados.
Geogebra.
Programa muy similar a Cabri en cuanto a instrumentos y posibilidades pero incorporando
elementos algebraicos y de cálculo. La gran ventaja sobre otros programas de geometría
dinámica es la dualidad en pantalla: una expresión en la ventana algebraica se corresponde
con un objeto en la ventana geométrica y viceversa. Es un programa libre y gratuito, GNU
General Public License.
Euler
Es un potente laboratorio numérico e interactivo. Evalúa rápidamente funciones numéricas,
visualiza los resultados, y permite probar y programar algoritmos numéricos. El sistema
puede manejar números reales, complejos y de intervalos, vectores y matrices. La mayoría
de las rutinas están escritas en lenguaje de Euler y pueden ser modificados o ampliados por
el usuario.
Yacas
Es una herramienta de álgebra fácil de usar, un programa para la manipulación simbólica de
expresiones matemáticas. Utiliza su propio lenguaje de programación. El sistema cuenta con
una biblioteca de scripts que implementan muchas de las operaciones de álgebra simbólica;
nuevos algoritmos pueden ser fácilmente añadidos a la biblioteca. Yacas viene con una
amplia documentación (cientos de páginas) que cubren el lenguaje de script, la funcionalidad
que ya está implementada en el sistema, y los algoritmos que hemos utilizado.
Octave
Proporciona una cómoda interfaz de línea de comandos para resolver numéricamente
problemas lineales y no lineales, y realiza otros experimentos numéricos usando un lenguaje
compatible con Matlab.
Objetivos.
Objetivo general
En este proyecto se pretende transformar los procedimientos matemáticos involucrados en la
resolución de los diferentes métodos numéricos, a rutinas de código que permitan la
resolución de problemas matemáticos usando una herramienta de cómputo.
Objetivos específicos
 Codificar los métodos numéricos para implementarse en software
 Crear una interfaz de usuario para ingresar una función matemática en el ordenador
y seleccionar el método de resolución correspondiente.
 Identificar los procedimientos matemáticos que puedan resolverse a través de un
método numérico.
 Desarrollar una interfaz gráfica fácil de usar para el usuario final.
Metodología.
Para el presente proyecto se usará el lenguaje de programación JAVA, que cuenta con las
librerías necesarias para su desarrollo tales como Math, la cual contiene lo necesario para
operar con funciones matemáticas y hacer procesos como el redondeo de cifras.
La metodología a usar para el desarrollo del software será la metodología de prototipos, que
consiste en las fases de:
1. Planeación
2. Modelado
3. Elaboración del prototipo
4. Desarrollo posterior
5. Entrega y retroalimentación
6. Comunicación con el cliente
El modelo de prototipos tiene la ventaja de acelerar el desarrollo del software ya que la fase
de planeación y modelado es más rápida al ser el software un prototipo. En las fases de
elaboración y desarrollo se toma el tiempo que sea necesario para que en la entrega y
retroalimentación se pueda presentar una versión del proyecto que aunque no terminado sea
ya funcional para que el cliente pueda hacer sus observaciones y esté al tanto del progreso
del proyecto. En base a este análisis del cliente se puede volver a iterar la planeación y
siguientes fases hasta volver a presentar un nuevo prototipo y así llegar a un producto final
que satisfaga las necesidades del cliente.
Recursos.
Siendo JAVA el lenguaje de programación a utilizar se empleara una computadora con los
requerimientos básicos para poder utilizar la máquina virtual de java así como un entorno de
desarrollo integrado, el cual será BlueJ ya que integra una interfaz desde la cual se pueden
ver las relaciones entre los diferentes módulos o clases programadas.
Java Runtime Environment (JRE) es lo que se obtiene al descargar el software de Java. JRE
está formado por Java Virtual Machine (JVM), clases del núcleo de la plataforma Java y
bibliotecas de la plataforma Java de soporte.
El sistema operativo que alojara la JVM será Windows 10, para lo cual se requieren
RAM: 128 MB
Espacio en disco: 124 MB para JRE; 2 MB para Java Update
Procesador: Mínimo Pentium 2 a 266 MHz
BlueJ fue desarrollado para apoyar la enseñanza y el aprendizaje de la programación
orientada a objetos, y como resultado, su diseño difiere de otros entornos de desarrollo. La
pantalla principal muestra gráficamente la estructura de clases de una aplicación en desarrollo
(en un diagrama muy parecido a UML), y los objetos pueden ser creados y probados
interactivamente. Combinado con una interfaz de usuario simple, esta facilidad de
interacción permite experimentar de manera fácil con los objetos en desarrollo. Los
conceptos de la orientación a objetos (clases, objetos, comunicación a través de llamadas
a métodos) son representados visualmente en el diseño de interacción en la interfaz.
Para la codificación del software se requieren conocimientos básicos de las librerías
matemáticas integradas para el lenguaje de programación, y conocimientos básicos de
matemáticas con su implementación en software por parte del desarrollador del proyecto.
Cronograma
Semana 1
7/09/2020-
13/09/2020
Semana 2
14/09/2020-
20/09/2020
Semana 3
21/09/2020-
27/09/2020
Semana 4
28/09/2020-
04/10/2020
Realizado
Definiciónde
antecedentes,
objetivos,
metodologíay
recursosa usar.
X
Creaciónde una clase
de análisisléxico que
recibacadenasde
textoy lasconvierta
enexpresiones
matematicas
X
Programaciónde un
módulodel software
para redondearcifras
Solución de ecuaciones
Punto fijo
Análisisdel método
del puntofijo X
Diseñodel algoritmo,
clases, interfazy
métodospara
programar el modulo
del puntofijo.
X
Programaciónde las
clasespreviamente
diseñadas
X
Pruebasdel software
usandofuncionescon
resultadosconocidos
y herramientasde
graficación
X
Bisección
Análisisdel método
de la bisección X
Diseñodel algoritmo,
clases,interfazy X
métodospara
programar el módulo
de la bisección.
Programaciónde las
clasespreviamente
diseñadas
X
Pruebasdel software
usandofuncionescon
resultadosconocidos
y herramientasde
graficación
X
Falsa posición
Análisisdel método
de la falsaposición X
Diseñodel algoritmo,
clases,interfazy
métodospara
programar el módulo
de la falsaposición.
X
Programaciónde las
clasespreviamente
diseñadas
X
Pruebasdel software
usandofuncionescon
resultadosconocidos
y herramientasde
graficación
X
Semana 5
5/10/2020-
11/10/2020
Semana 6
12/10/2020-
18/10/2020
Semana 7
19/10/2020-
25/10/2020
Semana 8
26/10/2020-
1/11/2020
Newton Raphson
Análisisdel método
de Newton-Raphson X
Diseñodel algoritmo,
clases,interfazy
métodospara
programar el módulo
de Newton-Raphson.
X
Programaciónde las
clasespreviamente
diseñadas
X
Pruebasdel software
usandofuncionescon
resultadosconocidos
y herramientas de
graficación
X
Secante
Análisisdel método
de Secante X
Diseñodel algoritmo,
clases,interfazy
métodospara
programar el módulo
de Secante.
X
Programaciónde las
clasespreviamente
diseñadas
X
Pruebasdel software
usandofunciones con
resultadosconocidos
y herramientasde
graficación
X
Sistemas de ecuaciones
Método de Jacobi
Análisisdel método
de Jacobi. X
Diseñodel algoritmo,
clases,interfazy
métodospara
programar el módulo
de Jacobi.
X
Programaciónde las
clasespreviamente
diseñadas
X
Pruebasdel software
usandosistemasde
ecuacionescon
resultadosconocidos
y comprobaciónde
resultados
X
Método de Gauss- Seidel
Análisisdel método
de Gauss-Seidel. X
Diseñodel algoritmo,
clases,interfaz y
métodospara
programar el módulo
de Gauss-Seidel.
X
Programaciónde las
clasespreviamente
diseñadas
X
Pruebasdel software
usandosistemasde
ecuacionescon
resultadosconocidos
y comprobaciónde
resultados
X
Semana 9
2/11/2020-
8/11/2020
Semana 10
9/11/2020-
15/11/2020
Semana 11
2/11/2020-
8/11/2020
Semana 12
16/11/2020-
22/11/2020
Integración y derivación numérica
Método del trapecio
Análisisdel método
de trapecio. X
Diseñodel algoritmo,
clases,interfazy
métodos para
programar el módulo
de trapecio.
X
Programaciónde las
clasespreviamente
diseñadas
X
Pruebasdel software
usandointegralescon
resultadosconocidos
y comparando
resultados.
X
Método de Simpson
Análisisdel método
de Simpson. X
Diseñodel algoritmo,
clases,interfazy
métodospara
programar el módulo
de Simpson.
X
Programaciónde las
clasespreviamente
diseñadas
X
Pruebasdel software
usandointegralescon
resultadosconocidos
y comparando
resultados.
X
Derivación numérica
Análisisdel método
de derivación X
progresiva,regresivay
central.
Diseñodel algoritmo,
clases,interfazy
métodospara
programar los
métodosde
derivación
X
Programaciónde las
clasespreviamente
diseñadas
X
Pruebasdel software
usandoderivadascon
resultadosconocidos
y comparando
resultados.
X
Semana 13
23/11/2020-
29/11/2020
Semana 14
30/12/2020-
6/12/2020
Semana 15
7/12/2020-
13/12/2020
Semana 16
14/12/2020-
20/12/2020
Ajuste de datos
Regresión lineal por mínimos cuadrados
Análisisdel método
de mínimos
cuadrados.
X
Diseñodel algoritmo,
clases,interfazy
métodospara
programar el método
de losmínimos
cuadrados
X
Programaciónde las
clasespreviamente
diseñadas
X
Pruebasdel software
usandopuntos
cartesianosy
comparandola recta
obtenidaconlos
puntosgraficados
X
Integraciónde los
métodos
programadosenuna
solainterfaz.
X
Programación de analizador léxico y herramienta de
redondeo
Análisis Lexico
Un analizador léxico o analizador lexicográfico (en inglés scanner) es la primera fase de
un compilador, consistente en un programa que recibe como entrada el código fuente de otro
programa (secuencia de caracteres) y produce una salida compuesta de tokens (componentes
léxicos) o símbolos. Estos tokens sirven para una posterior etapa del proceso de traducción,
siendo la entrada para el analizador sintáctico (en inglés parser).
La especificación de un lenguaje de programación a menudo incluye un conjunto de reglas
que definen el léxico. Estas reglas consisten comúnmente en expresiones regulares que
indican el conjunto de posibles secuencias de caracteres que definen un token o lexema.
En algunos lenguajes de programación es necesario establecer patrones para caracteres
especiales (como el espacio en blanco) que la gramática pueda reconocer sin que constituya
un token en sí.
Para la correcta lectura de las funciones que serán evaluadas en los siguientes modulos del
programa se hizo la programación de un analizador léxico que recibe una cadena de texto y
convierta la cada en una operación matemática que el lenguaje java pueda interpretar.
Las funciones que acepta el lenguaje definido en el analizador léxico son, seno, coseno,
tangente, e, logaritmo, raíz cuadrada, suma, resta, multiplicación, división, potencia y el
agrupamiento de operaciones mediante paréntesis.
Raiz cuadrada sqrt()
seno sen()
coseno cos()
tangente tan()
e eˆ()
logaritmo ln()
suma, resta, multiplicación, división. + , - , / , *
Potencia o “ elevado a “
ˆ
Para el caso de e, la cadena se recibe como eˆ y se hace un filtrado para reemplazar el
carácter por los paréntesis que ocupa el lenguaje del analizador léxico, lo mismo ocurre con
variables x, ya que no se ha definido que operación realizaría x, el filtrado susituye x por su
correspondiente valor numérico previamente pasado como un parámetro, asi se maneja x
como si de un numero se tratara. Asi mismo, al recibir un resultado puede darse el caso de
ser devuelto en una nomenclatura tipo E’algun numero’, lo cual indica que hay un
desbordamiento por el numero de decimales que se están manejando, sin embargo el
analizador léxico no procesa este operador asi que en el filtrado de la función también se
sustituye por "*10^" lo cual es su verdadero significado.
Asi entonces el usuario puede introducir libremente cadenas de texto de la forma “(e^(-
0.5*x)) * cos(2*x) “ . Al leer la función también se debe enviar como parámetro el valor de
la variable x. En el caso de un error de sintaxis el resultado de la función será 0, ya que
devuelve la variable double resultado, la cual desde su declaración se le dio el valor 0.
Los errores en la sintaxis de la cadena pueden deberse a introducir un operador no definido
en el analizador léxico, una función no definida por este, o un carácter invalido o no
coherente con una expresión matemática.
Diseño UML
Implementación
Código del analizador léxico de funciones matemáticas
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.JOptionPane;
public class EvaluadorFunciones {
public static double eval(final String str) {
return new Object() {
int pos = -1, ch;
void nextChar() {
ch = (++pos < str.length()) ? str.charAt(pos) : -1;
}
boolean eat(int charToEat) {
while (ch == ' ') nextChar();
if (ch == charToEat) {
nextChar();
return true;
}
return false;
}
double parse() {
nextChar();
double x = parseExpression();
if (pos < str.length()) throw new RuntimeException("Unexpected: " +
(char)ch);
return x;
}
// Grammar:
// expression = term | expression `+` term | expression `-` term
// term = factor | term `*` factor | term `/` factor
// factor = `+` factor | `-` factor | `(` expression `)`
// | number | functionName factor | factor `^` factor
double parseExpression() {
double x = parseTerm();
for (;;) {
if (eat('+')) x += parseTerm(); // addition
else if (eat('-')) x -= parseTerm(); // subtraction
else return x;
}
}
double parseTerm() {
double x = parseFactor();
for (;;) {
if (eat('*')) x *= parseFactor(); // multiplication
else if (eat('/')) x /= parseFactor(); // division
else return x;
}
}
double parseFactor() {
if (eat('+')) return parseFactor(); // unary plus
if (eat('-')) return -parseFactor(); // unary minus
double x;
int startPos = this.pos;
if (eat('(')) { // parentheses
x = parseExpression();
eat(')');
} else if ((ch >= '0' && ch <= '9') || ch == '.') { // numbers
while ((ch >= '0' && ch <= '9') || ch == '.') nextChar();
x = Double.parseDouble(str.substring(startPos, this.pos));
} else if (ch >= 'a' && ch <= 'z') { // functions
while (ch >= 'a' && ch <= 'z') nextChar();
String func = str.substring(startPos, this.pos);
x = parseFactor();
if (func.equals("sqrt")) x = Math.sqrt(x);
else if (func.equals("sen")) x = Math.sin(x);
else if (func.equals("cos")) x = Math.cos(x);
else if (func.equals("tan")) x = Math.tan(Math.toRadians(x));
else if (func.equals("e")) x = Math.exp(x);
else if (func.equals("ln")) x = Math.log(x);
else throw new RuntimeException("Unknown function: " + func);
} else {
throw new RuntimeException("Unexpected: " + (char)ch);
}
if (eat('^')) x = Math.pow(x, parseFactor()); // exponentiation
// if (eat('e^')) x = Math.pow(x, parseFactor()); //numeros tipo 434E-10
return x;
}
}.parse();
}
}
Código de la clase de filtrado para funciones que incluyen una variable x
import javax.swing.JOptionPane;
public class EvaluarX{
public double evaluarFuncion(String funcion,double x){
// String sustitucionx= funcion.replaceAll("x",String.valueOf(x));
// sustitucionx= sustitucionx.replaceAll("E","*10^");
// sustitucionx= sustitucionx.replaceAll("e^","e");
String sustitucion="";
sustitucion=funcion.replace("e^","e");
sustitucion=sustitucion.replaceAll("x",String.valueOf(x));
sustitucion=sustitucion.replaceAll("E","*10^");
//sustitucion=sustitucion.replaceAll("E","^");
// funcion.replaceAll("e^","e");
//System.out.println(sustitucion);
EvaluadorFunciones EF= new EvaluadorFunciones();
double resultado=0.0;
try{
resultado=EF.eval(sustitucion);
}catch(Exception excepcion)
{
//JOptionPane.showMessageDialog(null, "error de
sintaxis", " ", JOptionPane.WARNING_MESSAGE);
}
return resultado;
}
public String sustitucionx1(String funcion,double x){
String sustitucionx= funcion.replaceAll("x1",String.valueOf(x));
return sustitucionx;
}
public String sustitucionx2(String funcion,double x){
String sustitucionx= funcion.replaceAll("x2",String.valueOf(x));
return sustitucionx;
}
public String sustitucionx3(String funcion,double x){
String sustitucionx= funcion.replaceAll("x3",String.valueOf(x));
return sustitucionx;
}
public double evaluarFuncionxxx(String funcion,double x1,double x2,double
x3){
String sustitucionx= funcion;
sustitucionx= sustitucionx1(sustitucionx, x1);
//System.out.println(sustitucionx);
sustitucionx= sustitucionx2(sustitucionx, x2);
//System.out.println(sustitucionx);
sustitucionx= sustitucionx3(sustitucionx, x3);
//System.out.println(sustitucionx);
EvaluadorFunciones EF= new EvaluadorFunciones();
return EF.eval(sustitucionx);
}
}
Redondeo
Debido a que será una operación muy repetitiva en todos los modulos del programa se creo
una clase que implementara el método de redondeo, la clase recibe como parámetros un
número y un numero de decimales, y devuelve un resultado redondeando el numero a su
entero decimal más cercano.
UML
Implementacion
Clase redondeo
public class Redondeo {
public double redondear(double numero,int digitos)
{
int cifras=(int) Math.pow(10,digitos);
return Math.rint(numero*cifras)/cifras;
}
}
Soluciónde ecuaciones
Análisis
Encontrar una solución ó una raíz real de una ecuación,
es hallar el valor de la variable independiente x, que anule
el valor de la función f(x), que se exprese en términos de
la variable citada. En otras palabras, si la función se
desarrolla en el plano cartesiano xy, la solución real de
esa función es el valor de x que corresponda a la
intersección del eje de las abscisas con la curva d efinida
por la función f(x).
Para encontrar una solución real, las ecuaciones, sin
importar que representen un polinomio u otra cualquiera, deben ser representadas en la
forma: f(x) = 0
Punto fijo
A partir de una ecuación F(X)=0 se genera una ecuación X=g(X), a la cual se le busca una
solución, y se debe tener en cuenta lo siguiente
 Se busca un valor de X que al reemplazarlo en g, el resultado sea X.
 Se debe elegir una aproximación inicial Xo
 Se calcula X1=g(Xo)
 Y se repite el paso anterior hasta llegar a una aproximación.
Puede afirmarse que si el método converge, la diferencia en valor absoluto entre valores
proporcionados en dos iteraciones sucesivas será cada vez más pequeña a medida que n
aumente, y con esto se tendrá un criterio para saber cuándo termina la aplicación del método.
Sea f(x) = 0 una ecuación algebraica o trascendente cualquiera. Se suma x en ambos
miembros y se obtiene:
(1)
f(x) + x = x
Donde el miembro izquierdo es otra
función de x que se define como
(2)
G(x) + x = x
Se sustituye en la ecuación (1):
(3)
x = G(x)
Si x = a es una raíz de la ecuación,
entonces
f (a) = 0
Al proceder reiteradamente en esta forma se induce que la n-ésima aproximación es:
Xn = G(Xn-1)
n = 1,2,3,.....
Diseño
Diagrama de flujodel métododel punto fijo.
Pseudocódigodel métodode punto fijo
Proceso Método punto Fijo
Leer Xo, Tolerancia, Iter
Yo = f(Xo)
Contador = 0
Error = Tolerancia + 1
Mientras 0 & Error > Tolerancia Hacer
Yo = f(Xn)
Error = abs ((Xn - Xo)/Xn)
Xo = Xn
Contador = Contador + 1
Fin Mientras
Si Yo = 0 Entonces
Muestre: ‘Xo es Raiz’
Sino Si Error < Tolerancia Entonces
Muestre: ‘‘Xo’ es una raiz aproximada con una tolerancia ‘Tolerancia’’
Fin Si
Fin Si
Fin Proceso
UML
Diseño de la interfaz de usuario
Implementación
Código de la interfaz grafica
import javax.swing.*;
import java.awt.Event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
import java.util.InputMismatchException;
public class Interfaz_PuntoFijo extends JFrame implements ActionListener{
//__________________________
JPanel panel3;
JTextField txt_puntofijo;
JButton btn_puntofijo;
JLabel lbl_puntofijo;
JTextArea textarea_puntofijo;
JScrollPane scrollpane_puntofijo;
JButton limpiar_puntofijo;
JTextField txt_valorinicial;
JLabel lbl_valorinicial;
JTextField txt_errorpuntofijo;
JLabel lbl_errorpuntofijo;
JTextField txt_decimalespuntofijo;
JLabel lbl_decimalespuntofijo;
String error[];
JComboBox cotaerror;
String decimales[];
JComboBox numdecimales;
public Interfaz_PuntoFijo(){
//setDefaultCloseOperation(EXIT_ON_CLOSE );
// setBounds(0, 0, 850, 500);
//setVisible(true);
//_________________________________________//
lbl_puntofijo=new JLabel("Ingrese la funcion ");
lbl_puntofijo.setBounds(20, 15, 200, 20);
txt_puntofijo=new JTextField();
txt_puntofijo.setBounds(130, 15, 500, 20);
lbl_valorinicial=new JLabel("Valor inicial ");
lbl_valorinicial.setBounds(20, 100, 200, 20);
txt_valorinicial=new JTextField();
txt_valorinicial.setBounds(130, 100, 150, 20);
lbl_errorpuntofijo=new JLabel("Error");
lbl_errorpuntofijo.setBounds(20, 140, 200, 20);
// txt_errorpuntofijo=new JTextField();
// txt_errorpuntofijo.setBounds(130, 140, 150, 20);
error= new String[] { "0.1", "0.01", "0.001","0.0001", "0.00001" };
cotaerror= new JComboBox(error);
cotaerror.setSelectedIndex(2);
cotaerror.setBounds(130, 140, 150, 20);
lbl_decimalespuntofijo=new JLabel("Decimales");
lbl_decimalespuntofijo.setBounds(20, 160, 200, 20);
decimales= new String[] { "1", "2","3", "4","5","6","7" };
numdecimales= new JComboBox(decimales);
numdecimales.setSelectedIndex(4);
numdecimales.setBounds(130, 160, 150, 20);
// txt_decimalespuntofijo=new JTextField();
// txt_decimalespuntofijo.setBounds(130, 160, 150, 20);
btn_puntofijo=new JButton("Obtener raiz");
btn_puntofijo.setBounds(20, 200, 200, 20);
btn_puntofijo.addActionListener(this);
textarea_puntofijo=new JTextArea();
textarea_puntofijo.setEditable(false);
scrollpane_puntofijo=new JScrollPane(textarea_puntofijo);
scrollpane_puntofijo.setBounds(300,50,500,300);
limpiar_puntofijo = new JButton("Limpiar texto");
limpiar_puntofijo.setBounds(20, 250, 200, 20);
limpiar_puntofijo.addActionListener(this);
panel3=new JPanel();
panel3.setLayout(null);
panel3.add(scrollpane_puntofijo);
panel3.add(lbl_puntofijo);
panel3.add(txt_puntofijo);
panel3.add(lbl_errorpuntofijo);
panel3.add(cotaerror);
panel3.add(lbl_decimalespuntofijo);
panel3.add(numdecimales);
panel3.add(lbl_valorinicial);
panel3.add(txt_valorinicial);
panel3.add(btn_puntofijo);
panel3.add(limpiar_puntofijo);
//________________________________________________
}
public JPanel interfazpuntofijo() {
return panel3;
}
public void actionPerformed(ActionEvent mn){
if(mn.getSource()==btn_puntofijo){
String funcion;
Double inicial=0.0;
Double error=0.0;
int decimales=0;
funcion=txt_puntofijo.getText();
funcion=funcion.replaceAll(" ", ""); //quitar espacios
try{
inicial=Double.parseDouble(txt_valorinicial.getText());
} catch (NumberFormatException nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor inicial",
JOptionPane.WARNING_MESSAGE);}
error=Double.parseDouble(cotaerror.getSelectedItem().toString());
decimales=Integer.parseInt(numdecimales.getSelectedItem().toString());
if(funcion.length()!=0){
PuntoFijo pf = new PuntoFijo();
textarea_puntofijo.setText(pf.puntofijo(funcion,inicial,error,decimales));
}else{
// System.out.print("hola");
JOptionPane.showMessageDialog(null, "La función no ha sido creada", "Casilla vacia
", JOptionPane.WARNING_MESSAGE);}
}
if(mn.getSource()==limpiar_puntofijo){
textarea_puntofijo.setText("");
}
}
// public static void main(String[] args) {
// Puntofijo2 MN = new Puntofijo2();
// }
}
La clase punto fijo recibe una función, un valor inicial, un margen de error y con cuantos
decimales debe trabajar y devuelve un String que se añadirá al área editable de la interfaz
gráfica .
Clase que implementa el método del punto fijo
public class PuntoFijo{
String consola="";
double error;
double errorRelativo;
double erp;
public String puntofijo(String funcion,double x,double margen,int decimales) {
EvaluarX EX=new EvaluarX();
Redondeo R= new Redondeo();
int cifras=decimales;
//String funcion = "(e(x))/3";
error= margen + 1;
double resultado=0;
consola+="XttFuncion(x)ttError";
consola+="n";
//while (erp>margen){
while (error>margen){
try{
resultado= R.redondear((EX.evaluarFuncion(funcion,x)),cifras);
//if(resultado==Infinity);
error= Math.abs(resultado-x);
error =R.redondear(error,cifras);
consola+=""+x+"tt"+resultado+"tt"+error;
consola+="n";
// System.out.println(""+x+"tt"+resultado+"tt"+error+"n");
x=resultado;
} catch (Exception e){}
}
return consola;
}
// public static void main (String [] args){
// PuntoFijo pf= new PuntoFijo();
// pf.puntofijo("(e^x)-(10*(x^2))+2",1.0,0.0001,5);
// }
}
Pruebas
La función f(𝑥) = 𝑒𝑥
– 3 x
De la forma x= 𝑒𝑥
/3
Valor inicial= 0.5 ERP= 0.001 % 5 decimales de redondeo
Arroja un valor para x =0.61904 que se aproxima a la raíz de la función como lo muestra la
gráfica de la función
Graficando f(𝑥) = 𝑒𝑥
– 3 x se obtiene la siguiente grafica que confirma la aproximación de
la raíz
Método de bisección
Análisis
Este método plantea que si se cumple que:
 f(x) es real y continua en el intervalo que va desde un Xi hasta un Xs
 f(Xi) f(Xs)<0
Si se cumple lo anterior, por lo menos existe una raíz dentro de este intervalo.
El procedimiento es el siguiente:
 Se elige un intervalo inicial para función f(x)
 Luego se busca localizar la raíz con mayor
exactitud dentro del intervalo dividiendo a la
mitad y observando si se conservan las
condiciones iniciales.
 Se compara el Xmed con cada uno de los
límites del intervalo y se observa que
producto cambia de signo y se asigna un
nuevo intervalo.
 Se vuelve a repetir el proceso, y se va
poniendo pequeño el intervalo hasta llegar a
una aproximación de la raíz o la raíz exacta.
Al aplicarse el método se puede apreciar que la
aproximación a la raíz mejora cada vez que el
intervalo se hace más pequeño.
Diseño
Diagrama de flujo del método de la bisección
Pseudocódigo del método de la bisección
Proceso Metodo de Biseccion
Leer Xi, Xs, Tolerancia, Iter
Yi = f(Xi)
Ys = f(Xs)
Si Yi*Ys < 0 Entonces
Xm= (Xi + Xs)/2
Contador = 1
Ym = f(Xm)
Error = Tolerancia + 1
Mientras Hacer
Si Yi*Ym < 0 Entonces
X s= Xm
Ys = Ym
Sino
X i= Xm
Yi = Ym
Fin Si
Xaux = Xm
Xm = (Xi + Xs)/2
Ym = f(Xm)
Error = Abs(Xm - Xaux)
Contador = Contador + 1
Fin Mientras
Si Ym = 0 Entonces
Muestre:‘Xm es Raiz’
Sino Si Error < Tolerancia Entonces
Muestre:‘Xm es aproximacion a una raiz con una toleracia ‘Tolerancia’’
Fin Si
Fin Si
Sino
Muestre:‘El intervalo es inadecuado’
Fin Si
Fin Proceso
UML
Diseño de la interfaz gráfica de usuario
Implementación
Interfaz grafica de usuario
import javax.swing.*;
import java.awt.Event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Interfaz_Biseccion extends JFrame implements ActionListener{
//___________________________
JPanel panel2;
JTextField txt_biseccion;
JButton btn_biseccion;
JLabel lbl_biseccion;
JTextArea textarea_biseccion;
JScrollPane scrollpane_biseccion;
JButton limpiar_biseccion;
JTextField txt_errorbiseccion;
JLabel lbl_errorbiseccion;
JTextField txt_decimalesbiseccion;
JLabel lbl_decimalesbiseccion;
JTextField txt_valorabiseccion;
JLabel lbl_valorabiseccion;
JTextField txt_valorbbiseccion;
JLabel lbl_valorbbiseccion;
//___________________________
String error[];
JComboBox cotaerror;
String decimales[];
JComboBox numdecimales;
//__________________________
public Interfaz_Biseccion(){
//______________________________________//
lbl_biseccion=new JLabel("Ingrese la funcion ");
lbl_biseccion.setBounds(20, 15, 200, 20);
txt_biseccion=new JTextField();
txt_biseccion.setBounds(130, 15, 500, 20);
lbl_valorabiseccion=new JLabel("Valor a ");
lbl_valorabiseccion.setBounds(20, 100, 200, 20);
txt_valorabiseccion=new JTextField();
txt_valorabiseccion.setBounds(130, 100, 150, 20);
lbl_valorbbiseccion=new JLabel("Valor b ");
lbl_valorbbiseccion.setBounds(20, 120, 200, 20);
txt_valorbbiseccion=new JTextField();
txt_valorbbiseccion.setBounds(130, 120, 150, 20);
lbl_errorbiseccion=new JLabel("Error");
lbl_errorbiseccion.setBounds(20, 140, 200, 20);
error= new String[] { "0.1", "0.01", "0.001","0.0001", "0.00001" };
cotaerror= new JComboBox(error);
cotaerror.setSelectedIndex(2);
cotaerror.setBounds(130, 140, 150, 20);
// txt_errorbiseccion=new JTextField();
// txt_errorbiseccion.setBounds(130, 140, 150, 20);
lbl_decimalesbiseccion=new JLabel("Decimales");
lbl_decimalesbiseccion.setBounds(20, 160, 200, 20);
// txt_decimalesbiseccion=new JTextField();
// txt_decimalesbiseccion.setBounds(130, 160, 150, 20);
decimales= new String[] { "1", "2","3", "4","5","6","7" };
numdecimales= new JComboBox(decimales);
numdecimales.setSelectedIndex(4);
numdecimales.setBounds(130, 160, 150, 20);
btn_biseccion=new JButton("Obtener raiz");
btn_biseccion.setBounds(20, 200, 200, 20);
btn_biseccion.addActionListener(this);
textarea_biseccion=new JTextArea();
textarea_biseccion.setEditable(false);
scrollpane_biseccion=new JScrollPane(textarea_biseccion);
scrollpane_biseccion.setBounds(300,50,500,300);
limpiar_biseccion = new JButton("Limpiar texto");
limpiar_biseccion.setBounds(20, 250, 200, 20);
limpiar_biseccion.addActionListener(this);
panel2=new JPanel();
panel2.setLayout(null);
panel2.add(scrollpane_biseccion);
panel2.add(lbl_biseccion);
panel2.add(txt_biseccion);
panel2.add(lbl_valorabiseccion);
panel2.add(txt_valorabiseccion);
panel2.add(lbl_valorbbiseccion);
panel2.add(txt_valorbbiseccion);
panel2.add(btn_biseccion);
panel2.add(limpiar_biseccion);
panel2.add(lbl_errorbiseccion);
panel2.add(cotaerror);
panel2.add(lbl_decimalesbiseccion);
panel2.add(numdecimales);
//_________________________________________//
}
public void actionPerformed(ActionEvent mn){
if(mn.getSource()==btn_biseccion){
String funcion;
Double a=0.0;
Double b=0.0;
Double error=0.0;
int decimales=0;
funcion=txt_biseccion.getText();
funcion=funcion.replaceAll(" ", ""); //quitar espacios
try{
a=Double.parseDouble(txt_valorabiseccion.getText());
} catch (NumberFormatException nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor
inicial", JOptionPane.WARNING_MESSAGE);}
try{
b=Double.parseDouble(txt_valorbbiseccion.getText());
} catch (NumberFormatException nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor
inicial", JOptionPane.WARNING_MESSAGE);}
error=Double.parseDouble(cotaerror.getSelectedItem().toString());
decimales=Integer.parseInt(numdecimales.getSelectedItem().toString());
if(funcion.length()!=0){
Biseccion bi = new Biseccion();
textarea_biseccion.setText(bi.biseccion(funcion,a,b,error,decimales));
}else{
JOptionPane.showMessageDialog(null, "La función no ha sido creada", "Casilla
vacia ", JOptionPane.WARNING_MESSAGE);}
}
if(mn.getSource()==limpiar_biseccion){
textarea_biseccion.setText("");
}
}
public JPanel interfazbiseccion() {
return panel2;
}
}
La clase Bisección recibe una función, un valor inicial a, el valor inicial b, un margen de
error y con cuantos decimales debe trabajar y devuelve un String que se añadirá al área
editable de la interfaz gráfica .
Clase que implementa el método de la bisección
import javax.swing.*;
import java.awt.Event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Interfaz_Biseccion extends JFrame implements ActionListener{
//___________________________
JPanel panel2;
JTextField txt_biseccion;
JButton btn_biseccion;
JLabel lbl_biseccion;
JTextArea textarea_biseccion;
JScrollPane scrollpane_biseccion;
JButton limpiar_biseccion;
JTextField txt_errorbiseccion;
JLabel lbl_errorbiseccion;
JTextField txt_decimalesbiseccion;
JLabel lbl_decimalesbiseccion;
JTextField txt_valorabiseccion;
JLabel lbl_valorabiseccion;
JTextField txt_valorbbiseccion;
JLabel lbl_valorbbiseccion;
//___________________________
String error[];
JComboBox cotaerror;
String decimales[];
JComboBox numdecimales;
//__________________________
public Interfaz_Biseccion(){
//______________________________________//
lbl_biseccion=new JLabel("Ingrese la funcion ");
lbl_biseccion.setBounds(20, 15, 200, 20);
txt_biseccion=new JTextField();
txt_biseccion.setBounds(130, 15, 500, 20);
lbl_valorabiseccion=new JLabel("Valor a ");
lbl_valorabiseccion.setBounds(20, 100, 200, 20);
txt_valorabiseccion=new JTextField();
txt_valorabiseccion.setBounds(130, 100, 150, 20);
lbl_valorbbiseccion=new JLabel("Valor b ");
lbl_valorbbiseccion.setBounds(20, 120, 200, 20);
txt_valorbbiseccion=new JTextField();
txt_valorbbiseccion.setBounds(130, 120, 150, 20);
lbl_errorbiseccion=new JLabel("Error");
lbl_errorbiseccion.setBounds(20, 140, 200, 20);
error= new String[] { "0.1", "0.01", "0.001","0.0001", "0.00001" };
cotaerror= new JComboBox(error);
cotaerror.setSelectedIndex(2);
cotaerror.setBounds(130, 140, 150, 20);
// txt_errorbiseccion=new JTextField();
// txt_errorbiseccion.setBounds(130, 140, 150, 20);
lbl_decimalesbiseccion=new JLabel("Decimales");
lbl_decimalesbiseccion.setBounds(20, 160, 200, 20);
// txt_decimalesbiseccion=new JTextField();
// txt_decimalesbiseccion.setBounds(130, 160, 150, 20);
decimales= new String[] { "1", "2","3", "4","5","6","7" };
numdecimales= new JComboBox(decimales);
numdecimales.setSelectedIndex(4);
numdecimales.setBounds(130, 160, 150, 20);
btn_biseccion=new JButton("Obtener raiz");
btn_biseccion.setBounds(20, 200, 200, 20);
btn_biseccion.addActionListener(this);
textarea_biseccion=new JTextArea();
textarea_biseccion.setEditable(false);
scrollpane_biseccion=new JScrollPane(textarea_biseccion);
scrollpane_biseccion.setBounds(300,50,500,300);
limpiar_biseccion = new JButton("Limpiar texto");
limpiar_biseccion.setBounds(20, 250, 200, 20);
limpiar_biseccion.addActionListener(this);
panel2=new JPanel();
panel2.setLayout(null);
panel2.add(scrollpane_biseccion);
panel2.add(lbl_biseccion);
panel2.add(txt_biseccion);
panel2.add(lbl_valorabiseccion);
panel2.add(txt_valorabiseccion);
panel2.add(lbl_valorbbiseccion);
panel2.add(txt_valorbbiseccion);
panel2.add(btn_biseccion);
panel2.add(limpiar_biseccion);
panel2.add(lbl_errorbiseccion);
panel2.add(cotaerror);
panel2.add(lbl_decimalesbiseccion);
panel2.add(numdecimales);
//_________________________________________//
}
public void actionPerformed(ActionEvent mn){
if(mn.getSource()==btn_biseccion){
String funcion;
Double a=0.0;
Double b=0.0;
Double error=0.0;
int decimales=0;
funcion=txt_biseccion.getText();
funcion=funcion.replaceAll(" ", ""); //quitar espacios
try{
a=Double.parseDouble(txt_valorabiseccion.getText());
} catch (NumberFormatException nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor
inicial", JOptionPane.WARNING_MESSAGE);}
try{
b=Double.parseDouble(txt_valorbbiseccion.getText());
} catch (NumberFormatException nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor
inicial", JOptionPane.WARNING_MESSAGE);}
error=Double.parseDouble(cotaerror.getSelectedItem().toString());
decimales=Integer.parseInt(numdecimales.getSelectedItem().toString());
if(funcion.length()!=0){
Biseccion bi = new Biseccion();
textarea_biseccion.setText(bi.biseccion(funcion,a,b,error,decimales));
}else{
JOptionPane.showMessageDialog(null, "La función no ha sido creada", "Casilla
vacia ", JOptionPane.WARNING_MESSAGE);}
}
if(mn.getSource()==limpiar_biseccion){
textarea_biseccion.setText("");
}
}
public JPanel interfazbiseccion() {
return panel2;
}
}
Pruebas
La función f(x)= 𝑒−𝑥
–lnx se evaluó con a=0.5 y b=2, con un error absoluto porcentual de
0.001 y 5 decimales
El método seleccionado fue el de la bisección
Raiz= 1.30982
Esto coincide con lo mostrado al graficar la función
Falsa posición
Análisis
 Si se tiene dos puntos (a, f(a)) y(b, f(b)) y se traza la recta que une a estos dos
puntos, se puede observar que un punto esta por debajo del eje x y otro por encima
de este, y un punto intermedio (Xm,0), con este punto intermedio se puede
comparar los límites y obtener un nuevo intervalo
 Si f(A) y f(B)<0, entonces la raíz
se encuentra al lado izquierdo del
intervalo.
 Si f(A) y f(B)>0, entonces la raíz
se encuentra al lado derecho del
intervalo.
 Para hallar la intersección de la
recta con el eje X usamos la siguiente fórmula:
Xm= a - ((f(a)*(b - a))/(f(b) - f(a)))
Diseño
Diagrama de flujo del método de la falsa posición
Pseudocódigodel métodode la falsa posición
Proceso Método de la falsa posición
Leer Xi, Xs, Tolerancia, Iter
Yi = f(Xi)
Ys = f(Xs)
Si Yi*Ys < 0 Entonces
Xm= Xi – ((Yi*(Xs – Xi))/(Ys – Yi))
Contador = 1
Ym = f(Xm)
Error = Tolerancia + 1
Mientras Hacer
Si Yi*Ym < 0 Entonces
X s= Xm
Ys = Ym
Sino
X i= Xm
Yi = Ym
Fin Si
Xaux = Xm
Xm= Xi – ((Yi*(Xs – Xi))/(Ys – Yi))
Ym = f(Xm)
Error = Abs(Xm - Xaux)
Contador = Contador + 1
Fin Mientras
Si Ym = 0 Entonces
Muestre:‘Xm es Raiz’
Sino Si Error < Tolerancia Entonces
Muestre:‘Xm es aproximacion a una raiz con una toleracia ‘Tolerancia’’
Fin Si
Fin Si
Sino
Muestre:‘El intervalo es inadecuado’
Fin Si
Fin Proceso
UML
Diseño de la interfaz gráfica de usuario
Implementación
Interfaz grafica de usuario
import javax.swing.*;
import java.awt.Event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Interfaz_falsaposicion extends JFrame implements ActionListener{
JPanel panel1;
JTextField txt_falsaposicion;
JButton btn_falsaPosicion;
JLabel lbl_falsaposicion;
JTextArea textarea_falsaposicion;
JScrollPane scrollpane_falsaposicion;
JButton limpiar_falsaposicion;
JTextField txt_errorfalsaposicion;
JLabel lbl_errorfalsaposicion;
JTextField txt_decimalesfalsaposicion;
JLabel lbl_decimalesfalsaposicion;
JTextField txt_valorafalsaposicion;
JLabel lbl_valorafalsaposicion;
JTextField txt_valorbfalsaposicion;
JLabel lbl_valorbfalsaposicion;
//___________________________
String error[];
JComboBox cotaerror;
String decimales[];
JComboBox numdecimales;
//__________________________
public Interfaz_falsaposicion(){
lbl_falsaposicion=new JLabel("Ingrese la funcion ");
lbl_falsaposicion.setBounds(20, 15, 200, 20);
txt_falsaposicion=new JTextField();
txt_falsaposicion.setBounds(130, 60, 150, 20);
txt_falsaposicion.setBounds(130, 15, 500, 20);
lbl_valorafalsaposicion=new JLabel("Valor a ");
lbl_valorafalsaposicion.setBounds(20, 100, 200, 20);
txt_valorafalsaposicion=new JTextField();
txt_valorafalsaposicion.setBounds(130, 100, 150, 20);
lbl_valorbfalsaposicion=new JLabel("Valor b ");
lbl_valorbfalsaposicion.setBounds(20, 120, 200, 20);
txt_valorbfalsaposicion=new JTextField();
txt_valorbfalsaposicion.setBounds(130, 120, 150, 20);
lbl_errorfalsaposicion=new JLabel("Error");
lbl_errorfalsaposicion.setBounds(20, 140, 200, 20);
// txt_errorfalsaposicion=new JTextField();
// txt_errorfalsaposicion.setBounds(130, 140, 150, 20);
error= new String[] { "0.1", "0.01", "0.001","0.0001", "0.00001" };
cotaerror= new JComboBox(error);
cotaerror.setSelectedIndex(2);
cotaerror.setBounds(130, 140, 150, 20);
lbl_decimalesfalsaposicion=new JLabel("Decimales");
lbl_decimalesfalsaposicion.setBounds(20, 160, 200, 20);
// txt_decimalesfalsaposicion=new JTextField();
// txt_decimalesfalsaposicion.setBounds(130, 160, 150, 20);
decimales= new String[] { "1", "2","3", "4","5","6","7" };
numdecimales= new JComboBox(decimales);
numdecimales.setSelectedIndex(4);
numdecimales.setBounds(130, 160, 150, 20);
btn_falsaPosicion=new JButton("Obtener raiz");
btn_falsaPosicion.setBounds(20, 200, 200, 20);
btn_falsaPosicion.addActionListener(this);
textarea_falsaposicion=new JTextArea();
textarea_falsaposicion.setEditable(false);
scrollpane_falsaposicion=new JScrollPane(textarea_falsaposicion);
scrollpane_falsaposicion.setBounds(300,50,500,300);
limpiar_falsaposicion = new JButton("Limpiar texto");
limpiar_falsaposicion.setBounds(20, 250, 200, 20);
limpiar_falsaposicion.addActionListener(this);
panel1=new JPanel();
panel1.setLayout(null);
panel1.add(scrollpane_falsaposicion);
panel1.add(lbl_falsaposicion);
panel1.add(txt_falsaposicion);
panel1.add(lbl_valorafalsaposicion);
panel1.add(txt_valorafalsaposicion);
panel1.add(lbl_valorbfalsaposicion);
panel1.add(txt_valorbfalsaposicion);
panel1.add(lbl_errorfalsaposicion);
panel1.add(cotaerror);
panel1.add(lbl_decimalesfalsaposicion);
panel1.add(numdecimales);
panel1.add(btn_falsaPosicion);
panel1.add(limpiar_falsaposicion);
}
public JPanel interfaz() {
return panel1;
}
public void actionPerformed(ActionEvent mn){
if(mn.getSource()==btn_falsaPosicion){
String funcion;
Double a=0.0;
Double b=0.0;
Double error=0.0;
int decimales=0;
funcion=txt_falsaposicion.getText();
funcion=funcion.replaceAll(" ", ""); //quitar espacios
try{
a=Double.parseDouble(txt_valorafalsaposicion.getText());
} catch (NumberFormatException nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor inicial",
JOptionPane.WARNING_MESSAGE);}
try{
b=Double.parseDouble(txt_valorbfalsaposicion.getText());
} catch (NumberFormatException nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor inicial",
JOptionPane.WARNING_MESSAGE);}
error=Double.parseDouble(cotaerror.getSelectedItem().toString());
decimales=Integer.parseInt(numdecimales.getSelectedItem().toString());
if(funcion.length()!=0){
FalsaPosicion f= new FalsaPosicion();
textarea_falsaposicion.setText(f.falsaPosicion(funcion,a,b,error,decimales));
}else{
JOptionPane.showMessageDialog(null, "La función no ha sido creada", "Casilla vacia
", JOptionPane.WARNING_MESSAGE);}
}
if(mn.getSource()==limpiar_falsaposicion){
textarea_falsaposicion.setText("");
}
}
}
La clase FalsaPosicion recibe una función, un valor inicial a, el valor inicial b, un margen
de error y con cuantos decimales debe trabajar y devuelve un String que se añadirá al área
editable de la interfaz gráfica .
Clase que implementa el método
public class FalsaPosicion {
public String consola="";
public String falsaPosicion(String funcion,double a, double b, double tolerancia,
int decimales){
consola+="METODO DE LA FALSA POSICIONn";
consola+="nx"+"t"+"f(x)t"+"error"+"n";
//_________________________
//double a=0;
//double b=1;
//double tolerancia=0.0001;
//int decimales=6;
// String funcion= "10*e(-0.5*x)*cos(2*x)";
//String funcion= "(5*(x^ 3))-(5*(x^2))+(6 * x)-2";
//String funcion="(0.05*x)-(sen(x))";
//_________________________
Redondeo R= new Redondeo();
EvaluarX EX=new EvaluarX();
double funcionA,funcionB,funcionC=0;
double error=tolerancia+1;
double c=0;
double cAnterior=c;
int contador=0;
funcionA=R.redondear((EX.evaluarFuncion(funcion,a)),decimales);
funcionB=R.redondear((EX.evaluarFuncion(funcion,b)),decimales);
if ((funcionA * funcionB)<0)
{
while(error>=tolerancia){
consola+="________________________________________________";
consola+="n";
cAnterior=c;
funcionA=R.redondear((EX.evaluarFuncion(funcion,a)),decimales);
funcionB=R.redondear((EX.evaluarFuncion(funcion,b)),decimales);
c=a - (((b-a)* funcionA)/(funcionB-funcionA)) ;
c=R.redondear(c,decimales);
funcionC= EX.evaluarFuncion(funcion,c);
funcionC=R.redondear(funcionC,decimales);
// error= Math.abs((Math.abs(c)-Math.abs(cAnterior))/Math.abs(c)) * 100;
//eap
error= Math.abs(Math.abs(c)-Math.abs(cAnterior)); //ea
error=R.redondear(error,decimales);
//if(error>=tolerancia){
consola+=c+"t"+funcionC+"tt"+error;
consola+="n";
// }
if(c==0) error=tolerancia-1; //para detener el ciclo
contador++;
if((funcionA*funcionC)<0){
b=c;
}
else {
a=c;
}
}
} else{consola+= " f(a) * f(b) es mayor que 0 n Introduzca nuevos valores de a
y b";}
return consola;
}
}
Pruebas
La función f(x)= 𝑒−𝑥
–lnx se evaluó con a=0.5 y b=2, con un error absoluto porcentual de
0.001 y 5 decimales
El método seleccionado fue el de la falsa posición.
Falsa posición=1.31028
Esto coincide con lo mostrado al graficar la función
Newton Raphson
Análisis
Este método de resolución numérica busca un cero de la función f(x) por aproximaciones
sucesivas a partir de un valor inicial x0. El valor sucesivo xn+1 es la abscisa del punto en
que la tangente a la gráfica de f(x) en xn corta al eje Ox. Es decir
Es por tanto equivalente a aplicar el método de iteraciones a la función
Este método es uno de los más utilizados para localizar raíces ya que en general es muy
eficiente y siempre converge para una función polinomial.
Se requiere que las funciones sean diferenciables, y por tanto, continuas, para poder aplicar
este método.
Se debe partir de un valor inicial para la raíz: xi , este puede ser cualquier valor, el método
convergirá a la raíz mas cercana.
Si se extiende una tangente desde el punto , el punto donde esta tangente cruza al
eje x representa una aproximación mejorada de la raíz.
El método de Newton-Raphson es convergente
cuadráticamente, es decir, el error es
aproximadamente al cuadrado del error anterior.
Esto significa que el número de cifras decimales
correctas se duplica aproximadamente en cada
interacción.
Pseudocódigo
1. Inicio
2. Ingreso función, Ingreso derivada función, Ingreso tolerancia desdeada e ingreso de
una aproximación.
3. Procesamiento de datos y conversíon de las entradas en variables.
4. Mientras que el valor absoluto de la f(xinicial)>tolerancia
5. Xin1= xin-f(xin)/f’(xin)
6. Xin= Xin1
7. Cierre condiciones
8. Mostrar raíz (Xin)
9. Fin
Diseño
Diagrama de flujo
UML
Diseñode la interfaz
Interfaz_Newton
+JPanel contenido
Interfaz_Newton():void
interfazNewton():return
JPanel
actionPerformed(ActionEvent
mn):void
Newton-raphson
+consola:String
+metodoNewton(double
x,Stringfuncion,double
tolerancia,int
decimales):returnString
EvaluarX
+evaluarFuncion(String
funcion,doublex):
returndouble
EvaluadorFunciones
+eval(finalString
str):returndouble
Biblioteca
ScriptEngine
Redondeo
+redondear(double
numero,intdigitos):
returndouble
Derivada
+obtenerDerivada(String
funcion,double x0,int
decimales):return
Double
Implementación
Códigofuente Interfazgrafica de usuario
import javax.swing.*;
import java.awt.Event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
import java.util.InputMismatchException;
publicclass Interfaz_NewtonextendsJFrame implements ActionListener{
//__________________________
JPanel panel3;
JTextFieldtxt_Newton;
JButton btn_Newton;
JLabel lbl_Newton;
JTextArea textarea_Newton;
JScrollPane scrollpane_Newton;
JButton limpiar_Newton;
JTextFieldtxt_valorinicial;
JLabel lbl_valorinicial;
JTextFieldtxt_errorNewton;
JLabel lbl_errorNewton;
JTextFieldtxt_decimalesNewton;
JLabel lbl_decimalesNewton;
String error[];
JComboBoxcotaerror;
String decimales[];
JComboBoxnumdecimales;
public Interfaz_Newton(){
//setDefaultCloseOperation(EXIT_ON_CLOSE);
// setBounds(0,0, 850, 500);
//setVisible(true);
//_________________________________________//
lbl_Newton=newJLabel("Ingrese lafuncion");
lbl_Newton.setBounds(20,15, 200, 20);
txt_Newton=newJTextField();
txt_Newton.setBounds(130,15, 500, 20);
lbl_valorinicial=newJLabel("Valorinicial ");
lbl_valorinicial.setBounds(20,100, 200, 20);
txt_valorinicial=newJTextField();
txt_valorinicial.setBounds(130,100, 150, 20);
lbl_errorNewton=newJLabel("Error");
lbl_errorNewton.setBounds(20,140, 200, 20);
// txt_errorNewton=newJTextField();
// txt_errorNewton.setBounds(130,140, 150, 20);
error= new String[]{ "0.1", "0.01", "0.001","0.0001", "0.00001" };
cotaerror= new JComboBox(error);
cotaerror.setSelectedIndex(2);
cotaerror.setBounds(130, 140, 150, 20);
lbl_decimalesNewton=newJLabel("Decimales");
lbl_decimalesNewton.setBounds(20,160, 200, 20);
decimales=newString[]{ "1","2","3","4","5","6","7" };
numdecimales=newJComboBox(decimales);
numdecimales.setSelectedIndex(4);
numdecimales.setBounds(130,160, 150, 20);
// txt_decimalesNewton=newJTextField();
// txt_decimalesNewton.setBounds(130,160, 150, 20);
btn_Newton=newJButton("Obtenerraiz");
btn_Newton.setBounds(20,200, 200, 20);
btn_Newton.addActionListener(this);
textarea_Newton=newJTextArea();
textarea_Newton.setEditable(false);
scrollpane_Newton=newJScrollPane(textarea_Newton);
scrollpane_Newton.setBounds(300,50,500,300);
limpiar_Newton= newJButton("Limpiartexto");
limpiar_Newton.setBounds(20,250, 200, 20);
limpiar_Newton.addActionListener(this);
panel3=newJPanel();
panel3.setLayout(null);
panel3.add(scrollpane_Newton);
panel3.add(lbl_Newton);
panel3.add(txt_Newton);
panel3.add(lbl_errorNewton);
panel3.add(cotaerror);
panel3.add(lbl_decimalesNewton);
panel3.add(numdecimales);
panel3.add(lbl_valorinicial);
panel3.add(txt_valorinicial);
panel3.add(btn_Newton);
panel3.add(limpiar_Newton);
//________________________________________________
}
publicJPanel interfazNewton() {
return panel3;
}
public voidactionPerformed(ActionEventmn){
if(mn.getSource()==btn_Newton){
String funcion;
Double inicial=0.0;
Double error=0.0;
int decimales=0;
funcion=txt_Newton.getText();
funcion=funcion.replaceAll(" ",""); //quitar espacios
try{
inicial=Double.parseDouble(txt_valorinicial.getText());
} catch (NumberFormatExceptionnfe){
JOptionPane.showMessageDialog(null,"Ingreseunvalor numerico","Valorinicial",
JOptionPane.WARNING_MESSAGE);}
error=Double.parseDouble(cotaerror.getSelectedItem().toString());
decimales=Integer.parseInt(numdecimales.getSelectedItem().toString());
if(funcion.length()!=0){
Newton pf= new Newton();
textarea_Newton.setText(pf.metodoNewton(inicial,funcion,error,decimales));
}else{
// System.out.print("hola");
JOptionPane.showMessageDialog(null,"Lafunciónno ha sido creada","Casillavacia ",
JOptionPane.WARNING_MESSAGE);}
}
if(mn.getSource()==limpiar_Newton){
textarea_Newton.setText("");
}
}
// publicstatic voidmain(String[]args) {
// Interfaz_NewtonMN = new Interfaz_Newton();
// }
}
Clase que recibe losparámetros de la interfazpara ejecutar el método
publicclass Newton{
publicString consola="";
public String metodoNewton(double x,Stringfuncion,double tolerancia,int decimales){
double h;
double z;
//double x = 0.0;
intcontador=0;
//double tolerancia=0.001;
double error=tolerancia+1;
double fx;
double fprimax;
RedondeoR= new Redondeo();
EvaluarX EX= new EvaluarX();
Derivada D = newDerivada();
consola+="x"+"t"+"f(x)"+"t"+"f´(x)"+"t"+"h"+"t"+"error";
consola+="n";
//System.out.println("x"+"t"+"f(x)"+"t"+"f´(x)"+"t"+"h"+"t"+"error");
fx=R.redondear(EX.evaluarFuncion(funcion,x),decimales);
fprimax=R.redondear(D.obtenerDerivada(funcion,x,decimales),decimales);
h= R.redondear((fx/fprimax),decimales);
z=x;
x= R.redondear(x-h,decimales);
//System.out.println(z+"t"+fx+"t"+fprimax+"t"+h+"t---");
consola+=z+"t"+fx+"t"+fprimax+"t"+h+"t---";
consola+="n";
while(error>tolerancia){
error=R.redondear(Math.abs(Math.abs(x)-Math.abs(z)),decimales);
fx=R.redondear(EX.evaluarFuncion(funcion,x),decimales);
fprimax=R.redondear(D.obtenerDerivada(funcion,x,decimales),decimales);
h= R.redondear((fx/fprimax),decimales);
z=x;
x= R.redondear(x-h,decimales);
//System.out.println(z+"t"+fx+"t"+fprimax+"t"+h+"t"+error);
consola+=z+"t"+fx+"t"+fprimax+"t"+h+"t"+error;
consola+="n";
}
return consola;
}
// publicstatic voidmain (String [] args) {
// Newton n = new Newton();
// n.metodoNewton(0.0,"(e^x)-(10*(x^2))+2",0.001,5);
// }
}
Clase que obtiene laderivada encada iteración del método
publicclass Derivada{
public double obtenerDerivada(Stringfuncion,double x0,intdecimales) {
//String funcion= " x ^ 2";
// double x0 = 1.0;
double h= 0.001;
EvaluarX EX = new EvaluarX();
double funcionx0mash=EX.evaluarFuncion(funcion,(x0+h));
double funcionx0menosh=EX.evaluarFuncion(funcion,(x0-h));
double centrada = (funcionx0mash-funcionx0menosh) /(2*h);
Redondeor = new Redondeo();
return r.redondear(centrada,decimales); }
// publicstatic voidmain (String [] args) {
// Derivada d = new Derivada ();
// System.out.println(d.obtenerDerivada("(e^x)-((10*x)^2)+2",0.0,4));
// }
}
Pruebas
La función es ((e^(-x/4))* (2 - x)) – 1 con un valor inicial =0
La raíz obtenidaes0.57836 que corresponde conlagrafica
Método de la secante
Análisis
El principal inconveniente del método de Newton estriba en que requiere conocer el valor de
la primera derivada de la función en el punto. Sin embargo, la forma funcional de f(x)
dificulta en ocasiones el cálculo de la derivada. En estos casos es más útil emplear el método
de la secante.
El método de la secante parte de dos puntos (y no sólo uno como el método de Newton) y
estima la tangente (es decir, la pendiente de la recta) por una aproximación de acuerdo con
la expresión:
Sustituyendo esta expresión en la ecuación del método de Newton, obtenemos la expresión
del método de la secante que nos proporciona el siguiente punto de iteración:
En la siguiente iteración, emplearemos los puntos x1 y x2para estimar un nuevo punto más
próximo a la raíz de acuerdo con la ecuación .En la figura se representa geométricamente
este método.
En general, el método de la secante presenta las mismas ventajas y limitaciones que el método
de Newton-Raphson explicado anteriormente.
Diseño
PSEUDOCÓDIGO MÉTODO DE LA SECANTE
Proceso Metodo de la Secante
Leer X1, Xo, Tolerancia, Iter
Yo = f(Xo)
Si Yo = 0 Entonces
Muestre: ‘Xo es Raiz’
Sino
Y1 = f(X1)
Contador = 0
Error = Tolerancia + 1
Mientras Hacer
X2 = X1 – ((Y1*(X1 Xo))/Den)
Error = Abs((X2 – X1)/ X2)
Xo = X1
Yo = Y1
X1 = X2
Y1 = f(X1)
Contador = Contador + 1
Fin Mientras
Si Y1 = 0 Entonces
Muestre: ‘X1 es Raiz’
Sino Si Error < Tolerancia Entonces
Muestre: ‘‘X1’ es una raiz aproximada con una tolerancia ‘Tolerancia’’
Sino Si Den= 0 Entonces
Muestre: ‘Hay posiblemente una raiz múltiple’
Sino
Muestre: ‘Fracaso en ‘Iter’ iterraciones’
Fin Si
Fin Si
Fin Si
Fin Si
Fin Proceso
Diagrama de flujo
UML
Diseño de la interfaz de usuario
Interfaz_Secante
+JPanel contenido
Interfaz_Secante ():void
interfazSecante():return
JPanel
actionPerformed(ActionEvent
mn):void
Secante
+consola:String
+metodoSecante (double
x,Stringfuncion,double
tolerancia,intdecimales):
returnString
EvaluarX
+evaluarFuncion(String
funcion,doublex):
returndouble
EvaluadorFunciones
+eval(finalString
str):returndouble
Biblioteca
ScriptEngine
Redondeo
+redondear(double
numero,intdigitos):
returndouble
Implementación
Código de la interfa de usuario
import javax.swing.*;
import java.awt.Event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Interfaz_Secante extends JFrame implements ActionListener{
//___________________________
JPanel panel2;
JTextField txt_Secante;
JButton btn_Secante;
JLabel lbl_Secante;
JTextArea textarea_Secante;
JScrollPane scrollpane_Secante;
JButton limpiar_Secante;
JTextField txt_errorSecante;
JLabel lbl_errorSecante;
JTextField txt_decimalesSecante;
JLabel lbl_decimalesSecante;
JTextField txt_valoraSecante;
JLabel lbl_valoraSecante;
JTextField txt_valorbSecante;
JLabel lbl_valorbSecante;
//___________________________
String error[];
JComboBox cotaerror;
String decimales[];
JComboBox numdecimales;
//__________________________
public Interfaz_Secante(){
//______________________________________//
lbl_Secante=new JLabel("Ingrese la funcion ");
lbl_Secante.setBounds(20, 15, 200, 20);
txt_Secante=new JTextField();
txt_Secante.setBounds(130, 15, 500, 20);
lbl_valoraSecante=new JLabel("Valor a ");
lbl_valoraSecante.setBounds(20, 100, 200, 20);
txt_valoraSecante=new JTextField();
txt_valoraSecante.setBounds(130, 100, 150, 20);
lbl_valorbSecante=new JLabel("Valor b ");
lbl_valorbSecante.setBounds(20, 120, 200, 20);
txt_valorbSecante=new JTextField();
txt_valorbSecante.setBounds(130, 120, 150, 20);
lbl_errorSecante=new JLabel("Error");
lbl_errorSecante.setBounds(20, 140, 200, 20);
error= new String[] { "0.1", "0.01", "0.001","0.0001", "0.00001" };
cotaerror= new JComboBox(error);
cotaerror.setSelectedIndex(2);
cotaerror.setBounds(130, 140, 150, 20);
// txt_errorSecante=new JTextField();
// txt_errorSecante.setBounds(130, 140, 150, 20);
lbl_decimalesSecante=new JLabel("Decimales");
lbl_decimalesSecante.setBounds(20, 160, 200, 20);
// txt_decimalesSecante=new JTextField();
// txt_decimalesSecante.setBounds(130, 160, 150, 20);
decimales= new String[] { "1", "2","3", "4","5","6","7" };
numdecimales= new JComboBox(decimales);
numdecimales.setSelectedIndex(4);
numdecimales.setBounds(130, 160, 150, 20);
btn_Secante=new JButton("Obtener raiz");
btn_Secante.setBounds(20, 200, 200, 20);
btn_Secante.addActionListener(this);
textarea_Secante=new JTextArea();
textarea_Secante.setEditable(false);
scrollpane_Secante=new JScrollPane(textarea_Secante);
scrollpane_Secante.setBounds(300,50,500,300);
limpiar_Secante = new JButton("Limpiar texto");
limpiar_Secante.setBounds(20, 250, 200, 20);
limpiar_Secante.addActionListener(this);
panel2=new JPanel();
panel2.setLayout(null);
panel2.add(scrollpane_Secante);
panel2.add(lbl_Secante);
panel2.add(txt_Secante);
panel2.add(lbl_valoraSecante);
panel2.add(txt_valoraSecante);
panel2.add(lbl_valorbSecante);
panel2.add(txt_valorbSecante);
panel2.add(btn_Secante);
panel2.add(limpiar_Secante);
panel2.add(lbl_errorSecante);
panel2.add(cotaerror);
panel2.add(lbl_decimalesSecante);
panel2.add(numdecimales);
//_________________________________________//
}
public void actionPerformed(ActionEvent mn){
if(mn.getSource()==btn_Secante){
String funcion;
Double a=0.0;
Double b=0.0;
Double error=0.0;
int decimales=0;
funcion=txt_Secante.getText();
funcion=funcion.replaceAll(" ", ""); //quitar espacios
try{
a=Double.parseDouble(txt_valoraSecante.getText());
} catch (NumberFormatException nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor
inicial", JOptionPane.WARNING_MESSAGE);}
try{
b=Double.parseDouble(txt_valorbSecante.getText());
} catch (NumberFormatException nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor
inicial", JOptionPane.WARNING_MESSAGE);}
error=Double.parseDouble(cotaerror.getSelectedItem().toString());
decimales=Integer.parseInt(numdecimales.getSelectedItem().toString());
if(funcion.length()!=0){
Secante bi = new Secante();
textarea_Secante.setText(bi.metodoSecante(a,b,funcion,error,decimales));
}else{
JOptionPane.showMessageDialog(null, "La función no ha sido creada",
"Casilla vacia ", JOptionPane.WARNING_MESSAGE);}
}
if(mn.getSource()==limpiar_Secante){
textarea_Secante.setText("");
}
}
public JPanel interfazSecante() {
return panel2;
}
}
Clase que implementa el método
public class Secante {
public String consola="";
// metodoSecante(inicial,funcion,error,decimales))
public String metodoSecante(double x0, double x00,String funcion, double
tolerancia,int decimales){
double f0;
double f00;
double z=0;
// double x0=0;
// double x00 = 0;
int contador=0;
//double tolerancia=0.001;
double error=tolerancia+1;
// x00=0.1;
//x0=0.2;
Redondeo R= new Redondeo();
EvaluarX ex= new EvaluarX();
// System.out.println("XntXn-1tf(xn)tf(xn+1)tError");
consola+="XntXn-1tf(xn)tf(xn+1)tError";
consola+="n";
// System.out.println("__________________________________");
consola+="__________________________________";
consola+="n";
//System.out.print(x0+"t"+x00);
consola+=x0+"t"+x00;
f0= R.redondear(ex.evaluarFuncion(funcion,x0),decimales);
f00= R.redondear(ex.evaluarFuncion(funcion,x00),decimales);
//System.out.print("t"+f0+"t"+f00+"t---n");
consola+="t"+f0+"t"+f00+"t---n";
//System.out.println("__________________________________");
consola+="n";
while (error>tolerancia){
z=x0;
x0=R.redondear((x0 - ( f0/ ((f0 - f00)/ (x0 - x00)))),decimales);
x00=z;
f0= R.redondear(ex.evaluarFuncion(funcion,x0),decimales);
f00= R.redondear(ex.evaluarFuncion(funcion,x00),decimales);
error=R.redondear(( Math.abs(Math.abs(x0)-Math.abs(x00))),decimales);
consola+=x0+"t"+x00+"t"+f0+"t"+f00+"t"+error;
//System.out.println(x0+"t"+x00+"t"+f0+"t"+f00+"t"+error);
// System.out.println("__________________________________");
consola+="n";
}
return consola;
}
// public static void main (String [] args) {
// Secante s= new Secante();
// s.metodoSecante(0.1,0.2,"4^(2*x)-8*(4^x)+12",0.001,5);
// }
}
Pruebas
La función a evaluar será (e^-x) – x con los valores de a=0.1 y b = 0.2
El resultado obtenido es 0.56715 que corresponde con la grafica:
Sistemas de ecuaciones lineales
Análisis
En matemáticas y álgebra lineal, un sistema de ecuaciones lineales, también conocido
como sistema lineal de ecuaciones o simplemente sistema lineal, es un conjunto
de ecuaciones lineales (es decir, un sistema de ecuaciones en donde cada ecuación es de
primer grado), definidas sobre un cuerpo o un anillo conmutativo.
Método de Jácobi
El método de Jácobi es un método iterativo con el cual se resuelve el sistema lineal
Ax = b
Comienza con una aproximación inicial x(0) a la solución x y genera una sucesión de
vectores x(k) que convergen a la solución x.
Un sistema de ecuaciones algebraicas lineales es un conjunto de ecuaciones de la forma:
:: :: ::
O bien en su forma matricial:
Que a su vez se puede expresar como:
Ax = b
Donde “A” es la matriz de coeficientes, x es el vector de incógnitas y b el vector de
términos independientes.
La solución del sistema de ecuaciones es un conjunto de n valores que
satisfacen simultáneamente todas las ecuaciones.
En la solución de estos problemas pueden presentarse 3 casos:
1.- Solución única Sistema compatible determinado.
2.- Mas de una solución Sistema compatible e indeterminado.
(numero infinito de soluciones)
3.- Sin solución Sistema incompatible.
Ilustrando el método de Jácobi con un sistema de ecuaciones de 3x3, si el vector:
Es el vector aproximación a la solución x después de k iteraciones, entonces se tiene que
para la siguiente aproximación:
Diseño
Diagrama de flujo
UML
Diseño de la interfaz de usuario
Jacobi
+consola:String
+metodoJacobi (
double[][]arreglo,double[]resultados,double[]x,double
tolerancia,intdecimales):returnString
InterfazJacobi
+JPanel contenido
InterfazJacobi ():void
InterfazJacobi ():return
JPanel
actionPerformed(ActionEvent
mn):void
EvaluarX
+evaluarFuncion(String
funcion,doublex):
returndouble
Biblioteca
ScriptEngine
Redondeo
+redondear(double
numero,intdigitos):
returndouble
EvaluadorFunciones
+eval(finalString
str):returndouble
Implementación
Código de la interfaz de usuario
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.border.EmptyBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class InterfazJacobi extends JFrame implements ActionListener{
JTextField txt_error;
JLabel lbl_error;
JTextField txt_decimales;
JLabel lbl_decimales;
String error[];
JComboBox cotaerror;
String decimales[];
JComboBox numdecimales;
JComboBox tamanios;
JTextField celdas[][];
JTextField resultados[];
JTextField iniciales[];
JPanel panelNumeros,
panelOperaciones,panelEncabezado,panelIniciales,contenido;
JPanel panel;
String tam[];
int tamanio;
JButton btn_raiz;
JTextArea textarea_jacobi;
JScrollPane scrollpane_jacobi;
public InterfazJacobi() {
contenido =new JPanel();
contenido.setLayout(null);
contenido.setBounds(0, 0, 850, 500);
//setSize(850, 500);
//setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//setResizable(false);
//setVisible(true);
//setLayout(null);
lbl_error=new JLabel("Error");
lbl_error.setBounds(20, 140, 200, 20);
contenido.add(lbl_error);
error= new String[] { "0.1", "0.01", "0.001","0.0001", "0.00001" };
cotaerror= new JComboBox(error);
cotaerror.setSelectedIndex(2);
cotaerror.setBounds(130, 140, 150, 20);
contenido.add(cotaerror);
lbl_decimales=new JLabel("Decimales");
lbl_decimales.setBounds(20, 160, 200, 20);
contenido.add(lbl_decimales);
decimales= new String[] { "1", "2","3", "4","5","6","7" };
numdecimales= new JComboBox(decimales);
numdecimales.setSelectedIndex(4);
numdecimales.setBounds(130, 160, 150, 20);
contenido.add(numdecimales);
textarea_jacobi=new JTextArea();
textarea_jacobi.setEditable(false);
scrollpane_jacobi=new JScrollPane(textarea_jacobi);
scrollpane_jacobi.setBounds(300,250,400,130);
contenido.add(scrollpane_jacobi);
JLabel ancho = new JLabel("Matriz");
ancho.setBounds(20, 50, 200, 20);
contenido.add(ancho);
btn_raiz=new JButton("Soluciones");
btn_raiz.setBounds(20, 200, 200, 20);
contenido.add(btn_raiz);
btn_raiz.addActionListener(this);
tam= new String[] { "2 x 2", "3 x 3", "4 x 4" };
tamanios= new JComboBox(tam);
tamanios.setSelectedIndex(0);
tamanios.setBounds(130, 50, 150, 20);
contenido.add(tamanios);
tamanios.addActionListener(this);
tamanio=2;
//tamanios.getSelectedIndex();
celdas = new JTextField[tamanio][tamanio];
resultados = new JTextField[tamanio];
iniciales = new JTextField[tamanio];
panel =new JPanel();
panel.setLayout(new BorderLayout());
panel.setBounds(300, 50, 400, 200);
panelEncabezado = new JPanel();
panelEncabezado.setLayout(new GridLayout(1,tamanio+1));
String variable="X";
for(int k = 0; k<tamanio; k++){
panelEncabezado.add(new JLabel(" "+variable+""+k));
}
panelEncabezado.add(new JLabel("Resultado"));
panel.add("North", panelEncabezado);
//________________________________________________________________
for(int k = 0; k<tamanio; k++){
iniciales[k]=new JTextField();
}
panelIniciales = new JPanel();
panelIniciales.setLayout(new GridLayout(1,tamanio+1));
for(int k = 0; k<tamanio; k++){
panelIniciales.add(new JLabel("Inicial x"+k));
panelIniciales.add(iniciales[k]);
}
panel.add("South", panelIniciales);
//______________________________________________________________________
__________
panelNumeros = new JPanel();
panelNumeros.setLayout(new GridLayout(tamanio,tamanio+1));
panelNumeros.setBorder(new EmptyBorder(8, 8, 8, 8));
for(int k = 0; k<tamanio; k++){
resultados[k]=new JTextField();
}
for(int i =0; i<tamanio; i++){
for(int j = 0; j<tamanio; j++){
celdas[i][j]=new JTextField();
celdas[i][j].setText("");
}
}
for(int i =0; i<tamanio; i++){
for(int j = 0; j<tamanio; j++){
panelNumeros.add(celdas[i][j]);
}
panelNumeros.add(resultados[i]);
}
panel.add("Center", panelNumeros);
//getContentPane().add(panel);
contenido.add(panel);
//contenido.setVisible(false);
///contenido.setVisible(true);
}
public void actionPerformed(ActionEvent mn){
// if(mn.getSource()== btn_llavea){
// funcion+="(";
// pantalla.setText(funcion);
// }
// if(mn.getSource()== btn_llaveb){
// funcion+=")";
// pantalla.setText(funcion);
// }
if(mn.getSource()== btn_raiz){
double matriz[][] = new double [tamanio][tamanio];
double results[] = new double[tamanio];
double inicials[] = new double[tamanio];
double error=0.0;
int decimales=0;
String aux="";
for(int i=0; i<tamanio; i++){
for (int j=0; j<tamanio; j++){
aux=celdas[i][j].getText();
aux.replaceAll(" ", "");
try{
matriz[i][j] =Double.parseDouble(aux);
} catch (NumberFormatException nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico",
"celda "+i+" "+j, JOptionPane.WARNING_MESSAGE);}
}
}
aux="";
for(int i=0; i<tamanio; i++){ aux=resultados[i].getText(); aux.replaceAll(" ",
"");
try{results[i]=Double.parseDouble(aux);}catch (NumberFormatException
nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico",
"celda "+i, JOptionPane.WARNING_MESSAGE);}
}
aux="";
for(int i=0; i<tamanio; i++){ aux=iniciales[i].getText(); aux.replaceAll(" ",
"");
try{inicials[i]=Double.parseDouble(aux);}catch (NumberFormatException
nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico",
"celda "+i, JOptionPane.WARNING_MESSAGE);}
}
error=Double.parseDouble(cotaerror.getSelectedItem().toString());
decimales=Integer.parseInt(numdecimales.getSelectedItem().toString());
Jacobi J = new Jacobi();
textarea_jacobi.setText("");
textarea_jacobi.setText(J.metodoJacobi
(matriz,results,inicials,error,decimales));
// J.metodoJacobi (matriz,results,inicials,error,decimales);
}
if(mn.getSource()== tamanios){
tamanio=tamanios.getSelectedIndex()+2;
panelNumeros.removeAll();
panelEncabezado.removeAll();
panelIniciales.removeAll();
//panelNumeros.repaint();
panelEncabezado.setLayout(new GridLayout(1,tamanio+1));
String variable="X";
for(int k = 0; k<tamanio; k++){
panelEncabezado.add(new JLabel(" "+variable+""+k));
}
panelEncabezado.add(new JLabel("Resultado"));
panel.add("North", panelEncabezado);
panelNumeros.setLayout(new GridLayout(tamanio,tamanio+1));
panelNumeros.setBorder(new EmptyBorder(8, 8, 8, 8));
celdas = new JTextField[tamanio][tamanio];
resultados = new JTextField[tamanio];
iniciales = new JTextField[tamanio]; ///____________________________
for(int k = 0; k<tamanio; k++){
iniciales[k]=new JTextField();
}
panelIniciales.setLayout(new GridLayout(1,tamanio+1));
for(int k = 0; k<tamanio; k++){
panelIniciales.add(new JLabel("Inicial x"+k));
panelIniciales.add(iniciales[k]);
}
for(int k = 0; k<tamanio; k++){
resultados[k]=new JTextField();
}
for(int i =0; i<tamanio; i++){
for(int j = 0; j<tamanio; j++){
celdas[i][j]=new JTextField();
celdas[i][j].setText("");
}
}
for(int i =0; i<tamanio; i++){
for(int j = 0; j<tamanio; j++){
panelNumeros.add(celdas[i][j]);
}
panelNumeros.add(resultados[i]);
}
panelNumeros.setVisible(false);
panelEncabezado.setVisible(false);
panelIniciales.setVisible(false);
panelNumeros.setVisible(true);
panelEncabezado.setVisible(true);
panelIniciales.setVisible(true);
}
}
public JPanel interfazJacobi() {
return contenido;
}
// public static void main (String [] args){
// Matriz c = new Matriz();
// }
}
Clase que implementa el método
public class Jacobi{
public String metodoJacobi
(double[][]arreglo,double[]resultados,double[]x,double tolerancia,int decimales) {
String consola="";
int tam= resultados.length;
EvaluarX EX=new EvaluarX();
Redondeo R= new Redondeo();
double xn[]= new double [tam];
for ( int i =0 ; i< tam ; i ++ ) {
//System.out.print("X"+i+"t");
consola+="X"+i+"t";
}
// System.out.print("error");
consola+="errorn";
//System.out.print("n");
for ( int i =0 ; i< tam ; i ++ ) {
x[i]=1;
//System.out.print(x[i]+"t");
consola+=x[i]+"t";
} consola+="n";//System.out.print("n");
// double tolerancia=0.0001;
double error=tolerancia+ 1;
//int decimales=4;
String funcion="";
EvaluadorFunciones EF= new EvaluadorFunciones();
for ( int i =0 ; i< tam ; i ++ ) {
funcion+="("+resultados[i];
for ( int j =0 ; j< tam ; j ++ ) {if(j!=i)funcion += "-("+
arreglo[i][j]+"*"+x[j]+")"; }
funcion +=")/"+arreglo[i][i];
error=x[i];
xn[i]= R.redondear((EF.eval(funcion)),decimales);
error=R.redondear(Math.abs(error-xn[i]),decimales);
//System.out.print(x[i]+"t");
consola+=xn[i]+"t";
funcion="";
}
for ( int i =0 ; i< tam ; i ++ ) {x[i]=xn[i];}
//System.out.print(R.redondear(error,decimales)+"n");
consola+=R.redondear(error,decimales)+"n";
while (error>tolerancia){
for ( int i =0 ; i< tam ; i ++ ) {
funcion+="("+resultados[i];
for ( int j =0 ; j< tam ; j ++ ) {if(j!=i)funcion += "-("+
arreglo[i][j]+"*"+x[j]+")"; }
funcion +=")/"+arreglo[i][i];
error=x[i];
xn[i]= R.redondear((EF.eval(funcion)),decimales);
error=Math.abs(error-xn[i]);
//System.out.print(x[i]+"t");
consola+=xn[i]+"t";
funcion="";
}
for ( int i =0 ; i< tam ; i ++ ) {x[i]=xn[i];}
// System.out.print(R.redondear(error,decimales)+"n");
consola+=R.redondear(error,decimales)+"n";
}
return consola;
}
// public static void main(String []args) {
// Jacobi J = new Jacobi () ;
// double arreglo[][] = new double [3][3];
// arreglo[0][0]=8.0;
// arreglo[0][1]=2.0;
// arreglo[0][2]=3.0;
// arreglo[1][0]=1.0;
// arreglo[1][1]=-9.0;
// arreglo[1][2]=2.0;
// arreglo[2][0]=2.0;
// arreglo[2][1]=3.0;
// arreglo[2][2]=6.0;
// double resultados[] = new double [3];
// resultados[0]= 30;
// resultados[1]= 1;
// resultados[2] = 31;
// double x [] = new double [3];
// for ( int i =0 ; i< 3 ; i ++ ) {
// x[i]=1;
// }
// System.out.println(J.metodoJacobi(arreglo,resultados,x,0.0001,4));
// }
}
Pruebas
Se procederá a resolver el siguiente sistema de ecuaciones
Los valores iniciales serán [1,1,1]
Los resultados son -0.99998 -5.00003 5.00002
Que al ser redondeados serían aproximadamente -1, -5 y 5
Se puede comprobar el sistema cambiando x por los valores obtenidos
12 (-1) -(-5) +3(5)
-12 +5 +15 =-
12+20=8
(-1) +7(-5) -3(5)
-1 -35 -15 =-51
4(-1) -4(-5) +9(5)
-4 +20 +45 =-
4+65=61
Método de Gauss- Seidel
La secuencia de pasos que constituyen el método de Gauss-Seidel es la siguiente:
1. Asignar un valor inicial a cada incógnita que aparezca en el conjunto. Si es posible
hacer una hipótesis razonable de éstos valores, hacerla. Si no, se pueden asignar
valores seleccionados arbitrariamente. Los valores iniciales utilizados no afectarán la
convergencia como tal, pero afectarán el número de iteraciones requeridas para dicha
convergencia.
2. Partiendo de la primera ecuación, determinar un nuevo valor para la incógnita que
tiene el coeficiente más grande en esa ecuación, utilizando para las otras incógnitas
los valores supuestos.
3. Pasar a la segunda ecuación y determinar en ella el valor de la incógnita que tiene el
coeficiente más grande en esa ecuación, utilizando el valor calculado para la incógnita
del paso 2 y los valores supuestos para las incógnitas restantes.
4. Continuar con las ecuaciones restantes, determinando siempre el valor calculado de
la incógnita que tiene el coeficniente más grande en cada ecuación particular, y
utilizando siempre los últimos valores calculados para las otras incógnitas de la
ecuación. (Durante la primera iteración, se deben utilizar los valores supuestos para
las incógnitas hasta que se obtenga un valor calculado). Cuando la ecuación final ha
sido resuelta, proporcionando un valor para la única incógnita, se dice que se ha
completado una iteración.
5. Continuar iterando hasta que el valor de cada incógnita, determinado en una iteración
particular, difiera del valor obtenido en la iteración previa, en una cantidad menor que
cierto seleccionado arbitrariamente. El procedimiento queda entonces completo.
Refiriéndonos al paso 5, mientras menor sea la magnitud del seleccionado, mayor será la
precisión de la solución. Sin embargo, la magnitud del epsilon no especifica el error que
puede existir en los valores obtenidos para las incógnitas, ya que ésta es una función de la
velocidad de convergencia. Mientras mayor sea la velocidad de convergencia, mayor será la
precisión obtenida en los valores de las incógnitas para un dado.
Diseño
Diagrama de flujo
UML
Implementación
Código de la interfaz de usuario
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JButton;
GaussSeidel
+consola:String
+metodoGaussSeidel (
double[][]arreglo,double[]resultados,double[]x,double
tolerancia,intdecimales):returnString
InterfazGaussSeidel
+JPanel contenido
InterfazGaussSeidel ():void
InterfazGaussSeidel ():return
JPanel
actionPerformed(ActionEvent
mn):void
EvaluarX
+evaluarFuncion(String
funcion,doublex):
returndouble
Biblioteca
ScriptEngine
Redondeo
+redondear(double
numero,intdigitos):
returndouble
EvaluadorFunciones
+eval(finalString
str):returndouble
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.border.EmptyBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class InterfazGaussSeidel extends JFrame implements ActionListener{
JTextField txt_error;
JLabel lbl_error;
JTextField txt_decimales;
JLabel lbl_decimales;
String error[];
JComboBox cotaerror;
String decimales[];
JComboBox numdecimales;
JComboBox tamanios;
JTextField celdas[][];
JTextField resultados[];
JTextField iniciales[];
JPanel panelNumeros, panelOperaciones,panelEncabezado,panelIniciales,contenido;
JPanel panel;
String tam[];
int tamanio;
JButton btn_raiz;
JTextArea textarea_GaussSeidel;
JScrollPane scrollpane_GaussSeidel;
public InterfazGaussSeidel() {
contenido =new JPanel();
contenido.setLayout(null);
contenido.setBounds(0, 0, 850, 500);
//setSize(850, 500);
//setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//setResizable(false);
//setVisible(true);
//setLayout(null);
lbl_error=new JLabel("Error");
lbl_error.setBounds(20, 140, 200, 20);
contenido.add(lbl_error);
error= new String[] { "0.1", "0.01", "0.001","0.0001", "0.00001" };
cotaerror= new JComboBox(error);
cotaerror.setSelectedIndex(2);
cotaerror.setBounds(130, 140, 150, 20);
contenido.add(cotaerror);
lbl_decimales=new JLabel("Decimales");
lbl_decimales.setBounds(20, 160, 200, 20);
contenido.add(lbl_decimales);
decimales= new String[] { "1", "2","3", "4","5","6","7" };
numdecimales= new JComboBox(decimales);
numdecimales.setSelectedIndex(4);
numdecimales.setBounds(130, 160, 150, 20);
contenido.add(numdecimales);
textarea_GaussSeidel=new JTextArea();
textarea_GaussSeidel.setEditable(false);
scrollpane_GaussSeidel=new JScrollPane(textarea_GaussSeidel);
scrollpane_GaussSeidel.setBounds(300,250,400,130);
contenido.add(scrollpane_GaussSeidel);
JLabel ancho = new JLabel("Matriz");
ancho.setBounds(20, 50, 200, 20);
contenido.add(ancho);
btn_raiz=new JButton("Soluciones");
btn_raiz.setBounds(20, 200, 200, 20);
contenido.add(btn_raiz);
btn_raiz.addActionListener(this);
tam= new String[] { "2 x 2", "3 x 3", "4 x 4" };
tamanios= new JComboBox(tam);
tamanios.setSelectedIndex(0);
tamanios.setBounds(130, 50, 150, 20);
contenido.add(tamanios);
tamanios.addActionListener(this);
tamanio=2;
//tamanios.getSelectedIndex();
celdas = new JTextField[tamanio][tamanio];
resultados = new JTextField[tamanio];
iniciales = new JTextField[tamanio];
panel =new JPanel();
panel.setLayout(new BorderLayout());
panel.setBounds(300, 50, 400, 200);
panelEncabezado = new JPanel();
panelEncabezado.setLayout(new GridLayout(1,tamanio+1));
String variable="X";
for(int k = 0; k<tamanio; k++){
panelEncabezado.add(new JLabel(" "+variable+""+k));
}
panelEncabezado.add(new JLabel("Resultado"));
panel.add("North", panelEncabezado);
//________________________________________________________________
for(int k = 0; k<tamanio; k++){
iniciales[k]=new JTextField();
}
panelIniciales = new JPanel();
panelIniciales.setLayout(new GridLayout(1,tamanio+1));
for(int k = 0; k<tamanio; k++){
panelIniciales.add(new JLabel("Inicial x"+k));
panelIniciales.add(iniciales[k]);
}
panel.add("South", panelIniciales);
//________________________________________________________________________________
panelNumeros = new JPanel();
panelNumeros.setLayout(new GridLayout(tamanio,tamanio+1));
panelNumeros.setBorder(new EmptyBorder(8, 8, 8, 8));
for(int k = 0; k<tamanio; k++){
resultados[k]=new JTextField();
}
for(int i =0; i<tamanio; i++){
for(int j = 0; j<tamanio; j++){
celdas[i][j]=new JTextField();
celdas[i][j].setText("");
}
}
for(int i =0; i<tamanio; i++){
for(int j = 0; j<tamanio; j++){
panelNumeros.add(celdas[i][j]);
}
panelNumeros.add(resultados[i]);
}
panel.add("Center", panelNumeros);
//getContentPane().add(panel);
contenido.add(panel);
//contenido.setVisible(false);
///contenido.setVisible(true);
}
public void actionPerformed(ActionEvent mn){
// if(mn.getSource()== btn_llavea){
// funcion+="(";
// pantalla.setText(funcion);
// }
// if(mn.getSource()== btn_llaveb){
// funcion+=")";
// pantalla.setText(funcion);
// }
if(mn.getSource()== btn_raiz){
double matriz[][] = new double [tamanio][tamanio];
double results[] = new double[tamanio];
double inicials[] = new double[tamanio];
double error=0.0;
int decimales=0;
String aux="";
for(int i=0; i<tamanio; i++){
for (int j=0; j<tamanio; j++){
aux=celdas[i][j].getText();
aux.replaceAll(" ", "");
try{
matriz[i][j] =Double.parseDouble(aux);
} catch (NumberFormatException nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "celda "+i+"
"+j, JOptionPane.WARNING_MESSAGE);}
}
}
aux="";
for(int i=0; i<tamanio; i++){ aux=resultados[i].getText(); aux.replaceAll(" ", "");
try{results[i]=Double.parseDouble(aux);}catch (NumberFormatException nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "celda "+i,
JOptionPane.WARNING_MESSAGE);}
}
aux="";
for(int i=0; i<tamanio; i++){ aux=iniciales[i].getText(); aux.replaceAll(" ", "");
try{inicials[i]=Double.parseDouble(aux);}catch (NumberFormatException nfe){
JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "celda "+i,
JOptionPane.WARNING_MESSAGE);}
}
error=Double.parseDouble(cotaerror.getSelectedItem().toString());
decimales=Integer.parseInt(numdecimales.getSelectedItem().toString());
GaussSeidel J = new GaussSeidel();
textarea_GaussSeidel.setText("");
textarea_GaussSeidel.setText(J.metodoGaussSeidel
(matriz,results,inicials,error,decimales));
// J.metodoGaussSeidel (matriz,results,inicials,error,decimales);
}
if(mn.getSource()== tamanios){
tamanio=tamanios.getSelectedIndex()+2;
panelNumeros.removeAll();
panelEncabezado.removeAll();
panelIniciales.removeAll();
//panelNumeros.repaint();
panelEncabezado.setLayout(new GridLayout(1,tamanio+1));
String variable="X";
for(int k = 0; k<tamanio; k++){
panelEncabezado.add(new JLabel(" "+variable+""+k));
}
panelEncabezado.add(new JLabel("Resultado"));
panel.add("North", panelEncabezado);
panelNumeros.setLayout(new GridLayout(tamanio,tamanio+1));
panelNumeros.setBorder(new EmptyBorder(8, 8, 8, 8));
celdas = new JTextField[tamanio][tamanio];
resultados = new JTextField[tamanio];
iniciales = new JTextField[tamanio]; ///____________________________
for(int k = 0; k<tamanio; k++){
iniciales[k]=new JTextField();
}
panelIniciales.setLayout(new GridLayout(1,tamanio+1));
for(int k = 0; k<tamanio; k++){
panelIniciales.add(new JLabel("Inicial x"+k));
panelIniciales.add(iniciales[k]);
}
for(int k = 0; k<tamanio; k++){
resultados[k]=new JTextField();
}
for(int i =0; i<tamanio; i++){
for(int j = 0; j<tamanio; j++){
celdas[i][j]=new JTextField();
celdas[i][j].setText("");
}
}
for(int i =0; i<tamanio; i++){
for(int j = 0; j<tamanio; j++){
panelNumeros.add(celdas[i][j]);
}
panelNumeros.add(resultados[i]);
}
panelNumeros.setVisible(false);
panelEncabezado.setVisible(false);
panelIniciales.setVisible(false);
panelNumeros.setVisible(true);
panelEncabezado.setVisible(true);
panelIniciales.setVisible(true);
}
}
public JPanel interfazGaussSeidel() {
return contenido;
}
// public static void main (String [] args){
// Matriz c = new Matriz();
// }
}
Clase que implementa el método
public class GaussSeidel{
public String metodoGaussSeidel
(double[][]arreglo,double[]resultados,double[]x,double tolerancia,int decimales) {
String consola="";
int tam= resultados.length;
EvaluarX EX=new EvaluarX();
Redondeo R= new Redondeo();
for ( int i =0 ; i< tam ; i ++ ) {
//System.out.print("X"+i+"t");
consola+="X"+i+"t";
}
// System.out.print("error");
consola+="errorn";
//System.out.print("n");
for ( int i =0 ; i< tam ; i ++ ) {
x[i]=1;
//System.out.print(x[i]+"t");
consola+=x[i]+"t";
} consola+="n";//System.out.print("n");
// double tolerancia=0.0001;
double error=tolerancia+ 1;
//int decimales=4;
String funcion="";
EvaluadorFunciones EF= new EvaluadorFunciones();
for ( int i =0 ; i< tam ; i ++ ) {
funcion+="("+resultados[i];
for ( int j =0 ; j< tam ; j ++ ) {if(j!=i)funcion += "-("+ arreglo[i][j]+"*"+x[j]+")";
}
funcion +=")/"+arreglo[i][i];
error=x[i];
x[i]= R.redondear((EF.eval(funcion)),decimales);
error=R.redondear(Math.abs(error-x[i]),decimales);
//System.out.print(x[i]+"t");
consola+=x[i]+"t";
funcion="";
}
//System.out.print(R.redondear(error,decimales)+"n");
consola+=R.redondear(error,decimales)+"n";
while (error>tolerancia){
for ( int i =0 ; i< tam ; i ++ ) {
funcion+="("+resultados[i];
for ( int j =0 ; j< tam ; j ++ ) {if(j!=i)funcion += "-("+
arreglo[i][j]+"*"+x[j]+")"; }
funcion +=")/"+arreglo[i][i];
error=x[i];
x[i]= R.redondear((EF.eval(funcion)),decimales);
error=Math.abs(error-x[i]);
//System.out.print(x[i]+"t");
consola+=x[i]+"t";
funcion="";
}
// System.out.print(R.redondear(error,decimales)+"n");
consola+=R.redondear(error,decimales)+"n";
}
return consola;
}
public static void main(String []args) {
GaussSeidel J = new GaussSeidel () ;
double arreglo[][] = new double [3][3];
arreglo[0][0]=8.0;
arreglo[0][1]=2.0;
arreglo[0][2]=3.0;
arreglo[1][0]=1.0;
arreglo[1][1]=-9.0;
arreglo[1][2]=2.0;
arreglo[2][0]=2.0;
arreglo[2][1]=3.0;
arreglo[2][2]=6.0;
double resultados[] = new double [3];
resultados[0]= 30;
resultados[1]= 1;
resultados[2] = 31;
double x [] = new double [3];
for ( int i =0 ; i< 3 ; i ++ ) {
x[i]=1;
}
System.out.println(J.metodoGaussSeidel(arreglo,resultados,x,0.0001,4));
}
}
Pruebas
Se usó el siguiente sistema de ecuaciones para probar el programa
Los valores iniciales para x1,x2 y x3 son 1,1,1
Los valores obtenidos son 1.99975 3.00009 4.00006
Que al ser redondeados serían 2,3 y 4.
Sustituyendo estos valores en el sistema se comprueba que el resultado es correcto.
6(2) +2(3) +(4)
12 +6 +4 =22
-(2) +8(3) +2(4)
-2 +24 +8 =-
2+32=30
(2) -(3) +6(4)
2 -3 +24 =-
3+26=23
Integración y derivaciónnumérica
INTEGRACIÓN NUMÉRICA
Dentrodel CálculoNumérico,laIntegraciónNuméricacomprende una ampliafamiliade
algoritmosparael cálculodel valornuméricode unaintegral definida.Enlamayoría de loscasos,
ese valornuméricoesunvaloraproximadode laintegral definida.
Método del trapecio
Análisis
Para aproximar la solución de una integral definida se puede utilizar la siguiente estrategia;
como la integral definida representa el área bajo la curva, entonces es posible aproximar
dicha área a través de un trapecio (n = 1), ver la figura,
por lo que, una aproximación a la integral definida estará dada por,
Donde la expresión del lado derecho es la formula para el área del trapecio. Sin embargo es
posible mejorar esta aproximación tomando dos trapecios (n = 2), y para ello se divide el
intervalo de integración [a, b], a la mitad para tener, , ver la figura,
Así, que la nueva aproximación a la integral definida será,
Diseño
UML
Trapecio
+consola:String
+metodoTrapecio ( double a,double b,double
n,Stringfuncion,int decimales):returnString
InterfazTrapecio
+JPanel contenido
InterfazTrapecio():void
InterfazTrapecio():return
JPanel
actionPerformed(ActionEvent
mn):void
EvaluarX
+evaluarFuncion(String
funcion,doublex):
returndouble
Biblioteca
ScriptEngine
Redondeo
+redondear(double
numero,intdigitos):
returndouble
EvaluadorFunciones
+eval(finalString
str):returndouble
Implementación
Código de la interfaz de usuario
import javax.swing.*;
import java.awt.Event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Interfaz_Trapecio extends JFrame implements ActionListener{
JLabel lbl_segmentos;
JTextField txt_segmentos;
JPanel panel1;
JTextField txt_Trapecio;
JButton btn_Trapecio;
JLabel lbl_Trapecio;
JTextArea textarea_Trapecio;
JScrollPane scrollpane_Trapecio;
JButton limpiar_Trapecio;
JTextField txt_errorTrapecio;
JLabel lbl_errorTrapecio;
JTextField txt_decimalesTrapecio;
JLabel lbl_decimalesTrapecio;
JTextField txt_valoraTrapecio;
JLabel lbl_valoraTrapecio;
JTextField txt_valorbTrapecio;
JLabel lbl_valorbTrapecio;
//___________________________
String error[];
JComboBox cotaerror;
String decimales[];
JComboBox numdecimales;
//__________________________
public Interfaz_Trapecio(){
lbl_Trapecio=new JLabel("Ingrese la funcion ");
lbl_Trapecio.setBounds(20, 15, 200, 20);
txt_Trapecio=new JTextField();
txt_Trapecio.setBounds(130, 60, 150, 20);
txt_Trapecio.setBounds(130, 15, 500, 20);
lbl_segmentos=new JLabel("No.Segmentos ");
lbl_segmentos.setBounds(20, 50, 200, 20);
txt_segmentos=new JTextField();
txt_segmentos.setBounds(130, 50, 150, 20);
lbl_valoraTrapecio=new JLabel("Limite a ");
lbl_valoraTrapecio.setBounds(20, 100, 200, 20);
txt_valoraTrapecio=new JTextField();
txt_valoraTrapecio.setBounds(130, 100, 150, 20);
lbl_valorbTrapecio=new JLabel("Limite b ");
lbl_valorbTrapecio.setBounds(20, 120, 200, 20);
txt_valorbTrapecio=new JTextField();
txt_valorbTrapecio.setBounds(130, 120, 150, 20);
lbl_decimalesTrapecio=new JLabel("Decimales");
lbl_decimalesTrapecio.setBounds(20, 160, 200, 20);
// txt_decimalesTrapecio=new JTextField();
// txt_decimalesTrapecio.setBounds(130, 160, 150, 20);
decimales= new String[] { "1", "2","3", "4","5","6","7" };
numdecimales= new JComboBox(decimales);
numdecimales.setSelectedIndex(4);
numdecimales.setBounds(130, 160, 150, 20);
btn_Trapecio=new JButton("Obtener integral");
btn_Trapecio.setBounds(20, 200, 200, 20);
btn_Trapecio.addActionListener(this);
textarea_Trapecio=new JTextArea();
textarea_Trapecio.setEditable(false);
scrollpane_Trapecio=new JScrollPane(textarea_Trapecio);
scrollpane_Trapecio.setBounds(300,50,500,300);
limpiar_Trapecio = new JButton("Limpiar texto");
limpiar_Trapecio.setBounds(20, 250, 200, 20);
limpiar_Trapecio.addActionListener(this);
panel1=new JPanel();
panel1.setLayout(null);
panel1.add(scrollpane_Trapecio);
panel1.add(lbl_Trapecio);
panel1.add(txt_Trapecio);
panel1.add(lbl_valoraTrapecio);
panel1.add(txt_valoraTrapecio);
panel1.add(lbl_valorbTrapecio);
panel1.add(txt_valorbTrapecio);
panel1.add(lbl_decimalesTrapecio);
panel1.add(numdecimales);
panel1.add(btn_Trapecio);
panel1.add(limpiar_Trapecio);
panel1.add(lbl_segmentos);
panel1.add(txt_segmentos);
}
public JPanel interfaz() {
return panel1;
}
public void actionPerformed(ActionEvent mn){
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software
Metodos numericos y su implementacion en software

More Related Content

What's hot

Teoria de errores
Teoria de erroresTeoria de errores
Teoria de erroresAbel Fong
 
Jacobi y Gauss Seidel
Jacobi y Gauss SeidelJacobi y Gauss Seidel
Jacobi y Gauss Seideljoselolozano
 
Metodos numericos
Metodos numericos Metodos numericos
Metodos numericos Cate Graham
 
Exposicion cap 7
Exposicion cap 7Exposicion cap 7
Exposicion cap 7cyndy
 
Tipos de metodos numericos
Tipos de metodos numericosTipos de metodos numericos
Tipos de metodos numericosTensor
 
Ejercicios resueltos- de metodos
Ejercicios resueltos- de metodosEjercicios resueltos- de metodos
Ejercicios resueltos- de metodosMichael Dhgfhr
 
Ejercicios de metodo de 9 puntos, leonardo medina
Ejercicios de metodo de 9 puntos, leonardo medinaEjercicios de metodo de 9 puntos, leonardo medina
Ejercicios de metodo de 9 puntos, leonardo medinaLeonardoljmg
 
Introducción a los Métodos Numéricos
Introducción a los Métodos NuméricosIntroducción a los Métodos Numéricos
Introducción a los Métodos NuméricosBrianith Navarro
 
Aplicaciones de la Transformada de Laplace. 3 ejercicios resueltos por Ing. R...
Aplicaciones de la Transformada de Laplace. 3 ejercicios resueltos por Ing. R...Aplicaciones de la Transformada de Laplace. 3 ejercicios resueltos por Ing. R...
Aplicaciones de la Transformada de Laplace. 3 ejercicios resueltos por Ing. R...roscoro
 
Espacios vectoriales y su apoyo a la ingenieria
Espacios vectoriales y su apoyo a la ingenieriaEspacios vectoriales y su apoyo a la ingenieria
Espacios vectoriales y su apoyo a la ingenieriaEdisonCC1
 

What's hot (20)

Teoria de errores
Teoria de erroresTeoria de errores
Teoria de errores
 
Sadiku
SadikuSadiku
Sadiku
 
Practica 3 regla falsa
Practica 3 regla falsaPractica 3 regla falsa
Practica 3 regla falsa
 
Jacobi y Gauss Seidel
Jacobi y Gauss SeidelJacobi y Gauss Seidel
Jacobi y Gauss Seidel
 
Metodos numericos
Metodos numericos Metodos numericos
Metodos numericos
 
Formato ieee
Formato ieeeFormato ieee
Formato ieee
 
Exposicion cap 7
Exposicion cap 7Exposicion cap 7
Exposicion cap 7
 
Gauss con pivoteo
Gauss con pivoteoGauss con pivoteo
Gauss con pivoteo
 
Algebra Booleana 2
Algebra Booleana 2Algebra Booleana 2
Algebra Booleana 2
 
Tipos de metodos numericos
Tipos de metodos numericosTipos de metodos numericos
Tipos de metodos numericos
 
Metodo de cholesky
Metodo de choleskyMetodo de cholesky
Metodo de cholesky
 
Conceptos basicos de métodos numéricos
Conceptos basicos de métodos numéricosConceptos basicos de métodos numéricos
Conceptos basicos de métodos numéricos
 
Ejercicios resueltos- de metodos
Ejercicios resueltos- de metodosEjercicios resueltos- de metodos
Ejercicios resueltos- de metodos
 
ziegler nichols metodo 1
ziegler nichols metodo 1ziegler nichols metodo 1
ziegler nichols metodo 1
 
96240987 ejercicios-resueltos-1
96240987 ejercicios-resueltos-196240987 ejercicios-resueltos-1
96240987 ejercicios-resueltos-1
 
Ejercicios de metodo de 9 puntos, leonardo medina
Ejercicios de metodo de 9 puntos, leonardo medinaEjercicios de metodo de 9 puntos, leonardo medina
Ejercicios de metodo de 9 puntos, leonardo medina
 
Reporte unidad 3 interpolación
Reporte unidad 3 interpolaciónReporte unidad 3 interpolación
Reporte unidad 3 interpolación
 
Introducción a los Métodos Numéricos
Introducción a los Métodos NuméricosIntroducción a los Métodos Numéricos
Introducción a los Métodos Numéricos
 
Aplicaciones de la Transformada de Laplace. 3 ejercicios resueltos por Ing. R...
Aplicaciones de la Transformada de Laplace. 3 ejercicios resueltos por Ing. R...Aplicaciones de la Transformada de Laplace. 3 ejercicios resueltos por Ing. R...
Aplicaciones de la Transformada de Laplace. 3 ejercicios resueltos por Ing. R...
 
Espacios vectoriales y su apoyo a la ingenieria
Espacios vectoriales y su apoyo a la ingenieriaEspacios vectoriales y su apoyo a la ingenieria
Espacios vectoriales y su apoyo a la ingenieria
 

Similar to Metodos numericos y su implementacion en software

Tema2 fundamentos de matlab
Tema2 fundamentos de matlabTema2 fundamentos de matlab
Tema2 fundamentos de matlabGregorio Sarango
 
Discrete Event Simulation, CASE tool built using C#
Discrete Event Simulation, CASE tool built using C#Discrete Event Simulation, CASE tool built using C#
Discrete Event Simulation, CASE tool built using C#Ron Perlmuter
 
Lecture 1 uml with java implementation
Lecture 1 uml with java implementationLecture 1 uml with java implementation
Lecture 1 uml with java implementationthe_wumberlog
 
Required computer skills program devlopment
Required computer skills program devlopmentRequired computer skills program devlopment
Required computer skills program devlopmentHubert Shanthan
 
49.INS2065.Computer Based Technologies.TA.NguyenDucAnh.pdf
49.INS2065.Computer Based Technologies.TA.NguyenDucAnh.pdf49.INS2065.Computer Based Technologies.TA.NguyenDucAnh.pdf
49.INS2065.Computer Based Technologies.TA.NguyenDucAnh.pdfcNguyn506241
 
Lab view core 1 outline
Lab view core 1 outlineLab view core 1 outline
Lab view core 1 outlinebestip
 
Introduction to MATrices LABoratory (MATLAB) as Part of Digital Signal Proces...
Introduction to MATrices LABoratory (MATLAB) as Part of Digital Signal Proces...Introduction to MATrices LABoratory (MATLAB) as Part of Digital Signal Proces...
Introduction to MATrices LABoratory (MATLAB) as Part of Digital Signal Proces...Ahmed Gad
 
MATLAB Assignment Help
MATLAB Assignment HelpMATLAB Assignment Help
MATLAB Assignment HelpEssay Corp
 
Geometry Softwares
Geometry SoftwaresGeometry Softwares
Geometry SoftwaresHazelManzo
 
PCCF UNIT 1.pptx
PCCF UNIT 1.pptxPCCF UNIT 1.pptx
PCCF UNIT 1.pptxDivyaKS12
 
industrial internship presentation
industrial internship presentation industrial internship presentation
industrial internship presentation ShreyaBhatt23
 
Introducción a la progrogramación orientada a objetos con Java
Introducción a la progrogramación orientada a objetos con JavaIntroducción a la progrogramación orientada a objetos con Java
Introducción a la progrogramación orientada a objetos con JavaFacultad de Ciencias y Sistemas
 
Software design.edited (1)
Software design.edited (1)Software design.edited (1)
Software design.edited (1)FarjanaAhmed3
 
Calculator using Java
Calculator using JavaCalculator using Java
Calculator using JavaGarvit Anand
 

Similar to Metodos numericos y su implementacion en software (20)

Vedic Calculator
Vedic CalculatorVedic Calculator
Vedic Calculator
 
Tema2 fundamentos de matlab
Tema2 fundamentos de matlabTema2 fundamentos de matlab
Tema2 fundamentos de matlab
 
Discrete Event Simulation, CASE tool built using C#
Discrete Event Simulation, CASE tool built using C#Discrete Event Simulation, CASE tool built using C#
Discrete Event Simulation, CASE tool built using C#
 
Lecture 1 uml with java implementation
Lecture 1 uml with java implementationLecture 1 uml with java implementation
Lecture 1 uml with java implementation
 
10tait
10tait10tait
10tait
 
Chapter 10
Chapter 10 Chapter 10
Chapter 10
 
Waterfall model
Waterfall modelWaterfall model
Waterfall model
 
Required computer skills program devlopment
Required computer skills program devlopmentRequired computer skills program devlopment
Required computer skills program devlopment
 
49.INS2065.Computer Based Technologies.TA.NguyenDucAnh.pdf
49.INS2065.Computer Based Technologies.TA.NguyenDucAnh.pdf49.INS2065.Computer Based Technologies.TA.NguyenDucAnh.pdf
49.INS2065.Computer Based Technologies.TA.NguyenDucAnh.pdf
 
Lab view core 1 outline
Lab view core 1 outlineLab view core 1 outline
Lab view core 1 outline
 
Introduction to MATrices LABoratory (MATLAB) as Part of Digital Signal Proces...
Introduction to MATrices LABoratory (MATLAB) as Part of Digital Signal Proces...Introduction to MATrices LABoratory (MATLAB) as Part of Digital Signal Proces...
Introduction to MATrices LABoratory (MATLAB) as Part of Digital Signal Proces...
 
MATLAB Assignment Help
MATLAB Assignment HelpMATLAB Assignment Help
MATLAB Assignment Help
 
Beekman5 std ppt_13
Beekman5 std ppt_13Beekman5 std ppt_13
Beekman5 std ppt_13
 
PRELIM-Lesson-2.pdf
PRELIM-Lesson-2.pdfPRELIM-Lesson-2.pdf
PRELIM-Lesson-2.pdf
 
Geometry Softwares
Geometry SoftwaresGeometry Softwares
Geometry Softwares
 
PCCF UNIT 1.pptx
PCCF UNIT 1.pptxPCCF UNIT 1.pptx
PCCF UNIT 1.pptx
 
industrial internship presentation
industrial internship presentation industrial internship presentation
industrial internship presentation
 
Introducción a la progrogramación orientada a objetos con Java
Introducción a la progrogramación orientada a objetos con JavaIntroducción a la progrogramación orientada a objetos con Java
Introducción a la progrogramación orientada a objetos con Java
 
Software design.edited (1)
Software design.edited (1)Software design.edited (1)
Software design.edited (1)
 
Calculator using Java
Calculator using JavaCalculator using Java
Calculator using Java
 

More from Benjamín Joaquín Martínez

More from Benjamín Joaquín Martínez (20)

Sistemas de detección de intrusiones.pdf
Sistemas de detección de intrusiones.pdfSistemas de detección de intrusiones.pdf
Sistemas de detección de intrusiones.pdf
 
Portafolio ingles.pdf
Portafolio ingles.pdfPortafolio ingles.pdf
Portafolio ingles.pdf
 
Tabla de llamadas para linux x86_64 bits.pdf
Tabla de llamadas para linux x86_64 bits.pdfTabla de llamadas para linux x86_64 bits.pdf
Tabla de llamadas para linux x86_64 bits.pdf
 
Sistema de registro con php
Sistema de registro con phpSistema de registro con php
Sistema de registro con php
 
compiladores6Benjamin133467.pdf
compiladores6Benjamin133467.pdfcompiladores6Benjamin133467.pdf
compiladores6Benjamin133467.pdf
 
Compiladores5_Benjamin133467.pdf
Compiladores5_Benjamin133467.pdfCompiladores5_Benjamin133467.pdf
Compiladores5_Benjamin133467.pdf
 
133467 compiladores 4.pdf
133467 compiladores 4.pdf133467 compiladores 4.pdf
133467 compiladores 4.pdf
 
133467_COMPILADORES3.pdf
133467_COMPILADORES3.pdf133467_COMPILADORES3.pdf
133467_COMPILADORES3.pdf
 
133467_COMPILADORES2
133467_COMPILADORES2133467_COMPILADORES2
133467_COMPILADORES2
 
COMPILADORES1.pdf
COMPILADORES1.pdfCOMPILADORES1.pdf
COMPILADORES1.pdf
 
Algoritmos de búsqueda.pdf
Algoritmos de búsqueda.pdfAlgoritmos de búsqueda.pdf
Algoritmos de búsqueda.pdf
 
Logica proposicional
Logica proposicionalLogica proposicional
Logica proposicional
 
Lenguajes para dispositivos moviles 133467
Lenguajes para dispositivos moviles 133467Lenguajes para dispositivos moviles 133467
Lenguajes para dispositivos moviles 133467
 
Bd distribuidas
Bd distribuidasBd distribuidas
Bd distribuidas
 
diseño de bases de datos distribuidas
diseño de bases de datos distribuidas   diseño de bases de datos distribuidas
diseño de bases de datos distribuidas
 
procesamiento de consultas distribuidas
procesamiento de consultas distribuidasprocesamiento de consultas distribuidas
procesamiento de consultas distribuidas
 
Algoritmo de INGRES
Algoritmo de INGRES Algoritmo de INGRES
Algoritmo de INGRES
 
Fragmentación
FragmentaciónFragmentación
Fragmentación
 
Modelo cliente servidor
Modelo cliente servidorModelo cliente servidor
Modelo cliente servidor
 
Arquitectura de bases de datos distribuidas
Arquitectura de bases de datos distribuidasArquitectura de bases de datos distribuidas
Arquitectura de bases de datos distribuidas
 

Recently uploaded

Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...aditisharan08
 
XpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsXpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsMehedi Hasan Shohan
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptkotipi9215
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number SystemsJheuzeDellosa
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxbodapatigopi8531
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...Christina Lin
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 

Recently uploaded (20)

Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...
 
XpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software SolutionsXpertSolvers: Your Partner in Building Innovative Software Solutions
XpertSolvers: Your Partner in Building Innovative Software Solutions
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.ppt
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number Systems
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 

Metodos numericos y su implementacion en software

  • 1. Métodos numéricos y su implementación en software Elabora: Benjamín Joaquín Martínez https://www.linkedin.com/in/benja minjoaquinmartinez/
  • 2. Índice No.Pagina Introducción 4 Antecedentes 4 Objetivos 6 Metodología 6 Recursos 7 Cronograma 8 Programación de analizador léxicoy herramientade redondeo 13 Análisisléxico 13 Redondeo 19 Soluciónde ecuaciones 20 Punto fijo 20 Análisis 20 Diseño 22 Implementación 24 Pruebas 31 Bisección 33 Análisis 33 Diseño 34 Implementación 38 Pruebas 49 Falsa posición 51 Análisis 51 Diseño 52 Implementación 56 Pruebas 64 NewtonRaphson 66 Análisis 66 Diseño 68 Implementación 70 Pruebas 76 Secante 77 Análisis 77 Diseño 78 Implementación 82 Pruebas 89 Sistemasde ecuaciones 91 Métodode Jacobi 91 Análisis 91 Diseño 93 Implementación 95 Pruebas 109 Métodode Gauss- Seidel 110
  • 3. Análisis 110 Diseño 111 Implementación 112 Pruebas 126 Integración y derivaciónnumérica 128 Integración numérica 128 Métododel trapecio 128 Análisis 128 Diseño 131 Implementación 132 Pruebas 139 Metodode simpson 141 Análisis 141 Diseño 142 Implementación 143 Pruebas 151 Derivaciónnumérica 152 Análisis 152 Diseño 153 Implementación 154 Pruebas 167 Ajuste de datos 169 Regresiónlineal por mínimoscuadrados 169 Análisis 169 Diseño 171 Implementación 172 Pruebas 181 Integración de los módulosdel programa 182 Bibliografía 184
  • 4. Introducción Este proyecto surge de la necesidad de crear una herramienta de software en la que se puedan implementar los métodos numéricos a través de una interfaz en la que un usuario pueda introducir una función matemática y elegir que método numérico utilizar para el propósito que sea requerido. Antecedentes. Muchos problemas de cómputo en el área de matemáticas pueden ser divididos en pequeños módulos de cálculos bien conocidos, como solución de sistemas de ecuaciones lineales, transformadas de Fourier, etc. Por consecuencia, usualmente los programadores sólo tienen que escribir una rutina pequeña para el problema particular que se tenga, porque ya existe software para resolver las subtareas del problema. Facilitando así el no tener que programar los procedimientos matemáticos una y otra vez. Para crear proyectos relacionados con el cálculo matemático existe ya software desarrollado como por ejemplo: Matlab Es un programa de cálculo numérico, orientado a matrices y vectores. Por tanto desde el principio hay que pensar que todo lo que se pretenda hacer con él, será mucho más rápido y efectivo si se piensa en términos de matrices y vectores. Derive Es un potente programa para el cálculo matemático avanzado: variables, expresiones algebraicas, ecuaciones, funciones, vectores, matrices, trigonometría, etc. También tiene capacidades de calculadora científica, y puede representar funciones gráficas en dos y tres dimensiones en varios sistemas coordenados. Geogebra. Programa muy similar a Cabri en cuanto a instrumentos y posibilidades pero incorporando elementos algebraicos y de cálculo. La gran ventaja sobre otros programas de geometría
  • 5. dinámica es la dualidad en pantalla: una expresión en la ventana algebraica se corresponde con un objeto en la ventana geométrica y viceversa. Es un programa libre y gratuito, GNU General Public License. Euler Es un potente laboratorio numérico e interactivo. Evalúa rápidamente funciones numéricas, visualiza los resultados, y permite probar y programar algoritmos numéricos. El sistema puede manejar números reales, complejos y de intervalos, vectores y matrices. La mayoría de las rutinas están escritas en lenguaje de Euler y pueden ser modificados o ampliados por el usuario. Yacas Es una herramienta de álgebra fácil de usar, un programa para la manipulación simbólica de expresiones matemáticas. Utiliza su propio lenguaje de programación. El sistema cuenta con una biblioteca de scripts que implementan muchas de las operaciones de álgebra simbólica; nuevos algoritmos pueden ser fácilmente añadidos a la biblioteca. Yacas viene con una amplia documentación (cientos de páginas) que cubren el lenguaje de script, la funcionalidad que ya está implementada en el sistema, y los algoritmos que hemos utilizado. Octave Proporciona una cómoda interfaz de línea de comandos para resolver numéricamente problemas lineales y no lineales, y realiza otros experimentos numéricos usando un lenguaje compatible con Matlab.
  • 6. Objetivos. Objetivo general En este proyecto se pretende transformar los procedimientos matemáticos involucrados en la resolución de los diferentes métodos numéricos, a rutinas de código que permitan la resolución de problemas matemáticos usando una herramienta de cómputo. Objetivos específicos  Codificar los métodos numéricos para implementarse en software  Crear una interfaz de usuario para ingresar una función matemática en el ordenador y seleccionar el método de resolución correspondiente.  Identificar los procedimientos matemáticos que puedan resolverse a través de un método numérico.  Desarrollar una interfaz gráfica fácil de usar para el usuario final. Metodología. Para el presente proyecto se usará el lenguaje de programación JAVA, que cuenta con las librerías necesarias para su desarrollo tales como Math, la cual contiene lo necesario para operar con funciones matemáticas y hacer procesos como el redondeo de cifras. La metodología a usar para el desarrollo del software será la metodología de prototipos, que consiste en las fases de: 1. Planeación 2. Modelado 3. Elaboración del prototipo 4. Desarrollo posterior 5. Entrega y retroalimentación 6. Comunicación con el cliente El modelo de prototipos tiene la ventaja de acelerar el desarrollo del software ya que la fase de planeación y modelado es más rápida al ser el software un prototipo. En las fases de elaboración y desarrollo se toma el tiempo que sea necesario para que en la entrega y
  • 7. retroalimentación se pueda presentar una versión del proyecto que aunque no terminado sea ya funcional para que el cliente pueda hacer sus observaciones y esté al tanto del progreso del proyecto. En base a este análisis del cliente se puede volver a iterar la planeación y siguientes fases hasta volver a presentar un nuevo prototipo y así llegar a un producto final que satisfaga las necesidades del cliente. Recursos. Siendo JAVA el lenguaje de programación a utilizar se empleara una computadora con los requerimientos básicos para poder utilizar la máquina virtual de java así como un entorno de desarrollo integrado, el cual será BlueJ ya que integra una interfaz desde la cual se pueden ver las relaciones entre los diferentes módulos o clases programadas. Java Runtime Environment (JRE) es lo que se obtiene al descargar el software de Java. JRE está formado por Java Virtual Machine (JVM), clases del núcleo de la plataforma Java y bibliotecas de la plataforma Java de soporte. El sistema operativo que alojara la JVM será Windows 10, para lo cual se requieren RAM: 128 MB Espacio en disco: 124 MB para JRE; 2 MB para Java Update Procesador: Mínimo Pentium 2 a 266 MHz BlueJ fue desarrollado para apoyar la enseñanza y el aprendizaje de la programación orientada a objetos, y como resultado, su diseño difiere de otros entornos de desarrollo. La pantalla principal muestra gráficamente la estructura de clases de una aplicación en desarrollo (en un diagrama muy parecido a UML), y los objetos pueden ser creados y probados interactivamente. Combinado con una interfaz de usuario simple, esta facilidad de interacción permite experimentar de manera fácil con los objetos en desarrollo. Los conceptos de la orientación a objetos (clases, objetos, comunicación a través de llamadas a métodos) son representados visualmente en el diseño de interacción en la interfaz.
  • 8. Para la codificación del software se requieren conocimientos básicos de las librerías matemáticas integradas para el lenguaje de programación, y conocimientos básicos de matemáticas con su implementación en software por parte del desarrollador del proyecto. Cronograma Semana 1 7/09/2020- 13/09/2020 Semana 2 14/09/2020- 20/09/2020 Semana 3 21/09/2020- 27/09/2020 Semana 4 28/09/2020- 04/10/2020 Realizado Definiciónde antecedentes, objetivos, metodologíay recursosa usar. X Creaciónde una clase de análisisléxico que recibacadenasde textoy lasconvierta enexpresiones matematicas X Programaciónde un módulodel software para redondearcifras Solución de ecuaciones Punto fijo Análisisdel método del puntofijo X Diseñodel algoritmo, clases, interfazy métodospara programar el modulo del puntofijo. X Programaciónde las clasespreviamente diseñadas X Pruebasdel software usandofuncionescon resultadosconocidos y herramientasde graficación X Bisección Análisisdel método de la bisección X Diseñodel algoritmo, clases,interfazy X
  • 9. métodospara programar el módulo de la bisección. Programaciónde las clasespreviamente diseñadas X Pruebasdel software usandofuncionescon resultadosconocidos y herramientasde graficación X Falsa posición Análisisdel método de la falsaposición X Diseñodel algoritmo, clases,interfazy métodospara programar el módulo de la falsaposición. X Programaciónde las clasespreviamente diseñadas X Pruebasdel software usandofuncionescon resultadosconocidos y herramientasde graficación X Semana 5 5/10/2020- 11/10/2020 Semana 6 12/10/2020- 18/10/2020 Semana 7 19/10/2020- 25/10/2020 Semana 8 26/10/2020- 1/11/2020 Newton Raphson Análisisdel método de Newton-Raphson X Diseñodel algoritmo, clases,interfazy métodospara programar el módulo de Newton-Raphson. X Programaciónde las clasespreviamente diseñadas X Pruebasdel software usandofuncionescon resultadosconocidos y herramientas de graficación X
  • 10. Secante Análisisdel método de Secante X Diseñodel algoritmo, clases,interfazy métodospara programar el módulo de Secante. X Programaciónde las clasespreviamente diseñadas X Pruebasdel software usandofunciones con resultadosconocidos y herramientasde graficación X Sistemas de ecuaciones Método de Jacobi Análisisdel método de Jacobi. X Diseñodel algoritmo, clases,interfazy métodospara programar el módulo de Jacobi. X Programaciónde las clasespreviamente diseñadas X Pruebasdel software usandosistemasde ecuacionescon resultadosconocidos y comprobaciónde resultados X Método de Gauss- Seidel Análisisdel método de Gauss-Seidel. X Diseñodel algoritmo, clases,interfaz y métodospara programar el módulo de Gauss-Seidel. X Programaciónde las clasespreviamente diseñadas X
  • 11. Pruebasdel software usandosistemasde ecuacionescon resultadosconocidos y comprobaciónde resultados X Semana 9 2/11/2020- 8/11/2020 Semana 10 9/11/2020- 15/11/2020 Semana 11 2/11/2020- 8/11/2020 Semana 12 16/11/2020- 22/11/2020 Integración y derivación numérica Método del trapecio Análisisdel método de trapecio. X Diseñodel algoritmo, clases,interfazy métodos para programar el módulo de trapecio. X Programaciónde las clasespreviamente diseñadas X Pruebasdel software usandointegralescon resultadosconocidos y comparando resultados. X Método de Simpson Análisisdel método de Simpson. X Diseñodel algoritmo, clases,interfazy métodospara programar el módulo de Simpson. X Programaciónde las clasespreviamente diseñadas X Pruebasdel software usandointegralescon resultadosconocidos y comparando resultados. X Derivación numérica Análisisdel método de derivación X
  • 12. progresiva,regresivay central. Diseñodel algoritmo, clases,interfazy métodospara programar los métodosde derivación X Programaciónde las clasespreviamente diseñadas X Pruebasdel software usandoderivadascon resultadosconocidos y comparando resultados. X Semana 13 23/11/2020- 29/11/2020 Semana 14 30/12/2020- 6/12/2020 Semana 15 7/12/2020- 13/12/2020 Semana 16 14/12/2020- 20/12/2020 Ajuste de datos Regresión lineal por mínimos cuadrados Análisisdel método de mínimos cuadrados. X Diseñodel algoritmo, clases,interfazy métodospara programar el método de losmínimos cuadrados X Programaciónde las clasespreviamente diseñadas X Pruebasdel software usandopuntos cartesianosy comparandola recta obtenidaconlos puntosgraficados X Integraciónde los métodos programadosenuna solainterfaz. X
  • 13. Programación de analizador léxico y herramienta de redondeo Análisis Lexico Un analizador léxico o analizador lexicográfico (en inglés scanner) es la primera fase de un compilador, consistente en un programa que recibe como entrada el código fuente de otro programa (secuencia de caracteres) y produce una salida compuesta de tokens (componentes léxicos) o símbolos. Estos tokens sirven para una posterior etapa del proceso de traducción, siendo la entrada para el analizador sintáctico (en inglés parser). La especificación de un lenguaje de programación a menudo incluye un conjunto de reglas que definen el léxico. Estas reglas consisten comúnmente en expresiones regulares que indican el conjunto de posibles secuencias de caracteres que definen un token o lexema. En algunos lenguajes de programación es necesario establecer patrones para caracteres especiales (como el espacio en blanco) que la gramática pueda reconocer sin que constituya un token en sí. Para la correcta lectura de las funciones que serán evaluadas en los siguientes modulos del programa se hizo la programación de un analizador léxico que recibe una cadena de texto y convierta la cada en una operación matemática que el lenguaje java pueda interpretar. Las funciones que acepta el lenguaje definido en el analizador léxico son, seno, coseno, tangente, e, logaritmo, raíz cuadrada, suma, resta, multiplicación, división, potencia y el agrupamiento de operaciones mediante paréntesis. Raiz cuadrada sqrt() seno sen() coseno cos() tangente tan() e eˆ() logaritmo ln() suma, resta, multiplicación, división. + , - , / , * Potencia o “ elevado a “ ˆ Para el caso de e, la cadena se recibe como eˆ y se hace un filtrado para reemplazar el carácter por los paréntesis que ocupa el lenguaje del analizador léxico, lo mismo ocurre con variables x, ya que no se ha definido que operación realizaría x, el filtrado susituye x por su correspondiente valor numérico previamente pasado como un parámetro, asi se maneja x como si de un numero se tratara. Asi mismo, al recibir un resultado puede darse el caso de ser devuelto en una nomenclatura tipo E’algun numero’, lo cual indica que hay un desbordamiento por el numero de decimales que se están manejando, sin embargo el
  • 14. analizador léxico no procesa este operador asi que en el filtrado de la función también se sustituye por "*10^" lo cual es su verdadero significado. Asi entonces el usuario puede introducir libremente cadenas de texto de la forma “(e^(- 0.5*x)) * cos(2*x) “ . Al leer la función también se debe enviar como parámetro el valor de la variable x. En el caso de un error de sintaxis el resultado de la función será 0, ya que devuelve la variable double resultado, la cual desde su declaración se le dio el valor 0. Los errores en la sintaxis de la cadena pueden deberse a introducir un operador no definido en el analizador léxico, una función no definida por este, o un carácter invalido o no coherente con una expresión matemática. Diseño UML
  • 15. Implementación Código del analizador léxico de funciones matemáticas import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.swing.JOptionPane; public class EvaluadorFunciones { public static double eval(final String str) { return new Object() { int pos = -1, ch; void nextChar() { ch = (++pos < str.length()) ? str.charAt(pos) : -1; } boolean eat(int charToEat) { while (ch == ' ') nextChar(); if (ch == charToEat) { nextChar(); return true; } return false; } double parse() { nextChar(); double x = parseExpression(); if (pos < str.length()) throw new RuntimeException("Unexpected: " + (char)ch); return x; } // Grammar: // expression = term | expression `+` term | expression `-` term // term = factor | term `*` factor | term `/` factor // factor = `+` factor | `-` factor | `(` expression `)` // | number | functionName factor | factor `^` factor
  • 16. double parseExpression() { double x = parseTerm(); for (;;) { if (eat('+')) x += parseTerm(); // addition else if (eat('-')) x -= parseTerm(); // subtraction else return x; } } double parseTerm() { double x = parseFactor(); for (;;) { if (eat('*')) x *= parseFactor(); // multiplication else if (eat('/')) x /= parseFactor(); // division else return x; } } double parseFactor() { if (eat('+')) return parseFactor(); // unary plus if (eat('-')) return -parseFactor(); // unary minus double x; int startPos = this.pos; if (eat('(')) { // parentheses x = parseExpression(); eat(')'); } else if ((ch >= '0' && ch <= '9') || ch == '.') { // numbers while ((ch >= '0' && ch <= '9') || ch == '.') nextChar(); x = Double.parseDouble(str.substring(startPos, this.pos)); } else if (ch >= 'a' && ch <= 'z') { // functions while (ch >= 'a' && ch <= 'z') nextChar(); String func = str.substring(startPos, this.pos); x = parseFactor(); if (func.equals("sqrt")) x = Math.sqrt(x); else if (func.equals("sen")) x = Math.sin(x); else if (func.equals("cos")) x = Math.cos(x); else if (func.equals("tan")) x = Math.tan(Math.toRadians(x)); else if (func.equals("e")) x = Math.exp(x); else if (func.equals("ln")) x = Math.log(x); else throw new RuntimeException("Unknown function: " + func); } else { throw new RuntimeException("Unexpected: " + (char)ch);
  • 17. } if (eat('^')) x = Math.pow(x, parseFactor()); // exponentiation // if (eat('e^')) x = Math.pow(x, parseFactor()); //numeros tipo 434E-10 return x; } }.parse(); } } Código de la clase de filtrado para funciones que incluyen una variable x import javax.swing.JOptionPane; public class EvaluarX{ public double evaluarFuncion(String funcion,double x){ // String sustitucionx= funcion.replaceAll("x",String.valueOf(x)); // sustitucionx= sustitucionx.replaceAll("E","*10^"); // sustitucionx= sustitucionx.replaceAll("e^","e"); String sustitucion=""; sustitucion=funcion.replace("e^","e"); sustitucion=sustitucion.replaceAll("x",String.valueOf(x)); sustitucion=sustitucion.replaceAll("E","*10^"); //sustitucion=sustitucion.replaceAll("E","^"); // funcion.replaceAll("e^","e"); //System.out.println(sustitucion); EvaluadorFunciones EF= new EvaluadorFunciones(); double resultado=0.0; try{ resultado=EF.eval(sustitucion); }catch(Exception excepcion) { //JOptionPane.showMessageDialog(null, "error de sintaxis", " ", JOptionPane.WARNING_MESSAGE); }
  • 18. return resultado; } public String sustitucionx1(String funcion,double x){ String sustitucionx= funcion.replaceAll("x1",String.valueOf(x)); return sustitucionx; } public String sustitucionx2(String funcion,double x){ String sustitucionx= funcion.replaceAll("x2",String.valueOf(x)); return sustitucionx; } public String sustitucionx3(String funcion,double x){ String sustitucionx= funcion.replaceAll("x3",String.valueOf(x)); return sustitucionx; } public double evaluarFuncionxxx(String funcion,double x1,double x2,double x3){ String sustitucionx= funcion; sustitucionx= sustitucionx1(sustitucionx, x1); //System.out.println(sustitucionx); sustitucionx= sustitucionx2(sustitucionx, x2); //System.out.println(sustitucionx); sustitucionx= sustitucionx3(sustitucionx, x3); //System.out.println(sustitucionx); EvaluadorFunciones EF= new EvaluadorFunciones(); return EF.eval(sustitucionx); } }
  • 19. Redondeo Debido a que será una operación muy repetitiva en todos los modulos del programa se creo una clase que implementara el método de redondeo, la clase recibe como parámetros un número y un numero de decimales, y devuelve un resultado redondeando el numero a su entero decimal más cercano. UML Implementacion Clase redondeo public class Redondeo { public double redondear(double numero,int digitos) { int cifras=(int) Math.pow(10,digitos); return Math.rint(numero*cifras)/cifras; } }
  • 20. Soluciónde ecuaciones Análisis Encontrar una solución ó una raíz real de una ecuación, es hallar el valor de la variable independiente x, que anule el valor de la función f(x), que se exprese en términos de la variable citada. En otras palabras, si la función se desarrolla en el plano cartesiano xy, la solución real de esa función es el valor de x que corresponda a la intersección del eje de las abscisas con la curva d efinida por la función f(x). Para encontrar una solución real, las ecuaciones, sin importar que representen un polinomio u otra cualquiera, deben ser representadas en la forma: f(x) = 0 Punto fijo A partir de una ecuación F(X)=0 se genera una ecuación X=g(X), a la cual se le busca una solución, y se debe tener en cuenta lo siguiente  Se busca un valor de X que al reemplazarlo en g, el resultado sea X.  Se debe elegir una aproximación inicial Xo  Se calcula X1=g(Xo)  Y se repite el paso anterior hasta llegar a una aproximación. Puede afirmarse que si el método converge, la diferencia en valor absoluto entre valores proporcionados en dos iteraciones sucesivas será cada vez más pequeña a medida que n aumente, y con esto se tendrá un criterio para saber cuándo termina la aplicación del método. Sea f(x) = 0 una ecuación algebraica o trascendente cualquiera. Se suma x en ambos miembros y se obtiene: (1) f(x) + x = x
  • 21. Donde el miembro izquierdo es otra función de x que se define como (2) G(x) + x = x Se sustituye en la ecuación (1): (3) x = G(x) Si x = a es una raíz de la ecuación, entonces f (a) = 0 Al proceder reiteradamente en esta forma se induce que la n-ésima aproximación es: Xn = G(Xn-1) n = 1,2,3,.....
  • 22. Diseño Diagrama de flujodel métododel punto fijo. Pseudocódigodel métodode punto fijo Proceso Método punto Fijo Leer Xo, Tolerancia, Iter Yo = f(Xo) Contador = 0 Error = Tolerancia + 1 Mientras 0 & Error > Tolerancia Hacer Yo = f(Xn) Error = abs ((Xn - Xo)/Xn) Xo = Xn Contador = Contador + 1 Fin Mientras Si Yo = 0 Entonces Muestre: ‘Xo es Raiz’ Sino Si Error < Tolerancia Entonces Muestre: ‘‘Xo’ es una raiz aproximada con una tolerancia ‘Tolerancia’’ Fin Si Fin Si Fin Proceso
  • 23. UML
  • 24. Diseño de la interfaz de usuario Implementación Código de la interfaz grafica import javax.swing.*; import java.awt.Event.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JOptionPane; import java.util.InputMismatchException; public class Interfaz_PuntoFijo extends JFrame implements ActionListener{ //__________________________ JPanel panel3; JTextField txt_puntofijo; JButton btn_puntofijo; JLabel lbl_puntofijo;
  • 25. JTextArea textarea_puntofijo; JScrollPane scrollpane_puntofijo; JButton limpiar_puntofijo; JTextField txt_valorinicial; JLabel lbl_valorinicial; JTextField txt_errorpuntofijo; JLabel lbl_errorpuntofijo; JTextField txt_decimalespuntofijo; JLabel lbl_decimalespuntofijo; String error[]; JComboBox cotaerror; String decimales[]; JComboBox numdecimales; public Interfaz_PuntoFijo(){ //setDefaultCloseOperation(EXIT_ON_CLOSE ); // setBounds(0, 0, 850, 500); //setVisible(true); //_________________________________________// lbl_puntofijo=new JLabel("Ingrese la funcion "); lbl_puntofijo.setBounds(20, 15, 200, 20); txt_puntofijo=new JTextField(); txt_puntofijo.setBounds(130, 15, 500, 20);
  • 26. lbl_valorinicial=new JLabel("Valor inicial "); lbl_valorinicial.setBounds(20, 100, 200, 20); txt_valorinicial=new JTextField(); txt_valorinicial.setBounds(130, 100, 150, 20); lbl_errorpuntofijo=new JLabel("Error"); lbl_errorpuntofijo.setBounds(20, 140, 200, 20); // txt_errorpuntofijo=new JTextField(); // txt_errorpuntofijo.setBounds(130, 140, 150, 20); error= new String[] { "0.1", "0.01", "0.001","0.0001", "0.00001" }; cotaerror= new JComboBox(error); cotaerror.setSelectedIndex(2); cotaerror.setBounds(130, 140, 150, 20); lbl_decimalespuntofijo=new JLabel("Decimales"); lbl_decimalespuntofijo.setBounds(20, 160, 200, 20); decimales= new String[] { "1", "2","3", "4","5","6","7" }; numdecimales= new JComboBox(decimales); numdecimales.setSelectedIndex(4); numdecimales.setBounds(130, 160, 150, 20); // txt_decimalespuntofijo=new JTextField();
  • 27. // txt_decimalespuntofijo.setBounds(130, 160, 150, 20); btn_puntofijo=new JButton("Obtener raiz"); btn_puntofijo.setBounds(20, 200, 200, 20); btn_puntofijo.addActionListener(this); textarea_puntofijo=new JTextArea(); textarea_puntofijo.setEditable(false); scrollpane_puntofijo=new JScrollPane(textarea_puntofijo); scrollpane_puntofijo.setBounds(300,50,500,300); limpiar_puntofijo = new JButton("Limpiar texto"); limpiar_puntofijo.setBounds(20, 250, 200, 20); limpiar_puntofijo.addActionListener(this); panel3=new JPanel(); panel3.setLayout(null); panel3.add(scrollpane_puntofijo); panel3.add(lbl_puntofijo); panel3.add(txt_puntofijo); panel3.add(lbl_errorpuntofijo); panel3.add(cotaerror); panel3.add(lbl_decimalespuntofijo); panel3.add(numdecimales); panel3.add(lbl_valorinicial); panel3.add(txt_valorinicial); panel3.add(btn_puntofijo); panel3.add(limpiar_puntofijo);
  • 28. //________________________________________________ } public JPanel interfazpuntofijo() { return panel3; } public void actionPerformed(ActionEvent mn){ if(mn.getSource()==btn_puntofijo){ String funcion; Double inicial=0.0; Double error=0.0; int decimales=0; funcion=txt_puntofijo.getText(); funcion=funcion.replaceAll(" ", ""); //quitar espacios try{ inicial=Double.parseDouble(txt_valorinicial.getText()); } catch (NumberFormatException nfe){ JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor inicial", JOptionPane.WARNING_MESSAGE);} error=Double.parseDouble(cotaerror.getSelectedItem().toString());
  • 29. decimales=Integer.parseInt(numdecimales.getSelectedItem().toString()); if(funcion.length()!=0){ PuntoFijo pf = new PuntoFijo(); textarea_puntofijo.setText(pf.puntofijo(funcion,inicial,error,decimales)); }else{ // System.out.print("hola"); JOptionPane.showMessageDialog(null, "La función no ha sido creada", "Casilla vacia ", JOptionPane.WARNING_MESSAGE);} } if(mn.getSource()==limpiar_puntofijo){ textarea_puntofijo.setText(""); } } // public static void main(String[] args) { // Puntofijo2 MN = new Puntofijo2();
  • 30. // } } La clase punto fijo recibe una función, un valor inicial, un margen de error y con cuantos decimales debe trabajar y devuelve un String que se añadirá al área editable de la interfaz gráfica . Clase que implementa el método del punto fijo public class PuntoFijo{ String consola=""; double error; double errorRelativo; double erp; public String puntofijo(String funcion,double x,double margen,int decimales) { EvaluarX EX=new EvaluarX(); Redondeo R= new Redondeo(); int cifras=decimales; //String funcion = "(e(x))/3"; error= margen + 1; double resultado=0; consola+="XttFuncion(x)ttError"; consola+="n"; //while (erp>margen){ while (error>margen){
  • 31. try{ resultado= R.redondear((EX.evaluarFuncion(funcion,x)),cifras); //if(resultado==Infinity); error= Math.abs(resultado-x); error =R.redondear(error,cifras); consola+=""+x+"tt"+resultado+"tt"+error; consola+="n"; // System.out.println(""+x+"tt"+resultado+"tt"+error+"n"); x=resultado; } catch (Exception e){} } return consola; } // public static void main (String [] args){ // PuntoFijo pf= new PuntoFijo(); // pf.puntofijo("(e^x)-(10*(x^2))+2",1.0,0.0001,5); // } } Pruebas La función f(𝑥) = 𝑒𝑥 – 3 x De la forma x= 𝑒𝑥 /3 Valor inicial= 0.5 ERP= 0.001 % 5 decimales de redondeo Arroja un valor para x =0.61904 que se aproxima a la raíz de la función como lo muestra la gráfica de la función
  • 32. Graficando f(𝑥) = 𝑒𝑥 – 3 x se obtiene la siguiente grafica que confirma la aproximación de la raíz
  • 33. Método de bisección Análisis Este método plantea que si se cumple que:  f(x) es real y continua en el intervalo que va desde un Xi hasta un Xs  f(Xi) f(Xs)<0 Si se cumple lo anterior, por lo menos existe una raíz dentro de este intervalo. El procedimiento es el siguiente:  Se elige un intervalo inicial para función f(x)  Luego se busca localizar la raíz con mayor exactitud dentro del intervalo dividiendo a la mitad y observando si se conservan las condiciones iniciales.  Se compara el Xmed con cada uno de los límites del intervalo y se observa que producto cambia de signo y se asigna un nuevo intervalo.  Se vuelve a repetir el proceso, y se va poniendo pequeño el intervalo hasta llegar a una aproximación de la raíz o la raíz exacta. Al aplicarse el método se puede apreciar que la aproximación a la raíz mejora cada vez que el intervalo se hace más pequeño.
  • 34. Diseño Diagrama de flujo del método de la bisección
  • 35. Pseudocódigo del método de la bisección Proceso Metodo de Biseccion Leer Xi, Xs, Tolerancia, Iter Yi = f(Xi) Ys = f(Xs) Si Yi*Ys < 0 Entonces Xm= (Xi + Xs)/2 Contador = 1 Ym = f(Xm) Error = Tolerancia + 1 Mientras Hacer Si Yi*Ym < 0 Entonces X s= Xm Ys = Ym Sino X i= Xm Yi = Ym Fin Si Xaux = Xm Xm = (Xi + Xs)/2 Ym = f(Xm) Error = Abs(Xm - Xaux) Contador = Contador + 1 Fin Mientras
  • 36. Si Ym = 0 Entonces Muestre:‘Xm es Raiz’ Sino Si Error < Tolerancia Entonces Muestre:‘Xm es aproximacion a una raiz con una toleracia ‘Tolerancia’’ Fin Si Fin Si Sino Muestre:‘El intervalo es inadecuado’ Fin Si Fin Proceso
  • 37. UML
  • 38. Diseño de la interfaz gráfica de usuario Implementación Interfaz grafica de usuario import javax.swing.*; import java.awt.Event.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Interfaz_Biseccion extends JFrame implements ActionListener{ //___________________________ JPanel panel2; JTextField txt_biseccion; JButton btn_biseccion; JLabel lbl_biseccion; JTextArea textarea_biseccion; JScrollPane scrollpane_biseccion; JButton limpiar_biseccion;
  • 39. JTextField txt_errorbiseccion; JLabel lbl_errorbiseccion; JTextField txt_decimalesbiseccion; JLabel lbl_decimalesbiseccion; JTextField txt_valorabiseccion; JLabel lbl_valorabiseccion; JTextField txt_valorbbiseccion; JLabel lbl_valorbbiseccion; //___________________________ String error[]; JComboBox cotaerror; String decimales[]; JComboBox numdecimales; //__________________________ public Interfaz_Biseccion(){ //______________________________________// lbl_biseccion=new JLabel("Ingrese la funcion "); lbl_biseccion.setBounds(20, 15, 200, 20); txt_biseccion=new JTextField(); txt_biseccion.setBounds(130, 15, 500, 20); lbl_valorabiseccion=new JLabel("Valor a "); lbl_valorabiseccion.setBounds(20, 100, 200, 20); txt_valorabiseccion=new JTextField(); txt_valorabiseccion.setBounds(130, 100, 150, 20);
  • 40. lbl_valorbbiseccion=new JLabel("Valor b "); lbl_valorbbiseccion.setBounds(20, 120, 200, 20); txt_valorbbiseccion=new JTextField(); txt_valorbbiseccion.setBounds(130, 120, 150, 20); lbl_errorbiseccion=new JLabel("Error"); lbl_errorbiseccion.setBounds(20, 140, 200, 20); error= new String[] { "0.1", "0.01", "0.001","0.0001", "0.00001" }; cotaerror= new JComboBox(error); cotaerror.setSelectedIndex(2); cotaerror.setBounds(130, 140, 150, 20); // txt_errorbiseccion=new JTextField(); // txt_errorbiseccion.setBounds(130, 140, 150, 20); lbl_decimalesbiseccion=new JLabel("Decimales"); lbl_decimalesbiseccion.setBounds(20, 160, 200, 20); // txt_decimalesbiseccion=new JTextField(); // txt_decimalesbiseccion.setBounds(130, 160, 150, 20); decimales= new String[] { "1", "2","3", "4","5","6","7" }; numdecimales= new JComboBox(decimales); numdecimales.setSelectedIndex(4); numdecimales.setBounds(130, 160, 150, 20); btn_biseccion=new JButton("Obtener raiz");
  • 41. btn_biseccion.setBounds(20, 200, 200, 20); btn_biseccion.addActionListener(this); textarea_biseccion=new JTextArea(); textarea_biseccion.setEditable(false); scrollpane_biseccion=new JScrollPane(textarea_biseccion); scrollpane_biseccion.setBounds(300,50,500,300); limpiar_biseccion = new JButton("Limpiar texto"); limpiar_biseccion.setBounds(20, 250, 200, 20); limpiar_biseccion.addActionListener(this); panel2=new JPanel(); panel2.setLayout(null); panel2.add(scrollpane_biseccion); panel2.add(lbl_biseccion); panel2.add(txt_biseccion); panel2.add(lbl_valorabiseccion); panel2.add(txt_valorabiseccion); panel2.add(lbl_valorbbiseccion); panel2.add(txt_valorbbiseccion); panel2.add(btn_biseccion); panel2.add(limpiar_biseccion); panel2.add(lbl_errorbiseccion); panel2.add(cotaerror); panel2.add(lbl_decimalesbiseccion); panel2.add(numdecimales);
  • 42. //_________________________________________// } public void actionPerformed(ActionEvent mn){ if(mn.getSource()==btn_biseccion){ String funcion; Double a=0.0; Double b=0.0; Double error=0.0; int decimales=0; funcion=txt_biseccion.getText(); funcion=funcion.replaceAll(" ", ""); //quitar espacios try{ a=Double.parseDouble(txt_valorabiseccion.getText()); } catch (NumberFormatException nfe){ JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor inicial", JOptionPane.WARNING_MESSAGE);} try{ b=Double.parseDouble(txt_valorbbiseccion.getText()); } catch (NumberFormatException nfe){ JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor inicial", JOptionPane.WARNING_MESSAGE);} error=Double.parseDouble(cotaerror.getSelectedItem().toString()); decimales=Integer.parseInt(numdecimales.getSelectedItem().toString());
  • 43. if(funcion.length()!=0){ Biseccion bi = new Biseccion(); textarea_biseccion.setText(bi.biseccion(funcion,a,b,error,decimales)); }else{ JOptionPane.showMessageDialog(null, "La función no ha sido creada", "Casilla vacia ", JOptionPane.WARNING_MESSAGE);} } if(mn.getSource()==limpiar_biseccion){ textarea_biseccion.setText(""); } } public JPanel interfazbiseccion() { return panel2; } }
  • 44. La clase Bisección recibe una función, un valor inicial a, el valor inicial b, un margen de error y con cuantos decimales debe trabajar y devuelve un String que se añadirá al área editable de la interfaz gráfica . Clase que implementa el método de la bisección import javax.swing.*; import java.awt.Event.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Interfaz_Biseccion extends JFrame implements ActionListener{ //___________________________ JPanel panel2; JTextField txt_biseccion; JButton btn_biseccion; JLabel lbl_biseccion; JTextArea textarea_biseccion; JScrollPane scrollpane_biseccion; JButton limpiar_biseccion; JTextField txt_errorbiseccion; JLabel lbl_errorbiseccion; JTextField txt_decimalesbiseccion; JLabel lbl_decimalesbiseccion; JTextField txt_valorabiseccion; JLabel lbl_valorabiseccion; JTextField txt_valorbbiseccion; JLabel lbl_valorbbiseccion;
  • 45. //___________________________ String error[]; JComboBox cotaerror; String decimales[]; JComboBox numdecimales; //__________________________ public Interfaz_Biseccion(){ //______________________________________// lbl_biseccion=new JLabel("Ingrese la funcion "); lbl_biseccion.setBounds(20, 15, 200, 20); txt_biseccion=new JTextField(); txt_biseccion.setBounds(130, 15, 500, 20); lbl_valorabiseccion=new JLabel("Valor a "); lbl_valorabiseccion.setBounds(20, 100, 200, 20); txt_valorabiseccion=new JTextField(); txt_valorabiseccion.setBounds(130, 100, 150, 20); lbl_valorbbiseccion=new JLabel("Valor b "); lbl_valorbbiseccion.setBounds(20, 120, 200, 20); txt_valorbbiseccion=new JTextField(); txt_valorbbiseccion.setBounds(130, 120, 150, 20); lbl_errorbiseccion=new JLabel("Error"); lbl_errorbiseccion.setBounds(20, 140, 200, 20);
  • 46. error= new String[] { "0.1", "0.01", "0.001","0.0001", "0.00001" }; cotaerror= new JComboBox(error); cotaerror.setSelectedIndex(2); cotaerror.setBounds(130, 140, 150, 20); // txt_errorbiseccion=new JTextField(); // txt_errorbiseccion.setBounds(130, 140, 150, 20); lbl_decimalesbiseccion=new JLabel("Decimales"); lbl_decimalesbiseccion.setBounds(20, 160, 200, 20); // txt_decimalesbiseccion=new JTextField(); // txt_decimalesbiseccion.setBounds(130, 160, 150, 20); decimales= new String[] { "1", "2","3", "4","5","6","7" }; numdecimales= new JComboBox(decimales); numdecimales.setSelectedIndex(4); numdecimales.setBounds(130, 160, 150, 20); btn_biseccion=new JButton("Obtener raiz"); btn_biseccion.setBounds(20, 200, 200, 20); btn_biseccion.addActionListener(this); textarea_biseccion=new JTextArea(); textarea_biseccion.setEditable(false); scrollpane_biseccion=new JScrollPane(textarea_biseccion); scrollpane_biseccion.setBounds(300,50,500,300); limpiar_biseccion = new JButton("Limpiar texto");
  • 47. limpiar_biseccion.setBounds(20, 250, 200, 20); limpiar_biseccion.addActionListener(this); panel2=new JPanel(); panel2.setLayout(null); panel2.add(scrollpane_biseccion); panel2.add(lbl_biseccion); panel2.add(txt_biseccion); panel2.add(lbl_valorabiseccion); panel2.add(txt_valorabiseccion); panel2.add(lbl_valorbbiseccion); panel2.add(txt_valorbbiseccion); panel2.add(btn_biseccion); panel2.add(limpiar_biseccion); panel2.add(lbl_errorbiseccion); panel2.add(cotaerror); panel2.add(lbl_decimalesbiseccion); panel2.add(numdecimales); //_________________________________________// } public void actionPerformed(ActionEvent mn){ if(mn.getSource()==btn_biseccion){ String funcion;
  • 48. Double a=0.0; Double b=0.0; Double error=0.0; int decimales=0; funcion=txt_biseccion.getText(); funcion=funcion.replaceAll(" ", ""); //quitar espacios try{ a=Double.parseDouble(txt_valorabiseccion.getText()); } catch (NumberFormatException nfe){ JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor inicial", JOptionPane.WARNING_MESSAGE);} try{ b=Double.parseDouble(txt_valorbbiseccion.getText()); } catch (NumberFormatException nfe){ JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor inicial", JOptionPane.WARNING_MESSAGE);} error=Double.parseDouble(cotaerror.getSelectedItem().toString()); decimales=Integer.parseInt(numdecimales.getSelectedItem().toString()); if(funcion.length()!=0){ Biseccion bi = new Biseccion(); textarea_biseccion.setText(bi.biseccion(funcion,a,b,error,decimales)); }else{ JOptionPane.showMessageDialog(null, "La función no ha sido creada", "Casilla vacia ", JOptionPane.WARNING_MESSAGE);} }
  • 49. if(mn.getSource()==limpiar_biseccion){ textarea_biseccion.setText(""); } } public JPanel interfazbiseccion() { return panel2; } } Pruebas La función f(x)= 𝑒−𝑥 –lnx se evaluó con a=0.5 y b=2, con un error absoluto porcentual de 0.001 y 5 decimales El método seleccionado fue el de la bisección
  • 50. Raiz= 1.30982 Esto coincide con lo mostrado al graficar la función
  • 51. Falsa posición Análisis  Si se tiene dos puntos (a, f(a)) y(b, f(b)) y se traza la recta que une a estos dos puntos, se puede observar que un punto esta por debajo del eje x y otro por encima de este, y un punto intermedio (Xm,0), con este punto intermedio se puede comparar los límites y obtener un nuevo intervalo  Si f(A) y f(B)<0, entonces la raíz se encuentra al lado izquierdo del intervalo.  Si f(A) y f(B)>0, entonces la raíz se encuentra al lado derecho del intervalo.  Para hallar la intersección de la recta con el eje X usamos la siguiente fórmula: Xm= a - ((f(a)*(b - a))/(f(b) - f(a)))
  • 52. Diseño Diagrama de flujo del método de la falsa posición
  • 53. Pseudocódigodel métodode la falsa posición Proceso Método de la falsa posición Leer Xi, Xs, Tolerancia, Iter Yi = f(Xi) Ys = f(Xs) Si Yi*Ys < 0 Entonces Xm= Xi – ((Yi*(Xs – Xi))/(Ys – Yi)) Contador = 1 Ym = f(Xm) Error = Tolerancia + 1 Mientras Hacer Si Yi*Ym < 0 Entonces X s= Xm Ys = Ym Sino X i= Xm Yi = Ym Fin Si Xaux = Xm Xm= Xi – ((Yi*(Xs – Xi))/(Ys – Yi)) Ym = f(Xm)
  • 54. Error = Abs(Xm - Xaux) Contador = Contador + 1 Fin Mientras Si Ym = 0 Entonces Muestre:‘Xm es Raiz’ Sino Si Error < Tolerancia Entonces Muestre:‘Xm es aproximacion a una raiz con una toleracia ‘Tolerancia’’ Fin Si Fin Si Sino Muestre:‘El intervalo es inadecuado’ Fin Si Fin Proceso
  • 55. UML
  • 56. Diseño de la interfaz gráfica de usuario Implementación Interfaz grafica de usuario import javax.swing.*; import java.awt.Event.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Interfaz_falsaposicion extends JFrame implements ActionListener{ JPanel panel1; JTextField txt_falsaposicion; JButton btn_falsaPosicion; JLabel lbl_falsaposicion; JTextArea textarea_falsaposicion;
  • 57. JScrollPane scrollpane_falsaposicion; JButton limpiar_falsaposicion; JTextField txt_errorfalsaposicion; JLabel lbl_errorfalsaposicion; JTextField txt_decimalesfalsaposicion; JLabel lbl_decimalesfalsaposicion; JTextField txt_valorafalsaposicion; JLabel lbl_valorafalsaposicion; JTextField txt_valorbfalsaposicion; JLabel lbl_valorbfalsaposicion; //___________________________ String error[]; JComboBox cotaerror; String decimales[]; JComboBox numdecimales; //__________________________ public Interfaz_falsaposicion(){ lbl_falsaposicion=new JLabel("Ingrese la funcion "); lbl_falsaposicion.setBounds(20, 15, 200, 20); txt_falsaposicion=new JTextField(); txt_falsaposicion.setBounds(130, 60, 150, 20); txt_falsaposicion.setBounds(130, 15, 500, 20); lbl_valorafalsaposicion=new JLabel("Valor a "); lbl_valorafalsaposicion.setBounds(20, 100, 200, 20);
  • 58. txt_valorafalsaposicion=new JTextField(); txt_valorafalsaposicion.setBounds(130, 100, 150, 20); lbl_valorbfalsaposicion=new JLabel("Valor b "); lbl_valorbfalsaposicion.setBounds(20, 120, 200, 20); txt_valorbfalsaposicion=new JTextField(); txt_valorbfalsaposicion.setBounds(130, 120, 150, 20); lbl_errorfalsaposicion=new JLabel("Error"); lbl_errorfalsaposicion.setBounds(20, 140, 200, 20); // txt_errorfalsaposicion=new JTextField(); // txt_errorfalsaposicion.setBounds(130, 140, 150, 20); error= new String[] { "0.1", "0.01", "0.001","0.0001", "0.00001" }; cotaerror= new JComboBox(error); cotaerror.setSelectedIndex(2); cotaerror.setBounds(130, 140, 150, 20); lbl_decimalesfalsaposicion=new JLabel("Decimales"); lbl_decimalesfalsaposicion.setBounds(20, 160, 200, 20); // txt_decimalesfalsaposicion=new JTextField(); // txt_decimalesfalsaposicion.setBounds(130, 160, 150, 20); decimales= new String[] { "1", "2","3", "4","5","6","7" }; numdecimales= new JComboBox(decimales);
  • 59. numdecimales.setSelectedIndex(4); numdecimales.setBounds(130, 160, 150, 20); btn_falsaPosicion=new JButton("Obtener raiz"); btn_falsaPosicion.setBounds(20, 200, 200, 20); btn_falsaPosicion.addActionListener(this); textarea_falsaposicion=new JTextArea(); textarea_falsaposicion.setEditable(false); scrollpane_falsaposicion=new JScrollPane(textarea_falsaposicion); scrollpane_falsaposicion.setBounds(300,50,500,300); limpiar_falsaposicion = new JButton("Limpiar texto"); limpiar_falsaposicion.setBounds(20, 250, 200, 20); limpiar_falsaposicion.addActionListener(this); panel1=new JPanel(); panel1.setLayout(null); panel1.add(scrollpane_falsaposicion); panel1.add(lbl_falsaposicion); panel1.add(txt_falsaposicion); panel1.add(lbl_valorafalsaposicion); panel1.add(txt_valorafalsaposicion); panel1.add(lbl_valorbfalsaposicion); panel1.add(txt_valorbfalsaposicion);
  • 60. panel1.add(lbl_errorfalsaposicion); panel1.add(cotaerror); panel1.add(lbl_decimalesfalsaposicion); panel1.add(numdecimales); panel1.add(btn_falsaPosicion); panel1.add(limpiar_falsaposicion); } public JPanel interfaz() { return panel1; } public void actionPerformed(ActionEvent mn){ if(mn.getSource()==btn_falsaPosicion){ String funcion; Double a=0.0; Double b=0.0; Double error=0.0; int decimales=0; funcion=txt_falsaposicion.getText(); funcion=funcion.replaceAll(" ", ""); //quitar espacios try{ a=Double.parseDouble(txt_valorafalsaposicion.getText()); } catch (NumberFormatException nfe){
  • 61. JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor inicial", JOptionPane.WARNING_MESSAGE);} try{ b=Double.parseDouble(txt_valorbfalsaposicion.getText()); } catch (NumberFormatException nfe){ JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor inicial", JOptionPane.WARNING_MESSAGE);} error=Double.parseDouble(cotaerror.getSelectedItem().toString()); decimales=Integer.parseInt(numdecimales.getSelectedItem().toString()); if(funcion.length()!=0){ FalsaPosicion f= new FalsaPosicion(); textarea_falsaposicion.setText(f.falsaPosicion(funcion,a,b,error,decimales)); }else{ JOptionPane.showMessageDialog(null, "La función no ha sido creada", "Casilla vacia ", JOptionPane.WARNING_MESSAGE);} } if(mn.getSource()==limpiar_falsaposicion){ textarea_falsaposicion.setText(""); } } }
  • 62. La clase FalsaPosicion recibe una función, un valor inicial a, el valor inicial b, un margen de error y con cuantos decimales debe trabajar y devuelve un String que se añadirá al área editable de la interfaz gráfica . Clase que implementa el método public class FalsaPosicion { public String consola=""; public String falsaPosicion(String funcion,double a, double b, double tolerancia, int decimales){ consola+="METODO DE LA FALSA POSICIONn"; consola+="nx"+"t"+"f(x)t"+"error"+"n"; //_________________________ //double a=0; //double b=1; //double tolerancia=0.0001; //int decimales=6; // String funcion= "10*e(-0.5*x)*cos(2*x)"; //String funcion= "(5*(x^ 3))-(5*(x^2))+(6 * x)-2"; //String funcion="(0.05*x)-(sen(x))"; //_________________________ Redondeo R= new Redondeo(); EvaluarX EX=new EvaluarX(); double funcionA,funcionB,funcionC=0; double error=tolerancia+1; double c=0; double cAnterior=c; int contador=0; funcionA=R.redondear((EX.evaluarFuncion(funcion,a)),decimales); funcionB=R.redondear((EX.evaluarFuncion(funcion,b)),decimales); if ((funcionA * funcionB)<0) { while(error>=tolerancia){ consola+="________________________________________________"; consola+="n";
  • 63. cAnterior=c; funcionA=R.redondear((EX.evaluarFuncion(funcion,a)),decimales); funcionB=R.redondear((EX.evaluarFuncion(funcion,b)),decimales); c=a - (((b-a)* funcionA)/(funcionB-funcionA)) ; c=R.redondear(c,decimales); funcionC= EX.evaluarFuncion(funcion,c); funcionC=R.redondear(funcionC,decimales); // error= Math.abs((Math.abs(c)-Math.abs(cAnterior))/Math.abs(c)) * 100; //eap error= Math.abs(Math.abs(c)-Math.abs(cAnterior)); //ea error=R.redondear(error,decimales); //if(error>=tolerancia){ consola+=c+"t"+funcionC+"tt"+error; consola+="n"; // } if(c==0) error=tolerancia-1; //para detener el ciclo contador++; if((funcionA*funcionC)<0){ b=c; } else { a=c; } } } else{consola+= " f(a) * f(b) es mayor que 0 n Introduzca nuevos valores de a y b";} return consola; }
  • 64. } Pruebas La función f(x)= 𝑒−𝑥 –lnx se evaluó con a=0.5 y b=2, con un error absoluto porcentual de 0.001 y 5 decimales El método seleccionado fue el de la falsa posición.
  • 65. Falsa posición=1.31028 Esto coincide con lo mostrado al graficar la función
  • 66. Newton Raphson Análisis Este método de resolución numérica busca un cero de la función f(x) por aproximaciones sucesivas a partir de un valor inicial x0. El valor sucesivo xn+1 es la abscisa del punto en que la tangente a la gráfica de f(x) en xn corta al eje Ox. Es decir Es por tanto equivalente a aplicar el método de iteraciones a la función Este método es uno de los más utilizados para localizar raíces ya que en general es muy eficiente y siempre converge para una función polinomial. Se requiere que las funciones sean diferenciables, y por tanto, continuas, para poder aplicar este método. Se debe partir de un valor inicial para la raíz: xi , este puede ser cualquier valor, el método convergirá a la raíz mas cercana. Si se extiende una tangente desde el punto , el punto donde esta tangente cruza al eje x representa una aproximación mejorada de la raíz.
  • 67. El método de Newton-Raphson es convergente cuadráticamente, es decir, el error es aproximadamente al cuadrado del error anterior. Esto significa que el número de cifras decimales correctas se duplica aproximadamente en cada interacción. Pseudocódigo 1. Inicio 2. Ingreso función, Ingreso derivada función, Ingreso tolerancia desdeada e ingreso de una aproximación. 3. Procesamiento de datos y conversíon de las entradas en variables. 4. Mientras que el valor absoluto de la f(xinicial)>tolerancia 5. Xin1= xin-f(xin)/f’(xin) 6. Xin= Xin1 7. Cierre condiciones 8. Mostrar raíz (Xin) 9. Fin
  • 69. UML Diseñode la interfaz Interfaz_Newton +JPanel contenido Interfaz_Newton():void interfazNewton():return JPanel actionPerformed(ActionEvent mn):void Newton-raphson +consola:String +metodoNewton(double x,Stringfuncion,double tolerancia,int decimales):returnString EvaluarX +evaluarFuncion(String funcion,doublex): returndouble EvaluadorFunciones +eval(finalString str):returndouble Biblioteca ScriptEngine Redondeo +redondear(double numero,intdigitos): returndouble Derivada +obtenerDerivada(String funcion,double x0,int decimales):return Double
  • 70. Implementación Códigofuente Interfazgrafica de usuario import javax.swing.*; import java.awt.Event.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JOptionPane; import java.util.InputMismatchException; publicclass Interfaz_NewtonextendsJFrame implements ActionListener{ //__________________________ JPanel panel3; JTextFieldtxt_Newton; JButton btn_Newton; JLabel lbl_Newton; JTextArea textarea_Newton; JScrollPane scrollpane_Newton; JButton limpiar_Newton; JTextFieldtxt_valorinicial; JLabel lbl_valorinicial; JTextFieldtxt_errorNewton; JLabel lbl_errorNewton; JTextFieldtxt_decimalesNewton; JLabel lbl_decimalesNewton; String error[]; JComboBoxcotaerror; String decimales[]; JComboBoxnumdecimales; public Interfaz_Newton(){ //setDefaultCloseOperation(EXIT_ON_CLOSE); // setBounds(0,0, 850, 500); //setVisible(true); //_________________________________________// lbl_Newton=newJLabel("Ingrese lafuncion"); lbl_Newton.setBounds(20,15, 200, 20);
  • 71. txt_Newton=newJTextField(); txt_Newton.setBounds(130,15, 500, 20); lbl_valorinicial=newJLabel("Valorinicial "); lbl_valorinicial.setBounds(20,100, 200, 20); txt_valorinicial=newJTextField(); txt_valorinicial.setBounds(130,100, 150, 20); lbl_errorNewton=newJLabel("Error"); lbl_errorNewton.setBounds(20,140, 200, 20); // txt_errorNewton=newJTextField(); // txt_errorNewton.setBounds(130,140, 150, 20); error= new String[]{ "0.1", "0.01", "0.001","0.0001", "0.00001" }; cotaerror= new JComboBox(error); cotaerror.setSelectedIndex(2); cotaerror.setBounds(130, 140, 150, 20); lbl_decimalesNewton=newJLabel("Decimales"); lbl_decimalesNewton.setBounds(20,160, 200, 20); decimales=newString[]{ "1","2","3","4","5","6","7" }; numdecimales=newJComboBox(decimales); numdecimales.setSelectedIndex(4); numdecimales.setBounds(130,160, 150, 20); // txt_decimalesNewton=newJTextField(); // txt_decimalesNewton.setBounds(130,160, 150, 20); btn_Newton=newJButton("Obtenerraiz"); btn_Newton.setBounds(20,200, 200, 20); btn_Newton.addActionListener(this); textarea_Newton=newJTextArea(); textarea_Newton.setEditable(false); scrollpane_Newton=newJScrollPane(textarea_Newton); scrollpane_Newton.setBounds(300,50,500,300);
  • 72. limpiar_Newton= newJButton("Limpiartexto"); limpiar_Newton.setBounds(20,250, 200, 20); limpiar_Newton.addActionListener(this); panel3=newJPanel(); panel3.setLayout(null); panel3.add(scrollpane_Newton); panel3.add(lbl_Newton); panel3.add(txt_Newton); panel3.add(lbl_errorNewton); panel3.add(cotaerror); panel3.add(lbl_decimalesNewton); panel3.add(numdecimales); panel3.add(lbl_valorinicial); panel3.add(txt_valorinicial); panel3.add(btn_Newton); panel3.add(limpiar_Newton); //________________________________________________ } publicJPanel interfazNewton() { return panel3; } public voidactionPerformed(ActionEventmn){ if(mn.getSource()==btn_Newton){ String funcion; Double inicial=0.0; Double error=0.0; int decimales=0; funcion=txt_Newton.getText(); funcion=funcion.replaceAll(" ",""); //quitar espacios try{ inicial=Double.parseDouble(txt_valorinicial.getText()); } catch (NumberFormatExceptionnfe){ JOptionPane.showMessageDialog(null,"Ingreseunvalor numerico","Valorinicial", JOptionPane.WARNING_MESSAGE);} error=Double.parseDouble(cotaerror.getSelectedItem().toString());
  • 73. decimales=Integer.parseInt(numdecimales.getSelectedItem().toString()); if(funcion.length()!=0){ Newton pf= new Newton(); textarea_Newton.setText(pf.metodoNewton(inicial,funcion,error,decimales)); }else{ // System.out.print("hola"); JOptionPane.showMessageDialog(null,"Lafunciónno ha sido creada","Casillavacia ", JOptionPane.WARNING_MESSAGE);} } if(mn.getSource()==limpiar_Newton){ textarea_Newton.setText(""); } } // publicstatic voidmain(String[]args) { // Interfaz_NewtonMN = new Interfaz_Newton(); // } } Clase que recibe losparámetros de la interfazpara ejecutar el método publicclass Newton{ publicString consola=""; public String metodoNewton(double x,Stringfuncion,double tolerancia,int decimales){ double h; double z; //double x = 0.0; intcontador=0; //double tolerancia=0.001; double error=tolerancia+1;
  • 74. double fx; double fprimax; RedondeoR= new Redondeo(); EvaluarX EX= new EvaluarX(); Derivada D = newDerivada(); consola+="x"+"t"+"f(x)"+"t"+"f´(x)"+"t"+"h"+"t"+"error"; consola+="n"; //System.out.println("x"+"t"+"f(x)"+"t"+"f´(x)"+"t"+"h"+"t"+"error"); fx=R.redondear(EX.evaluarFuncion(funcion,x),decimales); fprimax=R.redondear(D.obtenerDerivada(funcion,x,decimales),decimales); h= R.redondear((fx/fprimax),decimales); z=x; x= R.redondear(x-h,decimales); //System.out.println(z+"t"+fx+"t"+fprimax+"t"+h+"t---"); consola+=z+"t"+fx+"t"+fprimax+"t"+h+"t---"; consola+="n"; while(error>tolerancia){ error=R.redondear(Math.abs(Math.abs(x)-Math.abs(z)),decimales); fx=R.redondear(EX.evaluarFuncion(funcion,x),decimales); fprimax=R.redondear(D.obtenerDerivada(funcion,x,decimales),decimales); h= R.redondear((fx/fprimax),decimales); z=x; x= R.redondear(x-h,decimales); //System.out.println(z+"t"+fx+"t"+fprimax+"t"+h+"t"+error); consola+=z+"t"+fx+"t"+fprimax+"t"+h+"t"+error; consola+="n"; } return consola; } // publicstatic voidmain (String [] args) { // Newton n = new Newton(); // n.metodoNewton(0.0,"(e^x)-(10*(x^2))+2",0.001,5); // } }
  • 75. Clase que obtiene laderivada encada iteración del método publicclass Derivada{ public double obtenerDerivada(Stringfuncion,double x0,intdecimales) { //String funcion= " x ^ 2"; // double x0 = 1.0; double h= 0.001; EvaluarX EX = new EvaluarX(); double funcionx0mash=EX.evaluarFuncion(funcion,(x0+h)); double funcionx0menosh=EX.evaluarFuncion(funcion,(x0-h)); double centrada = (funcionx0mash-funcionx0menosh) /(2*h); Redondeor = new Redondeo(); return r.redondear(centrada,decimales); } // publicstatic voidmain (String [] args) { // Derivada d = new Derivada (); // System.out.println(d.obtenerDerivada("(e^x)-((10*x)^2)+2",0.0,4)); // } }
  • 76. Pruebas La función es ((e^(-x/4))* (2 - x)) – 1 con un valor inicial =0 La raíz obtenidaes0.57836 que corresponde conlagrafica
  • 77. Método de la secante Análisis El principal inconveniente del método de Newton estriba en que requiere conocer el valor de la primera derivada de la función en el punto. Sin embargo, la forma funcional de f(x) dificulta en ocasiones el cálculo de la derivada. En estos casos es más útil emplear el método de la secante. El método de la secante parte de dos puntos (y no sólo uno como el método de Newton) y estima la tangente (es decir, la pendiente de la recta) por una aproximación de acuerdo con la expresión: Sustituyendo esta expresión en la ecuación del método de Newton, obtenemos la expresión del método de la secante que nos proporciona el siguiente punto de iteración:
  • 78. En la siguiente iteración, emplearemos los puntos x1 y x2para estimar un nuevo punto más próximo a la raíz de acuerdo con la ecuación .En la figura se representa geométricamente este método. En general, el método de la secante presenta las mismas ventajas y limitaciones que el método de Newton-Raphson explicado anteriormente. Diseño PSEUDOCÓDIGO MÉTODO DE LA SECANTE Proceso Metodo de la Secante Leer X1, Xo, Tolerancia, Iter Yo = f(Xo) Si Yo = 0 Entonces Muestre: ‘Xo es Raiz’ Sino Y1 = f(X1) Contador = 0 Error = Tolerancia + 1 Mientras Hacer
  • 79. X2 = X1 – ((Y1*(X1 Xo))/Den) Error = Abs((X2 – X1)/ X2) Xo = X1 Yo = Y1 X1 = X2 Y1 = f(X1) Contador = Contador + 1 Fin Mientras Si Y1 = 0 Entonces Muestre: ‘X1 es Raiz’ Sino Si Error < Tolerancia Entonces Muestre: ‘‘X1’ es una raiz aproximada con una tolerancia ‘Tolerancia’’ Sino Si Den= 0 Entonces Muestre: ‘Hay posiblemente una raiz múltiple’ Sino Muestre: ‘Fracaso en ‘Iter’ iterraciones’ Fin Si Fin Si Fin Si Fin Si Fin Proceso
  • 81. UML Diseño de la interfaz de usuario Interfaz_Secante +JPanel contenido Interfaz_Secante ():void interfazSecante():return JPanel actionPerformed(ActionEvent mn):void Secante +consola:String +metodoSecante (double x,Stringfuncion,double tolerancia,intdecimales): returnString EvaluarX +evaluarFuncion(String funcion,doublex): returndouble EvaluadorFunciones +eval(finalString str):returndouble Biblioteca ScriptEngine Redondeo +redondear(double numero,intdigitos): returndouble
  • 82. Implementación Código de la interfa de usuario import javax.swing.*; import java.awt.Event.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Interfaz_Secante extends JFrame implements ActionListener{ //___________________________ JPanel panel2; JTextField txt_Secante; JButton btn_Secante; JLabel lbl_Secante; JTextArea textarea_Secante; JScrollPane scrollpane_Secante; JButton limpiar_Secante; JTextField txt_errorSecante; JLabel lbl_errorSecante; JTextField txt_decimalesSecante; JLabel lbl_decimalesSecante; JTextField txt_valoraSecante; JLabel lbl_valoraSecante; JTextField txt_valorbSecante; JLabel lbl_valorbSecante; //___________________________ String error[];
  • 83. JComboBox cotaerror; String decimales[]; JComboBox numdecimales; //__________________________ public Interfaz_Secante(){ //______________________________________// lbl_Secante=new JLabel("Ingrese la funcion "); lbl_Secante.setBounds(20, 15, 200, 20); txt_Secante=new JTextField(); txt_Secante.setBounds(130, 15, 500, 20); lbl_valoraSecante=new JLabel("Valor a "); lbl_valoraSecante.setBounds(20, 100, 200, 20); txt_valoraSecante=new JTextField(); txt_valoraSecante.setBounds(130, 100, 150, 20); lbl_valorbSecante=new JLabel("Valor b "); lbl_valorbSecante.setBounds(20, 120, 200, 20); txt_valorbSecante=new JTextField(); txt_valorbSecante.setBounds(130, 120, 150, 20); lbl_errorSecante=new JLabel("Error"); lbl_errorSecante.setBounds(20, 140, 200, 20); error= new String[] { "0.1", "0.01", "0.001","0.0001", "0.00001" }; cotaerror= new JComboBox(error);
  • 84. cotaerror.setSelectedIndex(2); cotaerror.setBounds(130, 140, 150, 20); // txt_errorSecante=new JTextField(); // txt_errorSecante.setBounds(130, 140, 150, 20); lbl_decimalesSecante=new JLabel("Decimales"); lbl_decimalesSecante.setBounds(20, 160, 200, 20); // txt_decimalesSecante=new JTextField(); // txt_decimalesSecante.setBounds(130, 160, 150, 20); decimales= new String[] { "1", "2","3", "4","5","6","7" }; numdecimales= new JComboBox(decimales); numdecimales.setSelectedIndex(4); numdecimales.setBounds(130, 160, 150, 20); btn_Secante=new JButton("Obtener raiz"); btn_Secante.setBounds(20, 200, 200, 20); btn_Secante.addActionListener(this); textarea_Secante=new JTextArea(); textarea_Secante.setEditable(false); scrollpane_Secante=new JScrollPane(textarea_Secante); scrollpane_Secante.setBounds(300,50,500,300); limpiar_Secante = new JButton("Limpiar texto"); limpiar_Secante.setBounds(20, 250, 200, 20); limpiar_Secante.addActionListener(this);
  • 86. funcion=txt_Secante.getText(); funcion=funcion.replaceAll(" ", ""); //quitar espacios try{ a=Double.parseDouble(txt_valoraSecante.getText()); } catch (NumberFormatException nfe){ JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor inicial", JOptionPane.WARNING_MESSAGE);} try{ b=Double.parseDouble(txt_valorbSecante.getText()); } catch (NumberFormatException nfe){ JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "Valor inicial", JOptionPane.WARNING_MESSAGE);} error=Double.parseDouble(cotaerror.getSelectedItem().toString()); decimales=Integer.parseInt(numdecimales.getSelectedItem().toString()); if(funcion.length()!=0){ Secante bi = new Secante(); textarea_Secante.setText(bi.metodoSecante(a,b,funcion,error,decimales)); }else{ JOptionPane.showMessageDialog(null, "La función no ha sido creada", "Casilla vacia ", JOptionPane.WARNING_MESSAGE);} } if(mn.getSource()==limpiar_Secante){ textarea_Secante.setText(""); }
  • 87. } public JPanel interfazSecante() { return panel2; } } Clase que implementa el método public class Secante { public String consola=""; // metodoSecante(inicial,funcion,error,decimales)) public String metodoSecante(double x0, double x00,String funcion, double tolerancia,int decimales){ double f0; double f00; double z=0; // double x0=0; // double x00 = 0; int contador=0; //double tolerancia=0.001; double error=tolerancia+1; // x00=0.1;
  • 88. //x0=0.2; Redondeo R= new Redondeo(); EvaluarX ex= new EvaluarX(); // System.out.println("XntXn-1tf(xn)tf(xn+1)tError"); consola+="XntXn-1tf(xn)tf(xn+1)tError"; consola+="n"; // System.out.println("__________________________________"); consola+="__________________________________"; consola+="n"; //System.out.print(x0+"t"+x00); consola+=x0+"t"+x00; f0= R.redondear(ex.evaluarFuncion(funcion,x0),decimales); f00= R.redondear(ex.evaluarFuncion(funcion,x00),decimales); //System.out.print("t"+f0+"t"+f00+"t---n"); consola+="t"+f0+"t"+f00+"t---n"; //System.out.println("__________________________________"); consola+="n"; while (error>tolerancia){ z=x0; x0=R.redondear((x0 - ( f0/ ((f0 - f00)/ (x0 - x00)))),decimales); x00=z; f0= R.redondear(ex.evaluarFuncion(funcion,x0),decimales);
  • 89. f00= R.redondear(ex.evaluarFuncion(funcion,x00),decimales); error=R.redondear(( Math.abs(Math.abs(x0)-Math.abs(x00))),decimales); consola+=x0+"t"+x00+"t"+f0+"t"+f00+"t"+error; //System.out.println(x0+"t"+x00+"t"+f0+"t"+f00+"t"+error); // System.out.println("__________________________________"); consola+="n"; } return consola; } // public static void main (String [] args) { // Secante s= new Secante(); // s.metodoSecante(0.1,0.2,"4^(2*x)-8*(4^x)+12",0.001,5); // } } Pruebas La función a evaluar será (e^-x) – x con los valores de a=0.1 y b = 0.2
  • 90. El resultado obtenido es 0.56715 que corresponde con la grafica:
  • 91. Sistemas de ecuaciones lineales Análisis En matemáticas y álgebra lineal, un sistema de ecuaciones lineales, también conocido como sistema lineal de ecuaciones o simplemente sistema lineal, es un conjunto de ecuaciones lineales (es decir, un sistema de ecuaciones en donde cada ecuación es de primer grado), definidas sobre un cuerpo o un anillo conmutativo. Método de Jácobi El método de Jácobi es un método iterativo con el cual se resuelve el sistema lineal Ax = b Comienza con una aproximación inicial x(0) a la solución x y genera una sucesión de vectores x(k) que convergen a la solución x. Un sistema de ecuaciones algebraicas lineales es un conjunto de ecuaciones de la forma: :: :: :: O bien en su forma matricial: Que a su vez se puede expresar como:
  • 92. Ax = b Donde “A” es la matriz de coeficientes, x es el vector de incógnitas y b el vector de términos independientes. La solución del sistema de ecuaciones es un conjunto de n valores que satisfacen simultáneamente todas las ecuaciones. En la solución de estos problemas pueden presentarse 3 casos: 1.- Solución única Sistema compatible determinado. 2.- Mas de una solución Sistema compatible e indeterminado. (numero infinito de soluciones) 3.- Sin solución Sistema incompatible. Ilustrando el método de Jácobi con un sistema de ecuaciones de 3x3, si el vector: Es el vector aproximación a la solución x después de k iteraciones, entonces se tiene que para la siguiente aproximación:
  • 94. UML Diseño de la interfaz de usuario Jacobi +consola:String +metodoJacobi ( double[][]arreglo,double[]resultados,double[]x,double tolerancia,intdecimales):returnString InterfazJacobi +JPanel contenido InterfazJacobi ():void InterfazJacobi ():return JPanel actionPerformed(ActionEvent mn):void EvaluarX +evaluarFuncion(String funcion,doublex): returndouble Biblioteca ScriptEngine Redondeo +redondear(double numero,intdigitos): returndouble EvaluadorFunciones +eval(finalString str):returndouble
  • 95. Implementación Código de la interfaz de usuario import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; import java.awt.GridBagLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.WindowConstants; import javax.swing.border.EmptyBorder; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class InterfazJacobi extends JFrame implements ActionListener{ JTextField txt_error; JLabel lbl_error; JTextField txt_decimales; JLabel lbl_decimales;
  • 96. String error[]; JComboBox cotaerror; String decimales[]; JComboBox numdecimales; JComboBox tamanios; JTextField celdas[][]; JTextField resultados[]; JTextField iniciales[]; JPanel panelNumeros, panelOperaciones,panelEncabezado,panelIniciales,contenido; JPanel panel; String tam[]; int tamanio; JButton btn_raiz; JTextArea textarea_jacobi; JScrollPane scrollpane_jacobi; public InterfazJacobi() { contenido =new JPanel(); contenido.setLayout(null); contenido.setBounds(0, 0, 850, 500); //setSize(850, 500); //setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //setResizable(false);
  • 97. //setVisible(true); //setLayout(null); lbl_error=new JLabel("Error"); lbl_error.setBounds(20, 140, 200, 20); contenido.add(lbl_error); error= new String[] { "0.1", "0.01", "0.001","0.0001", "0.00001" }; cotaerror= new JComboBox(error); cotaerror.setSelectedIndex(2); cotaerror.setBounds(130, 140, 150, 20); contenido.add(cotaerror); lbl_decimales=new JLabel("Decimales"); lbl_decimales.setBounds(20, 160, 200, 20); contenido.add(lbl_decimales); decimales= new String[] { "1", "2","3", "4","5","6","7" }; numdecimales= new JComboBox(decimales); numdecimales.setSelectedIndex(4); numdecimales.setBounds(130, 160, 150, 20); contenido.add(numdecimales); textarea_jacobi=new JTextArea(); textarea_jacobi.setEditable(false);
  • 98. scrollpane_jacobi=new JScrollPane(textarea_jacobi); scrollpane_jacobi.setBounds(300,250,400,130); contenido.add(scrollpane_jacobi); JLabel ancho = new JLabel("Matriz"); ancho.setBounds(20, 50, 200, 20); contenido.add(ancho); btn_raiz=new JButton("Soluciones"); btn_raiz.setBounds(20, 200, 200, 20); contenido.add(btn_raiz); btn_raiz.addActionListener(this); tam= new String[] { "2 x 2", "3 x 3", "4 x 4" }; tamanios= new JComboBox(tam); tamanios.setSelectedIndex(0); tamanios.setBounds(130, 50, 150, 20); contenido.add(tamanios); tamanios.addActionListener(this); tamanio=2; //tamanios.getSelectedIndex(); celdas = new JTextField[tamanio][tamanio]; resultados = new JTextField[tamanio]; iniciales = new JTextField[tamanio]; panel =new JPanel(); panel.setLayout(new BorderLayout()); panel.setBounds(300, 50, 400, 200);
  • 99. panelEncabezado = new JPanel(); panelEncabezado.setLayout(new GridLayout(1,tamanio+1)); String variable="X"; for(int k = 0; k<tamanio; k++){ panelEncabezado.add(new JLabel(" "+variable+""+k)); } panelEncabezado.add(new JLabel("Resultado")); panel.add("North", panelEncabezado); //________________________________________________________________ for(int k = 0; k<tamanio; k++){ iniciales[k]=new JTextField(); } panelIniciales = new JPanel(); panelIniciales.setLayout(new GridLayout(1,tamanio+1)); for(int k = 0; k<tamanio; k++){ panelIniciales.add(new JLabel("Inicial x"+k)); panelIniciales.add(iniciales[k]); } panel.add("South", panelIniciales); //______________________________________________________________________ __________
  • 100. panelNumeros = new JPanel(); panelNumeros.setLayout(new GridLayout(tamanio,tamanio+1)); panelNumeros.setBorder(new EmptyBorder(8, 8, 8, 8)); for(int k = 0; k<tamanio; k++){ resultados[k]=new JTextField(); } for(int i =0; i<tamanio; i++){ for(int j = 0; j<tamanio; j++){ celdas[i][j]=new JTextField(); celdas[i][j].setText(""); } } for(int i =0; i<tamanio; i++){ for(int j = 0; j<tamanio; j++){ panelNumeros.add(celdas[i][j]); } panelNumeros.add(resultados[i]); } panel.add("Center", panelNumeros); //getContentPane().add(panel); contenido.add(panel); //contenido.setVisible(false);
  • 101. ///contenido.setVisible(true); } public void actionPerformed(ActionEvent mn){ // if(mn.getSource()== btn_llavea){ // funcion+="("; // pantalla.setText(funcion); // } // if(mn.getSource()== btn_llaveb){ // funcion+=")"; // pantalla.setText(funcion); // } if(mn.getSource()== btn_raiz){ double matriz[][] = new double [tamanio][tamanio]; double results[] = new double[tamanio]; double inicials[] = new double[tamanio]; double error=0.0; int decimales=0; String aux=""; for(int i=0; i<tamanio; i++){ for (int j=0; j<tamanio; j++){ aux=celdas[i][j].getText(); aux.replaceAll(" ", ""); try{ matriz[i][j] =Double.parseDouble(aux); } catch (NumberFormatException nfe){
  • 102. JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "celda "+i+" "+j, JOptionPane.WARNING_MESSAGE);} } } aux=""; for(int i=0; i<tamanio; i++){ aux=resultados[i].getText(); aux.replaceAll(" ", ""); try{results[i]=Double.parseDouble(aux);}catch (NumberFormatException nfe){ JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "celda "+i, JOptionPane.WARNING_MESSAGE);} } aux=""; for(int i=0; i<tamanio; i++){ aux=iniciales[i].getText(); aux.replaceAll(" ", ""); try{inicials[i]=Double.parseDouble(aux);}catch (NumberFormatException nfe){ JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "celda "+i, JOptionPane.WARNING_MESSAGE);} } error=Double.parseDouble(cotaerror.getSelectedItem().toString()); decimales=Integer.parseInt(numdecimales.getSelectedItem().toString());
  • 103. Jacobi J = new Jacobi(); textarea_jacobi.setText(""); textarea_jacobi.setText(J.metodoJacobi (matriz,results,inicials,error,decimales)); // J.metodoJacobi (matriz,results,inicials,error,decimales); } if(mn.getSource()== tamanios){ tamanio=tamanios.getSelectedIndex()+2; panelNumeros.removeAll(); panelEncabezado.removeAll(); panelIniciales.removeAll(); //panelNumeros.repaint(); panelEncabezado.setLayout(new GridLayout(1,tamanio+1)); String variable="X"; for(int k = 0; k<tamanio; k++){ panelEncabezado.add(new JLabel(" "+variable+""+k)); } panelEncabezado.add(new JLabel("Resultado")); panel.add("North", panelEncabezado); panelNumeros.setLayout(new GridLayout(tamanio,tamanio+1)); panelNumeros.setBorder(new EmptyBorder(8, 8, 8, 8)); celdas = new JTextField[tamanio][tamanio]; resultados = new JTextField[tamanio]; iniciales = new JTextField[tamanio]; ///____________________________ for(int k = 0; k<tamanio; k++){
  • 104. iniciales[k]=new JTextField(); } panelIniciales.setLayout(new GridLayout(1,tamanio+1)); for(int k = 0; k<tamanio; k++){ panelIniciales.add(new JLabel("Inicial x"+k)); panelIniciales.add(iniciales[k]); } for(int k = 0; k<tamanio; k++){ resultados[k]=new JTextField(); } for(int i =0; i<tamanio; i++){ for(int j = 0; j<tamanio; j++){ celdas[i][j]=new JTextField(); celdas[i][j].setText(""); } } for(int i =0; i<tamanio; i++){ for(int j = 0; j<tamanio; j++){ panelNumeros.add(celdas[i][j]); } panelNumeros.add(resultados[i]); }
  • 105. panelNumeros.setVisible(false); panelEncabezado.setVisible(false); panelIniciales.setVisible(false); panelNumeros.setVisible(true); panelEncabezado.setVisible(true); panelIniciales.setVisible(true); } } public JPanel interfazJacobi() { return contenido; } // public static void main (String [] args){ // Matriz c = new Matriz(); // } } Clase que implementa el método public class Jacobi{ public String metodoJacobi (double[][]arreglo,double[]resultados,double[]x,double tolerancia,int decimales) { String consola=""; int tam= resultados.length; EvaluarX EX=new EvaluarX();
  • 106. Redondeo R= new Redondeo(); double xn[]= new double [tam]; for ( int i =0 ; i< tam ; i ++ ) { //System.out.print("X"+i+"t"); consola+="X"+i+"t"; } // System.out.print("error"); consola+="errorn"; //System.out.print("n"); for ( int i =0 ; i< tam ; i ++ ) { x[i]=1; //System.out.print(x[i]+"t"); consola+=x[i]+"t"; } consola+="n";//System.out.print("n"); // double tolerancia=0.0001; double error=tolerancia+ 1; //int decimales=4; String funcion=""; EvaluadorFunciones EF= new EvaluadorFunciones(); for ( int i =0 ; i< tam ; i ++ ) { funcion+="("+resultados[i]; for ( int j =0 ; j< tam ; j ++ ) {if(j!=i)funcion += "-("+ arreglo[i][j]+"*"+x[j]+")"; } funcion +=")/"+arreglo[i][i];
  • 107. error=x[i]; xn[i]= R.redondear((EF.eval(funcion)),decimales); error=R.redondear(Math.abs(error-xn[i]),decimales); //System.out.print(x[i]+"t"); consola+=xn[i]+"t"; funcion=""; } for ( int i =0 ; i< tam ; i ++ ) {x[i]=xn[i];} //System.out.print(R.redondear(error,decimales)+"n"); consola+=R.redondear(error,decimales)+"n"; while (error>tolerancia){ for ( int i =0 ; i< tam ; i ++ ) { funcion+="("+resultados[i]; for ( int j =0 ; j< tam ; j ++ ) {if(j!=i)funcion += "-("+ arreglo[i][j]+"*"+x[j]+")"; } funcion +=")/"+arreglo[i][i]; error=x[i]; xn[i]= R.redondear((EF.eval(funcion)),decimales); error=Math.abs(error-xn[i]); //System.out.print(x[i]+"t"); consola+=xn[i]+"t"; funcion=""; } for ( int i =0 ; i< tam ; i ++ ) {x[i]=xn[i];} // System.out.print(R.redondear(error,decimales)+"n"); consola+=R.redondear(error,decimales)+"n";
  • 108. } return consola; } // public static void main(String []args) { // Jacobi J = new Jacobi () ; // double arreglo[][] = new double [3][3]; // arreglo[0][0]=8.0; // arreglo[0][1]=2.0; // arreglo[0][2]=3.0; // arreglo[1][0]=1.0; // arreglo[1][1]=-9.0; // arreglo[1][2]=2.0; // arreglo[2][0]=2.0; // arreglo[2][1]=3.0; // arreglo[2][2]=6.0; // double resultados[] = new double [3]; // resultados[0]= 30; // resultados[1]= 1; // resultados[2] = 31; // double x [] = new double [3]; // for ( int i =0 ; i< 3 ; i ++ ) {
  • 109. // x[i]=1; // } // System.out.println(J.metodoJacobi(arreglo,resultados,x,0.0001,4)); // } } Pruebas Se procederá a resolver el siguiente sistema de ecuaciones Los valores iniciales serán [1,1,1]
  • 110. Los resultados son -0.99998 -5.00003 5.00002 Que al ser redondeados serían aproximadamente -1, -5 y 5 Se puede comprobar el sistema cambiando x por los valores obtenidos 12 (-1) -(-5) +3(5) -12 +5 +15 =- 12+20=8 (-1) +7(-5) -3(5) -1 -35 -15 =-51 4(-1) -4(-5) +9(5) -4 +20 +45 =- 4+65=61 Método de Gauss- Seidel La secuencia de pasos que constituyen el método de Gauss-Seidel es la siguiente: 1. Asignar un valor inicial a cada incógnita que aparezca en el conjunto. Si es posible hacer una hipótesis razonable de éstos valores, hacerla. Si no, se pueden asignar valores seleccionados arbitrariamente. Los valores iniciales utilizados no afectarán la convergencia como tal, pero afectarán el número de iteraciones requeridas para dicha convergencia. 2. Partiendo de la primera ecuación, determinar un nuevo valor para la incógnita que tiene el coeficiente más grande en esa ecuación, utilizando para las otras incógnitas los valores supuestos. 3. Pasar a la segunda ecuación y determinar en ella el valor de la incógnita que tiene el coeficiente más grande en esa ecuación, utilizando el valor calculado para la incógnita del paso 2 y los valores supuestos para las incógnitas restantes. 4. Continuar con las ecuaciones restantes, determinando siempre el valor calculado de la incógnita que tiene el coeficniente más grande en cada ecuación particular, y utilizando siempre los últimos valores calculados para las otras incógnitas de la ecuación. (Durante la primera iteración, se deben utilizar los valores supuestos para las incógnitas hasta que se obtenga un valor calculado). Cuando la ecuación final ha
  • 111. sido resuelta, proporcionando un valor para la única incógnita, se dice que se ha completado una iteración. 5. Continuar iterando hasta que el valor de cada incógnita, determinado en una iteración particular, difiera del valor obtenido en la iteración previa, en una cantidad menor que cierto seleccionado arbitrariamente. El procedimiento queda entonces completo. Refiriéndonos al paso 5, mientras menor sea la magnitud del seleccionado, mayor será la precisión de la solución. Sin embargo, la magnitud del epsilon no especifica el error que puede existir en los valores obtenidos para las incógnitas, ya que ésta es una función de la velocidad de convergencia. Mientras mayor sea la velocidad de convergencia, mayor será la precisión obtenida en los valores de las incógnitas para un dado. Diseño Diagrama de flujo
  • 112. UML Implementación Código de la interfaz de usuario import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; import java.awt.GridBagLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JButton; GaussSeidel +consola:String +metodoGaussSeidel ( double[][]arreglo,double[]resultados,double[]x,double tolerancia,intdecimales):returnString InterfazGaussSeidel +JPanel contenido InterfazGaussSeidel ():void InterfazGaussSeidel ():return JPanel actionPerformed(ActionEvent mn):void EvaluarX +evaluarFuncion(String funcion,doublex): returndouble Biblioteca ScriptEngine Redondeo +redondear(double numero,intdigitos): returndouble EvaluadorFunciones +eval(finalString str):returndouble
  • 113. import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.WindowConstants; import javax.swing.border.EmptyBorder; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class InterfazGaussSeidel extends JFrame implements ActionListener{ JTextField txt_error; JLabel lbl_error; JTextField txt_decimales; JLabel lbl_decimales; String error[]; JComboBox cotaerror; String decimales[]; JComboBox numdecimales; JComboBox tamanios; JTextField celdas[][]; JTextField resultados[]; JTextField iniciales[]; JPanel panelNumeros, panelOperaciones,panelEncabezado,panelIniciales,contenido; JPanel panel;
  • 114. String tam[]; int tamanio; JButton btn_raiz; JTextArea textarea_GaussSeidel; JScrollPane scrollpane_GaussSeidel; public InterfazGaussSeidel() { contenido =new JPanel(); contenido.setLayout(null); contenido.setBounds(0, 0, 850, 500); //setSize(850, 500); //setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //setResizable(false); //setVisible(true); //setLayout(null); lbl_error=new JLabel("Error"); lbl_error.setBounds(20, 140, 200, 20); contenido.add(lbl_error); error= new String[] { "0.1", "0.01", "0.001","0.0001", "0.00001" }; cotaerror= new JComboBox(error); cotaerror.setSelectedIndex(2); cotaerror.setBounds(130, 140, 150, 20); contenido.add(cotaerror);
  • 115. lbl_decimales=new JLabel("Decimales"); lbl_decimales.setBounds(20, 160, 200, 20); contenido.add(lbl_decimales); decimales= new String[] { "1", "2","3", "4","5","6","7" }; numdecimales= new JComboBox(decimales); numdecimales.setSelectedIndex(4); numdecimales.setBounds(130, 160, 150, 20); contenido.add(numdecimales); textarea_GaussSeidel=new JTextArea(); textarea_GaussSeidel.setEditable(false); scrollpane_GaussSeidel=new JScrollPane(textarea_GaussSeidel); scrollpane_GaussSeidel.setBounds(300,250,400,130); contenido.add(scrollpane_GaussSeidel); JLabel ancho = new JLabel("Matriz"); ancho.setBounds(20, 50, 200, 20); contenido.add(ancho); btn_raiz=new JButton("Soluciones"); btn_raiz.setBounds(20, 200, 200, 20); contenido.add(btn_raiz); btn_raiz.addActionListener(this); tam= new String[] { "2 x 2", "3 x 3", "4 x 4" };
  • 116. tamanios= new JComboBox(tam); tamanios.setSelectedIndex(0); tamanios.setBounds(130, 50, 150, 20); contenido.add(tamanios); tamanios.addActionListener(this); tamanio=2; //tamanios.getSelectedIndex(); celdas = new JTextField[tamanio][tamanio]; resultados = new JTextField[tamanio]; iniciales = new JTextField[tamanio]; panel =new JPanel(); panel.setLayout(new BorderLayout()); panel.setBounds(300, 50, 400, 200); panelEncabezado = new JPanel(); panelEncabezado.setLayout(new GridLayout(1,tamanio+1)); String variable="X"; for(int k = 0; k<tamanio; k++){ panelEncabezado.add(new JLabel(" "+variable+""+k)); } panelEncabezado.add(new JLabel("Resultado")); panel.add("North", panelEncabezado); //________________________________________________________________ for(int k = 0; k<tamanio; k++){ iniciales[k]=new JTextField();
  • 117. } panelIniciales = new JPanel(); panelIniciales.setLayout(new GridLayout(1,tamanio+1)); for(int k = 0; k<tamanio; k++){ panelIniciales.add(new JLabel("Inicial x"+k)); panelIniciales.add(iniciales[k]); } panel.add("South", panelIniciales); //________________________________________________________________________________ panelNumeros = new JPanel(); panelNumeros.setLayout(new GridLayout(tamanio,tamanio+1)); panelNumeros.setBorder(new EmptyBorder(8, 8, 8, 8)); for(int k = 0; k<tamanio; k++){ resultados[k]=new JTextField(); } for(int i =0; i<tamanio; i++){ for(int j = 0; j<tamanio; j++){ celdas[i][j]=new JTextField(); celdas[i][j].setText(""); }
  • 118. } for(int i =0; i<tamanio; i++){ for(int j = 0; j<tamanio; j++){ panelNumeros.add(celdas[i][j]); } panelNumeros.add(resultados[i]); } panel.add("Center", panelNumeros); //getContentPane().add(panel); contenido.add(panel); //contenido.setVisible(false); ///contenido.setVisible(true); } public void actionPerformed(ActionEvent mn){ // if(mn.getSource()== btn_llavea){ // funcion+="("; // pantalla.setText(funcion); // } // if(mn.getSource()== btn_llaveb){ // funcion+=")"; // pantalla.setText(funcion); // } if(mn.getSource()== btn_raiz){
  • 119. double matriz[][] = new double [tamanio][tamanio]; double results[] = new double[tamanio]; double inicials[] = new double[tamanio]; double error=0.0; int decimales=0; String aux=""; for(int i=0; i<tamanio; i++){ for (int j=0; j<tamanio; j++){ aux=celdas[i][j].getText(); aux.replaceAll(" ", ""); try{ matriz[i][j] =Double.parseDouble(aux); } catch (NumberFormatException nfe){ JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "celda "+i+" "+j, JOptionPane.WARNING_MESSAGE);} } } aux=""; for(int i=0; i<tamanio; i++){ aux=resultados[i].getText(); aux.replaceAll(" ", ""); try{results[i]=Double.parseDouble(aux);}catch (NumberFormatException nfe){ JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "celda "+i, JOptionPane.WARNING_MESSAGE);} } aux=""; for(int i=0; i<tamanio; i++){ aux=iniciales[i].getText(); aux.replaceAll(" ", ""); try{inicials[i]=Double.parseDouble(aux);}catch (NumberFormatException nfe){
  • 120. JOptionPane.showMessageDialog(null, "Ingrese un valor numerico", "celda "+i, JOptionPane.WARNING_MESSAGE);} } error=Double.parseDouble(cotaerror.getSelectedItem().toString()); decimales=Integer.parseInt(numdecimales.getSelectedItem().toString()); GaussSeidel J = new GaussSeidel(); textarea_GaussSeidel.setText(""); textarea_GaussSeidel.setText(J.metodoGaussSeidel (matriz,results,inicials,error,decimales)); // J.metodoGaussSeidel (matriz,results,inicials,error,decimales); } if(mn.getSource()== tamanios){ tamanio=tamanios.getSelectedIndex()+2; panelNumeros.removeAll(); panelEncabezado.removeAll(); panelIniciales.removeAll(); //panelNumeros.repaint(); panelEncabezado.setLayout(new GridLayout(1,tamanio+1)); String variable="X"; for(int k = 0; k<tamanio; k++){ panelEncabezado.add(new JLabel(" "+variable+""+k)); }
  • 121. panelEncabezado.add(new JLabel("Resultado")); panel.add("North", panelEncabezado); panelNumeros.setLayout(new GridLayout(tamanio,tamanio+1)); panelNumeros.setBorder(new EmptyBorder(8, 8, 8, 8)); celdas = new JTextField[tamanio][tamanio]; resultados = new JTextField[tamanio]; iniciales = new JTextField[tamanio]; ///____________________________ for(int k = 0; k<tamanio; k++){ iniciales[k]=new JTextField(); } panelIniciales.setLayout(new GridLayout(1,tamanio+1)); for(int k = 0; k<tamanio; k++){ panelIniciales.add(new JLabel("Inicial x"+k)); panelIniciales.add(iniciales[k]); } for(int k = 0; k<tamanio; k++){ resultados[k]=new JTextField(); } for(int i =0; i<tamanio; i++){ for(int j = 0; j<tamanio; j++){ celdas[i][j]=new JTextField(); celdas[i][j].setText(""); }
  • 122. } for(int i =0; i<tamanio; i++){ for(int j = 0; j<tamanio; j++){ panelNumeros.add(celdas[i][j]); } panelNumeros.add(resultados[i]); } panelNumeros.setVisible(false); panelEncabezado.setVisible(false); panelIniciales.setVisible(false); panelNumeros.setVisible(true); panelEncabezado.setVisible(true); panelIniciales.setVisible(true); } } public JPanel interfazGaussSeidel() { return contenido; } // public static void main (String [] args){ // Matriz c = new Matriz(); // } }
  • 123. Clase que implementa el método public class GaussSeidel{ public String metodoGaussSeidel (double[][]arreglo,double[]resultados,double[]x,double tolerancia,int decimales) { String consola=""; int tam= resultados.length; EvaluarX EX=new EvaluarX(); Redondeo R= new Redondeo(); for ( int i =0 ; i< tam ; i ++ ) { //System.out.print("X"+i+"t"); consola+="X"+i+"t"; } // System.out.print("error"); consola+="errorn"; //System.out.print("n"); for ( int i =0 ; i< tam ; i ++ ) { x[i]=1; //System.out.print(x[i]+"t"); consola+=x[i]+"t"; } consola+="n";//System.out.print("n"); // double tolerancia=0.0001; double error=tolerancia+ 1; //int decimales=4; String funcion="";
  • 124. EvaluadorFunciones EF= new EvaluadorFunciones(); for ( int i =0 ; i< tam ; i ++ ) { funcion+="("+resultados[i]; for ( int j =0 ; j< tam ; j ++ ) {if(j!=i)funcion += "-("+ arreglo[i][j]+"*"+x[j]+")"; } funcion +=")/"+arreglo[i][i]; error=x[i]; x[i]= R.redondear((EF.eval(funcion)),decimales); error=R.redondear(Math.abs(error-x[i]),decimales); //System.out.print(x[i]+"t"); consola+=x[i]+"t"; funcion=""; } //System.out.print(R.redondear(error,decimales)+"n"); consola+=R.redondear(error,decimales)+"n"; while (error>tolerancia){ for ( int i =0 ; i< tam ; i ++ ) { funcion+="("+resultados[i]; for ( int j =0 ; j< tam ; j ++ ) {if(j!=i)funcion += "-("+ arreglo[i][j]+"*"+x[j]+")"; } funcion +=")/"+arreglo[i][i]; error=x[i]; x[i]= R.redondear((EF.eval(funcion)),decimales); error=Math.abs(error-x[i]);
  • 125. //System.out.print(x[i]+"t"); consola+=x[i]+"t"; funcion=""; } // System.out.print(R.redondear(error,decimales)+"n"); consola+=R.redondear(error,decimales)+"n"; } return consola; } public static void main(String []args) { GaussSeidel J = new GaussSeidel () ; double arreglo[][] = new double [3][3]; arreglo[0][0]=8.0; arreglo[0][1]=2.0; arreglo[0][2]=3.0; arreglo[1][0]=1.0; arreglo[1][1]=-9.0; arreglo[1][2]=2.0; arreglo[2][0]=2.0; arreglo[2][1]=3.0; arreglo[2][2]=6.0; double resultados[] = new double [3]; resultados[0]= 30; resultados[1]= 1; resultados[2] = 31;
  • 126. double x [] = new double [3]; for ( int i =0 ; i< 3 ; i ++ ) { x[i]=1; } System.out.println(J.metodoGaussSeidel(arreglo,resultados,x,0.0001,4)); } } Pruebas Se usó el siguiente sistema de ecuaciones para probar el programa Los valores iniciales para x1,x2 y x3 son 1,1,1
  • 127. Los valores obtenidos son 1.99975 3.00009 4.00006 Que al ser redondeados serían 2,3 y 4. Sustituyendo estos valores en el sistema se comprueba que el resultado es correcto. 6(2) +2(3) +(4) 12 +6 +4 =22 -(2) +8(3) +2(4) -2 +24 +8 =- 2+32=30 (2) -(3) +6(4) 2 -3 +24 =- 3+26=23
  • 128. Integración y derivaciónnumérica INTEGRACIÓN NUMÉRICA Dentrodel CálculoNumérico,laIntegraciónNuméricacomprende una ampliafamiliade algoritmosparael cálculodel valornuméricode unaintegral definida.Enlamayoría de loscasos, ese valornuméricoesunvaloraproximadode laintegral definida. Método del trapecio Análisis Para aproximar la solución de una integral definida se puede utilizar la siguiente estrategia; como la integral definida representa el área bajo la curva, entonces es posible aproximar dicha área a través de un trapecio (n = 1), ver la figura, por lo que, una aproximación a la integral definida estará dada por, Donde la expresión del lado derecho es la formula para el área del trapecio. Sin embargo es posible mejorar esta aproximación tomando dos trapecios (n = 2), y para ello se divide el intervalo de integración [a, b], a la mitad para tener, , ver la figura,
  • 129. Así, que la nueva aproximación a la integral definida será,
  • 130.
  • 131. Diseño UML Trapecio +consola:String +metodoTrapecio ( double a,double b,double n,Stringfuncion,int decimales):returnString InterfazTrapecio +JPanel contenido InterfazTrapecio():void InterfazTrapecio():return JPanel actionPerformed(ActionEvent mn):void EvaluarX +evaluarFuncion(String funcion,doublex): returndouble Biblioteca ScriptEngine Redondeo +redondear(double numero,intdigitos): returndouble EvaluadorFunciones +eval(finalString str):returndouble
  • 132. Implementación Código de la interfaz de usuario import javax.swing.*; import java.awt.Event.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Interfaz_Trapecio extends JFrame implements ActionListener{ JLabel lbl_segmentos; JTextField txt_segmentos; JPanel panel1; JTextField txt_Trapecio; JButton btn_Trapecio; JLabel lbl_Trapecio; JTextArea textarea_Trapecio; JScrollPane scrollpane_Trapecio; JButton limpiar_Trapecio; JTextField txt_errorTrapecio; JLabel lbl_errorTrapecio; JTextField txt_decimalesTrapecio; JLabel lbl_decimalesTrapecio; JTextField txt_valoraTrapecio; JLabel lbl_valoraTrapecio; JTextField txt_valorbTrapecio; JLabel lbl_valorbTrapecio;
  • 133. //___________________________ String error[]; JComboBox cotaerror; String decimales[]; JComboBox numdecimales; //__________________________ public Interfaz_Trapecio(){ lbl_Trapecio=new JLabel("Ingrese la funcion "); lbl_Trapecio.setBounds(20, 15, 200, 20); txt_Trapecio=new JTextField(); txt_Trapecio.setBounds(130, 60, 150, 20); txt_Trapecio.setBounds(130, 15, 500, 20); lbl_segmentos=new JLabel("No.Segmentos "); lbl_segmentos.setBounds(20, 50, 200, 20); txt_segmentos=new JTextField(); txt_segmentos.setBounds(130, 50, 150, 20); lbl_valoraTrapecio=new JLabel("Limite a "); lbl_valoraTrapecio.setBounds(20, 100, 200, 20); txt_valoraTrapecio=new JTextField(); txt_valoraTrapecio.setBounds(130, 100, 150, 20); lbl_valorbTrapecio=new JLabel("Limite b "); lbl_valorbTrapecio.setBounds(20, 120, 200, 20);
  • 134. txt_valorbTrapecio=new JTextField(); txt_valorbTrapecio.setBounds(130, 120, 150, 20); lbl_decimalesTrapecio=new JLabel("Decimales"); lbl_decimalesTrapecio.setBounds(20, 160, 200, 20); // txt_decimalesTrapecio=new JTextField(); // txt_decimalesTrapecio.setBounds(130, 160, 150, 20); decimales= new String[] { "1", "2","3", "4","5","6","7" }; numdecimales= new JComboBox(decimales); numdecimales.setSelectedIndex(4); numdecimales.setBounds(130, 160, 150, 20); btn_Trapecio=new JButton("Obtener integral"); btn_Trapecio.setBounds(20, 200, 200, 20); btn_Trapecio.addActionListener(this); textarea_Trapecio=new JTextArea(); textarea_Trapecio.setEditable(false); scrollpane_Trapecio=new JScrollPane(textarea_Trapecio); scrollpane_Trapecio.setBounds(300,50,500,300); limpiar_Trapecio = new JButton("Limpiar texto"); limpiar_Trapecio.setBounds(20, 250, 200, 20); limpiar_Trapecio.addActionListener(this);