Eigen解线性方程组

一. 矩阵分解:

矩阵分解 (decomposition, factorization)是将矩阵拆解为数个矩阵的乘积,可分为三角分解、满秩分解、QR分解、Jordan分解和SVD(奇异值)分解等,常见的有三种:1)三角分解法 (Triangular Factorization),2)QR 分解法 (QR Factorization),3)奇异值分解法 (Singular Value Decompostion)。

  1. LU三角分解:

    三角分解法是将原正方 (square) 矩阵分解成一个上三角形矩阵 或是排列(permuted) 的上三角形矩阵和一个 下三角形矩阵,这样的分解法又称为LU分解法。它的用途主要在简化一个大矩阵的行列式值的计算过程,求 反矩阵,和求解联立方程组。不过要注意这种分解法所得到的上下三角形矩阵并非唯一,还可找到数个不同 的一对上下三角形矩阵,此两三角形矩阵相乘也会得到原矩阵。

    MATLAB以lu函数来执行lu分解法, 其语法为[L,U]=lu(A)。

  2. QR分解:

    QR分解法是将矩阵分解成一个正规正交矩阵与上三角形矩阵,所以称为QR分解法,与此正规正交矩阵的通用符号Q有关。

    MATLAB以qr函数来执行QR分解法, 其语法为[Q,R]=qr(A)。

    3. 奇异值分解:

    奇异值分解 (singular value decomposition,SVD) 是另一种正交矩阵分解法;SVD是最可靠的分解法,但是它比QR 分解法要花上近十倍的计算时间。[U,S,V]=svd(A),其中U和V分别代表两个正交矩阵,而S代表一对角矩阵。 和QR分解法相同, 原矩阵A不必为正方矩阵。使用SVD分解法的用途是解最小平方误差法和数据压缩。

    MATLAB以svd函数来执行svd分解法, 其语法为[S,V,D]=svd(A)。

  3. LLT分解:

    A=LL^T

    Cholesky 分解是把一个对称正定的矩阵表示成一个下三角矩阵L和其转置的乘积的分解。它要求矩阵的所有特征值必须大于零,故分解的下三角的对角元也是大于零的(LU三角分解法的变形)。

    5. LDLT分解法:

    若A为一对称矩阵且其任意一k阶主子阵均不为零,则A有如下惟一的分解形式:

    A=LDL^T

    其中L为一下三角形单位矩阵(即主对角线元素皆为1),D为一对角矩阵(只在主对角线上有元素,其余皆为零),L^T为L的转置矩阵。

    LDLT分解法实际上是Cholesky分解法的改进,因为Cholesky分解法虽然不需要选主元,但其运算过程中涉及到开方问题,而LDLT分解法则避免了这一问题,可用于求解线性方程组。

    二. 代码使用:

<span style="font-size:18px;">
#include <iostream>
#include <Eigen/Dense>
 using namespace std;
using namespace Eigen;
int main()
{
//线性方程求解 Ax =B;
    Matrix4d A;
    A << 2,-1,-1,1,              1,1,-2,1,               4,-6,2,-2,              3,6,-9,7;
Vector4d B(2,4,4,9);
    Vector4d x = A.colPivHouseholderQr().solve(B);
    Vector4d x2 = A.llt().solve(B);
    Vector4d x3 = A.ldlt().solve(B);
    std::cout << "The solution is:\n" << x <<"\n\n"<<x2<<"\n\n"<<x3 <<std::endl;
}
</span>

注意:

我用上面代码计算出来,只有A.colPivHouseholderQr().sole(B),算出来的是正常。其他都是错误,我就先使用这个公式运算吧,等我忙完这一阵子,在来研究一下。

运行结果:

colPivHouseholderQr:
0
-1
-4
-3
llt:
-289.143
448.714
29.9082
3.97959
ldlt:
1.52903
0.1758
-0.340206
0.0423223

除了colPivHouseholderQr、LLT、LDLT,还有以下的函数可以求解线性方程组,请注意精度和速度:解小矩阵(4*4)基本没有速度差别

// Solve Ax = b. Result stored in x. Matlab: x = A \ b.
x = A.ldlt().solve(b));  // A sym. p.s.d.    #include <Eigen/Cholesky>
x = A.llt().solve(b));  // A sym. p.d.      #include <Eigen/Cholesky>
x = A.lu().solve(b));  // Stable and fast. #include <Eigen/LU>
x = A.qr().solve(b));  // No pivoting.     #include <Eigen/QR>
x = A.svd().solve(b));  // Stable, slowest. #include <Eigen/SVD>
// .ldlt() -> .matrixL() and .matrixD()
// .llt()  -> .matrixL()
// .lu()   -> .matrixL() and .matrixU()
// .qr()   -> .matrixQ() and .matrixR()
// .svd()  -> .matrixU(), .singularValues(), and .matrixV()

本文转自 ChenYuanshen 的CSDN 博客 :https://blog.csdn.net/u013354805/article/details/48250547?utm_source=copy

原文地址:https://www.cnblogs.com/ymd12103410/p/9705792.html

时间: 2024-11-09 10:24:47

Eigen解线性方程组的相关文章

高斯消去法解线性方程组(MPI)

