矩阵算法

矩阵算法
矩阵算法

矩阵及其基本算法计13 刘汝佳矩阵及其基本算法矩阵的表示矩阵的基本运算小结和应用举例一、矩阵的表示矩阵在形式上最直接的表示是一个二维数组,但是在一些特殊的场合中,我们需要引入一些特殊的方法来表示一些特殊的矩阵。在本节中,大家还将了解到以下几种表示方法: 还将了解到以下几种表示方法: 三角矩阵的压缩表示法稀疏矩阵的三元组表示法稀疏矩阵的十字链表表示法矩阵的二维数组表示法我们用二维数组很容易表示一个矩阵。加上矩阵的维数M 我们用二维数组很容易表示一个矩阵。加上矩阵的维数M 和N,我们可以定义一个我们可以定义一个TMatrix结构: 结构: struct TMatrix { int n,m; int numbers[MAXN+1][MAXN+1]; }; 这就是矩阵的二维数组表示法。怎么样,容易吧?这就是矩阵的二维数组表示法。怎么样,容易吧?三角矩阵的压缩表示(1) 三角矩阵的压缩表示N阶上三角矩阵,对称矩阵和反对称矩阵都只需要储存主对角线以上的共(N+1)*N/2个元素。N+1)*N/2个元素。因此,我们可以用一个大小为( 因此,我们可以用一个大小为(N+1)*N/2 的一维数组来表示。不过,我们需要一个公式,把每个元素原来的位置(i,j)映射到一维数组的下标k 原来的位置(i,j)映射到一维数组的下标k。三角矩阵的压缩表示(2) 三角矩阵的压缩表示我们从上到下,从左到右地储存各个元素,如下图:?a11 a12 a13 a14 ? ?

a a a ? 22 23 24 ? ? ? a33 a34 ? ? ? a44 ? ? i ?1 l =1 ?a1 a2 a3 a4 ? ? a a a ? 5 6 7 ? ? ? a8 a9 ? ? ? a10 ? ? Aij前面的数的个数为:(n ? l + 1) + ( j ? 1) ∑ 计算得: 计算得: 1 k = (2n ? i + 2)(i ? 1) + j 2 稀疏矩阵在前面的二维数组表示法中,我们表示一个N*M的矩阵需要N*M个内存单元。一个N*M的矩阵需要N*M个内存单元。如果已知矩阵中存在着大量的0 如果已知矩阵中存在着大量的0元素,那么这种表示方法是很浪费空间的。由于非零元素的个数L 由于非零元素的个数L十分有限,我们可以只储存下这L 以只储存下这L个元素的位置和大小,占用的空间便会少得多。稀疏矩阵的三元组表示法显然,表示稀疏矩阵最直接的方法就是仅记录下非零元素的个数L和这L 仅记录下非零元素的个数L和这L个元素的位置(row,col)和大小(value),的位置(row,col)和大小(value),即下面这个结构:struct TMatrix2 { int l; int row[MAXL],col[MAXL],value[MAXL]; }; 稀疏矩阵的十字链表表示(1) 稀疏矩阵的十字链表表示三元组表示法比较好的解决了稀疏矩阵的空间存储问题,却忽视了稀疏矩阵可能进行了一些基本操作。考虑两个稀疏矩阵A考虑两个稀疏矩阵A和B相加的问题。对于运算结果矩阵C来说,可能会因为正负抵消而产生出很多新的零元素和非零元素,导致三元组需要进行一些插入和删除操作。当这些操作很频繁的时候,程序的速度会明显变慢。在某些特定情况下,我们需要对元素进行检索,由于三元组的元素之间联系并不紧密,所以检索很不方便。稀疏矩阵的十字链表表示(2) 稀疏矩阵的十字链表表示为了加强同一行和同一列之间元素的联系,我们把每一行分别做成一个链表,把每一列也分别做成一个链表。通过对链表的遍历,我们可以很方便的按顺序访问到某一特定行或列的所有元素。插入和删除操作也很方便。这样,我们了建立一种十字型的链表结构,每个结点有上,下,左,右四个指针和自身的位置坐标,大小共7 置坐标,大小共7个域。稀疏矩阵的十字链表表示(3) 稀疏矩阵的十字链表表示结点类型如下定义:struct Tnode { int row, col; int value; Tnode *left, *right, *up, *down; }; row,col分别为该非零元素的位置,value为它的值。row,col分别为该非零元素的位置,value为它的值。left,right,up,down 分别为指向四个方向的后继元素。left,right,up,down分别为指向四个方向的后继元素。稀疏矩阵的十字链表表示(4) 稀疏矩阵的十字链表表示为了方便的找到每一个包含非零元素的行和列,我们把所有行串在一起,组成一个行链表,把所有列也串在一起,组成一个列链表。像这样:struct TRow { int RowNo; TNode * firstnode; }; struct TCol { int ColNo; TNode * firstnode; }; 矩阵表示方法小结矩阵的表示方法和应用是分不开的。我们衡量一种表示方法的优劣,需要从不同的角度进行分析。适用范围空间需求量基本操作的时间消耗实现的难易程度以上几种方法都在某些方面表现良好而其他方面不够理想,因此我们

需要根据实际需要的侧重点不同,选择合适的表示方法二、矩阵的基本运算矩阵的判重矩阵的线性运算矩阵的转置矩阵乘法矩阵的判重在二维数组表示法中,我们可以用一个二重循环判断两个矩阵是否相等。在三元组表示方法中,我们如果保证非零元素是按照从上到下,从左到右的顺序储存的,则可以用一个循环直接判断。但如果不能保证,则需要二重循环。因此在未加说明的情况下,三元组表示法均需要按顺序保存各个元素。在十字链表表示方法中,我们需要依次遍历每一个非零行(或者列)。矩阵的线性运算矩阵的数乘: 矩阵的数乘: B=kA在任何一种表示法中,我们都可以通过遍历所有元素的方法完成数乘运算。矩阵的加法: 矩阵的加法: C=A+B 在二维数组表示法中,我们可以通过二重循环来进行矩阵加法在稀疏矩阵中,注意到结果中的非零元素所在的位置必对应A位置必对应A或B中的一个非零元素,所以加法运算不会在A算不会在A和B中原非零元素之外的其他位置上生成新的非零元素。矩阵的线性运算(2) 矩阵的线性运算考虑三元组表示法中的矩阵加法。由于都需要按顺序储存各个元素,我们应当按顺序对每个A按顺序对每个A或B中非零的位置做加法。下面有一个例子:?1 0 0 ? ?0 0 2? ?1 0 2 ? ?0 5 0 ? + ?3 0 0 ? = ?3 5 0 ? ? ? ? ? ? ? ?0 2 0? ?0 7 0? ?0 9 0? ? ? ? ? ? ? 矩阵的线性运算(3) 矩阵的线性运算我们记录两个矩阵A我们记录两个矩阵A,B的当前非零元素序号pA和pB。序号pA和pB。为了保证结果的有序性,我们每次比较这两个当前元素的位置。如果A的当前位置靠前,则把A的第pA个元素加入如果A的当前位置靠前,则把A的第pA个元素加入矩阵C 并使pA=pA+1 矩阵C,并使pA=pA+1 如果B的当前位置靠前,则把B的第pB个元素加入如果B的当前位置靠前,则把B的第pB个元素加入矩阵C 并使pB=pB+1 矩阵C,并使pB=pB+1 如果当前位置相同,则先使pA=pA+1, pB=pB+1。如果当前位置相同,则先使pA=pA+1, pB=pB+1。如果A的第pA- 个元素和B的第pB如果A的第pA-1个元素和B的第pB-1个元素的和不为零,则把它加到矩阵C 零,则把它加到矩阵C中。矩阵的线性运算(4) 矩阵的线性运算十字链表表示法下的加法可以一行行的做。即:如果A的当前行号比B小,把A的当前行整个复制到C 如果A的当前行号比B小,把A的当前行整个复制到C中。如果B的当前行号比A小,把B的当前行整个复制到C 如果B的当前行号比A小,把B的当前行整个复制到C中。否则把A的当前行和B的当前行的合并结果加入C 否则把A的当前行和B的当前行的合并结果加入C中。第三种情况和三元组表示下的加法很类似,只是下标pA,pB换成了指针。是下标pA,pB换成了指针。同样的,需要注意两个非零元素之和可能等于零,从而不能插入到结果中矩阵的转置(1) 矩阵的转置矩阵的转置在二维数组中,转置可以通过简单的坐标变换得到在三元组表示法中,在对每个元素进行坐标变换后还需要进行一次排序,以维持元素位置的有序性。在十字链表表示法中,我们不仅需要对每个结点进行坐标变换,还需要交换行链表和列链表,以及更改每个结点四个方向的指针,实现比较麻烦。矩阵的转置(2) 矩阵的转置二维数组的转置可以通过下列代码来实现:void MatrixT(TMatrix A) { TMatrix B; B.m=A.n; B.n=A.m; for(int i=1;i<=A.n;i++) for(int j=1;j<=A.m;j++) B.numbers[j][i]=A.numbers[i][j]; return B; } 对代码稍作修改,我们可以对矩阵进行旋转和镜像变换生成8 对代码稍作修改,我们可以对矩阵进行旋转和镜像变换生成8个新矩阵矩阵的转置(3) 矩阵的转置前面提到过,三元组表示法中,矩阵的转置可以通过坐标变换后排序来实现。不过,我们通常使用的是另外一种方法。这种方法不用排序,而速度也更快。快速转置算法:直接写到正确的位置。首先,求出每一列第一非零元素转置后的序号。这一步只需要统计一下每列的非零元素的个数就可以了。由于每一列的元素在转置以后的先后次序保持不变,每个元素就可以直接写到该行的下一个空闲位置。矩阵的转置(4) 矩阵的转置请看下面的例子:?0 ?3 ? ?0 ? ?5 1 0 2 ? ?0 6 0 0 ? ?1 ? ? 0 0 0 ? ?0 ? ? 4 0 0? ?2 3 0 5? 6 0 4? ? 0 0 0? ? 0 0 0? 各列非零元素个数为:2,3,0,1 各列第一个元素序号:0,2,5,5 3 5 1 6 4 2 0 1 2 3 4 5 矩阵乘法(1) 矩阵乘法矩阵乘法在二维数

组表示中,最简单的方法就是对每个元素用循环累加出结果,二重循环枚举每个元素,共三层循环。在三元组表示中,对于A中的一个元素A我们只需要访问B 在三元组表示中,对于A中的一个元素Aij,我们只需要访问B 中第j行所有元素B 中第j行所有元素Bjk,把每个乘积Aij ×Bjk加到Cik中。这样,把每个乘积A加到C 每遍历A的一行元素,就计算出了C 每遍历A的一行元素,就计算出了C的一行元素。和快速转置算法类似,我们可以事先算出B 算法类似,我们可以事先算出B的每行元素的下标范围,再用一个循环依次考虑A一个循环依次考虑A中的每个元素就可以了。十字链表在本质上是三元组的链式存储,所以乘法和三元组差别不大,但是实现却麻烦得多。该方法的好处在于,把中间结果A间结果Aij ×Bjk 加到Cik时,如果Cik并不存在,就需要对矩阵加到C 时,如果C 进行插入操作。在十字链表上的插入操作比三元组快得多。矩阵乘法(2) 矩阵乘法Strassen矩阵乘法Strassen矩阵乘法下面,我们来介绍基于二维数组的矩阵相乘算法。考虑两个2*2矩阵A考虑两个2*2矩阵A和B相乘。? a 11 A = ? ? a 21 则有:? a 11 b 11 +

a 12

b 21 C = AB = ? ? a 21 b 11 + a 22 b 21 a 11 b 12 + a 12 b 22 ? ?

c 11 = ? a 21 b 12 + a 22 b

22 ? ? ? c 21 c 12 ? c 22 ? ? a 12 ? a 22 ? ? ? b 11 B = ? ? b 21 b 12 ? b 22 ? ? 普通的方法需要进行8次乘法。矩阵乘法(3) 矩阵乘法Strassen的新方法如下:Strassen的新方法如下:P = ( a 11 + a Q = (a S = a U 21 22 22 )( b 11 + b 22 ) ) b 11 则: c11 = P + S ? T + V c12 = R + T c21 = Q + S c22 = P + R ? Q + U + a R = a 11 ( b 12 ? b 22 ) 22 ( b 21 ? b 11 ) ? a 11 )( b 11 + b 12 ) 22 T = ( a 11 + a 12 ) b 22 = (a 21 V = ( a 12 ? a )( b 21 + b 22 ) 只需要7次乘法!!! 只需要7次乘法!!! 矩阵乘法(3) 矩阵乘法当矩阵为2 当矩阵为2N*2N时,我们可以利用分块矩阵,分成2*2个阵,分成2*2个2N-1*2N-1矩阵,递归求解。当N=1时可以直接利用公式得出结果。N=1时可以直接利用公式得出结果。分析指出,Strassen乘法比常规乘法的加分析指出,Strassen乘法比常规乘法的加法和乘法运算量都有减少,但存储量增加,是一种用空间换时间的方法。此方法还可以推广到矩阵的求逆运算。三、小结与应用举例矩阵表示小结矩阵运算小结结束语鸣谢小结–矩阵的表示矩阵的表示矩阵有三种常用的表示方法:二维数组,三元组和十字链表。二维数组适合稠密矩阵,表示直观,操作方便三元组是稀疏矩阵最省空间的表示方法之一,它可以很好的支持线性运算和乘法运算,且编程复杂度低,是稀疏矩阵表示法的首选。十字链表比三元组占用空间大些,不过仍适合稀疏矩阵的表示,尤其适用于非零元素个数变化较大的场合,但不适合转置操作,且编程实现难度较大。小结–矩阵的运算矩阵的运算三种方法都可以通过遍历表的方式判定两个矩阵是否相同。三种表示方法都能较好的支持线性运算。数乘运算只需要遍历一次所有元素,而稀疏矩阵的加法运算需要进行类似有序表合并的操作。二维数组的转置只需要进行坐标变换,三元组还需要排序,而十字链表需要更新多个指针域。转置可以推广到平面点阵图象的变换,这时一般采用数组来表示矩阵。矩阵乘法的算法有很多种。基于数组的算法中,Strassen算法矩阵乘法的算法有很多种。基于数组的算法中,Strassen算法是一种以空间换时间的算法。稀疏的乘法不是依次计算结果的每个元素,而是依次考虑A的每个元素,而是依次考虑A和B的每对元素对结果的贡献。结束语在前面的内容中,我们讨论了矩阵的表示和基本运算。希望这些内容能开阔大家的眼界,启发大家的思维,激发大家进一步学习的兴趣。这些内容只是矩阵中最最基本的东西。像初等变换,矩阵求逆,求特征值等方面并为涉及到。但是如果能熟练的掌握以上内容,相信各位各方面的能力都会有显著的提高。每一个内容都有它存在的理由,每一种方法都体现出一种思路。前面提到的快速转置,Strassen矩阵乘出一种思路。前面提到的快速转置,Strassen矩阵乘法等算法都值得我们去思考。鸣谢感谢吴老师给我这次与大家交流的机会。感谢各位同学,特别是我的室友在我准备期间给我支持和鼓励感谢一位不愿意我透露其姓名的同学协助我校对本幻灯片感谢大家专心听完我的《矩阵及其基本算法》同学们辛苦了!

最短路径的Dijkstra算法及Matlab程序

两个指定顶点之间的最短路径 问题如下:给出了一个连接若干个城镇的铁路网络,在这个网络的两个指定城镇间,找一条最短铁路线。 以各城镇为图G 的顶点,两城镇间的直通铁路为图G 相应两顶点间的边,得图G 。对G 的每一边e ,赋以一个实数)(e w —直通铁路的长度,称为e 的权,得到赋权图G 。G 的子图的权是指子图的各边的权和。问题就是求赋权图G 中指定的两个顶点00,v u 间的具最小权的轨。这条轨叫做00,v u 间的最短路,它的权叫做00,v u 间的距离,亦记作),(00v u d 。 求最短路已有成熟的算法:迪克斯特拉(Dijkstra )算法,其基本思想是按距0u 从近到远为顺序,依次求得0u 到G 的各顶点的最短路和距离,直至0v (或直至G 的所有顶点),算法结束。为避免重复并保留每一步的计算信息,采用了标号算法。下面是该算法。 (i) 令0)(0=u l ,对0u v ≠,令∞=)(v l ,}{00u S =,0=i 。 (ii) 对每个i S v ∈(i i S V S \=),用 )}()(),({min uv w u l v l i S u +∈ 代替)(v l 。计算)}({min v l i S v ∈,把达到这个最小值的一个顶点记为1+i u ,令}{11++=i i i u S S 。 (iii). 若1||-=V i ,停止;若1||-

Dijkstra算法

5.3.4 附录E 最短路径算法——Dijkstra 算法 在路由选择算法中都要用到求最短路径算法。最出名的求最短路径算法有两个,即Bellman-Ford 算法和Dijkstra 算法。这两种算法的思路不同,但得出的结果是相同的。我们在下面只介绍Dijkstra 算法,它的已知条件是整个网络拓扑和各链路的长度。 应注意到,若将已知的各链路长度改为链路时延或费用,这就相当于求任意两结点之间具有最小时延或最小费用的路径。因此,求最短路径的算法具有普遍的应用价值。 令v 部分: 不直接相连与结点若结点 1 v ? ?∞在用计算机进行求解时,可以用一个比任何路径长度大得多的数值代替∞。对于上述例子, 可以使D (v ) = 99。 (2) 寻找一个不在N 中的结点w ,其D (w )值为最小。把w 加入到N 中。然后对所有不在N 中的结点v ,用[D (v ), D (w ) + l (w , v )]中的较小的值去更新原有的D (v )值,即: D (v )←Min[D (v ), D (w ) + l (w , v )] (E-1) (3) 重复步骤(2),直到所有的网络结点都在N 中为止。 表E-1是对图E-1的网络进行求解的详细步骤。可以看出,上述的步骤(2)共执行了5次。表中带圆圈的数字是在每一次执行步骤(2)时所寻找的具有最小值的D (w ) 值。当第5次执行步骤(2)并得出了结果后,所有网络结点都已包含在N 之中,整个算法即告结束。 表E-1 计算图E-1的网络的最短路径

现在我们对以上的最短路径树的找出过程进行一些解释。 因为选择了结点1为源结点,因此一开始在集合N中只有结点1。结点1只和结点2, 3和4直接相连,因此在初始化时,在D(2),D(3)和D(4)下面就填入结点1到这些结点相应的距离,而在D(5)和D(6)下面填入∞。 下面执行步骤1。在结点1以外的结点中,找出一个距结点1最近的结点w,这应当是w = 4,因为在D(2),D(3)和D(4)中,D(4) = 1,它的之值最小。于是将结点4加入到结点集合N中。这时,我们在步骤1这一行和D(4)这一列下面写入①,数字1表示结点4到结点1的距离,数字1的圆圈表示结点4在这个步骤加入到结点集合N中了。 接着就要对所有不在集合N中的结点(即结点2, 3, 5和6)逐个执行(E-1)式。 对于结点2,原来的D(2) = 2。现在D(w) + l(w, v) = D(4) + l(4, 2) = 1 + 2 = 3 > D(2)。因此结点2到结点1距离不变,仍为2。 对于结点3,原来的D(3) = 5。现在D(w) + l(w, v) = D(4) + l(4, 3) = 1 + 3 = 4 < D(3)。因此结点3到结点1的距离要更新,从5减小到4。 对于结点5,原来的D(5) = ∞。现在D(w) + l(w, v) = D(4) + l(4, 5) = 1 + 1 = 2 < D(5)。因此结点5到结点1的距离要更新,从∞减小到2。 对于结点6,现在到结点1的距离仍为∞。 步骤1的计算到此就结束了。 下面执行步骤2。在结点1和4以外的结点中,找出一个距结点1最近的结点w。现在有两个结点(结点2和5)到结点1的距离一样,都是2。我们选择结点5(当然也可以选择结点2,最后得出的结果还是一样的)。以后的详细步骤这里就省略了,读者可以自行完 1的路由表。此路由表指出对于发往某个目的结点的分组,从结点1发出后的下一跳结点(在算法中常称为“后继结点”)和距离。当然,像这样的路由表,在所有其他各结点中都有一个。但这就需要分别以这些结点为源结点,重新执行算法,然后才能找出以这个结点为根的最短路径树和相应的路由表。

第3章 矩阵及其运算

第3章 矩阵及其运算 3.1 基本要求、重点难点 基本要求: 1.1.掌握矩阵的定义. 2.2.掌握矩阵的运算法则. 3.3.掌握伴随矩阵的概念及利用伴随矩阵求逆矩阵的方法. 4.4.掌握矩阵秩的概念及求矩阵秩的方法. 5.5. 掌握初等变换和初等矩阵的概念,能够利用初等变换计算矩阵的秩,求可逆矩阵的逆矩阵. 6.6.掌握线形方程组有解得判定定理及其初等变换解线形方程组的方法. 重点难点:重点是矩阵定义,矩阵乘法运算,逆矩阵的求法,矩阵的秩,初等 变换及线性方程组的解. 难点是矩阵乘法,求逆矩阵的伴随矩阵方法. 3.2 基本内容 3.2.1 3.2.1 重要定义 定义3.1 由n m ?个数)2,1;,2,1(n j m i a ij ==组成的m 行n 列的数表成为一个m 行n 列矩阵,记为 ????????????mn m m n n a a a a a a a a a 2122221 11211 简记为A n m ij a ?=)(,或A )(ij a =,n m A ?,mn A 注意行列式与矩阵的区别: (1) (1) 行列式是一个数,而矩阵是一个数表. (2) (2) 行列式的行数、列数一定相同,但矩阵的行数、列数不一定相 同. (3) (3) 一个数乘以行列式,等于这个数乘以行列式的某行(或列)的所有元素,而一个数乘以矩阵等于这个数乘以矩阵的所有元素. (4) (4) 两个行列式相等只要它们表示的数值相等即可,而两个矩阵相等则要求两个矩阵对应元素相等. (5) (5) 当0||≠A 时,||1A 有意义,而A 1 无意义.

n m =的矩阵叫做阶方阵或m 阶方阵.一阶方阵在书写时不写括号,它在 运算中可看做一个数. 对角线以下(上)元素都是0的矩阵叫上(下)三角矩阵,既是上三角阵, 又是下三角的矩阵,也就是除对角线以外的元素全是0的矩阵叫对角矩阵.在对角矩阵中,对角线上元素全一样的矩阵叫数量矩阵;数量矩阵中,对角线元素全是1的n 阶矩阵叫n 阶单位矩阵,常记为n E (或n I ),简记为E (或I ),元素都是0的矩阵叫零矩阵,记为n m 0?,或简记为0. 行和列分别相等的两个矩阵叫做同型矩阵,两个同型矩阵的且对应位置上的 元素分别相等的矩阵叫做相等矩阵. 设有矩阵A =n m ij a ?)(,则A -n m ij a ?-=)(称为A 的负矩阵. 若A 是方阵,则保持相对元素不变而得到的行列式称为方针A 的行列式,记 为||A 或A Det . 将矩阵A 的行列式互换所得到的矩阵为A 的转置矩阵,记为T A 或A '. 若方阵A 满足A A T =,则称A 为对称矩阵,若方阵A 满足A A T -=,则称A 为反对称矩阵. 若矩阵的元素都是实数,则矩阵称为实矩阵.若矩阵的元素含有复数,则称矩 阵为复矩阵,若A =n m ij a ?)(是复矩阵,则称矩阵n m ij a ?)((其中ij a 为ij a 的共轭矩阵,记为A n m ij a ?=)(. 定义3.2 对于n 阶矩阵A ,如果存在n 阶矩阵B ,使得E BA AB ==,则 称方阵A 可逆,B 称为A 的逆矩阵,记做1-=A B . 对于方阵A n m ij a ?=)(,设ij a 的代数余子式为ij A ,则矩阵 *A ????????????=nm n n n n A A A A A A A A A 2122212 12111 称为A 的伴随矩阵,要注意伴随矩阵中元素的位置. 定义3.3 设有矩阵A ,如果: (1) (1) 在A 中有一个r 阶子式D 不为零.

dijkstra算法

迪克斯特拉算法: 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。 定义: Dijkstra算法一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN,CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权边。 算法思想: 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的集合(初始时只含有源点V0) (2)V-S=T:尚未确定的顶点集合 将T中顶点按递增的次序加入到S中,保证: (1)从源点V0到S中其他各顶点的长度都不大于从V0到T 中任何顶点的最短路径长度 (2)每个顶点对应一个距离值 S中顶点:从V0到此顶点的长度 T中顶点:从V0到此顶点的只包括S中顶点作中间顶点的最短路径长度

依据:可以证明V0到T中顶点Vk的,或是从V0到Vk的直接路径的权值;或是从V0经S中顶点到Vk的路径权值之和。 (反证法可证) 求最短路径步骤 算法步骤如下: G={V,E} 1.初始时令S={V0},T=V-S={其余顶点},T中顶点对应的距离值 若存在,d(V0,Vi)为弧上的权值 若不存在,d(V0,Vi)为∞ 2.从T中选取一个与S中顶点有关联边且权值最小的顶点W,加入到S中 3.对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值 重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止

矩阵数值算法

计算实习报告 一 实习目的 (1)了解矩阵特征值与相应特征向量求解的意义,理解幂法和反幂法的原理, 能编制此算法的程序,并能求解实际问题。 (2)通过对比非线性方程的迭代法,理解线性方程组迭代解法的原理,学会编 写Jacobi 迭代法程序,并能求解中小型非线性方程组。初始点对收敛性质及收 敛速度的影响。 (3)理解 QR 法计算矩阵特征值与特征向量的原理,能编制此算法的程序,并 用于实际问题的求解。 二 问题定义及题目分析 1. 分别用幂法和幂法加速技术求矩阵 2.5 2.5 3.00.50.0 5.0 2.0 2.00.50.5 4.0 2.52.5 2.5 5.0 3.5-?? ?- ?= ?-- ?--?? A 的主特征值和特征向量. 2. 对于实对称矩阵n n ?∈A R ,用Jacobi 方法编写其程序,并用所编程序求下列矩阵的全部 特征值. 1515 4 1141144114114?-?? ?-- ? ?- ?= ? ?- ?-- ? ?-??A 3. 对于实矩阵n n ?∈A R ,用QR 方法编写其程序,并用所编程序求下列矩阵的全部特征值: 111 21 113,4,5,62311111n n n n n n ? ???? ?????==+? ????? ??+??A 三 概要设计 (1) 幂法用于求按模最大的特征值及其对应的特征向量的一种数值算法,

它要求矩阵 A 的特征值有如下关系: 12n ...λλλ>≥≥ ,对于相应 的特征向量。其算法如下: Step 0:初始化数据0,, 1.A z k = Step 1:计算1k k y A z +=。 Step 2:令 k k m y ∞=。 Step 3:令 k k k z y m = ;如果1k k m m +≈或1k k z z +≈,则 goto Step 4;否则 , k = k + 1 ,goto Step 1。 Step 4:输出结果 算法说明与要求 输入参数为实数矩阵、初始向量、误差限与最大迭代次数。输出 参数为特征值及相对应的特征向量。注意初始向量不能为“0”向量。 (2) 迭代法的原理 如果能将方程 Ax =b 改写成等价形式:x=Bx+f 。如果B 满足:ρ(B )<1,则对于任意初始向量 x (0) ,由迭代 x ( k + 1) = Bx (k ) + f 产生的序列均收敛到方程组的精确解。迭代法中两种最有名的迭代法就是Jacobi 迭代法,它的迭代矩阵 B 为: 1()J D L U -=-+,1 f D b -= 其中,D 为系数矩阵 A 的对角元所组成对角矩阵,L 为系数矩阵 A 的对角元下方所有元素所组成的下三角矩阵,U 为系数矩阵 A 的对角元上方所有元素所组成的上三角矩阵。 算法如下: Step 0:初始化数据 00,,,,k A b x δ=和ε。 Step 1:计算D,L,U,J 或G, 得到迭代矩阵B. Step 2::1k k =+ 0x B x f * =+ 0x x = 如果0x x δ-<或()f x ε≤,goto Step 3?否则 goto Step 2。 Step 3:输出结果。 程序说明与要求

传递矩阵-matlab程序

%main_critical.m %该程序使用Riccati传递距阵法计算转子系统的临界转速及振型 %本函数中均采用国际单位制 % 第一步:设置初始条件(调用函数shaft_parameters) %初始值设置包括:轴段数N,搜索次数M %输入轴段参数:内径d,外径D,轴段长度l,支撑刚度K,单元质量mm,极转动惯量Jpp[N,M,d,D,l,K,mm,Jpp]=shaft_parameters; % 第二步:计算单元的5个特征值(调用函数shaft_pra_cal) %单元的5个特征值: %m_k::质量 %Jp_k:极转动惯量 %Jd_k:直径转动惯量 %EI:弹性模量与截面对中性轴的惯性矩的乘积 %rr:剪切影响系数 [m_k,Jp_k,EI,rr]=shaft_pra_cal(N,D,d,l,Jpp,mm); % 第三步:计算剩余量(调用函数surplus_calculate),并绘制剩余量图 %剩余量:D1 for i=1:1:M ptx(i)=0; pty(i)=0; end for ii=1:1:M wi=ii/1*2+50; [D1,SS,Sn]=surplus_calculate(N,wi,K,m_k,Jp_k,JD_k,l,EI,rr); D1; pty(ii)=D1; ptx(ii)=w1 end ylabel(‘剩余量’); plot(ptx,pty) xlabel(‘角速度red/s’); grid on % 第四步:用二分法求固有频率及振型图 %固有频率:Critical_speed wi=50; for i=1:1:4 order=i [D1,SS,Sn]=surplus_calculate(N,wi,k,m_k,Jp_k,Jd_k,l,EI,rr); Step=1; D2=D1; kkk=1; while kkk<5000 if D2*D1>0 wi=wi+step;

Dijkstra最短路径算法

5.3.4 附录E 最短路径算法——Dijkstra算法 在路由选择算法中都要用到求最短路径算法。最出名的求最短路径算法有两个,即Bellman-Ford算法和Dijkstra算法。这两种算法的思路不同,但得出的结果是相同的。我们在下面只介绍Dijkstra算法,它的已知条件是整个网络拓扑和各链路的长度。 应注意到,若将已知的各链路长度改为链路时延或费用,这就相当于求任意两结点之间具有最小时延或最小费用的路径。因此,求最短路径的算法具有普遍的应用价值。 下面以图E-1的网络为例来讨论这种算法,即寻找从源结点到网络中其他各结点的最短路径。为方便起见,设源结点为结点1。然后一步一步地寻找,每次找一个结点到源结点的最短路径,直到把所有 点1, j)为结点i (1) 初始化 令N表示网络结点的集合。先令N = {1}。对所有不在N中的结点v,写出

不直接相连与结点若结点直接相连 与结点若结点 1 1 ),1()(v v v l v D ? ? ?∞= 在用计算机进行求解时,可以用一个比任何路径长度大得多的数值代替∞。对于上述例子,可以使D (v ) = 99。 (2) 寻找一个不在N 中的结点w ,其D (w )值为最小。把w 加入到N 中。然后对所有不在N 中的结点v ,用[D (v ), D (w ) + l (w , v )]中的较小的值去更新原有的D (v )值,即: D (v )←Min[D (v ), D (w ) + l (w , v )] (E-1) (3) 重复步骤(2),直到所有的网络结点都在N 中为止。 表E-1是对图E-1的网络进行求解的详细步骤。可以看出,上述的步骤(2)共执行了5次。表中带圆圈的数字是在每一次执行步骤(2)时所寻找的具有最小值的D (w ) 值。当第5次执行步骤(2)并得出了结果后,所有网络结点都已包含在N 之中,整个算法即告结束。 表E-1 计算图E-1的网络的最短路径

(整理)传输矩阵法.

传输矩阵法 一、 传输矩阵法概述 1. 传输矩阵 在介绍传输矩阵的模型之前,首先引入一个简单的电路模型。如图1(a)所示, 在(a)中若已知A 点电压及电路电流,则我们只需要知道电阻R ,便可求出B 点电压。传输矩阵具有和电阻相同的模型特性。 (a) (b) 图1 传输矩阵模型及电路模拟模型 如图1(b)所示,有这样的关系式存在:E 0=M(z)E 1。M(z)即为传输矩阵,它将介质前后空间的电磁场联系起来,这和电阻将A 、B 两点的电势联系起来的实质是相似的。 图2 多层周期性交替排列介质 传输矩阵法多应用于多层周期性交替排列介质(如图2所示), M(z)反映的介质前后空间电磁场之间的关系,而其实质是每层薄膜特征矩阵的乘积,若用 j M 表示第j 层的特征矩阵,则有: 1 2 3 4 …… j …… N

(1) 其中, (2) j δ为相位厚度,有 (3) 如公式(2)所示,j M 的表示为一个2×2的矩阵形式,其中每个矩阵元都没有任何实际物理意义,它只是一个计算结果,其推导过程将在第二部分给出。 2. 传输矩阵法 在了解了传输矩阵的基础上,下面将介绍传输矩阵法的定义: 传输矩阵法是将磁场在实空间的格点位置展开,将麦克斯韦方程组化成传输矩阵形式,变成本征值求解问题。 从其定义可以看出,传输矩阵法的实质就是将麦克斯韦方程转化为传输矩阵,也就是传输矩阵法的建模过程,具体如下:利用麦克斯韦方程组求解两个紧邻层面上的电场和磁场,从而可以得到传输矩阵,然后将单层结论推广到整个介质空间,由此即可计算出整个多层介质的透射系数和反射系数。 传输矩阵法的特点:矩阵元少(4个),运算量小,速度快;关键:求解矩阵元;适用介质:多层周期性交替排列介质。 二、 传输矩阵的基础理论——薄膜光学理论 1.麦克斯韦方程组 麦克斯韦方程组由四个场量:D 、E 、B 、H ,两个源量:J 、ρ以及反映它们之间关系的方程组成。而且由媒质方程中的参数ε、μ、σ反映介质对电磁场的影响。方程组的实质是描述电磁场的传播,即:一个变化的磁场引起邻近区域的电场变化,而此电场的变化又引起邻近磁场的变化,如此进行下去,便可抽象出电磁场的传播。如图3 所示。 ? ? ? ???==∏=D C B A M z M N j j 1)(?? ??? ?????=j j j j j j j i i M δδηδηδcos sin sin cos j j j j d N θλπ δcos 2=ε

DIJKSTRA算法详细讲解

最短路径之Dijkstra算法详细讲解 1最短路径算法 在日常生活中,我们如果需要常常往返A地区和B地区之间,我们最希望知道的可能是从A地区到B地区间的众多路径中,那一条路径的路途最短。最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括: (1)确定起点的最短路径问题:即已知起始结点,求最短路径的问题。 (2)确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。 (3)确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径。 (4)全局最短路径问题:求图中所有的最短路径。 用于解决最短路径问题的算法被称做“最短路径算法”,有时被简称作“路径算法”。最常用的路径算法有:Dijkstra算法、A*算法、Bellman-Ford算法、Floyd-Warshall算法、Johnson算法。 本文主要研究Dijkstra算法的单源算法。 2Dijkstra算法 2.1Dijkstra算法 Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。 2.2Dijkstra算法思想 Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径,就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U 表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S 中的顶点为中间顶点的当前最短路径长度。 2.3Dijkstra算法具体步骤

矩阵链算法

/************************ Matrix Chain Multiplication ***************************/ /************************ 作者:Hugo ***************************/ /************************ 最后修改日期:2015.09.10 ***************************/ /************************ 最后修改人:Hugo ***************************/ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Text.RegularExpressions; using System.Collections; namespace Matrix { class Program { public static int nummulti = 0; static ArrayList list1 = new ArrayList();//定义计算式存储列表 static ArrayList listrow = new ArrayList();//定义矩阵行数存储列表 static ArrayList listcolumn = new ArrayList();//定义矩阵列数存储列表 static void Main(string[] args) { /****************************************************************************** *****************/ //从键盘上获取矩阵 int nummatrix = Int32.Parse(Console.ReadLine()); int countmat = 0; for (countmat = 0; countmat < nummatrix; countmat++) { string s = Console.ReadLine(); string[] str = s.Split(' ');//把输入的一行字符按空格拆分 listrow.Add(Int32.Parse(str[1]));//行数存储到矩阵行数存储列表 listcolumn.Add(Int32.Parse(str[2]));//列数存储到矩阵列数存储列表

Dijkstra算法

最短路径—Dijkstra算法 Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。 问题描述:在无向图G=(V,E) 中,假设每条边E[i] 的长度为w[i],找到由顶点V0 到其余各点的最短路径。(单源最短路径) 2.算法描述 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S 中只有一个源点,以后每求得一条最短路径, 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。 2)算法步骤: a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边, 则正常有权值,若u不是v的出边邻接点,则权值为∞。 b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。 c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短, 则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。 d.重复步骤b和c直到所有顶点都包含在S中。 GPSR路由协议:(车载自组织网络中自适应路由协议研究_李诗雨) 2>基于地理位置的路由 随着科技的发展,现在的车辆通常都会具有全球定位系统,利用这个系统, 车辆可以随时随地查找出自己的地理坐标。于是越来越多的学者开始利用这些定 位系统来制定新的路由,如Greedy Perimeter Stateless Routing(GPSR)}ZO}。GPSR 是影响最广和应用范围最大的一个路由协议。它脱离了传统路由协议需要维护一 个全局静态路由,需要时刻去查看该路由的有效性的方式,而开始将更多的注意 力放到车辆四周的临近车辆,只依赖它们进行短距离的路由计算。在GPSR协议 中[[21],网络节点都可以通过GPS等方法获取自身的地理位置,源节点在发送数据 时会在报文里加入目的节点的GPS坐标,在后面每一跳节点都会查找自己的邻居 车辆,在其中找到一个距离目的节点在地理位置上最近的节点作为下一跳节点。

Dijkstra算法

Dijkstra 算法
Dijkstra 算法(狄克斯特拉算法) 算法(狄克斯特拉算法)
目录
[隐藏]
? ? ? ? ? o ?
1 2 3 4 5
Dijkstra 算法概述 算法描述 虚拟码 时间复杂度 Dijkstra 算法案例分析 5.1 案例一:基于 Dijkstra 算法在物流配送中的应用[1] 6 参考文献
[编辑]
Dijkstra 算法概述
Dijkstra 算法 算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于 1959 年提出的,因此 又叫狄克斯特拉算法。 是从一个顶点到其余各顶点的最短路径算法, 解决的是有向图中最短 路径问题。 其基本原理是:每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权 都为正时, 由于不会存在一个距离更短的没扩展过的点, 所以这个点的距离永远不会再被改 变, 因而保证了算法的正确性。 不过根据这个原理, Dijkstra 求最短路的图不能有负权边, 用 因为扩展到负权边的时候会产生更短的距离, 有可能就破坏了已经更新的点距离不会改变的 性质。 举例来说,如果图中的顶点表示城市,而边上的权重表示著城市间开车行经的距离。 Dijkstra 算法可以用来找到两个城市之间的最短路径。 Dijkstra 算法的输入包含了一个有权重的有向图 G,以及 G 中的一个来源顶点 S。 我 们以 V 表示 G 中所有顶点的集合。 每一个图中的边,都是两个顶点所形成的有序元素对。 (u,v)表示从顶点 u 到 v 有路径相连。 我们以 E 所有边的集合,而边的权重则由权重函数 w: E → [0, ∞]定义。 因此,w(u,v)就是从顶点 u 到顶点 v 的非负花费值(cost)。 边的花费 可以想像成两个顶点之间的距离。 任两点间路径的花费值, 就是该路径上所有边的花费值总 和。已知有 V 中有顶点 s 及 t, Dijkstra 算法可以找到 s 到 t 的最低花费路径(i.e. 最短路径)。 这个算法也可以在一个图中,找到从一个顶点 s 到任何其他顶点的最短路径。

矩阵的运算及其运算规则

矩阵基本运算及应用 201700060牛晨晖 在数学中,矩阵是一个按照长方阵列排列的复数或实数集合。矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵。矩阵的运算是数值分析领域的重要问题。将矩阵分解为简单矩阵的组合可以在理论和实际应用上简化矩阵的运算。在电力系统方面,矩阵知识已有广泛深入的应用,本文将在介绍矩阵基本运算和运算规则的基础上,简要介绍其在电力系统新能源领域建模方面的应用情况,并展望随机矩阵理论等相关知识与人工智能电力系统的紧密结合。 1矩阵的运算及其运算规则 1.1矩阵的加法与减法 1.1.1运算规则 设矩阵,, 则

简言之,两个矩阵相加减,即它们相同位置的元素相加减! 注意:只有对于两个行数、列数分别相等的矩阵(即同型矩阵),加减法运算才有意义,即加减运算是可行的. 1.1.2运算性质 满足交换律和结合律 交换律; 结合律. 1.2矩阵与数的乘法 1.2.1运算规则 数乘矩阵A,就是将数乘矩阵A中的每一个元素,记为或. 特别地,称称为的负矩阵. 1.2.2运算性质 满足结合律和分配律 结合律:(λμ)A=λ(μA);(λ+μ)A =λA+μA. 分配律:λ(A+B)=λA+λB.

已知两个矩阵 满足矩阵方程,求未知矩阵. 解由已知条件知 1.3矩阵与矩阵的乘法 1.3.1运算规则 设,,则A与B的乘积是这样一个矩阵: (1) 行数与(左矩阵)A相同,列数与(右矩阵)B相同,即 . (2) C的第行第列的元素由A的第行元素与B的第列元素对应相乘,再取乘积之和.

Dijkstra算法C代码

#include "stdio.h" #include "stdlib.h" #define M 10000 int dist[M] = {0},fa[M] = {0},visit[M] = {0}; int g[M][M] = {0}; int n,start,end; int findmin(){ int i,flag; int min = 987654321; for( i = 1 ; i<= n ; i++ ) if( visit[i] == 0 && dist[i] < min && dist[i] != 0){ min = dist[i]; flag = i; } return flag; } int Dijkstra(){ int i,j,pos; for( i = 1 ; i <= n ; i++ ){ dist[i] = g[start][i]; if( dist[i] == 123456789 ) fa[i] = i;

else fa[i] = start; } visit[start] = 1; for( i = 1 ; i <= n ; i++ ){ pos = 0; pos = findmin(); if(pos == 0) break; visit[pos] = 1; for( j = 1 ; j <= n ; j++ ) if( visit[j] == 0 && dist[j] > dist[pos] + g[pos][j] ){ dist[j] = dist[pos] + g[pos][j]; fa[j] = pos; } } } int main(){ int i,j; int p; scanf("%d%d%d",&n,&start,&end); for( i = 1 ; i <= n ; i++ )

GE矩阵+计算方法+案例(一班三组)

GE矩阵法及其使用方法介绍 一、GE矩阵法概述 GE矩阵法又称通用电器公司法、麦肯锡矩阵、九盒矩阵法、行业吸引力矩阵是美国通用电气公司(GE)于70年代开发了新的投资组合分析方法。对企业进行业务选择和定位具有重要的价值和意义。GE矩阵可以用来根据事业单位在市场上的实力和所在市场的吸引力对这些事业单位进行评估,也可以表述一个公司的事业单位组合判断其强项和弱点。在需要对产业吸引力和业务实力作广义而灵活的定义时,可以以GE矩阵为基础进行战略规划。按市场吸引力和业务自身实力两个维度评估现有业务(或事业单位),每个维度分三级,分成九个格以表示两个维度上不同级别的组合。两个维度上可以根据不同情况确定评价指标。 二、方格分析计算方法介绍: GE矩阵可以用来根据事业单位在市场上的实力和所在市场的吸引力对这些事业 单位进行评估,也可以表述一个公司的事业单位组合判断其强项和弱点。在需要 对产业吸引力和业务实力作广义而灵活的定义时,可以以GE矩阵为基础进行战 略规划。按市场吸引力和业务自身实力两个维度评估现有业务(或事业单位),

每个维度分三级,分成九个格以表示两个维度上不同级别的组合。两个维度上可以根据不同情况确定评价指标。 绘制GE矩阵,需要找出外部(行业吸引力)和内部(企业竞争力)因素,然后对各因素加权,得出衡量内部因素和市场吸引力外部因素的标准。当然,在开始搜集资料前仔细选择哪些有意义的战略事业单位是十分重要的。 1. 定义各因素。选择要评估业务(或产品)的企业竞争实力和市场吸引力所需的重要 因素。在GE内部,分别称之为内部因素和外部因素。下面列出的是经常考虑的一些因素(可能需要根据各公司情况作出一些增减)。确定这些因素的方法可以采取头脑风暴法或名义群体法等,关键是不能遗漏重要因素,也不能将微不足道的因素纳人分析中。 2. 估测内部因素和外部因素的影响。从外部因素开始,纵览这张表(使用同一组经理), 并根据每一因素的吸引力大小对其评分。若一因素对所有竞争对手的影响相似,则对其影响做总体评估,若一因素对不同竞争者有不同影响,可比较它对自己业务的影响和重要竞争对手的影响。在这里可以采取五级评分标准(1=毫无吸引力,2=没有吸引力,3=中性影响,4=有吸引力,5=极有吸引力)。然后也使用5级标准对内部因素进行类似的评定(1=极度竞争劣势,2=竞争劣势,3=同竞争对手持平,4=竞争优势,5=极度竞争优势),在这一部分,应该选择一个总体上最强的竞争对手做对比的对象。 具体的方法是:- 确定内外部影响的因素,并确定其权重- 根据产业状况和企业状况定出产业吸引力因素和企业竞争力因素的级数(五级)- 最后,用权重乘以级数,得出每个因素的加权数,并汇总,得到整个产业吸引力的加权值 下面分别用折线图和表格两种形式来表示。

Dijkstra算法详细讲解

D i j k s t r a算法详细讲解 This model paper was revised by the Standardization Office on December 10, 2020

最短路径之D i j k s t r a算法详细讲解 1最短路径算法 在日常生活中,我们如果需要常常往返A地区和B地区之间,我们最希望知道的可能是从A地区到B地区间的众多路径中,那一条路径的路途最短。最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。算法具体的形式包括: (1)确定起点的最短路径问题:即已知起始结点,求最短路径的问题。 (2)确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。 (3)确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径。 (4)全局最短路径问题:求图中所有的最短路径。 用于解决最短路径问题的算法被称做“最短路径算法”,有时被简称作“路径算法”。最常用的路径算法有:Dijkstra算法、A*算法、Bellman-Ford算法、Floyd-Warshall算法、Johnson算法。 本文主要研究Dijkstra算法的单源算法。 2 Dijkstra算法 2.1 Dijkstra算法 Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。 2.2 Dijkstra算法思想 Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。 2.3 Dijkstra算法具体步骤

传递矩阵法在结构振动响应分析中的应用

传递矩阵法在结构振动响应分析中的应用 【摘要】传递矩阵法因其简便、快捷,已被广泛应用于机械、航空和航天等领域。本文以航空发动机低压转子临界转速分析为例,对传递矩阵法在结构振动响应分析中的应用方法和分析步骤进行了详细的介绍,并给出了某型发动机低压转子在不同支承刚度下的临界转速。 【关键词】传递矩阵;振动响应;临界转速;转子动力学 0 引言 经典传递矩阵法是20 世纪20 年代建立起来的用于研究弹性构件组成的一维线性系统振动问题的方法。经过多年的发展和完善,已经可以用于求解多圆盘轴的扭转振动问题、梁的弯曲振动模态、轴的横向振动问题、系统的静态响应和扭矩载荷响应问题、以及一维结构的振动特性分析和复合梁的振动特性等结构动力学问题。并且,由于传递矩阵法建模灵活、计算效率高等优点,已在包括光学、声学、电子学、机器人学、机械、兵器、航空、航天等诸多现代工程技术领域中得到了广泛应用[1]。 应用传递矩阵法进行分析的一般步骤为:1)结构离散化;2)建立系统传递矩阵;3)特征方程求解。 1 结构离散化 航空发动机低压转子结构简化模型见图1: 其主要组件为压气机、涡轮和低压轴。低压转子通过前、中、后3个支点与发动机转子系统相连[2]。 将该结构进行离散化处理[3-5],并将各支点简化为线弹性体后,得到图2所示模型。 离散化处理后,整个低压转子的质量将被转换为分布式质量节点。表1给出了离散化后各质量节点的质量分布情况。 2 建立系统传递矩阵 将连续结构进行离散化处理后,实体结构将被简化成等刚性无质量梁单元及分布质量点。 3 特征方程求解 以转子转速做为变量,在不同刚度参数下对特征值进行求解。在某一给定刚

