You are on page 1of 16

/* *********************************************************** ******************** Mtodos Numricos Jorge Juan Gmez Basanta 13 / Abril / 1998 Este programa obtiene todas las

races (reales y complejas) de un polinomio, utilizando los mtodos de Newton-Raphson y Bairstow. *********************************************************** *********************** */ import import import import import import import import import import import import import import import java.applet.Applet; java.awt.Button; java.awt.Choice; java.awt.Dimension; java.awt.Graphics; java.awt.Label; java.awt.Panel; java.awt.TextArea; java.awt.TextField; java.awt.event.ActionEvent; java.awt.event.ActionListener; java.awt.event.ItemEvent; java.awt.event.ItemListener; java.util.Locale; java.util.ResourceBundle;

import javax.swing.Box; import javax.swing.BoxLayout; public class Polinomios extends Applet implements ActionListener, ItemListener { //Declaracion de controles Button endButton, addButton, resetButton; Label coeffLabel, polyLabel, titleLabel, authorLabel, resultsLabel; TextField coeffField; TextArea resultsArea, polyArea; Choice languageChoice; //Declaracion de variables globales

double limInf, limSup, deltaX, x0, tolerancia; double[] coef, deriv, segderiv, b, c, paux; int contador = 0, nraiz = 0; int grado, gradoderiv, gradosegderiv, gradopr; ResourceBundle bundle = null; boolean changeLanguage; //****************************init public void init() { String lang = "es", ctry = "MX"; if (bundle == null) { ctry = this.getParameter("country"); if (this.getParameter("language") != null) lang = this.getParameter("language"); if (this.getParameter("country") != null) ctry = this.getParameter("country"); bundle = getBundleVar(lang, ctry); } //definir arreglos coef = new double[100]; deriv = new double[100]; segderiv = new double[100]; b = new double[100]; c = new double[100]; paux = new double[100]; //interface de usuario setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); resize(530, 240); titleLabel = new Label(getText("msg.welcome"), Label.CENTER); authorLabel = new Label(getText("msg.developed") + " Jorge Juan G\u00F3mez Basanta", Label.CENTER); polyLabel = new Label(getText("msg.polynomial") + ": ", Label.RIGHT); polyArea = new TextArea(3, 50); polyArea.setEditable(false); coeffLabel = new Label(getText("msg.coefficient") + " x^0:", Label.RIGHT); resultsLabel = new Label(getText("msg.results") +

":", Label.RIGHT); coeffField = new TextField(8); coeffField.setSize(50, 20); endButton = new Button(getText("btn.end")); endButton.addActionListener(this); addButton = new Button(getText("btn.add")); addButton.addActionListener(this); resetButton = new Button(getText("btn.reset")); resetButton.addActionListener(this); resetButton.setSize(new Dimension(50, 26)); resultsArea = new TextArea(6, 50); resultsArea.setEditable(false); languageChoice = new Choice(); languageChoice.addItemListener(this); languageChoice.addItem("Espa\u00F1ol"); languageChoice.addItem("English"); if (lang.equals("es")) languageChoice.select("Espa\u00F1ol"); else if (lang.equals("en")) languageChoice.select("English"); Panel boxtitle = new Panel(); boxtitle.setLayout(new BoxLayout(boxtitle, BoxLayout.Y_AXIS)); boxtitle.add(titleLabel); boxtitle.add(authorLabel); Panel boxtop = new Panel(); boxtop.setLayout(new BoxLayout(boxtop, BoxLayout.X_AXIS)); boxtop.add(boxtitle); boxtop.add(Box.createHorizontalGlue()); boxtop.add(languageChoice); boxtop.add(resetButton); Panel boxcoef = new Panel(); boxcoef.setLayout(new BoxLayout(boxcoef, BoxLayout.X_AXIS)); boxcoef.add(coeffLabel); boxcoef.add(Box.createRigidArea(new Dimension(5, 0))); boxcoef.add(coeffField); boxcoef.add(addButton); boxtop.add(Box.createHorizontalGlue()); boxcoef.add(endButton);

