Solved

Automating a formula

Posted on 2004-09-14
6
295 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
  • 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 50 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
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
2k Power n formula 2 39
Revenue table 8 117
Maximum possible 10 character string combinations from 36 unique characters 18 105
Calculation of speed from point A to point B. 4 29
A Guide to the PMT, FV, IPMT and PPMT Functions In MS Excel we have the PMT, FV, IPMT and PPMT functions, which do a fantastic job for interest rate calculations.  But what if you don't have Excel ? This article is for programmers looking to re…
Complex Numbers are funny things.  Many people have a basic understanding of them, some a more advanced.  The confusion usually arises when that pesky i (or j for Electrical Engineers) appears and understanding the meaning of a square root of a nega…
This is a video describing the growing solar energy use in Utah. This is a topic that greatly interests me and so I decided to produce a video about it.
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

685 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