行列式,矩阵,线性方程组,逆阵
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
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
}
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
//求第一行第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
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
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
//求出系数矩阵行列式的值
int DD=arra(a);
for(int k=0;k
}
//第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
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功能.不错.十分好用.只是递归的效率太低.高阶的几乎就是解不出来了.在想办法..
我看不懂你的算法啊,能不能详细一点,写个实例,我的邮箱[email protected]
谢谢高手指点啊!!!