有这样的一个问题:
公司职工问题(特征值与特征向量的应用问题)
某公司为了技术更新,计划对职工实行分批脱产轮训.
已知该公司现有2000人正在脱产轮训,而不脱产职工有10000人.
若每年从不脱产职工中抽调30%的人脱产轮训,同时又有60%
脱产轮训职工结业回到生产岗位.设职工总数不变.试通过矩阵
运算表示第n年职工状况,并据此计算第n年不脱产职工与脱
产职工各多少人.
求解过程:
利用Eigen 求解:
1、在Qt 建立console控制台工程,在.pro 文件中添加 路径引用:`
INCLUDEPATH+=F:\QT\eigen3
2、在.app 文件中添加如下代码:
#include <Eigen/Dense>
#include <Eigen/Eigenvalues>
#include <unsupported/Eigen/MatrixFunctions>
``
3、主要关键代码
using namespace Eigen;
using namespace std;
/*
【例2】 公司职工问题(特征值与特征向量的应用问题)
某公司为了技术更新,计划对职工实行分批脱产轮训.
已知该公司现有2000人正在脱产轮训,而不脱产职工有10000人.
若每年从不脱产职工中抽调30%的人脱产轮训,同时又有60%
脱产轮训职工结业回到生产岗位.设职工总数不变.试通过矩阵
运算表示第n年职工状况,并据此计算第n年不脱产职工与脱
产职工各多少人.
*/
/*
求解:
xn表示第n年不脱产职工人数,
yn表示第n年脱产职工人数,故:
xn+1 = 0.7*xn + 0.6*yn
yn+1 = 0.3*xn + 0.4*yn
令
matrix2d A;
A<<0.7,0.6,
0.3,0.4;
xn =A^n *x0;
*/
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Matrix2d A;
A << 0.7,0.6,0.3,0.4;
cout << "Here is the matrix A:\n" << A << endl;
Vector2d B;
B<<10000,2000;
cout << "Here is the Vetor B:\n" << B << endl;
cout << "Here is a 3x3 matrix, A:" << endl << A << endl << endl;
EigenSolver<Matrix2d> ev(A);
Matrix2d D = ev.pseudoEigenvalueMatrix();
Matrix2d V = ev.pseudoEigenvectors();
cout << "The pseudo-eigenvalue matrix D is:" << endl << D << endl;
cout << "The pseudo-eigenvector matrix V is:" << endl << V << endl;
cout << "Finally, V * D * V^(-1) = " << endl << V * D * V.inverse() << endl;
Matrix2d tn;
for(int i = 0;i<7;i++)
{
tn = V * (D.pow(i)) * V.inverse();
cout << "Finally, Ans = " << endl << tn * B<< endl;
}
return a.exec();
}
输出
总结:
运用Eigen来求矩阵的特征值和特征向量,从而解决某一类的数学问题。