创建APDLMath箱内矩阵和向量如前面的几篇小文:
*DMAT:*DMAT创建稠密矩阵手段强大,提取单元或结构刚度矩阵易如反掌
*SMAT:*SMAT创建稀疏矩阵,使用时需注意ANSYS的三种自由度序列及转换
*VEC:*VEC创建向量功能也不错,*FREE可直接删除所有APDLMath箱内矩阵
而MAPDL矩阵和向量的“加减乘”运算有4个命令,如*SCAL、*AXPY、*MULT、*DOT等,而求逆运算则没有,但可以先用*EXPORT转换为数组,再通过APDL的*MOPER求逆,然后再导入也可实现求逆运算(实矩阵)。或许,随着ANSYS版本的不断更新,一些运算功能也在不断发展。下面介绍上述几个命令格式及其使用方法。
1.矩阵或向量比例缩放
命令*SCAL对矩阵或向量进行比例缩放,其实就是用常数×矩阵或向量(复数×复矩阵或复向量)。
*SCAL,Name,VAL1,VAL2
其中Name为矩阵或向量名,即由*DMAT、*SMAT或*VEC创建的矩阵或向量。VAL1为实部缩放常数(缺省为1);VAL2为虚部缩放常数(缺省为0),VAL2仅当矩阵或向量为复数时才有效。
2.矩阵或向量加减
命令*AXPY对既有矩阵或向量进行乘系数后的加减运算,系数可以是实数也可是复数(仅对复矩阵或复向量)。该运算不生成新矩阵,计算公式如M2=v*M1 w*M2。
*AXPY,vr,vi,M1,wr,wi,M2
其中vr、vi为M1矩阵或向量的实部和虚部乘子(也可用变量,vr/vi组成一复数),缺省为0。M1为矩阵或向量名,如未给定,则执行M2=w*M2计算,此时与矩阵比例缩放*SCAL类似。wr、wi为M2矩阵或向量的实部和虚部乘子(也可用变量,同样地,wr/wi组成一复数),缺省为0。M2为矩阵M2的名称,必须给定。
矩阵M1和M2行数与列数和类型必须相同,如均为稠密矩阵或均为稀疏矩阵,这是因为稠密矩阵和稀疏矩阵的存储方式不同所致。如果M2为实矩阵,则vi和wi均会忽略,即只有复矩阵能与复数相乘。
3.向量点积
命令*DOT计算两个向量的点积(或内积),命令格式为:
*DOT,Vector1,Vector2,Par_Real,Par_Imag
其中Vector1、Vector2为向量名,必须是*VEC创建的向量。Par_Real、Par_Imag分别为实部结果名和虚部结果名。如果两向量均为复数,则采用Vector1的共轭计算结果。
4.矩阵乘法
命令*MULT用于计算矩阵M1和M2相乘,且可采用转置相乘,计算公式如M3=M1(T1)*M2(T2)。
*MULT,M1,T1,M2,T2,M3
其中M1为矩阵名,必须是*DMAT或*SMAT创建的既有矩阵,T1为M1是否转置设置,T1=TRANS表示采用M1的转置,T1为空则表示不转置。M2为矩阵名,必须是*DMAT创建的既有矩阵,T2=TRANS表示采用M2的转置,T2为空则表示不转置。M3为相乘结果矩阵,必须给定名字。
矩阵相乘时,矩阵M1(或转置矩阵)的行数与矩阵M2(或转置矩阵)的列数相同,这与线性代数中的要求相同。
两个稀疏矩阵相乘不能用该命令,即M1和M2不能都为稀疏矩阵。不管是稠密矩阵×稀疏矩阵、稀疏矩阵×稠密矩阵、还是稠密矩阵×稠密矩阵,结果矩阵M3一定是稠密矩阵。
5.APDL中的矩阵求逆
用APDL的*MOPER命令对数组(矩阵)求逆,格式为“*MOPER,ParR,Par1,INVERT”,即求Par1的逆矩阵并存储到数组(矩阵)ParR中。当然Par1需满足求逆矩阵的相关条件。
下面以命令流的形式解释上述命令的使用方法。
MAPDL加减乘除应用命令流
!MAPDL加减乘除应用命令流
!定义一个矩阵和一个向量
*DMAT,A_M,D,ALLOC,4,4
*VEC,B_M,D,ALLOC,4
A_M(1,1)=2,1,3,4
A_M(1,2)=3,0,5,1
A_M(1,3)=1,4,2,5
A_M(1,4)=4,3,3,2
B_M(1)=23,15,34,31
!A*X=B的解为4,3,2,1
!==========================
!命令*AXPY和*SACL应用示例
!复制矩阵备用
*DMAT,A0_M,D,COPY,A_M
*DMAT,C_M,D,COPY,A_M
!系数W×实矩阵M2→实矩阵M2
W1=2.0
*AXPY,,,,W1,,C_M
!3矩阵M1 1×矩阵M2→矩阵M2
!C_M=3*A_M C_M(已乘W1=2)
*AXPY,3,,A_M,1,,C_M
!通过*PRINT,C_M
!在OUTPUT窗口查看运算结果
!用SCAL缩放,将C_M复原
!(因A_M与C_M初始相同)
*SCAL,C_M,1/(3 2)
!=======================
!先求解方程A*X=B得X
*LSENGINE,,MYSOLER1,A_M
*LSFACTOR,MYSOLER1
*LSBAC,MYSOLER1,B_M,X_M
!注意A_M已经改变了
!========================
!命令*MULT应用示例
!矩阵乘法做求解方程验证
!A*X→B?
*MULT,A0_M,,X_M,,BV_M
!BV_M与B_M相等,正确!
!=========================
!将A0_M转为APDL数组
*EXPORT,A0_M,APDL,A0
!求A0的逆矩阵A0INV
*MOPER,A0INV,A0,INVERT
!将A0INV导入矩阵A0INV_M
*DMAT,A0INV_M,D,IMPORT,APDL,A0INV
!计算A(逆)×B→X
*MULT,A0INV_M,,B_M,,XV_M
!X_M和XV_MX相等,正确!
!计算A*A(逆)→单位矩阵
*MULT,A0_M,,A0INV_M,,E_M
!======================!!!
*PRINT,A0_M!查看矩阵
*PRINT,E_M!查看矩阵
*STAT!查看各种信息
*FREE,ALL!删除矩阵和向量
*STAT!再查看信息
W1=$A0=$A0INV=
以上均为实矩阵的运算示例,复矩阵的定义、赋值、访问等另文介绍。从上可以看出,MAPDL的加减乘除运算比较方便,可以提高用户算法的计算效率。
声明:原创文章,欢迎留言与我讨论,如需转载留言