Lanczos算法输入:对称矩阵A输出:正交阵P,对称三对角阵S(只有对角线和对角线上下两个次对角线的元素非0),满足A=PSP'在对称阵进行特征值分解时,如果只求最大的几个特征值和特征向量,那么lanczos方法将非常好用。因为此时不需要完全求出P,只需要求出P的前几列就可以。
接着求解S的特征值分解:S=Q D Q',(D为对角阵,Q为正交阵),最后得到A的特征值分解:A=PQ D (PQ)'现在来看看复杂度,假设我们要求A的最大的r个特征值,一般来说,当r比较大时只需要求出P的前1.5*r列,此时注意到S为1.5*r的三对角阵,远远小于A的大小,所以其特征值分解会很快。
这就是lanczos算法的优点所在。
模态提取方法有Block Lanczos法,Subspace法,powerDynamics法,reduced法,unsymmetric法,damped法。这些方法都代表什么意思,有什么不同? 1. 分块Lanczos法特征值求解器是却省求解器,它采用Lanczos算法,是用一组向量来实现Lanczos递归计算。
这种方法和子空间法一样精确,但速度更快。
无论EQSLV命令指定过何种求解器进行求解,分块Lanczos法都将自动采用稀疏矩阵方程求解器。2. 子空间法使用子空间迭代技术,它内部使用广义Jacobi迭代算法。由于该方法采用完整的刚度和质量矩阵,因此精度很高,但是计算速度比缩减法慢。这种方法经常用于对计算精度要求高,但无法选择主自由度(DOF)的情形。
3. PowerDynamics法内部采用子空间迭代计算,但采用PCG迭代求解器。这种方法明显地比子空间法和分块Lanczos法快。但是,如果模型中包含形状较差的单元或病态矩阵时可能出现不收敛问题。
该法特别适用于求解超大模型(大于100,000个自由度)的起始少数阶模态。谱分析不要使用该方法提取模态。4.缩减法采用HBI算法(Householder-二分-逆迭代)来计算特征值和特征向量。
由于该方法采用一个较小的自由度子集即主自由度(DOF)来计算,因此计算速度更快。主自由度(DOF)导致计算过程中会形成精确的刚度矩阵和近似的质量矩阵(通常会有一些质量损失)。因此,计算结果的精度将取决于质量阵的近似程度,近似程度又取决于主自由度的数目和位置。
5. 非对称法也采用完整的刚度和质量矩阵,适用于刚度和质量矩阵为非对称的问题(例如声学中流体-结构耦合问题)。此法采用Lanczos算法,如果系统是非保守的(例如轴安装在轴承上),这种算法将解得复数特征值和特征向量。特征值的实部表示固有频率,虚部是系统稳定性的量度─负值表示系统是稳定的,而正值表示系统是不稳定的。该方法不进行Sturm序列检查,因此有可能遗漏一些高频端模态。
6. 阻尼法用于阻尼不能被忽略的问题,如转子动力学研究。该法使用完整矩阵(刚度、质量及阻尼矩阵)。阻尼法采用Lanczos算法并计算得到复数特征值和特征向量。此法不能用Sturm序列检查。
因此,有可能遗漏所提取频率的一些高频端模态。
概况这是一段Lanczos算法的程序。Lanczos算法是一种将矩阵通过正交相似变换变成对称三对角矩阵的算法,可用于求方阵的特征值和特征向量或一般矩阵的奇异值分解,以20世纪匈牙利数学家CorneliusLanczos命名。
A代表任意一个需要三对角化的矩阵,b是任意一个向量,且b的行数与A的列数相同因为要用到v = A*q;nmax是你想要得到的矩阵的大小,例如nmax=12,最后得到12*12的三对角矩阵。
在 ANSYS 中有以下几种提取模态的方法: (1) Block Lanczos 法 (2) 子空间法(3) PowerDynamics 法 (4) 减缩法 (5) 不对称法(6) 阻尼法使用何种模态提取方法主要取决于模型大小(相对于计算机的计算能力而言)和具体的应用场合。(1) Block Lanczos 法Block Lanczos 法可以在大多数场合中使用:- 是一种功能强大的方法,当提取中型到大型模型(50,000 ~ 100,000 个自由度)的大量振型时(40+),这种方法很有效;- 经常应用在具有实体单元或壳单元的模型中;- 在具有或没有初始截断点时同样有效。
(允许提取高于某个给定频率的振型);- 可以很好地处理刚体振型;- 需要较高的内存。
(2) 子空间法子空间法比较适合于提取类似中型到大型模型的较少的振型 (<40)- 需要相对较少的内存;- 实体单元和壳单元应当具有较好的单元形状,要对任何关于单元形状的警告信息予以注意;- 在具有刚体振型时可能会出现收敛问题;- 建议在具有约束方程时不要用此方法。(3) PowerDynamics 法PowerDynamics 法适用于提取很大的模型(100.000个自由度以上)的较少振型(<20)。这种方法明显比Block Lanczos 法或子空间法快,但是:- 需要很大的内存;- 当单元形状不好或出现病态矩阵时,用这种方法可能不收敛;- 建议只将这种方法作为对大模型的一种备用方法。注: PowerDynamics 方法- 子空间技术使用 Power 求解器 (PCG) 和 一致质量矩阵;- 不执行 Sturm 序列检查 (对于遗漏模态); 它可能影响多个重复频率的模型;- 一个包含刚体模态的模型, 如果你使用 PowerDynamics 方法,必须执行 RIGID 命令 (或者在分析设置对话框中指定RIGID 设置)。
(4) 减缩法如果模型中的集中质量不会引起局部振动,例如象梁和杆那样,可以使用缩减法:- 它是所有方法中最快的;- 需要较少的内存和硬盘空间;- 使用矩阵缩减法,即选择一组主自由度来减小[K] 和 [M] 的大小;- 缩减[的刚度矩阵 [K] 是精确的,但缩减的质量矩阵 [M] 是近似的,近似程度取决于主自由度的数目和位置;- 在结构抵抗弯曲能力较弱时不推荐使用此方法,如细长的梁和薄壳。注意:选择主自由度的原则。 (5) 不对称法不对称法适用于声学问题(具有结构藕合作用)和其它类似的具有不对称质量矩阵[M]和刚度矩阵[K] 的问题:- 计算以复数表示的特征值和特征向量* 实数部分就是自然频率* 虚数部分表示稳定性,负值表示稳定,正值表示不确定注意: 不对称方法采用 Lanczos 算法,不执行 Sturm 序列检查,所以遗漏高端频率。
(6) 阻尼法在模态分析中一般忽略阻尼,但如果阻尼的效果比较明显,就要使用阻尼法:- 主要用于回转体动力学中,这时陀螺阻尼应是主要的;- 在 ANSYS 的 BEAM4 和 PIPE16单元中,可以通过定义实常数中的 SPIN(旋转速度,弧度/秒)选项来说明陀螺效应;- 计算以复数表示的特征值和特征向量。* 虚数部分就是自然频率;* 实数部分表示稳定性,负值表示稳定,正值表示不确定。
姓名:刘保阔 学号:19021210887 转自:https://www.cnblogs.com/tianqizhi/p/9745913.html 【嵌牛导读】 奇异值分解(Singular Value Decomposition)是 矩阵论 中一种重要的 矩阵 分解,奇异值分解则是 特征 分解在任意矩阵上的推广。在 信号处理 、 统计学 等领域有重要应用。
【嵌牛正文】 一、奇异值与特征值基础知识: 特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法。
两者有着很紧密的关系,我在接下来会谈到,特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征。先谈谈特征值分解吧: 1)特征值: 如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式: 这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。特征值分解是将一个矩阵分解成下面的形式: 其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值。我这里引用了一些参考文献中的内容来说明一下。
首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。比如说下面的一个矩阵: 它其实对应的线性变换是下面的形式: 因为这个矩阵M乘以一个向量(x,y)的结果是: 上面的矩阵是对称的,所以这个变换是一个对x,y轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值>1时,是拉长,当值<1时时缩短),当矩阵不是对称的时候,假如说矩阵是下面的样子: 它所描述的变换是下面的样子: 这其实是在平面上对一个轴进行的拉伸变换(如蓝色的箭头所示),在图中,蓝色的箭头是一个最主要的变化方向(变化方向可能有不止一个),如果我们想要描述好一个变换,那我们就描述好这个变换主要的变化方向就好了。反过头来看看之前特征值分解的式子,分解得到的Σ矩阵是一个对角阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)。
当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,这个线性变化可能没法通过图片来表示,但是可以想象,这个变换也同样有很多的变换方向,我们通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)。也就是之前说的:提取这个矩阵最重要的特征。
总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。不过,特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。 2)奇异值: 下面谈谈奇异值分解。
特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的,在现实的世界中,我们看到的大部分矩阵都不是方阵,比如说有N个学生,每个学生有M科成绩,这样形成的一个N * M的矩阵就不可能是方阵,我们怎样才能描述这样普通的矩阵呢的重要特征呢?奇异值分解可以用来干这个事情,奇异值分解是一个能适用于任意的矩阵的一种分解的方法: 假设A是一个N * M的矩阵,那么得到的U是一个N * N的方阵(里面的向量是正交的,U里面的向量称为左奇异向量),Σ是一个N * M的矩阵(除了对角线的元素都是0,对角线上的元素称为奇异值),V’(V的转置)是一个N * N的矩阵,里面的向量也是正交的,V里面的向量称为右奇异向量),从图片来反映几个相乘的矩阵的大小可得下面的图片 那么奇异值和特征值是怎么对应起来的呢?首先,我们将一个矩阵A的转置 * A,将会得到一个方阵,我们用这个方阵求特征值可以得到:这里得到的v,就是我们上面的右奇异向量。此外我们还可以得到: 这里的σ就是上面说的奇异值,u就是上面说的左奇异向量。奇异值σ跟特征值类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r大的奇异值来近似描述矩阵,这里定义一下部分奇异值分解: r是一个远小于m、n的数,这样矩阵的乘法看起来像是下面的样子: 右边的三个矩阵相乘的结果将会是一个接近于A的矩阵,在这儿,r越接近于n,则相乘的结果越接近于A。
而这三个矩阵的面积之和(在存储观点来说,矩阵面积越小,存储量就越小)要远远小于原始的矩阵A,我们如果想要压缩空间来表示原矩阵A,我们存下这里的三个矩阵:U、Σ、V就好了。 二、奇异值的计算: 奇异值的计算是一个难题,是一个O(N^3)的算法。在单机的情况下当然是没问题的,matlab在一秒钟内就可以算出1000 * 1000的矩阵的所有奇异值,但是当矩阵的规模增长的时候,计算的复杂度呈3次方增长,就需要并行计算参与了。Google的吴军老师在数学之美系列谈到SVD的时候,说起Google实现了SVD的并行化算法,说这是对人类的一个贡献,但是也没有给出具体的计算规模,也没有给出太多有价值的信息。
其实SVD还是可以用并行的方式去实现的,在解大规模的矩阵的时候,一般使用迭代的方法,当矩阵的规模很大(比如说上亿)的时候,迭代的次数也可能会上亿次,如果使用Map-Reduce框架去解,则每次Map-Reduce完成的时候,都会涉及到写文件、读文件的操作。个人猜测Google云计算体系中除了Map-Reduce以外应该还有类似于MPI的计算模型,也就是节点之间是保持通信,数据是常驻在内存中的,这种计算模型比Map-Reduce在解决迭代次数非常多的时候,要快了很多倍。 Lanczos迭代 就是一种解对称方阵部分特征值的方法(之前谈到了,解A’* A得到的对称方阵的特征值就是解A的右奇异向量),是将一个对称的方程化为一个三对角矩阵再进行求解。按网上的一些文献来看,Google应该是用这种方法去做的奇异值分解的。
请见Wikipedia上面的一些引用的论文,如果理解了那些论文,也“几乎”可以做出一个SVD了。 由于奇异值的计算是一个很枯燥,纯数学的过程,而且前人的研究成果(论文中)几乎已经把整个程序的流程图给出来了。更多的关于奇异值计算的部分,将在后面的参考文献中给出,这里不再深入,我还是focus在奇异值的应用中去。
三、奇异值与主成分分析(PCA): 主成分分析在上一节里面也讲了一些,这里主要谈谈如何用SVD去解PCA的问题。PCA的问题其实是一个基的变换,使得变换后的数据有着最大的方差。方差的大小描述的是一个变量的信息量,我们在讲一个东西的稳定性的时候,往往说要减小方差,如果一个模型的方差很大,那就说明模型不稳定了。
但是对于我们用于机器学习的数据(主要是训练数据),方差大才有意义,不然输入的数据都是同一个点,那方差就为0了,这样输入的多个数据就等同于一个数据了。以下面这张图为例子: 这个假设是一个摄像机采集一个物体运动得到的图片,上面的点表示物体运动的位置,假如我们想要用一条直线去拟合这些点,那我们会选择什么方向的线呢?当然是图上标有signal的那条线。如果我们把这些点单纯的投影到x轴或者y轴上,最后在x轴与y轴上得到的方差是相似的(因为这些点的趋势是在45度左右的方向,所以投影到x轴或者y轴上都是类似的),如果我们使用原来的xy坐标系去看这些点,容易看不出来这些点真正的方向是什么。但是如果我们进行坐标系的变化,横轴变成了signal的方向,纵轴变成了noise的方向,则就很容易发现什么方向的方差大,什么方向的方差小了。
一般来说,方差大的方向是信号的方向,方差小的方向是噪声的方向,我们在数据挖掘中或者数字信号处理中,往往要提高信号与噪声的比例,也就是信噪比。对上图来说,如果我们只保留signal方向的数据,也可以对原数据进行不错的近似了。 PCA的全部工作简单点说,就是对原始的空间中顺序地找一组相互正交的坐标轴,第一个轴是使得方差最大的,第二个轴是在与第一个轴正交的平面中使得方差最大的,第三个轴是在与第1、2个轴正交的平面中方差最大的,这样假设在N维空间中,我们可以找到N个这样的坐标轴,我们取前r个去近似这个空间,这样就从一个N维的空间压缩到r维的空间了,但是我们选择的r个坐标轴能够使得空间的压缩使得数据的损失最小。
还是假设我们矩阵每一行表示一个样本,每一列表示一个feature,用矩阵的语言来表示,将一个m * n的矩阵A的进行坐标轴的变化,P就是一个变换的矩阵从一个N维的空间变换到另一个N维的空间,在空间中就会进行一些类似于旋转、拉伸的变化。 而将一个m * n的矩阵A变换成一个m * r的矩阵,这样就会使得本来有n个feature的,变成了有r个feature了(r 可以看出,其实PCA几乎可以说是对SVD的一个包装,如果我们实现了SVD,那也就实现了PCA了,而且更好的地方是,有了SVD,我们就可以得到两个方向的PCA,如果我们对A’A进行特征值的分解,只能得到一个方向的PCA。 四、奇异值与潜在语义索引LSI: 潜在语义索引(Latent Semantic Indexing)与PCA不太一样,至少不是实现了SVD就可以直接用的,不过LSI也是一个严重依赖于SVD的算法,之前吴军老师在 矩阵计算与文本处理中的分类问题 中谈到: “三个矩阵有非常清楚的物理含义。第一个矩阵X中的每一行表示意思相关的一类词,其中的每个非零元素表示这类词中每个词的重要性(或者说相关性),数值越大越相关。 最后一个矩阵Y中的每一列表示同一主题一类文章,其中每个元素表示这类文章中每篇文章的相关性。中间的矩阵则表示类词和文章雷之间的相关性。因此,我们只要对关联矩阵A进行一次奇异值分解,。