⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comp11.java

📁 此算法实现解方程组
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
class Comp11 {
	   public double[] b;//存储变量 b,最终结果也存在数组 bb中
	   public TextField rowtext,caltext,resulttext;
	   public TextArea textA,textb;
	   public double[][] array;//用于存储矩阵 A
       public static void main(String args[ ]){
    	   Comp11 t1=new Comp11();
    	   t1.go();
       }
    	public void go(){ 
    		Frame frame=new Frame("gauss");
            Panel paneln=new Panel( );  
            Panel panels=new Panel( );
            Panel pn1=new Panel( );
            Panel pn2=new Panel( );
    		Label l1=new Label("输入行数");
    		Label l2=new Label("列数");
    		Label l3=new Label("输入数组A");
    		Label l4=new Label("向量b");
    		Label result=new Label("结果");
    		rowtext=new TextField("1",10);
    		caltext=new TextField("1",10);
    		textA=new TextArea("",10,16,TextArea.SCROLLBARS_NONE);
    		textb=new TextArea("",10,1,TextArea.SCROLLBARS_NONE); 
    		resulttext=new TextField("1",20);
    		Button calb=new Button("运算");
    		calb.addActionListener(
          		  new ActionListener() {
          		    public void actionPerformed(ActionEvent ae) {  
          		    try{	
          		    	String sa=textA.getText().trim();
          		    	String sr=rowtext.getText().trim();
          		    	String sc=caltext.getText().trim();
          		    	String s5=textb.getText().trim();
          		    	int r=Integer.parseInt(sr);
          		    	int c=Integer.parseInt(sc);		    	
          		    	array=new double[r][c]; 
          		    	b=new double[r]; 
          		       //下面处理矩阵A的输入
          		    	while(sa.indexOf("\n")!=-1){ 
          		    		sa=sa.substring(0,sa.indexOf("\n"))+sa.substring(sa.indexOf("\n")+1);}
          	            while(sa.indexOf("\r")!=-1){ 
          	            	sa=sa.substring(0,sa.indexOf("\r"))+"@"+sa.substring(sa.indexOf("\r")+1);}   
          		    	while(sa.indexOf(" ")!=-1){ 
          		    		sa = sa.substring(0,sa.indexOf(" "))+"@"+sa.substring(sa.indexOf(" ")+1).trim(); 
          	            	} 
          		    	String[] ss=sa.split("@");
          		    	int q=ss.length;
          		    	if(r<c){//当行数小于列数时方程有无穷解
          		    		resulttext.setText("有无穷");
          		    	    return;
          		    	}
          		    	int row=0;
          		    	int arr=0;
          		    	for(int i=0;i<q;i++){//取出数组A的值
          		           	array[row][arr]=Double.parseDouble(ss[i]);
          		    		 arr++;
  		    		         if(arr%r==0){
		    		        	    row++;
		    		        	    arr=0;
		    		              }
  		    		         }
          		    	//下面处理变量b的输入
          		    	while(s5.indexOf("\n")!=-1){ 
          		    		s5=s5.substring(0,s5.indexOf("\n"))+s5.substring(s5.indexOf("\n")+1);}
          	            while(s5.indexOf("\r")!=-1){ 
          	            	s5=s5.substring(0,s5.indexOf("\r"))+"@"+s5.substring(s5.indexOf("\r")+1);}   
          		    	while(s5.indexOf(" ")!=-1){ 
          		    		s5= s5.substring(0,s5.indexOf(" "))+"@"+s5.substring(s5.indexOf(" ")+1).trim(); 
          	            	} 
          		    	String[] ss1=s5.split("@");
          		    	int q1=ss1.length;
          		    	int row1=0;
          		    	for(int i=0;i<q1;i++){//取出变量b的值         		   
          		    		 b[row1]=Double.parseDouble(ss1[i]);    		    		
		    		        	    row1++;		    		        	   
  		    		         }          		    		
          		    	gause(array,b,r,c);
          		    	//Java中方法传递的数组的引用,可以修改数组的值,可以通过数组array判断解的情况。
          		    	if((array[c-1][c-1]==0)&&(b[c-1]!=0)){//下面依次判断各种解的情况
          		    		resulttext.setText("方程无解");
              		    	        return;
          		    	}
            			int i1=r-1;
          		    	while(b[i1]==0){
          		    		i1--;
          		    	}
          		    	if(i1>c-1){
          		    		resulttext.setText("方程无解");
          		    	return;
          		    	}
          		    	int i2=0;
          		    	while(i2<c&&array[i2][i2]!=0){
          		    		i2++;
          		    	}
          		    	if(i2<c-1){
          		    		resulttext.setText("方程有无穷多解");
              		    	return;
          		    	}
                                 String ss2=new String();
 		    	         for(int i=0;i<n;i++){
 		    		 ss2+=Double.toString(b[i]);
 		    		 ss2+="  ";
 		    	 }
 		                resulttext.setText(ss2);
    		                return;
          		    	}catch(Exception ee){ 
          		    		resulttext.setText("");
          		    		textA.setText("输入错误"); 
                                        textb.setText("");}
          		    	
		        }         		  
		      }
	     	);
    		           paneln.setLayout(new BorderLayout(10,20));  
    		           pn1.setLayout(new FlowLayout(FlowLayout.CENTER,15,20));
    		           pn1.add(l1);
    		           pn1.add(rowtext);
    		           pn1.add(l2);
    		           pn1.add(caltext);
    		           pn2.setLayout(new FlowLayout(FlowLayout.CENTER,10,20));
    		           pn2.add(l3);
    		           pn2.add(textA);          
    		           pn2.add(l4);
    		           pn2.add(textb);
    		           pn2.add(calb);
    		           paneln.add(pn1,"North");
    		           paneln.add(pn2,"Center");
    		           panels.add(result);
    		           panels.add(resulttext);
                       frame.setLayout(new BorderLayout(10,30));
                       frame.add(paneln,"North");
                       frame.add(panels,"Center");
                       frame.pack();
                       frame.setSize(500,500);
                       frame.setVisible(true);
                       frame.addWindowListener(new WindowAdapter(){
            	            public void windowClosing(WindowEvent ev)
                             {   System.exit(0); }   
            	            });                            
             }
    	   public void gause(double[][] array1,double[] b,int m,int n){
    		    //高斯算法的实现,不判断方程解的情况。
    		   for(int i=0;i<n;i++){//需要化简m-1次,最终把矩阵化为上三角矩阵
    				if(array1[i][i]==0){//如果对角线的为零,实行换行。
    					int a1=i+1;
    					while((a1<m)&&(array1[a1][i]==0)){//找到第一个对角线不为零的行
    						a1++;
    					}
    						System.out.println(a1);
    						if(a1<m){
    						double w=0;
    						for(int x=i;x<n;x++){//交换矩阵A的两行
    						w=array1[i][x];	
    						array1[i][x]=array1[a1][x];
    						array1[a1][x]=w;
    						}
    						w=b[i];//交换b变量的两行
    						b[i]=b[a1];
    						b[a1]=w;
    					}else
    					{ System.out.println("erro");}  					
    				}
    				for(int j=i+1;j<m;j++){//每次需要化简m-i-1行
    					array1[j][i]=array1[j][i]/array1[i][i];//为了节省空间用用要被化为零的元素,存储倍数
    					for(int k=i+1;k<n;k++)//每行需要化简n-i-1单元
    						{
    							array1[j][k]=array1[j][k]-array1[i][k]*array1[j][i];
    							
    						}
    					b[j]=b[j]-array1[j][i]*b[i];//化简变量b
    					array1[j][i]=0;
    					}
    				}
    			for(int t=0;t<m;t++){//在dos下显示化简后的上三角矩阵
    				System.out.println("  ");
    				
    			
    				for(int q=0;q<n;q++){
    					System.out.print(array1[t][q]);
    					System.out.print("  ");
    				}
    				System.out.println(b[t]);
    		}
    			
    		 for(int i=n-1;i>=0;i--){//回代求出方程的解
    			 for(int j=n-1;j>i;j--){
    			   b[i]=b[i]*1000-array1[i][j]*b[j]*1000;//避免像java里面的1-0.8=0.19999999999999996问题
    			   b[i]=b[i]/1000;
    			 }    			  
    			   b[i]=b[i]/array1[i][i]; 
    			   if(b[i]==-0.0){//Java中如果有a=0/-1时会出现-0.0
    				 b[i]=-b[i];
    			  }
    		   }
    		  
    		}
     }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -