Java | 科学计算与数学建模、列主元素消去法的程序化

列主元素消去法是一种实用的计算矩阵的方法,这学期刚好在学Java所以用选择用Java来写。

计算精度设计的是4位有效数字,精度很低,所以结果不准确(比如无穷解等情况)

(ps:csu郑老师课程的童鞋们可以拿去作个基本框架参考,无穷解的情况还要修改o.o)

package modeling;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import pivot.column.ColumnPivot;
import java.text.DecimalFormat;

public class Mainline extends JFrame implements ActionListener{
    private  JButton jbt1 = new JButton("开始计算");
    private JButton jbt2 = new JButton("重新输入");
    private JPanel jpl = new JPanel();//创建一个JPanel对象//面板
    private BufferedReader br = null;
    private PrintStream ps=null;
    private JTextField[][] jtf;
    private  JLabel [][]jlb;
    private  JLabel jlb2[];
    private JLabel jlb3=new JLabel("计算结果为(4舍5入):");
    double d = 0;
    public Mainline(String string) throws Exception {
        super(string);

        try {
            String str = javax.swing.JOptionPane.showInputDialog("请输入未知数个数");
            d = Double.parseDouble(str);
        } catch (Exception e) {
            javax.swing.JOptionPane.showMessageDialog(null, "输入错误!");
        }
        int s = (int) d;
        //计算输入框
        this.setLocation(10, 20);
        this.setSize(1250, 650);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        jpl.add(jbt1);
        jpl.add(jbt2);
        this.add(jpl);//面板添加到容器中
        this.setVisible(true);
        jpl.setBackground(new Color(234,208,207));
        jpl.setLayout(null);
        jbt1.setLocation(300, 30);
        jbt1.setSize(100, 40);
        jbt1.setBackground(new Color(201,192,211));
        jbt2.setLocation(600, 30);
        jbt2.setSize(100, 40);
        jbt2.setBackground(new Color(201,192,211));

        jlb = new JLabel[s][s];
        jtf = new JTextField[s][s + 1];

        for (int j = 0; j < s; j++) {//行
            for (int i = 0; i < s; i++){//列
                jtf[j][i] = new JTextField(5);
                if (i == s - 1) {
                    jlb[j][i] = new JLabel("x" + (i + 1) + " = ");
                    jtf[j][i + 1] = new JTextField(5);
                    jtf[j][i + 1].setLocation(20 + s * 75, 100 + j * 100);
                    jtf[j][i + 1].setSize(35, 20);
                    jpl.add(jtf[j][i + 1]);
                } else {
                    jlb[j][i] = new JLabel("x" + (i + 1) + " + ");
                }
                jpl.add(jtf[j][i]);
                jpl.add(jlb[j][i]);
                jtf[j][i].setLocation(20 + i * 75, 100 + j * 100);
                jtf[j][i].setSize(35, 20);
                jlb[j][i].setLocation(60 + i * 75, 85 + j * 100);
                jlb[j][i].setSize(50, 50);

            }
        }
        //按钮事件
        jbt1.addActionListener(this);//绑定
        jbt2.addActionListener(this);//绑定
    }

    public void actionPerformed(ActionEvent e){

        if(e.getSource()==jbt1) {
            int a = (int) d;
           double juzhen[][] = new double[a][a + 1];//获取文本框内的矩阵数组
           for (int j = 0; j < a; j++) {
                for (int i = 0; i < a + 1; i++) {
                    juzhen[j][i] = Double.parseDouble(jtf[j][i].getText());
                }
            }
           ColumnPivot cp = new ColumnPivot(juzhen);// 创建对象
           double[] root=cp.getRoot();
           DecimalFormat df = new DecimalFormat("0.000");//设置根的格式
            double []r=new double[root.length];
            for (int i = 0; i < root.length; ++i){//设置根的格式———强制转换
                r[i]=Double.parseDouble(df.format(root[i]));
            }
            if (root.length == 0) {
                javax.swing.JOptionPane.showMessageDialog(null, "方程组无解!");
            }
            else {
                jpl.removeAll();

                jpl.revalidate();
                jpl.repaint();
                jpl.add(jlb3);
                jlb3.setLocation(50,  5);
                jlb3.setSize(300, 300);
                Font f = new Font("黑体", Font.BOLD, 18);
                jlb3.setFont(f);
                jlb2 = new JLabel[root.length];

               for (int i = 0; i < root.length; ++i) {
                    if(root.length>=1000) {
                        for (int j = 0; j < a; j++) {
                            jlb2[j] = new JLabel("x" + (j + 1) + "= 1.0");
                            jpl.add(jlb2[j]);
                            jlb2[j].setLocation(150, 100 +j * 50);
                            jlb2[j].setSize(200, 200);
                            jlb2[j].setFont(f);
                        }break;
                    }
                    else {
                       jlb2[i] = new JLabel("x" + (i + 1) + "= " + r[i]);
                       jpl.add(jlb2[i]);
                       jlb2[i].setLocation(150, 100 + i * 50);
                       jlb2[i].setSize(200, 200);
                       jlb2[i].setFont(f);
                   }
               }
            }
        }
        else if(e.getSource()==jbt2){//清空输入框
            int a = (int) d;
            for (int j = 0; j < a; j++) {
                for (int i = 0; i < a + 1; i++) {
                    jtf[j][i].setText("");
                }
            }
        }
    }
    public static void main(String[] args)throws Exception {
        Mainline m= new Mainline("列主元素法");
    }
}

欢迎批评指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值