Solved

Automating a formula

Posted on 2004-09-14
6
294 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
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.

 
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

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
HP Deskjet 2132 3 174
Revenue table 8 108
How to get the score in percent of an activity? 7 65
Best prediction based on two lists of numbers  in excel 2 59
Have you ever thought of installing a power system that generates solar electricity to power your house? Some may say yes, while others may tell me no. But have you noticed that people around you are now considering installing such systems in their …
When we purchase storage, we typically are advertised storage of 500GB, 1TB, 2TB and so on. However, when you actually install it into your computer, your 500GB HDD will actually show up as 465GB. Why? It has to do with the way people and computers…
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.
I've attached the XLSM Excel spreadsheet I used in the video and also text files containing the macros used.

789 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