Solved

Automating a formula

Posted on 2004-09-14
6
292 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
NAS Cloud Backup Strategies

This article explains backup scenarios when using network storage. We review the so-called “3-2-1 strategy” and summarize the methods you can use to send NAS data to the cloud

 
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

Does Powershell have you tied up in knots?

Managing Active Directory does not always have to be complicated.  If you are spending more time trying instead of doing, then it's time to look at something else. For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
pressure on a wall 10 60
Adjust number proportionately 12 72
Relative Frequency Assessment 2 35
Dual bridge protection 18 111
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…
We are taking giant steps in technological advances in the field of wireless telephony. At just 10 years since the advent of smartphones, it is crucial to examine the benefits and disadvantages that have been report to us.
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…

809 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