Dijkstra算法原理详细讲解

Dijkstra算法原理详细讲解 如下图,设A为源点,求A到其他各顶点(B、C、D、E、F)的最短路径。线上所标注为相邻线段之间的距离,即权值。(注:此图为随意所画,其相邻顶点间的距离与图中的目视长度不能一一对等) 算法执行步骤如下表:

Dijkstra算法的完整实现版本之算法的源代码 样例图: 输入格式: 输出格式:

输入时,将s,t,x,y,z五个点按照1,2,3,4,5起别名,输入格式按照下图例所示当提示Please enter the vertex where Dijkstra algorithm starts:时输入算法的起 始点 比如计算结果v1v4v2表示从点1到点2经过1,4,2为最短路径 Dijkstra算法的完整实现版本,算法的源代码 /* Dijkstra.c Copyright (c) 2002, 2006 by ctu_85 All Rights Reserved. */ #include "stdio.h" #include "malloc.h" #define maxium 32767 #define maxver 9 /*defines the max number of vertexs which the programm can handle*/ #define OK 1 struct Point { char vertex[3]; struct Link *work; struct Point *next; }; struct Link { char vertex[3]; int value; struct Link *next; }; struct Table /*the workbannch of the algorithm*/ { int cost; int Known; char vertex[3];

相关文档
最新文档