Solved
Automating a formula
Posted on 2004-09-14
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