用JAVA写一个Gauss列主元素消元法代码(可视化)

当你的数模老师让你用随便一个高级语言写一个高斯列主元素,垃圾的我只能尝试用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();
			
		}
		
}


效果展示:

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
有问题之后再改吧~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值