使用Eigen库求解Ax=b(高斯消元法,Cholesky,QR分解)

        Eigen(http://eigen.tuxfamily.org)是常⽤的 C++ 矩阵运算库,具有很⾼的运算效率。⼤部分
需要在 C++ 中使⽤矩阵运算的库,都会选⽤ Eigen 作为基本代数库,例如 Google Tensorflow, Google,Ceres, GTSAM 等。本次习题,你需要使⽤ Eigen 库,编写程序,求解⼀个线性⽅程组。为此,你需要先了解⼀些有关线性⽅程组数值解法的原理。


1. 在什么条件下, x 有解且唯⼀?

        在求解Ax=b时,x有解且唯一的条件是矩阵A为满秩矩阵(即行满秩或列满秩)。如果A不满秩,则方程组可能无解或有多个解。


2. ⾼斯消元法的原理是什么?

        

        高斯消元法是求解线性方阵组的一种算法,它也可用来求矩阵的秩,以及求可逆方阵的逆矩阵。它通过逐步消除未知数来将原始线性系统转化为另一个更简单的等价的系统。它的实质是通过初等行变化,将线性方程组的增广矩阵转化为行阶梯矩阵.说白了就是将原始矩阵化为阶梯矩阵从而易于求解,也是最简单的求解线性方程组的算法

        代码见以下链接:

高斯消元解线性方程组----C++实现_c++用高斯消元法解线性方程组-CSDN博客

3. QR 分解的原理是什么?

QR分解实质上是将一个实方阵分解为一个正交矩阵和上三角矩阵的积

A=QR

其中Q为正交矩阵,R为上三角矩阵

QR分解有三种较常用的方法:Gram Schmidt正交化、Householder变换,Givens变换(初等旋转变换)详细原理见以下链接:QR分解的三种方法和实现过程_qr分解的步骤-CSDN博客

4. Cholesky 分解的原理是什么?

Cholesky分解的实质是将一个实矩阵分解为一个上三角矩阵和一个下三角矩阵之积

A=LL^{T}

具体分解方法有两种一种是直接Cholesky 分解,一种是分块Cholesky 分解,前者较为简单,类似于直接设未知数求解,后者将每个矩阵分为四块进行求解,详情见链接:三十分钟理解:矩阵Cholesky分解,及其在求解线性方程组、矩阵逆的应用_cholesky分解法求解线性方程组-CSDN博客

5. 编程实现 A 为 100 × 100 随机矩阵时,⽤ QR 和 Cholesky 分解求 x 的程序。你可以参考本次课
⽤到的 useEigen 例程。

代码如下:

#include <iostream>
#include<ctime>
#include<Eigen/Core>
#include<Eigen/Dense>
using namespace std;

int main(int, char**){
    Eigen::Matrix<double,100,1>matrix_N1;
    matrix_N1=Eigen::MatrixXd::Random(100,1);
    Eigen::Matrix<double,100,100>A;
    Eigen::Matrix<double,100,1>x1;
    Eigen::Matrix<double,100,1>x2;
    //QR分解
    clock_t time_stt=clock();//first
    A=Eigen::MatrixXd::Random(100,100);
    x1=A.colPivHouseholderQr().solve(matrix_N1);
    cout<<"QR分解所用时间为:"<<1000*(clock()-time_stt)/(double)CLOCKS_PER_SEC<<"ms"<<endl;
    //Cholesky分解
    time_stt=clock();//second
    x2=A.llt().solve(matrix_N1);
    cout<<"Cholesky分解所用时间为:"<<1000*(clock()-time_stt)/(double)CLOCKS_PER_SEC<<"ms"<<endl;
    return 0;
}

运行结果:

QR分解时间为Cholesky的两倍以上。

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值