尝试编写一个程序来计算 5 次多项式和一个常数的根

Trying to write a program that calculates the roots for a polynomial of the 5th degree and one constant

此 class 从 JPanel GUI 读取输入。除非我为每个系数输入 1,否则不会 SOP 任何东西。然后它只打印“0.0” 关于如何让它工作的任何建议?我已经尝试了所有我能想到的。

public class PolyRoots extends PolyGUI {

private double coefficientToFifthPower;
private double coefficientToFourthPower;
private double coefficientToThirdPower;
private double coefficientToSecondPower;
private double coefficientToFirstPower;
private double constant;
private double x;

public double getCoefficientToFifthPower() {
    return coefficientToFifthPower;
}

public void setCoefficientToFifthPower(double coefficientToFifthPower) {
    this.coefficientToFifthPower = coefficientToFifthPower;
}

public double getCoefficientToFourthPower() {
    return coefficientToFourthPower;
}

public void setCoefficientToFourthPower(double coefficientToFourthPower) {
    this.coefficientToFourthPower = coefficientToFourthPower;
}

public double getCoefficientToThirdPower() {
    return coefficientToThirdPower;
}

public void setCoefficientToThirdPower(double coefficientToThirdPower) {
    this.coefficientToThirdPower = coefficientToThirdPower;
}

public double getCoefficientToSecondPower() {
    return coefficientToSecondPower;
}

public void setCoefficientToSecondPower(double coefficientToSecondPower) {
    this.coefficientToSecondPower = coefficientToSecondPower;
}

public double getCoefficientToFirstPower() {
    return coefficientToFirstPower;
}

public void setCoefficientToFirstPower(double coefficientToFirstPower) {
    this.coefficientToFirstPower = coefficientToFirstPower;
}

public double getConstant() {
    return constant;
}

public void setConstant(double constant) {
    this.constant = constant;
}

private double y;

public void readInputCoefficients() {

/*        this.coefficientToFifthPower = Integer.parseInt(inputCoefficientFifthPower);

    this.coefficientToFourthPower = Integer.parseInt(inputCoefficientFourthPower);

    this.coefficientToThirdPower = Integer.parseInt(inputCoefficientThirdPower);
    this.coefficientToSecondPower = Integer.parseInt(inputCoefficientSecondPower);

    this.coefficientToFirstPower = Integer.parseInt(inputCoefficientFirstPower);

    this.constant = Integer.parseInt(inputConstant);*/
}

public double calculateY(double x) {
    this.y = this.coefficientToFifthPower * Math.pow(x, 5) + this.coefficientToFourthPower * Math.pow(x, 4) +
            this.coefficientToThirdPower * Math.pow(x, 3) + this.coefficientToSecondPower * Math.pow(x, 2) + (this.coefficientToFirstPower * x) + this.constant;
    return this.y;
}

public void getTheBounds() {
    for (double x = -10.0001; x <= 10.0001; x += .1) {

        double y1 = calculateY(x);
        double y2 = calculateY(x + .01);

        if ((y1 * y2) < 0) {
            System.out.println(bisectionMethod(y1, y2));
        }
        else if((y1 * y2) > 0){
            System.out.println(bisectionMethod(y1,y2));
        }
    }

}

public double bisectionMethod(double a, double b) {
    double average;
    double root = 0;
    double yOfC;
    int leaveloop = 0;
    for(int x = 0; x <= 10000000; x++) {
        average = (a + b) / 2;
        yOfC = calculateY(average);
        if (Math.abs(yOfC) < 0.0001) {
            root = average;
            return root;
        } else if (yOfC * calculateY(a) > 0) {
            a = average;
        } else {
            b = average;
        }
    }
    System.out.println(root);
    return root;
}

}

图形界面

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;

