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.
// 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;
// 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);
// 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();
}
}
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.
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:
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.
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.
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. :)
Tech changes fast. You can learn faster. That’s why we’re bringing professional training courses to Experts Exchange. With a subscription, you can access all the Cloud Class® courses to expand your education, prep for certifications, and get top-notch instructions.
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.