Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Automating a formula

Posted on 2004-09-14
6
Medium Priority
?
299 Views
Last Modified: 2008-02-26
Hi all,
This is not homework.
This is a JAVA program but I need to get the math formula to a better format.
I am looking for an improvement in expanding the formula(s) for finding the roots of a polynomial.  The present setup is to use Horner's method and specifically show formulas that are for polynomials of degree 3  or 4.  I would like to express the formula using any number of degree. And for the moment, I do not see how to create a general formula using Horner's method.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

// hornersMethodDemo attempts to find solutions to polynomial equations that are of degree 2 or 3.
// Any terms that are missing are given coefficients  0. Step size is variable.

/* Sample problems:
 p(x) = x^2-25 use coefficients 1,0,-25 separated by "," as shown; interval from -7 to 7
 p(x) = x^2-8x+15 use for coefficients 1,-8,15 separated by "," as shown; interval from 0 to 7
 p(x) = x^3-11x^2+14x+80 use for coefficients 1,-11,14,80 separated by "," as shown; interval from -10 to 10
 p(x) = 0.3x^2-3.8x+12 use coefficients 0.3,-3.8,+12 separated by "," as shown; interval from 5 to 7
 note:
 any x value that is at one point is above the line y = 0 and the next is below the line y=0, there exist a root.
 or similarly, any x value that is at one point is below the line y = 0 and the next is above the line y=0, there exist a root.
 */  
// This example demonstrates the use of JLabel, JTextField
// and JButton.

public class hornersMethodDemo
  implements ActionListener {
  JFrame HornerFrame;
  JPanel HornerPanel;
 
  JTextField FromTField;
  JTextField ToTField;
  JTextField IncTField;
  JTextField PolyCoefs;
  JLabel FromLabel, ToLabel, IncLabel, PolyCoefLabel, CalcValueLabel;
  JButton Calculate;
 
  // Constructor
  public hornersMethodDemo() {
    // Create the frame and container.
    HornerFrame = new JFrame("Looking For Roots");
    HornerPanel = new JPanel();
    HornerPanel.setLayout(new GridLayout(3, 2));
   
    // Add the widgets.
    addWidgets();
   
    // Add the panel to the frame.
    HornerFrame.getContentPane().add(HornerPanel, BorderLayout.CENTER);
   
    // Exit when the window is closed.
    HornerFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   
    // Show the frame.
    HornerFrame.pack();
    HornerFrame.setVisible(true);
  }
 
  // Create and add the widgets for converter.
  private void addWidgets() {
    // Create widgets.
   
    FromTField = new JTextField();
    ToTField= new JTextField();  
    IncTField = new JTextField();
    PolyCoefs = new JTextField();
   
    FromLabel = new JLabel("Evaluate X From", SwingConstants.LEFT);
    ToLabel= new JLabel("Evaluate X To", SwingConstants.LEFT);
    IncLabel = new JLabel("Step Size", SwingConstants.LEFT);
    PolyCoefLabel = new JLabel("Enter Coefficients", SwingConstants.LEFT);
    CalcValueLabel = new JLabel("See System Out For Value", SwingConstants.LEFT);
    Calculate = new JButton("Calculate");
   
   
    // Listen to events from Calc button.
    Calculate.addActionListener(this);
   
    // Add widgets to container.
    HornerPanel.add(FromLabel);
    HornerPanel.add(FromTField);
    HornerPanel.add( ToLabel);
    HornerPanel.add(ToTField);
    HornerPanel.add(IncLabel);
    HornerPanel.add(IncTField);
    HornerPanel.add(PolyCoefLabel);
    HornerPanel.add(PolyCoefs);
   
   
    HornerPanel.add(Calculate);
    HornerPanel.add(CalcValueLabel);    
    //HornerPanel.add(CalcValue );  
   
    FromLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    ToLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    IncLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    CalcValueLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
  }
 
  // Implementation of ActionListener interface.
  public void actionPerformed(ActionEvent event) {    
   
    try {      
      float gofrmX = Float.parseFloat(FromTField.getText());//from
      float gotoX = Float.parseFloat(ToTField.getText());//to
      float stp = Float.parseFloat(IncTField.getText());//step
      String in = new String(PolyCoefs.getText()); //coefficients in normal order  
     
     
      String[] atoms = in.split(",");      
      //P(x) = a0 + x *(a1 + x*(a2+x*(...x*an)...)): model
      float  y = 0;
      int atmlength = atoms.length;
      System.out.print(gofrmX + " ** is the first X point ** ");
      while (gofrmX <= gotoX )
      {
        if (atmlength == 3) // 2nd degree
        {        
          y = Float.parseFloat(atoms[atoms.length-1]) + gofrmX*(Float.parseFloat(atoms[atoms.length-2]) + gofrmX*Float.parseFloat(atoms[atoms.length-3]));
        }
        if (atmlength == 4) // 3rd degree
        {        
          y = Float.parseFloat(atoms[atoms.length-1]) + gofrmX*(Float.parseFloat(atoms[atoms.length-2]) + gofrmX*(Float.parseFloat(atoms[atoms.length-3]) + gofrmX*Float.parseFloat(atoms[atoms.length-4])));
        }
        System.out.print("Value for y is " + y);        
        if( y < 0 ){
          System.out.println(" and is below the line y = 0  ");
        }              
        if( y == 0 ){
          System.out.println(" and is on the line y = 0 and is a root ");
        }
        if( y > 0 ){
          System.out.println(" and is above the line y = 0 ");
        }
        gofrmX = gofrmX + stp;
        System.out.print(gofrmX + " ** is another step **  ");
      }  
    }
    catch (Exception e) {
      //e.printStackTrace();
    }
  }
  // main method
  public static void main(String[] args) {
    // Set the look and feel.
    try {
      UIManager.setLookAndFeel(
                               UIManager.getCrossPlatformLookAndFeelClassName());
    }
    catch (Exception e) {}
   
    hornersMethodDemo calculator = new hornersMethodDemo();
  }
}


