大家好,又见面了,我是你们的朋友全栈君。
线性代数行列式求值算的可真是让人CPU疼,但计算机是不累的,所以用一个c++程序帮助你验证求解行列式的值吧。
行列式求值主要有以下这几种思路:
首先再次介绍下余子式和代数余子式:
**我们可以看到行列式展开得到的代数余子式又是一个行列式,这是一个逐步求精的过程。显然可以用递归的方法。 基本算法:
下面给出两种递归的方法:**
代码如下:
double cal(double **det,int n)//det-行列式,n:行列式的阶数
{
double detVal = 0;//行列式的值
if(n == 1)//递归终止条件
return det[0][0];
double **tempdet = new double *[n-1];//用来存储余相应的余子式
for(int i=0;i<n-1;i++)
tempdet[i] = new double[n-1];
for(int i=0;i<n;i++)//第一重循环,行列式按第一行展开
{
for(int j=0;j<n-1;j++)
for(int k=0;k<n-1;k++)
{
if(k <i)
tempdet[j][k]=det[j+1][k] ;
else
tempdet[j][k]=det[j+1][k+1];
}
detVal += det[0][i] * pow(-1.0,i) * cal(tempdet,n-1);
}
return detVal;
}
这一种构建了一个辅助函数,可以更加直观的理解此递归算法
//获得det[i][j]余子式行列式
vector<vector<double> > getComplementMinor(vector<vector<double> > det,int i,int j) ;
//获得行列式det的值
double getDetVal(vector<vector<double> > det);
//获得det[i][j]余子式行列式
vector<vector<double> > getComplementMinor(vector<vector<double> > det,int i,int j)
{
int n=det.size(),m=det[0].size();//n为det的行,m为det的列;
vector<vector<double> > ans(n-1);//保存获得的结果
for(int k=0;k<n-1;k++)
for(int l=0;l<n-1;l++)
{
ans[k].push_back(det[k<i?k:k+1][l<j?l:l+1]);
}
return ans;
}
double getDetVal(vector<vector<double> > det)
{
double ans=0;
int n=det.size(),m=det[0].size();//n为det的行,m为det的列;
if(n != m)
{
cout<<" 您输入的矩阵不是方阵!求么子行列式!";
exit(1);
}
if(det.size() == 1)
return det[0][0];
for(int i=0;i<m;i++)
{
ans+=det[0][i] * pow(-1,i)*getDetVal(getComplementMinor(det,0,i));
}
return ans;
}
#include<bits/stdc++.h>
using namespace std;
double cal(double **det,int n)//det-行列式,n:行列式的阶数
{
double detVal = 0;//行列式的值
if(n == 1)//递归终止条件
return det[0][0];
double **tempdet = new double *[n-1];//用来存储余相应的余子式
for(int i=0;i<n-1;i++)
tempdet[i] = new double[n-1];
for(int i=0;i<n;i++)//第一重循环,行列式按第一行展开
{
for(int j=0;j<n-1;j++)
for(int k=0;k<n-1;k++)
{
if(k <i)
tempdet[j][k]=det[j+1][k] ;
else
tempdet[j][k]=det[j+1][k+1];
}
detVal += det[0][i] * pow(-1.0,i) * cal(tempdet,n-1);
}
return detVal;
}
int main()
{
int n;
cout<<" 输入行列式的阶数:";
cin >> n;//输入行列式的阶数
double **det = new double *[n];//需要动态内存
for(int i=0;i<n;i++)
det[i] = new double[n];
cout<<" 输入行列式:"<<endl;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin >> det[i][j];
cout<<" 该行列式的值为:"<<cal(det,n);
}
第一种方法在精度上较好,但计算的阶数有限;后两者运算速度会比较好。但是本人最近较忙,后两者暂未给出(不要打我)- . -。 做题时用第一种方法完全可以帮你解决线性代数的问题。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128986.html原文链接:https://javaforall.cn