利用矩阵特征值求解多项式的根

2 篇文章 0 订阅

在PnL方法求相机位姿,Point—to—Line方法的点云匹配问题中,会将其中某一个参数的求解建模成求一个多项式的根。如下式所示:

\\ P(x) = \sum_{i=0}^{n} a_{i}x^n = 0                                         (1)

那么求解这样的一个多项式的根应该怎么做呢?参考文献1告诉我们可以利用矩阵特征值方法来求解,下面就简单的记录一下这个方法。

P(x) = a_1x^3 + a_2x^2+a_3x+a_4 = 0             (2)

而矩阵特征值的定义为:

A\textbf{y} = \lambda \textbf{y}                                                           (3)

要将矩阵A的特征值和多项式P(x) 的根联系起来,我们可以假设此时多项式P(x)的根就是矩阵 A阵的特征值,因此有:

A\textbf{y} = x\textbf{y}                                                          (4)

也就是说应该要有一个合理的矩阵A和特征向量y 能将(2)式等价为(4)式。

此时如果令:\textbf{y} = [x^2,x,1]^T,就很容易得到矩阵A了。

A = \begin{bmatrix} a_{11}&a_{12}&a_{13}\\ a_{21}&a_{22}&a_{23}\\ a_{31}&a_{32}&a_{33} \end{bmatrix} \begin{bmatrix} x^2\\x\\1 \end{bmatrix} = x \begin{bmatrix} x^2\\x\\1 \end{bmatrix} \Rightarrow A = \begin{bmatrix} -a_2/a_1&a_{3}/a_1&a_{4}/a_1\\ 1&0&0\\ 0&1&0 \end{bmatrix}           (5)

那么接下来就用简单的代码验证下。

#include <iostream>
#include <Eigen/Core>
#include <Eigen/Geometry>
#include <Eigen/Dense>
#include<unsupported/Eigen/Polynomials>
using namespace std;

int main()
{
    //setting coefficient of polynomial 
    // 9x^4+ 34x^3 + x^2 -100x +201 =0

    Eigen::VectorXf coeffs(5);
    coeffs(4) = 9;
    coeffs(3) = 34;
    coeffs(2) = 0;
    coeffs(1) = 0;
    coeffs(0) = 9;
    Eigen::Matrix4f A;
    A << -coeffs(3)/coeffs(4),-coeffs(2)/coeffs(4),-coeffs(1)/coeffs(4),-coeffs(0)/coeffs(4),
         1,                    0,                    0,                 0,
         0,                    1,                    0,                 0,
         0,                    0,                    1,                 0;
    

    // Slove

    Eigen::EigenSolver<Eigen::MatrixXf> ES(A);
    std::cout << "Roots:\n" << ES.eigenvalues().transpose() << std::endl;
    
    // // Check results
    Eigen::PolynomialSolver<float,4> solve;
    solve.compute(coeffs);
    cout << "Eigen Method:\n" << solve.roots().transpose() << endl;
    return 0;
}

结果如下:

同步更新在:

https://zhuanlan.zhihu.com/p/363946630

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值