行列式,矩阵,线性方程组,逆阵 java算法

行列式,矩阵,线性方程组,逆阵
package org.dean;
import javax.swing.*;
public class fun {
       private double[][]a;
       private int[][]aa;
       public fun(double[][] aa){
               a=new double[aa.length][aa[0].length];
               System.arraycopy(aa,0,a,0,aa.length);
             
       }
       public fun(int[][] a){
               aa=new int[a.length][a[0].length];
               System.arraycopy(a,0,aa,0,a.length);              
       }
   public void displayMatrix(int aa[][]){
           for(int[] df:aa){
               System.out.println();
               for(int d:df)
                       System.out.print(d+” “);}
       }
 
   public void displayMatrix(double aa[][]){
           for(double[] df:aa){
               System.out.println();
               for(double d:df)
                       System.out.print(d+” “);}
       }
       /**
        * 使用高斯消元解行列式
        * @param aa 二维double数组
        */
 public double guass(){          
         double arrangerResult=1.0;
         double k=0;
         if(a[0].length!=a.length)throw new IllegalArgumentException(“行列式的行列数必须相等”);
     for (int p = 0; p       for (int r =p+1; r        k=a[r][p]/a[p][p];
       a[r][p]=0;
       for (int c = p+1; c         a[r][c]=a[r][c]-k*a[p][c];
            }
          }
         }
     for (int i = 0; i                  arrangerResult=arrangerResult*a[i][i];//计算主对角线相乘的结果
          }
     return arrangerResult;
 }
 public int arra(){
         int c,l,sum;
         int A[];
         c=aa[0].length;
         l=aa.length;
         //第一行的代数余子式
         A=new int[c];        
         sum=0;
         //若行列数不相等
         if(c!=l) throw new IllegalArgumentException(“行列式的行数和列数必须相等”);
         //到达最小单位2*2,计算出值
         if(c==2)return aa[0][0]*aa[1][1]-aa[0][1]*aa[1][0];
         //按第一行展开,计算代数余子式
         for(int i=0;i          {   if((i)%2==0){
                 //求第一行第i个元素的代数余子式
                 A[i]=solveA(aa,0,i);}
         else{                
                 A[i]=solveA(aa,0,i)*(-1);}        
         sum+=aa[0][i]*A[i];
         }
       
         return sum;
       
       
 }
 public int arra(int aa[][]){
         int c,l,sum;
         int A[][];
         c=aa[0].length;
         l=aa.length;
         A=new int[c][l];        
         sum=0;        
         if(c!=l) throw new IllegalArgumentException(“行列式的行数和列数必须相等”);
         if(c==2)return aa[0][0]*aa[1][1]-aa[0][1]*aa[1][0];
         for(int i=0;i          {   if((i)%2==0){                
                 A[0][i]=solveA(aa,0,i);}
         else{        
                 A[0][i]=solveA(aa,0,i)*(-1);}        
         sum+=aa[0][i]*A[0][i];
         }
       
         return sum;
       
       
 }
 /**
  * 计算aa[][]第i行的j列元素的代数余子式
  * @param aa 整形数组
  * @param ii 元素的行号
  * @param jj 元素的列号
  * @return 代数余子式的行列式的值
  */
 public int solveA(int aa[][],int ii,int jj){
       //余子式元素
         int a[][];
         int c,l,m;
         int x=-1,y=0;
         c=aa[0].length-1;
         l=aa.length-1;
         //每次都按第一 行展开的余子式的行列式的值
         int A[];
         int sum=0;
         A=new int[c];
         a=new int[c][l];
         for(int i=0;i<=c;i++){
                 //如果元素的行号等于要求余子式的行号则跳过
                 if(i==ii){continue;}
                 y=0;x++;
                 for(int j=0;j<=c;j++){
            //如果元素的列号等于要求余子式的列号则跳过
                          if(j==jj){continue;
                                 }else{
                         a[x][y]=aa[i][j];                        
                         y++;}
                       
                 }}  
         if(c==2)return a[0][0]*a[1][1]-a[0][1]*a[1][0];
//  递归调用.每次都按第一行展开
         for(int i=0;i          {   if((i)%2==0)                
                 A[i]=solveA(a,0,i);
         else
                 A[i]=solveA(a,0,i)*(-1);
                 sum+=a[0][i]*A[i];
         }  
         return sum;
 }
 /**
  * 输入增广矩阵求解线性方程组解
  * @return 包含解的double数组
  */
 public double[] formula(){
         int c=aa[0].length-1;
         int r=aa.length;
         if(r!=(c)) throw new IllegalArgumentException(“必须是增广矩阵.且行数比列数少1 “);
         int D[]=new int[c];
         //A矩阵存放解
         double A[]=new double[c];        
         int a[][]=new int[r][c];
         for(int i=0;i            for(int j=0;j              a[i][j]=aa[i][j];
         //求出系数矩阵行列式的值
         int DD=arra(a);  
         for(int k=0;k            for(int i=0;i              for (int j=0;j                      a[i][j]=aa[i][j];
             }
             //第k列用最后一列替换
             a[i][k]=aa[i][c];
             }
             //求出第k列用最后一列替换以后的 行列式的值
             D[k]=arra(a);
             //求出解
             A[k]=D[k]/(double)DD;
             }
             return A;
         }
 /**
  * 求方阵的逆阵
  *
  *
  * @return 逆阵
  */
 public double[][] nizhen()
       {
       int c,l,sum;
        double A[][];
        c=aa[0].length;
       l=aa.length;
       A=new double[c][l];          
       double he=arra(aa);
       //如果只有2*2 则主对角线交换,副对角线取负即为A*
       if(c==2){
               A[0][0]=aa[1][1];
               A[1][1]=aa[0][0];
               A[1][0]=aa[0][1]*(-1);
               A[0][1]=aa[1][0]*(-1);
               //displayMatrix(A);
               return A;
       }
       for(int i=0;i          for(int j=0;j        {   if((i+j)%2==0){              
               A[j][i]=solveA(aa,i,j)/he;}
       else{              
               A[j][i]=(solveA(aa,i,j)*(-1))/he;}      
       }
       //displayMatrix(A);
       return A;
       }
}
今天重写了一次..使用了jdk5.0 的for while功能.不错.十分好用.只是递归的效率太低.高阶的几乎就是解不出来了.在想办法..

“行列式,矩阵,线性方程组,逆阵 java算法”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据