public class PolyGUI extends JPanel
{
// ***Variables are created ***
//*** GUIs are made up of JPanels.  Panels are created
//*** here and named appropriately to describe what will
//*** be placed in each of them.
JPanel titlePanel = new JPanel();
JPanel c5Panel = new JPanel();
JPanel c4Panel = new JPanel();
JPanel c3Panel = new JPanel();
JPanel c2Panel = new JPanel();
JPanel c1Panel = new JPanel();
JPanel cPanel = new JPanel();
JPanel calculatePanel = new JPanel();

//*** a JLabel is a text string that is given a String value
//*** and is placed in its corresponding JPanel or JButton
JLabel titleLabel = new JLabel();
JLabel c5Label = new JLabel();
JLabel c4Label = new JLabel();
JLabel c3Label = new JLabel();
JLabel c2Label = new JLabel();
JLabel c1Label = new JLabel();
JLabel cLabel = new JLabel();
JLabel questionLabel = new JLabel();
JLabel calculateLabel = new JLabel();
//*** three JButtons are created.  When pushed, each button calls
//*** its corresponding actionPerformed() method from the class created
//*** for each button. This method executes the method code, performing
//*** what the button is to do.
JButton calculateButton = new JButton();
//*** a JTextField creates a location where the client can place
//*** text
JTextField x5Txt = new JTextField(8);
JTextField x4Txt = new JTextField(8);
JTextField x3Txt = new JTextField(8);
JTextField x2Txt = new JTextField(8);
JTextField xTxt = new JTextField(8);
JTextField constantTxt = new JTextField(8);

//*** constructor
//*** Variables are given initial values

public PolyGUI()
{
    //*** set panel layouts
    //*** panels could be LEFT, or RIGHT justified.
    titlePanel.setLayout(new FlowLayout(FlowLayout.CENTER));
    c5Panel.setLayout(new FlowLayout(FlowLayout.CENTER));
    c4Panel.setLayout(new FlowLayout(FlowLayout.CENTER));
    c3Panel.setLayout(new FlowLayout(FlowLayout.CENTER));
    c2Panel.setLayout(new FlowLayout(FlowLayout.CENTER));
    c1Panel.setLayout(new FlowLayout(FlowLayout.CENTER));
    cPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
    questionLabel.setLayout(new FlowLayout(FlowLayout.CENTER));
    calculateButton.setLayout(new FlowLayout(FlowLayout.CENTER));


    //*** set Label fonts.  You can use other numbers besides 30,20
    //*** or 15 for the font size.  There are other fonts.
    Font quizBigFont = new Font("Helvetica Bold", Font.BOLD, 30);
    Font quizMidFont = new Font("Helvetica Bold", Font.BOLD, 20);
    titleLabel.setFont(quizBigFont);
    questionLabel.setFont(quizMidFont);
    c5Label.setFont(quizMidFont);
    c4Label.setFont(quizMidFont);
    c3Label.setFont(quizMidFont);
    c2Label.setFont(quizMidFont);
    c1Label.setFont(quizMidFont);
    cLabel.setFont(quizMidFont);
    //*** labels are given string values
    titleLabel.setText("Polynomial Project");
    questionLabel.setText("Please enter the coefficients");
    c5Label.setText("5");
    c4Label.setText("4");
    c3Label.setText("3");
    c2Label.setText("2");
    c1Label.setText("1");
    cLabel.setText("constant");
    calculateButton.setText("Calculate");
    calculateButton.addActionListener(new calculate());
    //*** panels
    titlePanel.add(titleLabel);
    c5Panel.add(c5Label);
    c5Panel.add(x5Txt);
    c4Panel.add(c4Label);
    c4Panel.add(x4Txt);
    c3Panel.add(c3Label);
    c3Panel.add(x3Txt);
    c2Panel.add(c2Label);
    c2Panel.add(x2Txt);
    c1Panel.add(c1Label);
    c1Panel.add(xTxt);
    cPanel.add(cLabel);
    cPanel.add(constantTxt);
    calculatePanel.add(calculateButton);
    setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
    add(titlePanel);
    add(questionLabel);
    add(c5Panel);
    add(c4Panel);
    add(c3Panel);
    add(c2Panel);
    add(c1Panel);
    add(cPanel);
    add(calculatePanel);


    //*** The method writeToFile() is called from the constructor.
    //*** One could call a read method from the constructor.

    //  writeToFile();
}// constructor



public void display()
{   //*** A JFrame is where the components of the screen
    //*** will be put.
    JFrame theFrame = new JFrame("GUI Example");
    //*** When the frame is closed it will exit to the
    //*** previous window that called it.
    theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //*** puts the panels in the JFrame
    theFrame.setContentPane(this);
    //*** sets the dimensions in pixels
    theFrame.setPreferredSize(new Dimension(600, 380));
    theFrame.pack();
    //*** make the window visible
    theFrame.setVisible(true);
}



class calculate implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("Calculating...");
        PolyRoots p1 = new PolyRoots();

        double x5 = Integer.parseInt(x5Txt.getText());
        double x4 = Integer.parseInt(x4Txt.getText());
        double x3 = Integer.parseInt(x3Txt.getText());
        double x2 = Integer.parseInt(x2Txt.getText());
        double x = Integer.parseInt(xTxt.getText());
        double constant = Integer.parseInt(constantTxt.getText());

        p1.setCoefficientToFifthPower(x5);
        p1.setCoefficientToFourthPower(x4);
        p1.setCoefficientToThirdPower(x3);
        p1.setCoefficientToSecondPower(x2);
        p1.setCoefficientToFirstPower(x);
        p1.setConstant(constant);

        p1.getTheBounds();


    }
}


public static void main(String[] args) throws IOException
{
    PolyGUI newGUI = new PolyGUI();
    newGUI.display();

}

}

这是一个简单的程序示例,其中有一个 main,您可以看到每一行代码的作用。

public class PolyRoots {
    private final double[] coeffs; // any number of coefficients.

    public PolyRoots(double... coeffs) {
        this.coeffs = coeffs;
    }

    public double calcY(double x) {
        double ret = coeffs[0];
        for (int i = 1; i < coeffs.length; i++)
            ret = ret * x + coeffs[i];
        return ret;
    }

    public static void main(String[] args) {
        PolyRoots roots = new PolyRoots(1e-3, -2e-2, 0.1, -1, 5);
        for (int i = -10_000; i <= 10_000; i++) {
            double x = i / 1000.0;
            double y = roots.calcY(x);
            System.out.println(x + "\t" + y);
        }
    }
}

对于这样的程序,您可以添加 getBoundsbisectionMethod 但是这些方法确实可以完成它们应该做的事情(因为我什至无法弄清楚他们试图做什么,但是我才开发了三十年 ;)