首页/文章/ 详情

APDLMath箱内矩阵的加减乘逆运算

3年前浏览1623

创建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的加减乘除运算比较方便,可以提高用户算法的计算效率。

声明:原创文章,欢迎留言与我讨论,如需转载留言

理论科普代码&命令求解技术其他软件
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2021-01-20
最近编辑:3年前
王新敏
硕士 | 教授 好好学习,天天快乐
获赞 122粉丝 613文章 96课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