用一上午的时间,用MPI编写了高斯消去法解线性方程组.这次只是针对单线程负责一个线程方程的求解,对于超大规模的方程组,需要按行分块,后面会在这个基础上进行修改.总结一下这次遇到的问题: (1)MPI_Allreduce()函数的使用: (2)MPI_Allgather()函数的使用: (3)线程之间不使用通信函数进行值传递(地址传递)是没有办法使用其他线程的数据,这是设计并行程序中最容易忽视的一点. 1 #include "stdio.h" 2 #include "mpi.h

选主元的高斯-约旦(Gauss-Jordan)消元法解线性方程组/求逆矩阵

做数据结构课设时候查的资料,主要是看求逆矩阵方面的知识的. 选主元的高斯-约当(Gauss-Jordan)消元法在很多地方都会用到,例如求一个矩阵的逆矩阵.解线性方程组(插一句:LM算法求解的一个步骤),等等.它的速度不是最快的,但是它非常稳定(来自网上的定义:一个计算方法,如果在使用此方法的计算过程中,舍入误差得到控制,对计算结果影响较小,称此方法为数值稳定的),同时它的求解过程也比较清晰明了,因而人们使用较多.下面我就用一个例子来告诉你Gauss-Jordan法的求解过程吧.顺便再提及一些注

数学-线性代数-#2 用消元法解线性方程组

线性代数-#2 用消元法解线性方程组 #2实现了#1中的承诺,介绍了求解线性方程组的系统方法--消元法. 既然是一种系统的方法,其基本步骤可以概括如下: 1.将方程组改写为增广矩阵: 为了省去传统消元法中反复出现但是没有应用价值的未知数符号和运算符,我们可以将线性方程组表示为增广矩阵的形式,也就是把"Ax=b"中的b附在A右侧; 2.确定第一列中的一个非零元素为主元,以方框框起示之.此元素所在行即为主元行: 一般第n个主元选在第n行.若在进行行变换(交换上下行)后仍没有可供选择的非零元

Matlab应用实例(9)—A\b解线性方程组

说明:A\b用来求解线性方程组,只要写出系数矩阵A和资源向量b,就可以用左除的方法(高斯消元法)得到解.其调用格式为X=A\b. [例1]求下列线性方程组: 解:写成矩阵形式有: 用MATLAB进行求解 主函数: A=[1 -2 3;3 -2 1;1 1 -1]; b=[2;7;1]; X=A\b 解得: X = 1.6250 -1.5000 -0.8750 版权声明:本文为博主原创文章,未经博主允许不得转载.

Eigen学习之简单线性方程与矩阵分解

Eigen提供了解线性方程的计算方法,包括LU分解法,QR分解法,SVD(奇异值分解).特征值分解等.对于一般形式如下的线性系统: 解决上述方程的方式一般是将矩阵A进行分解,当然最基本的方法是高斯消元法. 先来看Eigen 官方的第一个例程: 1 #include <iostream> 2 #include <Eigen/Dense> 3 4 using namespace std; 5 using namespace Eigen; 6 7 int main() 8 { 9 Mat

Eigen: C++开源矩阵计算库

Eigen库被分为一个Core模块和几个附加的模块,每个模块有一个相关的头文件,使用该模块时需要包含该头文件,为了能便利的使用eigen的几个模块,Eigen提供了Dense和Eigen两个头文件,各个头文件和模块如下表 Module Header file Contents Core #include <Eigen/Core> Matrix and Array classes, basic linear algebra (including triangular and selfadjoin

matlab求解线性方程组

模电题现在看来是不用matlab解方程不可做了orz 绝望,各种绝望,平时不努力到了期末季就焦虑得不行. 左除法就好 x=A/b; 如果有符号变量,用syms声明一下就好. 越来越懒了orz好吧,解线性方程组这种毫无技术含量的东西用matlab倒是没啥.但是求积分可不能依赖matlab了,现在我积分水平暴低,简直药丸orz

《Numerical Methods》-chaper7-解线性方程组的直接方法和最小二乘问题

基于我们在线性代数中学习过的知识,我们知道解线性方程组本质上就是Gauss消元,也就是基于增广矩阵A的矩阵初等变换.关于数学层面的内容这里不做过多的介绍,这里的侧重点是从数值计算的角度来看这些常见的问题. 那么基于Gauss消元的算法,我们将会很好理解如下的Matlab代码: for j = 1:n-1 for i = j+1 : n mult = A(i,j)/A(j,j); A(i,:) = A(i,:) – mult*A(j,:);    %这里改写成A(i , j:n) = A(i,j:

[线代笔记]第一章 线性方程组解法

第一章 线性方程组解法 代数学起源于解方程(代数方程) 一元一次.一元二次.一元三次.一元四次都有求根公式(通过系数进行有限次加.减.乘.除.乘方.开方得到解),一元五次以上方程就不再有求根公式了(近世代数) 二元一次方程组.三元一次方程组.…….n元一次方程组(线性代数研究对象) 高等代数——线性代数+多项式理论 1. 线性方程组的同解变形.线性组合.初等变换.消去法 例1 同解变形:用3种同解变形必可化方程组为阶梯型 交换两个方程位置 用非0的数c乘某个方程两边 用某个方程的k倍加到另一个方