n阶行列式的计算方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了n阶行列式的计算方法相关的知识,希望对你有一定的参考价值。

参考技术A

n阶行列式的计算方法如下:

一、基本方法

1.用n阶行列式定义计算。

当题目中出现低阶行列式,如二阶或三阶。

当出现特殊结构

2.用n阶行列式的性质,将一般行列式转化为上(下)三角行列式

如行列互换,行列倍乘倍加,行列相同或成比例,对换位置符号改变

3.用n阶行列式的展开定理

一般思想为降阶,按某一行或某一列展开

4.其他技巧

递推、数学归纳法、加边法、拆项法、利用范德蒙行列式的结论

展开式为a1b2c3+a2b3c1+a3b1c2-a1b3c2-a2b1c3-a3b2c1. 行列式起源于线性方程组的求解,在数学各分支有广泛的应用。在代数上,行列式可用来简化某些表达式,例如表示含较少未知数的线性方程组的解等。

在1683年,日本的关孝和最早提出了行列式的概念及它的展开法。莱布尼兹在1693年(生前未发表)的一封信中,也宣布了他关于行列式的发现。

性质1 行列互换,行列式不变。

性质2 把行列式中某一行(列)的所有元素都乘以一个数K,等于用数K乘以行列式。

性质3 如果行列式的某行(列)的各元素是两个元素之和,那么这个行列式等于两个行列式的和。

性质4 如果行列式中有两行(列)相同,那么行列式为零。(所谓两行(列)相同就是说两行(列)的对应元素都相等)

性质5 如果行列式中两行(列)成比例,那么行列式为零。

性质6 把一行(列)的倍数加到另一行(列),行列式不变。

性质7 对换行列式中两行(列)的位置,行列式反号。

n阶行列式的全排列求解(Java)

上一个随笔,我介绍了全排列的递归求解,其中还有排列的逆序数等代码,这次我来介绍如何使用全排列计算行列式的值。

使用全排列求行列式的值,简单的描述就是:

  1. 对这个行列式每一行选取一个数,这些数处于行列式的不同的列,将这些数相乘,结果记为A_1
  2. 将这些数的列标按行标从上到下的顺序排列,如果这个排列的逆序数为偶数,A_1加个正号+A_1,否则加个负号-A_1
  3. 由排列组合知识我们知道我们一共能从行列式中取出n!种情况。他们的和就是行列式的值

(刚开始用博客园,没找到插入latex的地方,我就截个图了。。。)

可见,我们需要实现以下功能:

1. 定义矩阵类

2. 获得矩阵列标的全排列

3. 对每个排列,在矩阵的每一行取一个数,并计算这个排列的逆序数,决定符号

4. 计算取出的数的求积,综合以上操作,求出行列式的值

逐个实现!

1. 首先,类定义的代码分别如下(成员函数逐一介绍):

public class Matrix {

    /**
     * author:ZhaoKe
     * college: CUST
     */
    public int row;
    public int column;
    public double[][] elements;
    
    public Matrix() {
        this.elements = new double[this.row][this.column];
        for (int i = 0; i < this.row; i++) {
            for (int j = 0; j < this.column; j++) {
                this.elements[i][j] = 0;
            }
        }
    }
    
    public Matrix(double[][] elements) {
        this.row = elements.length;
        this.column = elements[0].length;
        this.elements = new double[this.row][this.column];
        for (int i = 0; i < this.row; i++) {
            for (int j = 0; j < this.column; j++) {
                this.elements[i][j] = elements[i][j];
            }
        }
    }
}

 

2. 然后我们要获得全排列,这部分上一次已经讲过,完整代码请看一下 https://www.cnblogs.com/zhaoke271828/p/12530031.html

3. 根据排列从矩阵中取数,所谓排列,我们用数组表示,那么功能也很好实现,大家可以自己试一下,注意这是Matrix类的成员函数

    public double[] getArrayByColumnIndex(int[] index) {
        double[] array = new double[index.length];
        for (int i = 0; i < this.row; i++) {
            array[i] = this.elements[i][index[i]];
        }
        return array;
    }

4. 然后直接求行列式的值:

根据逆序数判断正负号:

this.isOdd(perm.against(result[i]))?1:-1
这个perm表示Permutation类的实例,这个类的定义参考我的另一个博客 全排列的Java实现 https://www.cnblogs.com/zhaoke271828/p/12530031.html
    public boolean isOdd(int number) {
        return number %2==0;
    }
    
    public double det() throws Exception {
        if (this.row != this.column) {
            throw new Exception("该矩阵不是方阵,不可求行列式,考虑求广义行列式吧!");
        }
        int[] index = new int[this.column];
        for (int i = 0; i < index.length; i++) {
            index[i] = i;
        }
        Permutation perm = new Permutation(index);
        perm.perm(index, 0);
        int[][] result = perm.getResult();
        double sum = 0;
        for (int i = 0; i < result.length; i++) {
//            System.out.println("本次运算的数组:" + Arrays.toString(getArrayByColumnIndex(result[i])));
//            System.out.println("符号是:" + (this.isOdd(perm.against(result[i]))?1:-1));
            sum += Array.prod(getArrayByColumnIndex(result[i]))*(this.isOdd(perm.against(result[i]))?1:-1);
        }
        return sum;
    }

其中涉及到对一个数组求连乘积,这个大家可以自己实现以下,我这里又定义了数组类Array,代码如下:

其实变麻烦了,不过博主习惯这种操作hhhhh~如果还需要关于数组的操作,方便添加功能

public class Array {
    public double[] elements;
    
    public Array(double[] elements) {
        this.elements = elements;
    }
    
    public static double prod(double[] array) {
        double prod = 1;
        for (int i = 0; i < array.length; i++) {
            prod *= array[i];
        }
        return prod;
    }
}

以上就是全部代码了,可以试一下效果:

public static void main(String[] args) {
        double[][] matrix = {
                {1, 2, 4, 8},
                {1,1,1,1},
                {1, 4, 16, 64},
                {1,5,25,125}
        };
        Matrix m = new Matrix(matrix);
        try {
            System.out.println(m.det());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

结果正是  -72.0

 

以上是关于n阶行列式的计算方法的主要内容,如果未能解决你的问题,请参考以下文章

线性代数行列式计算之迭代法

如何计算n阶行列式?

n阶行列式计算公式是啥?

行列式的计算方法

n阶范德蒙德行列式怎么算

n阶行列式怎么算?