[C++] 计算行列式的若干种方法 您所在的位置:网站首页 lapack计算行列式 [C++] 计算行列式的若干种方法

[C++] 计算行列式的若干种方法

2023-06-30 09:44| 来源: 网络整理| 查看: 265

计算行列式的三种方法 测试样例按行(列)展开法计算结果 高斯消元转化为上三角阵计算结果尝试引入permutation operation尝试使用分数运算 定义法代码测试结果 有问题欢迎提出

测试样例

10 1 3 4 0 2 0 4 -5 9 3 6 7 8 5 2 7 8 4 6 2 8 7 6 9 8 7 6 8 45 2 4 3 2 5 4 3 2 8 6 4 1 2 0 4 1 2 3 9 87 6 5 6 7 8 5 6 8 6 8 1 9 8 7 6 9 8 7 -9 2 3 5 6 3 5 4 1 8 7 9 2 -9 8 6 2 4 56 6 3 8 9 5 3 6 8 6 6 1 8 2 3 答案:7583304

按行(列)展开法

d e t ( A n ∗ n ) = ∑ j = 1 n a i j A i j , ( i = 1 , 2 , . . . , n ) det(A_{n*n}) = \sum\limits_{j=1}^na_{ij}A_{ij},(i=1,2,...,n) det(An∗n​)=j=1∑n​aij​Aij​,(i=1,2,...,n) 或 d e t ( A n ∗ n ) = ∑ i = 1 n a i j A i j , ( j = 1 , 2 , . . . , n ) det(A_{n*n}) = \sum\limits_{i=1}^na_{ij}A_{ij},(j=1,2,...,n) det(An∗n​)=i=1∑n​aij​Aij​,(j=1,2,...,n)

#include #include using namespace std; //构造第一行第line个元素的余子式 void StructMinor(double* matrix, int dimension, int line, double* minor){ int ptr=0; for(int cnt1=1; cnt1 //构造matrix[0][cnt]的余子式 StructMinor(matrix, dimension, cnt, minor); //determinant=ΣELEMENT0j*A0j determinant += sign*matrix[cnt]*Determinant(minor, dimension-1); sign *= -1; } return determinant; } int main(){ int dimension; int scale; double matrix[100]; ifstream input("matrix.txt"); input >> dimension; scale = dimension*dimension; for(int cnt=0; cnt> matrix[cnt]; cout double determinant=1; GaussElimination2UTM(matrix, dimension); //上三角阵对角线乘积即为行列式 for(int cnt=0; cnt double sign=1; double temp; for(int cnt1=0; cnt1 if(abs(matrix[cnt1*dimension+cnt1])>1e-3) break; for(int cnt3=0; cnt3 double determinant=1; determinant=GaussElimination2UTM(matrix, dimension); for(int cnt=0; cnt public: long long numerator; long long denominator; }; using namespace std; rationalnumber ReductionOfFraction(rationalnumber A){ bool sign; long long gcd, mod, temp; rationalnumber result; if(A.numerator == 0){ result.numerator = 0; result.denominator = 1; } else{ if(sign = (A.numerator temp = A.numerator>A.denominator?A.numerator:A.denominator; gcd = A.numerator rationalnumber result; result.numerator = -A.numerator; result.denominator = A.denominator; return result; } rationalnumber AdditionOfFraction(rationalnumber A, rationalnumber B){ rationalnumber result; result.numerator = A.numerator*B.denominator + B.numerator*A.denominator; result.denominator = A.denominator * B.denominator; result=ReductionOfFraction(result); return result; } rationalnumber MultiplicationOfFraction(rationalnumber A, rationalnumber B){ rationalnumber result; result.numerator = A.numerator * B.numerator; result.denominator = A.denominator * B.denominator; result=ReductionOfFraction(result); return result; } rationalnumber DivisionOfFraction(rationalnumber A, rationalnumber B){ rationalnumber result; result.numerator = A.numerator * B.denominator; result.denominator = A.denominator * B.numerator; result=ReductionOfFraction(result); return result; } //通过高斯消元法化矩阵为upper triangle matrix void GaussElimination2UTM(rationalnumber* matrix, int dimension){ //注意cnt3一定要从矩阵最右侧运算至左侧,否则主元列对应元素归零,运算就无法正常进行 for(int cnt1=0; cnt1 int dimension; int scale; double fraction; rationalnumber determinant; rationalnumber matrix[100]; ifstream input("matrix.txt"); input >> dimension; scale = dimension*dimension; for(int cnt=0; cnt double result; //递归基,在递归树的叶子返回定义的求和式的其中一项 if(depth>=dimension){ result = sign; for(int cnt=0; cnt //交换 temp = permutation[depth]; permutation[depth] = permutation[cnt]; permutation[cnt] = temp; //计算此情况下所有值之和 result += Determinant(depth+1, -1*sign); //换回 temp = permutation[depth]; permutation[depth] = permutation[cnt]; permutation[cnt] = temp; } } return result; } int main(){ int scale; ifstream input("matrix.txt"); input >> dimension; for(int cnt=0; cnt matrix[cnt]; cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有