Panel boxpoly = new Panel(); boxpoly.setLayout(new BoxLayout(boxpoly, BoxLayout.X_AXIS)); boxpoly.add(polyLabel); boxpoly.add(Box.createRigidArea(new Dimension(5, 0))); boxpoly.add(polyArea); Panel boxresult = new Panel(); boxresult.setLayout(new BoxLayout(boxresult, BoxLayout.X_AXIS)); boxresult.add(resultsLabel); boxresult.add(Box.createRigidArea(new Dimension(5, 0))); boxresult.add(resultsArea); add(boxtop); add(boxcoef); add(Box.createRigidArea(new Dimension(0, 5))); add(boxpoly); add(Box.createRigidArea(new Dimension(0, 5))); add(boxresult); coeffField.requestFocus(); } public void localize() { titleLabel.setText(getText("msg.welcome")); authorLabel.setText(getText("msg.developed") + " Jorge Juan G\u00F3mez Basanta"); polyLabel.setText(getText("msg.polynomial") + ": "); coeffLabel.setText(getText("msg.coefficient") + " x^0:"); resultsLabel.setText(getText("msg.results") + ":"); endButton.setLabel(getText("btn.end")); addButton.setLabel(getText("btn.add")); resetButton.setLabel(getText("btn.reset")); } public String getText(String _key) { String _value = "";

try { _value = bundle.getString(_key); } catch (java.util.MissingResourceException e) { //System.out.println("Value not found for key:" + _key); } return _value; } public ResourceBundle getBundleVar(String _language, String _country) { Locale locale; String basename = "polyi18n"; if (_language != null) locale = new Locale(_language, _country); else locale = new Locale("es", _country); return (ResourceBundle.getBundle(basename, locale)); } //*************************** obtenerraices public void obtenerraices() { gradopr = grado; derivar(); segderivada(); if (Math.abs(coef[0]) >= Math.abs(coef[grado])) { limInf = (-1) * Math.abs(coef[0]); limSup = Math.abs(coef[0]); } if (Math.abs(coef[grado]) > Math.abs(coef[0])) { limInf = (-1) * Math.abs(coef[grado]); limSup = Math.abs(coef[grado]); } if (Math.abs(coef[grado]) <= 2) {

limInf = -10; limSup = 10; } //System.out.println("*********************limites* *******************"); //System.out.println(limInf); //System.out.println(limSup); deltaX = .001; if (limSup <= 10) deltaX = .0001; if (limSup > 10) deltaX = .001; if (limSup > 100) deltaX = .01; if (limSup > 500) deltaX = 1; if (limSup > 1000) deltaX = 2; if (limSup > 10000) deltaX = 4; tolerancia = .00000000000000000000000001; if (grado == 2) { cuadratica(paux[2], paux[1], paux[0]); } else tabular(); while (nraiz != grado) { if ((grado - nraiz) == 2) { cuadratica(paux[2], paux[1], paux[0]); } if ((grado - nraiz) >= 4) { bairstow(-2, 2); } } //while } //*************************divsint public void divsint(double r) {

b[0] = paux[gradopr]; gradopr--; for (int i = 1; i <= gradopr; i++) { b[i] = paux[gradopr + 1 - i] + b[i - 1] * r; } for (int i = 0; i <= gradopr; i++) { paux[gradopr - i] = b[i]; } } //*************************dobledivsint public void dobledivsint(double r, double s) { b[0] = paux[gradopr]; b[1] = paux[gradopr - 1] + b[0] * r; for (int i = 2; i <= gradopr; i++) { b[i] = paux[gradopr - i] + b[i - 1] * r + b[i - 2] * s; } c[0] = b[0]; c[1] = b[1] + c[0] * r; for (int i = 2; i <= (gradopr - 1); i++) { c[i] = b[i] + c[i - 1] * r + c[i - 2] * s; } } //***********************************bairstow public void bairstow(double r, double s) { int n = grado - 1, cont = 0; double tol = 1, tolerancia = .0000000001; while (Math.abs(tol) >= tolerancia) { cont++; dobledivsint(r, s); double denominador, deltar, deltas; denominador = (c[n - 1] * c[n - 1]) - (c[n 2] * c[n]); deltar = ((-b[n] * c[n - 1]) - (c[n - 2] * (b[n + 1]))) / denominador; deltas = ((c[n - 1] * (-b[n + 1])) - ((-b[n])

