Eigen求解数学问题(二)

有这样的一个问题:

公司职工问题(特征值与特征向量的应用问题)
某公司为了技术更新,计划对职工实行分批脱产轮训.
已知该公司现有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来求矩阵的特征值和特征向量,从而解决某一类的数学问题。
原创文章 41 获赞 0 访问量 2066

猜你喜欢

转载自blog.csdn.net/qq_21291397/article/details/103385021