Any help is appreciated.

Delphi3
0
Comment
Question by:delphi3
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 2
6 Comments
 
LVL 9

Expert Comment

by:rjkimble
ID: 12061046
I think you should create a recursive function, something like this:

public static float horner( float x, String coefficents )

write some code that finds the last coefficient as a float, say c, and creates a new string, coefficients2, of the remaining ones. Then your return statement would look something like this:

return c + x * horner( x, coefficients2 );

if c is the last remaining coefficient, then just return c and you're done. I think that captures the idea behind Horner's method. This is just one approach. There are many others that do something similar.
0
 
LVL 9

Accepted Solution

by:
rjkimble earned 200 total points
ID: 12061122
Disregard the other post. When I first tried looking up Horner's method at MathWorld, the server was refusing connections. I found a link that pointed to something completely different, which was the basis for my post. Now that MathWorld is responding again, I see that you're looking at something completely different:

http://mathworld.wolfram.com/HornersMethod.html

Putting this into a computer program appears fairly straightforward, but it also involves a fair amount of detail work. You might consider my "horner" method as a way to compute the values of f(x) for any degree polynomial, but you still have your work cut out for you for the rest of the technique.
0
 
LVL 4

Author Comment

by:delphi3
ID: 12061713
rjkimble,

thanks for stopping by to view my Q and to respond.

I also read your well qualified backgound in the bio statement at EE, the one associated with your name. Very interesting.

I will take your advice and see what happens.

D3
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
LVL 9

Expert Comment

by:rjkimble
ID: 12065845
Thanks for your kind comments and for accepting my answer, but even though I am well qualified to answer mathematical questions, I'm not so sure that my answer is really the one you're seeking. I read at least one reference that suggested to me that you were looking for a way to take the input string and generate a method that computes the value of a polynomial with the indicated coefficients. That's what I was getting after. However, the MathWorld article shows that Horner's method is all about finding roots to polynomials, and that's a different thing altogether.
0
 
LVL 4

Author Comment

by:delphi3
ID: 12091593
Hi  rjkimble,

I have pursued this matter further and a posted a related Q in the JAVA language section.
The history of  "expertmb's"  answer is noted in Q:

http://www.experts-exchange.com/Programming/Programming_Languages/Java/Q_211315

58.html#12072270

the location of the items to be changed  of my work above are:
.........
    while (gofrmX <= gotoX )
      {
        if (atmlength == 3) // 2nd degree
        {      
          y = Float.parseFloat(atoms[atoms.length-1]) +

gofrmX*(Float.parseFloat(atoms[atoms.length-2]) +

gofrmX*Float.parseFloat(atoms[atoms.length-3]));
        }
        if (atmlength == 4) // 3rd degree
        {        
          y = Float.parseFloat(atoms[atoms.length-1]) +

gofrmX*(Float.parseFloat(atoms[atoms.length-2]) +

gofrmX*(Float.parseFloat(atoms[atoms.length-3]) +

gofrmX*Float.parseFloat(atoms[atoms.length-4])));
        }
        System.out.print("Value for y is " + y);        
        if( y < 0 ){

...........


 the new replacement will be:
........
   while (gofrmX <= gotoX )
      {
        y = 0;
        float yC = Float.parseFloat(atoms[atoms.length-1]);// constant term
        System.out.println ("Constant term "+ yC);
       
        for(int i = atmlength; i >1 ; i--){
          y = (y + (Float.parseFloat(atoms[atoms.length-i])))*gofrmX;
         
        }
        y= y + yC; // adding in the constant term
        System.out.print ("total y = "+ y);
       
        if( y < 0 ){
........
I am now able to do any number set of terms (well, maybe), thanks to EE expertmb's help
and yours was: "but you still have your work cut out for you for the rest of the technique."

I am sure that this whole problem and revisions will not buy anyone a cup of coffee at the local diner. :)

Delphi3
0
 
LVL 9

Expert Comment

by:rjkimble
ID: 12092249
Thanks for the update, and good luck!
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction On a scale of 1 to 10, how would you rate our Product? Many of us have answered that question time and time again. But only a few of us have had the pleasure of receiving a stack of the filled out surveys and being asked to do somethi…
Lithium-ion batteries area cornerstone of today's portable electronic devices, and even though they are relied upon heavily, their chemistry and origin are not of common knowledge. This article is about a device on which every smartphone, laptop, an…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…
I've attached the XLSM Excel spreadsheet I used in the video and also text files containing the macros used below. https://filedb.experts-exchange.com/incoming/2017/03_w12/1151775/Permutations.txt https://filedb.experts-exchange.com/incoming/201…
Suggested Courses

721 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question