* c[n])) / denominador; r = r + deltar; s = s + deltas; if (Math.abs(deltar) <= Math.abs(deltas)) tol = deltas; if (Math.abs(deltas) < Math.abs(deltar)) tol = deltar; if (cont == 30) { tol = tolerancia / 10; } if (denominador == 0) { tol = tolerancia / 10; } } //System.out.println("****************r y s**********************"); //System.out.println(r); //System.out.println(s); cuadratica(1, -r, -s); gradopr = gradopr - 2; for (int i = 0; i <= gradopr; i++) { paux[gradopr - i] = b[i]; System.out.print("paux"); System.out.print(gradopr - i); System.out.print(" :"); //System.out.println(paux[gradopr - i]); } //cuadratica(1,b[1],b[2]); } //****************cuadratica public void cuadratica(double a, double b, double c) { double discriminante, preal1, pcompleja, preal2; discriminante = (b * b) - (4 * a * c); if (discriminante < 1) { preal1 = -b / (2 * a); preal2 = 0; pcompleja = (Math.sqrt(discriminante * (1))) / (2 * a);

} else { preal1 = ((-b) + Math.sqrt(discriminante)) / (2 * a); preal2 = ((-b) - Math.sqrt(discriminante)) / (2 * a); pcompleja = 0; } if (pcompleja == 0) { nraiz++; resultsArea.append(getText("msg.root") + " " + String.valueOf(nraiz) + ": " + String.valueOf(preal1) + "\n"); nraiz++; resultsArea.append(getText("msg.root") + " " + String.valueOf(nraiz) + ": " + String.valueOf(preal2) + "\n\n"); } else if (preal2 == 0) { nraiz++; resultsArea.append(getText("msg.root") + " " + String.valueOf(nraiz) + ": " + String.valueOf(preal1) + " + " + String.valueOf(pcompleja) + " i\n"); nraiz++; resultsArea.append(getText("msg.root") + " " + String.valueOf(nraiz) + ": " + String.valueOf(preal1) + " " + String.valueOf(pcompleja) + " i\n\n"); } } //********************************** derivar ******************************************** //***************************************************** ************************************* //***************************************************** ************************************* //*************************** derivar public void derivar() { for (int i = 1; i <= grado; i++) {

deriv[(i - 1)] = i * coef[i]; //escribir derivada if (deriv[(i - 1)] != 0) { if ((i - 1) != 0) polyArea.append(" + "); polyArea.append(String.valueOf(deriv[(i 1)])); polyArea.append(" "); if ((i - 1) == 0) polyArea.append(""); else if ((i - 1) == 1) polyArea.append("x"); else { polyArea.append("x^"); polyArea.append(String.valueOf((i 1))); } } //if } //for polyArea.append("\n"); gradoderiv = grado - 1; } //derivar //****************************** segunda derivada public void segderivada() { for (int i = 1; i <= grado; i++) { segderiv[(i - 1)] = i * deriv[i]; //escribir segunda derivada if (segderiv[(i - 1)] != 0) { if ((i - 1) != 0) polyArea.append(" + "); polyArea.append(String.valueOf(segderiv[(i - 1)])); polyArea.append(" "); if ((i - 1) == 0) polyArea.append(""); else if ((i - 1) == 1) polyArea.append("x");

else { polyArea.append("x^"); polyArea.append(String.valueOf((i 1))); } } //if } //for gradosegderiv = gradoderiv - 1; } //segderivada //********************************** evaluar ******************************************** //***************************************************** ************************************* //***************************************************** ************************************* //*************************** evaluarfuncion public double evaluarfuncion(double num) { double result = 0; for (int i = 0; i <= grado; i++) { result += coef[i] * Math.pow(num, i); } //for return result; } //*************************** evaluarderiv public double evaluarderiv(double num) { double resul = 0; for (int i = 0; i <= gradoderiv; i++) { resul += deriv[i] * Math.pow(num, i); } //for return resul; } //*************************** evaluarsegderiv public double evaluarsegderiv(double num) { double resul = 0;

