当你的数模老师让你用随便一个高级语言写一个高斯列主元素,垃圾的我只能尝试用JAVA写了,垃圾代码不优雅见谅。
所有的代码都在文件夹Math中,这里只有Frame和Test是需要用的,Guass是拿来测试的代码,不需要管。代码结构如下:
Test.java
package math;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import javax.swing.*;
public class Test extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
JButton f = new JButton("结束程序");
JButton t = new JButton("重新开始");
JPanel panel = new JPanel();
JTextField[] jt = null;
public Test()
{
//放上面板
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation(0,0);
this.setSize(screenSize.width,screenSize.height);
this.add(panel);
// panel.setSize(screenSize.width,screenSize.height);
panel.setBackground(new Color(255,248,220));
// panel.setLayout(new GridLayout(Frame.num,1));
panel.setLayout(new BorderLayout());
JPanel wu = new JPanel();
panel.add(wu,BorderLayout.NORTH);
wu.setBackground(new Color(255,248,220));
JPanel jieshu = new JPanel();
panel.add(jieshu,BorderLayout.SOUTH);
t.setFont(new Font("宋体", Font.BOLD, 50));
f.setFont(new Font("宋体", Font.BOLD, 50));
jieshu.add(t,FlowLayout.LEFT);
jieshu.add(f,FlowLayout.CENTER);
jieshu.setOpaque(false);
jieshu.setLayout(new FlowLayout(FlowLayout.CENTER,300,40));
t.setBackground(new Color(255,215,0));
f.setBackground(new Color(255,215,0));
f.addActionListener(this);
t.addActionListener(this);
if(Frame.flag==-1)
{
JLabel label = new JLabel("这个方程组有无限解");
label.setFont(new Font("宋体", Font.BOLD, 100));
f.addActionListener(this);
t.addActionListener(this);
wu.add(label);
}
else if(Frame.flag==0)
{
JLabel label = new JLabel("这个方程组无解");
label.setFont(new Font("宋体", Font.BOLD, 100));
wu.add(label);
}
else if(Frame.flag==1)
{
JPanel jie = new JPanel();
JPanel Xnums = new JPanel();
Xnums.setBackground(new Color(255,227,132));
jie.setBackground(new Color(255,248,220));
panel.setLayout(new BorderLayout());
panel.add(jie,BorderLayout.NORTH);
panel.add(Xnums,BorderLayout.CENTER);
panel.add(jieshu,BorderLayout.SOUTH);
Xnums.setLayout(new GridLayout(Frame.num,1));
JLabel label = new JLabel("这个方程的解为:");
jie.add(label);
label.setFont(new Font("宋体", Font.BOLD, 50));
jt = new JTextField[Frame.num];
for(int i = 0;i < Frame.num;i++)
{
JPanel cen = new JPanel();
cen.setBackground(new Color(255,248,220));
//cen.setOpaque(true);
cen.setLayout(new FlowLayout());
String x;
x = "X" + (i+1) + "=";
JLabel jab = new JLabel(x);
jt[i]=new JTextField(12);
jt[i].setBackground(new Color(255,227,132));
jt[i].setFont(new Font("宋体", Font.BOLD, 50));
jt[i].setEditable(false);
jt[i].setText(String.valueOf((BigDecimal)(Frame.AnswerNumber[i])));
System.out.println(Frame.AnswerNumber[i]);
jab.setFont(new Font("宋体", Font.BOLD, 50));
cen.add(jab);
cen.add(jt[i]);
System.out.println(Frame.AnswerNumber[i]);
Xnums.add(cen);
}
}
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==f)
{
System.exit(0);
}
if(e.getSource() == t)
{
setVisible(false);
Frame.screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Frame x = new Frame();
String str = javax.swing.JOptionPane.showInputDialog("输入方程个数");
int nums = Integer.parseInt(str);
x.setXnum(nums);
x.setTitle("Gauss列主元素消去法");
x.setLocation(0, 0);
x.setSize(Frame.screenSize.width,Frame.screenSize.height);
x.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
x.setVisible(true);
x.buju();
}
}
}
Frame.java
package math;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.math.RoundingMode;
import javax.swing.*;
public class Frame extends JFrame{
private static final long serialVersionUID = 1L;
public static int flag;
JPanel panel=null;
JPanel panelbutton = new JPanel();
JPanel panelX = new JPanel();
JTextField[][] XNumbers = null;
static int num;
static BigDecimal[][] Numbers;
JTextField[] X = null;
public static BigDecimal[] AnswerNumber = null;
static Dimension screenSize = new Dimension();
public void buju()
{
layoutPanelX();
layoutPanelButton();
num = getNum();
setLayout(new BorderLayout());
// panelbutton.setOpaque(true);
panelX.setOpaque(true);
// panelbutton.setBackground(new Color(252,230,201));
panelbutton.setBackground(new Color(250,235,215));
add(panelX,BorderLayout.CENTER);
add(panelbutton,BorderLayout.SOUTH);
}
public int getNum() {
return num;
}
public void setXnum(int equationNumber) {
Frame.num = equationNumber;
}
//获取系数矩阵
public void layoutPanelX()
{
int i,j;
XNumbers = new JTextField[num][num+1];
String labels;
JLabel[][] jlabel=new JLabel[num][num];
for(i = 1;i <= num - 1;i++)
{
labels = "X" + i + "+";
for(j = 0;j < num;j++)
jlabel[i-1][j] = new JLabel(labels);
}
labels = "X" + i + "=";
for(j = 0;j < num;j++)
{
jlabel[i-1][j] = new JLabel(labels);
}
panelX.setLayout(new GridLayout(num,1));
for(i = 0;i < num;i++)
{
panel=new JPanel();
panel.setBackground(new Color(250,235,215));
panel.setOpaque(true);
panel.setLayout(new FlowLayout());
for(j = 0;j < num;j++)
{
XNumbers[i][j]=new JTextField(7);
panel.add(XNumbers[i][j]);
XNumbers[i][j].setFont(new Font("宋体", Font.BOLD, 30));
panel.add(jlabel[j][i]);
jlabel[j][i].setFont(new Font("宋体", Font.BOLD, 30));
}
XNumbers[i][num] = new JTextField(7);
panel.add(XNumbers[i][num]);
XNumbers[i][num].setFont(new Font("宋体", Font.BOLD, 30));
panelX.add(panel);
}
}
public void layoutPanelButton()
{
JButton start = new JButton("开始计算");
JButton finish = new JButton("结束程序");
panelbutton.setLayout(new FlowLayout(FlowLayout.CENTER,300,100));
panelbutton.add(finish,FlowLayout.LEFT);
panelbutton.add(start,FlowLayout.CENTER);
finish.setFont(new Font("宋体", Font.BOLD, 50));
finish.setBackground(new Color(235,142,85));
start.setFont(new Font("宋体", Font.BOLD, 50));
start.setBackground(new Color(235,142,85));
Numbers = new BigDecimal[num][num+1];
start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int i,j;
for(i = 0;i < num;i++)
{
for(j = 0;j <= num;j++)
{
if(XNumbers[i][j].getText()!=null)
{
Numbers[i][j] = new BigDecimal((String)XNumbers[i][j].getText()); //题目的数量
//System.out.print(Numbers[i][j]+" ");
}
else if(XNumbers[i][j].getText()==null)
{
Numbers[i][j] = new BigDecimal("0");
System.out.print(Numbers[i][j]+" ");
}
}
// System.out.println();
}
GaussAlgrithom();
new Test();
setVisible(false);
}
});
finish.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
// new Test();
}
});
}
public int GaussAlgrithom()
{
AnswerNumber=new BigDecimal[num];
int i,j,k,maxflag = 0;
BigDecimal max=new BigDecimal(-99999999.999999);
BigDecimal temp;
//看看得到的数据矩阵
// for(i = 0;i < num;i++)
// {
// for(j = 0;j <= num;j++)
// {
// System.out.print(Numbers[i][j]+" ");
// }
// System.out.println();
// }
//选取最大元
for(k = 0;k < num-1;k++)
{
for(i = k;i < num;i++)
{
if(Numbers[i][k].abs().compareTo(max)==1)
{
maxflag = i;
max = Numbers[i][k].abs();
}
}
//交换最大元行与原本第一行
for(j = 0;j <= num;j++)
{
temp = Numbers[k][j];
Numbers[k][j] = Numbers[maxflag][j];
Numbers[maxflag][j] = temp;
}
// for(i = 0;i < num;i++)
// {
// for(j = 0;j <= num;j++)
// {
// System.out.print(Numbers[i][j]+" ");
// }
// System.out.println();
// }
//做计算
for(i = k;i < num;i++)
{
if(i == k)
{
for(j = num;j >= k;j--)
{
if(Numbers[k][k].compareTo(BigDecimal.ZERO) == 0)
{
if(Numbers[k][num].compareTo(BigDecimal.ZERO) == 0)
{
System.out.println("有无限解");
}
else if(Numbers[k][num].compareTo(BigDecimal.ZERO) != 0)
{
System.out.println("无解");
}
}
else if(Numbers[k][k].compareTo(BigDecimal.ZERO) != 0)
{
Numbers[k][j] = Numbers[k][j].divide(Numbers[k][k],4,RoundingMode.HALF_UP);
//
}
}
}
else
{
for(j = num;j >= k;j--)
{
Numbers[i][j] = Numbers[i][j].add(Numbers[k][j].multiply(Numbers[i][k].negate()));
}
}
}
}
for(i = num-1;i >= 0;i--)
{
if(i == num-1)
{
if(Numbers[i][i].compareTo(BigDecimal.ZERO) == 0)
{
if(Numbers[i][num].compareTo(BigDecimal.ZERO) == 0)
{
System.out.println("有无限解");
flag = -1;
return -1;
}
else if (Numbers[i][num].compareTo(BigDecimal.ZERO) != 0)
{
System.out.println("无解");
flag = 0;
return 0;
}
}
else if(Numbers[i][i].compareTo(BigDecimal.ZERO) != 0)
{
AnswerNumber[i] = Numbers[i][i+1].divide(Numbers[i][i],5,RoundingMode.HALF_UP);
}
}
else
{
for(j = num-1;j >= i+1;j--)
{
Numbers[i][num] = Numbers[i][num].add(Numbers[i][j].negate().multiply(AnswerNumber[j]));
}
AnswerNumber[i] = Numbers[i][num];
}
}
// for(i = 0;i < num;i++)
// {
// for(j = 0;j <= num;j++)
// {
// System.out.print(Numbers[i][j]+" ");
// }
// System.out.println();
// }
for(i = 0;i < num;i++)
{
// System.out.print(AnswerNumber[i]+" ");
flag = 1;
}
return 1;
}
public static void main(String[] args) {
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Frame f = new Frame();
String str = javax.swing.JOptionPane.showInputDialog("输入方程个数");
int nums = Integer.parseInt(str);
f.setXnum(nums);
f.setTitle("Gauss列主元素消去法");
f.setLocation(0, 0);
f.setSize(screenSize.width,screenSize.height);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.buju();
}
}
效果展示:
有问题之后再改吧~