基本概念:

行列式是数,矩阵是一个式子!!!

余子式与代数余子式:

余子式:在 n 阶行列式中,把某个元素所在的行列都去掉之后,剩下的 n-1 阶行列式就叫做该元素的余子式:

代数余子式:

基本性质:

性质1:互换行列式的两列(或两行),行列式仅改变符号。

性质2:行列式某行(或某列)的 k 倍加到另一行(或列)上,行列式不变。

性质3:行列式等于它的任意列(或行)各个元素与其对应代数余子式乘积的和。

算法一:(时间有限,具体原理后期补充)

运用性质1、性质2。

 public static double GetLineTran(double[][] p, int n) {if (n == 1) return p[0][0];double exChange = 1.0; // 记录行列式中交换的次数boolean isZero = false; // 标记行列式某一行的最右边一个元素是否为零for (int i = 0; i < n; i ++) {// i 表示行号if (p[i][n - 1] != 0) { // 若第 i 行最右边的元素不为零isZero = true;if (i != (n - 1)) { // 若第 i 行不是行列式的最后一行for (int j = 0; j < n; j ++) { // 以此交换第 i 行与第 n-1 行各元素double temp = p[i][j];p[i][j] = p[n - 1][j];p[n - 1][j] = temp;exChange *= -1.0;}}break;}}if (!isZero) return 0; // 行列式最右边一列元素都为零,则行列式为零。for (int i = 0; i < (n - 1); i ++) {// 用第 n-1 行的各元素,将第 i 行最右边元素 p[i][n-1] 变换为 0,// 注意:i 从 0 到 n-2,第 n-1 行的最右边元素不用变换if (p[i][n - 1] != 0) {// 计算第  n-1 行将第 i 行最右边元素 p[i][n-1] 变换为 0的比例double proportion = p[i][n - 1] / p[n - 1][n - 1];for (int j = 0; j < n; j ++) {p[i][j] += p[n - 1][j] * (- proportion);}}}return exChange * p[n - 1][n - 1] * GetLineTran(p, (n - 1));}

算法二:(时间有限,具体原理后期补充)

运用性质3。

public static double GetValue(double[][] p, int n) {if (n == 1)  // 如果是一阶行列式,直接返回该元素return p[0][0];double sum = 0; // 累加求和变量for (int j = 0; j < n; j++) {// 遍历最后一行各元素,p[n - 1][j]int pt = (n - 1) + j;  // 符号判断指数double[][] p1 = new double[n][n];// 此过程是为了把行列式存放到临时数组中,不改变但前行列式for (int row = 0; row < n; row++) {for (int col = 0; col < n; col++) {p1[row][col] = p[row][col];  }}// 此过程,是为了将元素 p[n-1][j] 所在列之后的每一列向前移动一列,为后面获取该元素对应的余子式做准备for (int index = 0; index < n - 1; index++) {for (int index1 = j; index1 < n - 1; index1++) {p1[index][index1] = p1[index][index1 + 1]; }}// 此过程,截取临时数组 p1 左上角 n-1  阶行列式,提取元素 p[n-1][j] 的余子式double[][] temp = new double[n - 1][n - 1];for (int row = 0; row < n - 1; row++) {for (int col = 0; col < n - 1; col++) {temp[row][col] = p1[row][col];}}// 求和:sum += 元素 * 符号 * 余子式// 因为,余子式是去除某一元素所在的行和列之后剩下的元素构成的 n-1 阶行列式// 即,余子式本质还是行列式,所以需要递归求行列式的值sum += p[n - 1][j] * Math.pow(-1, pt) * GetValue(temp, n - 1);// System.out.println(p[n - 1][j] + " * " + Math.pow(-1, pt) + " * " + GetValue(p1, n - 1));}return sum;}

运行效果:

double[][] test = {{1, 2, 3, 4}, {2, 3, 4, 1}, {3, 4, 1, 2}, {4, 1, 2, 3}};The first method's result is : 160.00. Took 20081 nanoseconds.
The second method's result is : 160.00. Took 144583 nanoseconds.

总结:

算法 2 在精度上较好,但计算的阶数有限;运算速度上,算法 1 远远高于算法 2。因此,若求解低阶线性方程组,且要求的计算精度较高,可采用算法 2;若求解高阶线性方程组,可采用算法 1。

行列式求值的两种方法——Java实现相关推荐

  1. 用matlab计算稳态误差,利用Matlab求稳态误差的两种方法.

    利用Matlab求稳态误差的两种方法 摘要:稳态误差是系统控制精度或抗扰动能力的一种度量,它是稳态性能的一个重要指标.本文介绍利用Matlab的控制系统工具箱和Simulink工具箱求取系统误差稳态的 ...

  2. python字典取值_python 字典中取值的两种方法小结

    python 字典中取值的两种方法小结 如下所示: a={'name':'tony','sex':'male'} 获得name的值的方式有两种 print a['name'],type(a['name ...

  3. js获取classname值_利用js获取元素class值的两种方法

    我们有时为了达到某种效果,需要以元素的class值为条件做判断. 我们如何利用JavaScript获取元素class的值?我们先看下面代码: x=document.getElementsByTagNa ...

  4. jmeter提取多个变量的多个值_jmeter用一个正则提取器提取多个值的两种方法

    jmeter中,用json提取器,一次提取多个值,这个很多人都会.但是,用正则提取器一次提取多个,是否可以呢? 肯定,很多人都自信满满的说,可以!形如:token":"(.*?)& ...

  5. datetime 比较_Python 字典中key命中取值的两种方法性能比较!

    起步 从字典中取值有两个方法,一个是先判断key是否在字典中再取值:另一个是包裹try块中直接去取值: Python资源共享群:484031800 def use_in(d, key):if key ...

  6. 交换两个变量的值?两种方法

    ** 交换两个变量的值,两种方式 ①第一种,定义临时变量,用来存放第一个变量的值,再将第二个变量的值赋值给第一个变量,临时变量里面的值赋值给第二个变量,就换过来啦. ②第二种方法,利用两个数之和省去了 ...

  7. java如何获得键值_如何在java中取map中的键值 的两种方法

    第一种方法根据键值的名字取值 import java.util.HashMap; import java.util.Map; public class Test { /** * @param args ...

  8. JAVA中如何取map的值_如何在java中取map中的键值 的两种方法

    第一种方法根据键值的名字取值 import java.util.HashMap; import java.util.Map; public class Test { /** * @param args ...

  9. 【笔试题】求最小公倍数 C++(两种方法)

    题目 本题链接:求最小公倍数 正整数A和正整数B 的最小公倍数是指能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数. 输入描述: 输出描述: 示例1: 解题思路一: 暴力破解 从 ...

最新文章

  1. 程序员的视角:java GC
  2. Vivado IP核生成设置
  3. Django模型 Q对象实现复杂查找
  4. 万亿市场下,电商代运营还需另求“第二曲线”
  5. [原创]Maven实战-读书笔记
  6. 微观经济学如何计算机会成本,【微观经济学】机会成本
  7. 判断三角形是否是直角三角形
  8. java - 条件嵌套
  9. 语言怎么解决扭魔方_吧台高度没留够,怎么坐都变扭,直接加玻璃框没想到也能解决难题...
  10. IDEA添加mybatis-mapper的模板
  11. java static 对象加锁_java安全编码指南之:lock和同步的正确使用
  12. python在工作中怎么用_在Python中调用是如何工作的?
  13. ZigBee-CC2530单片机 - 实现软件自动复位
  14. Javascript搭建selenium测试环境
  15. 电话机上面的接头RJ11
  16. 关于 npm publish问题
  17. HotDB——布式事务数据库中不同数据库表对象的类型设计准测
  18. iOS — 百度地图 使用
  19. faker.js生成手机号
  20. 462 字节 C 代码实现雅虎 logo ACSII 动画

热门文章

  1. 计算机无法识别手机咋解决,我电脑不能识别手机USB端口。怎么办?
  2. 苹果CEO库克试骑小黄车;红外Wi-Fi系统速度达40 Gbps+ | IoT黑板报
  3. 近红外光谱数据分析--数据预处理(多元散射校正 MSC)
  4. 解决网页无法复制粘贴(生活小妙招)
  5. [附源码]Java计算机毕业设计SSM城市道路智能停车管理系统
  6. Family 一词的解释
  7. css兄弟结点选择器,兄弟选择器CSS
  8. 你只要掌握这项技术,我保你年薪30万~
  9. Android 打开拨号界面
  10. [Eclipse] plugin