for (int i = 0; i <= gradosegderiv; i++) { resul += segderiv[i] * Math.pow(num, i); } //for return resul; } //**************************************** tabular public void tabular() { resultsArea.setText(""); int encontreraiz = 0; double convergencia, incremento = 0; limInf += deltaX; for (double x = limInf; x < limSup + deltaX; x += deltaX) { if ((evaluarfuncion(x - deltaX) * evaluarfuncion(x)) < 0) { resultsArea.append("\n" + getText("msg.rootbetween") + " "); resultsArea.append(String.valueOf(x deltaX) + " y " + String.valueOf(x)); resultsArea.append("\n"); for (int factor = 1; factor <= 10; factor+ +) { incremento = (x - (x - deltaX)) / 10; x0 = (x - deltaX) + factor * incremento; System.out.print("x0 "); //System.out.println(x0); convergencia = Math.abs((evaluarfuncion(x0) * evaluarsegderiv(x0)) / (evaluarderiv(x0) * evaluarderiv(x0))); if (convergencia < 1) { factor = 10; nraiz++; newtonraphson(); } //convergencia } //for factor } //if encuentra raiz

} //for principal } //*************************** newtonraphson public void newtonraphson() { int diverge = 0; double x = x0; double raizirr, evalfx, evalderiv, cociente; int cont = 0; evalfx = evaluarfuncion(x0); evalderiv = evaluarderiv(x0); cociente = (evalfx / evalderiv); while (Math.abs(cociente) >= tolerancia) { raizirr = x - cociente; evalfx = evaluarfuncion(raizirr); evalderiv = evaluarderiv(raizirr); x = raizirr; cont++; cociente = (evalfx / evalderiv); if (cont == 100) { cociente = Math.abs(tolerancia / 10); resultsArea.append(getText("msg.root") + " " + String.valueOf(nraiz) + ": " + String.valueOf(x) + "\n"); diverge = 1; } } //while if (diverge == 0) resultsArea.append(getText("msg.root") + " " + String.valueOf(nraiz) + ": " + String.valueOf(x) + "\n"); divsint(x); } //*******************************************paint public void paint(Graphics g) {} public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { String lang = (String)e.getItem();

//System.out.println("itemStateChanged()" + lang); if (lang.equals("Espa\u00F1ol")) { //System.out.println("Selected: espaol"); bundle = getBundleVar("es", "MX"); localize(); } else if (lang.equals("English")) { //System.out.println("Selected: english"); bundle = getBundleVar("en", "US"); localize(); } } } public void actionPerformed(ActionEvent e) { if (e.getSource() == addButton) { try { coef[contador] = (Double.valueOf(coeffField.getText())).doubleValue(); coeffLabel.setText(getText("msg.coefficient") + " x^" + (contador + 1) + ":"); paux[contador] = coef[contador]; if (coef[contador] != 0) { if (contador != 0) polyArea.append(" + "); polyArea.append(String.valueOf(coef[contador])); polyArea.append(" "); if (contador == 0) polyArea.append(""); else if (contador == 1) polyArea.append("x"); else

{ polyArea.append("x^"); polyArea.append(String.valueOf(contador)); } } contador++; } catch (NumberFormatException exc) { resultsArea.append(getText("error.wrongnumber") + " :" + coeffField.getText()); } coeffField.setText(""); coeffField.requestFocus(); } if (e.getSource() == endButton) { addButton.setEnabled(false); coeffField.setEditable(false); coeffField.setEnabled(false); grado = contador - 1; polyArea.append("\n"); obtenerraices(); } if (e.getSource() == resetButton) { addButton.setEnabled(true); coeffField.setEditable(true); coeffField.setEnabled(true); limInf = 0; limSup = 0; deltaX = 0; x0 = 0; tolerancia = 0; contador = 0; nraiz = 0; grado = 0;

gradoderiv = 0; gradosegderiv = 0; gradopr = 0; resetArrays(); polyArea.setText(""); resultsArea.setText(""); coeffLabel.setText(getText("msg.coefficient") + " x^0:"); } } public void resetArrays() { for (int i = 0; i < 100; i++) { coef[i] = 0.0f; deriv[i] = 0.0f; segderiv[i] = 0.0f; b[i] = 0.0f; c[i] = 0.0f; paux[i] = 0.0f; } }

You might also like