列主元素消去法是一种实用的计算矩阵的方法,这学期刚好在学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("列主元素法");
}
}
欢迎批评指正。