Eigen求解数学问题(一)

有这样的一个问题:

三个朋友A,B,C各饲养家禽,A养鸡,B养鸭,C养兔.
他们同意按照下面的比例分享各人饲养的家禽:
A得鸡的1/3,鸭的1/3,兔的1/4;
B得鸡的1/6,鸭的1/3,兔的1/2;
C得鸡的1/2,鸭的1/3,兔的1/4;

要求他们分享家禽之后所获得的收益与他们各自饲养家禽的
收益相等.同时各户的最高收益是二千元,则每户确定他们各
自的收益是多少?要求:
(1)列出问题的数学模型,并算出最终他们三人应得的收益;
(2)试写出相应的Eigen求解代码.

求解过程:

根据协议中每人分享饲养后总收益与各自饲养相等的原则,
分别考虑A、B及C的总收益.设他们三人应得收益分别为x1,x2,x3

在这里插入图片描述
在这里插入图片描述
尽管这一问题是在方程组的无穷多组解中寻求解答,但是由
于题目条件限制,对于参数k,没有更多的选择余地.
为了确定满足条件,x3=2000,故取k=2000,得:
x1 =1743, x2 = 1928, x3 = 2000
即他们三人的收益各自是1743元,1928元,2000元.

利用Eigen 求解:

1、在Qt 建立console控制台工程,在.pro 文件中添加 路径引用:INCLUDEPATH+=C:\Qt\Qt5.13.2\Tools\eigen\Eigen;

2、在.app 文件中添加如下代码:

#include<math.h>
#include <Eigen>
#include<iostream>
using namespace Eigen;
using namespace std;

3、主要关键代码:

/*

三个朋友A,B,C各饲养家禽,A养鸡,B养鸭,C养兔.
他们同意按照下面的比例分享各人饲养的家禽:
A得鸡的1/3,鸭的1/3,兔的1/4;
B得鸡的1/6,鸭的1/3,兔的1/2;
C得鸡的1/2,鸭的1/3,兔的1/4;

要求他们分享家禽之后所获得的收益与他们各自饲养家禽的
收益相等.同时各户的最高收益是二千元,则每户确定他们各
自的收益是多少?要求:
(1)列出问题的数学模型,并算出最终他们三人应得的收益;
(2)试写出相应的Eigen求解代码.

求解:
将三个等式联立,可得描述实际问题的方程组.

1/3 *x1 + 1/3 *x2 + 1/4 *x3  = x1
1/6 *x1 + 1/3 *x2 + 1/2 *x3  = x2
1/2 *x1 + 1/3 *x2 + 1/4 *x3  = x3

即:
 -2/3 *x1 + 1/3 *x2 + 1/4 *x3 = 0
1/6 *x1 - 2/3 *x2 + 1/2 *x3  = 0
1/2 *x1 + 1/3 *x2 - 3/4 *x3  = 0
d

*/


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);



    MatrixXd mat(3,3);
    Vector3d b ;
    mat << -2/3.0, 1.0/3, 1.0/4,
            1.0/6, -2.0/3, 1.0/2,
            1.0/2, 1.0/3, -3.0/4;
    cout << "Here is the matrix mat:\n" << mat << endl;
    // This assignment shows the aliasing problem
 //   mat.bottomRightCorner(2,2) = mat.topLeftCorner(2,2);
 //   cout << "After the assignment, mat = \n" << mat << endl;

   b << 0, 0, 0;

   //mat.nul;

   FullPivLU<MatrixXd> lu(mat);
   MatrixXd A_null_space = lu.kernel();  //求零空间

   MatrixXd::Index maxRow,maxCol;       //定义变量

   cout << "The A_null_space is:\n" << A_null_space<< endl;   //输出零空间向量

   A_null_space.maxCoeff(&maxRow,&maxCol);   //获取最大向量

   MatrixXd Xn = 2000/(A_null_space(maxRow,maxCol)) * A_null_space; 

    cout << "The Xn is:\n" << Xn<< endl;  // 输出求解。
    
    return a.exec();
}

输出

在这里插入图片描述

总结:

 Eigen是C++中可以用来调用并进行矩阵计算的一个库,简单了说它就是一个c++版本的matlab包。

最近项目开发中要用到矩阵的相关操作,找了些相关的数学问题来具体操作练练,这样的学习或许可以比较快的掌握Eigen库。
Eigen中提供了求解线性方程组的各种分解方法,但是对零空间向量的求解笔者也是费尽周折在琢磨出来。
  在学习Eigen库的过程中,除了对官方手册进行比较的中文注释外,我想最重要的还是莫过于多练习了。顺便可以将线性相关的数学内容温习温习。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值