微波仿真论坛附录COMSOLMultiphysics的MATLAB矢量计算基础18页.docx
- 文档编号:25002888
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:30
- 大小:121.52KB
微波仿真论坛附录COMSOLMultiphysics的MATLAB矢量计算基础18页.docx
《微波仿真论坛附录COMSOLMultiphysics的MATLAB矢量计算基础18页.docx》由会员分享,可在线阅读,更多相关《微波仿真论坛附录COMSOLMultiphysics的MATLAB矢量计算基础18页.docx(30页珍藏版)》请在冰豆网上搜索。
微波仿真论坛附录COMSOLMultiphysics的MATLAB矢量计算基础18页
附录COMSOLMultiphysics的MATLAB矢量计算基础
一般说来,“教师”概念之形成经历了十分漫长的历史。
杨士勋(唐初学者,四门博士)《春秋谷梁传疏》曰:
“师者教人以不及,故谓师为师资也”。
这儿的“师资”,其实就是先秦而后历代对教师的别称之一。
《韩非子》也有云:
“今有不才之子……师长教之弗为变”其“师长”当然也指教师。
这儿的“师资”和“师长”可称为“教师”概念的雏形,但仍说不上是名副其实的“教师”,因为“教师”必须要有明确的传授知识的对象和本身明确的职责。
W.B.J.ZIMMERMAN1,J.M.REES2
我国古代的读书人,从上学之日起,就日诵不辍,一般在几年内就能识记几千个汉字,熟记几百篇文章,写出的诗文也是字斟句酌,琅琅上口,成为满腹经纶的文人。
为什么在现代化教学的今天,我们念了十几年书的高中毕业生甚至大学生,竟提起作文就头疼,写不出像样的文章呢?
吕叔湘先生早在1978年就尖锐地提出:
“中小学语文教学效果差,中学语文毕业生语文水平低,……十几年上课总时数是9160课时,语文是2749课时,恰好是30%,十年的时间,二千七百多课时,用来学本国语文,却是大多数不过关,岂非咄咄怪事!
”寻根究底,其主要原因就是腹中无物。
特别是写议论文,初中水平以上的学生都知道议论文的“三要素”是论点、论据、论证,也通晓议论文的基本结构:
提出问题――分析问题――解决问题,但真正动起笔来就犯难了。
知道“是这样”,就是讲不出“为什么”。
根本原因还是无“米”下“锅”。
于是便翻开作文集锦之类的书大段抄起来,抄人家的名言警句,抄人家的事例,不参考作文书就很难写出像样的文章。
所以,词汇贫乏、内容空洞、千篇一律便成了中学生作文的通病。
要解决这个问题,不能单在布局谋篇等写作技方面下功夫,必须认识到“死记硬背”的重要性,让学生积累足够的“米”。
1DepartmentofChemicalandProcessEngineering,UniversityofSheffield,
“师”之概念,大体是从先秦时期的“师长、师傅、先生”而来。
其中“师傅”更早则意指春秋时国君的老师。
《说文解字》中有注曰:
“师教人以道者之称也”。
“师”之含义,现在泛指从事教育工作或是传授知识技术也或是某方面有特长值得学习者。
“老师”的原意并非由“老”而形容“师”。
“老”在旧语义中也是一种尊称,隐喻年长且学识渊博者。
“老”“师”连用最初见于《史记》,有“荀卿最为老师”之说法。
慢慢“老师”之说也不再有年龄的限制,老少皆可适用。
只是司马迁笔下的“老师”当然不是今日意义上的“教师”,其只是“老”和“师”的复合构词,所表达的含义多指对知识渊博者的一种尊称,虽能从其身上学以“道”,但其不一定是知识的传播者。
今天看来,“教师”的必要条件不光是拥有知识,更重于传播知识。
NewcastleStreet,SheffieldS13JDUnitedKingdom
2DepartmentofAppliedMathematics,UniversityofSheffield,HicksBuilding,Sheffield
矢量计算支撑了偏微分方程和它们的数值近似求解。
为了很好的使用有限元方法,建模人员应该掌握矢量计算基础知识。
本科毕业的工程师可能学过矢量计算的数学课程,但是由于没有碰到过矢量计算的实际应用,这时在工程建模中使用矢量计算就受到限制。
本附录介绍了所有COMSOLMULTIPHYSICSWITHMATLAB中用到的矢量计算基础知识。
所以也可以将该附录当作是COMSOLMULTIPHYSICSWITHMATLAB多变量微分计算的入门读本。
当我们写该附录时曾经争论过是否将这部分内容直接加入到第一章(数值分析基础)中,因为导数的数值近似是偏微分方程求解的基础,而偏微分方程是COMSOLMULTIPHYSICS的基本运算单元。
确实,在学习波谱法求解偏微分方程时,基本理论就是“导数理论”——如何使用波变换方法来近似导数。
所以通过对比发现,有限元方法的基础就是数值微分。
所以争论就不存在了,第一章主要是关于COMSOLMULTIPHYSICS直接计算的基本问题的。
但是不管多有用,近似导数仍然只是建模的一个中间步骤,不是目标本身。
我们这里只考虑用于矢量计算的MATLAB基础,本附录的重点在于特征值分析和逻辑表达式。
这些在整本书中都有体现。
应当注意到我们这里介绍的每个功能都可以在COMSOLScript中实现。
本书中唯一不能在COMSOLScript中实现的Matlab命令就是fminsearch。
1.矢量回顾
1.1矢量表达
FEMLAB可以处理标量、矢量和矩阵数据,这里简单介绍一下矢量的表达(作为MATLAB矩阵数据类型的一个特例)。
标量可以作为一个单独的数,但是矢量是具有大小和方向的。
在如图1所示的右手坐标系系统中,向量a用以下形式表达:
(1)
这里
,
和
是坐标方向的单位矢量,
,
,
是向量
在各轴方向上的分量。
它们是
对各单位矢量
,
和
的投影。
对于坐标系中的P点(x,y,z),矢量P对于初始坐标系统O的位置为:
(2)
MATLAB用分量的形式描述列矢量或行矢量:
>>a=[1;2;3];%columnvector
>>a=[123];%rowvector
在行向量中,空白(任意连续空格)作为分界符。
列向量用分号或者回车符分界:
>>a=[1
2
3];
1.2内积,矩阵乘法,单位矢量和矢积
典型的内积(或点积)定义为:
(3)
这里
是矢量
和
的夹角。
为了在MATALB中达到相同的目的,我们使用*运算符:
>>a=[1;2;3];
>>b=[-32-1];
>>b*a
ans=
-2
这是一个行向量(1×3矩阵)乘以列向量(3×1矩阵)的特殊情况。
因为前者的列数和后者的行数相等,这两个矩阵是相容的,可以根据矩阵乘法通用法则计算。
(4)
如果A是m×n矩阵,B是n×l矩阵,则AB是m×l矩阵。
如果共用的维数不同,那么矩阵不相容,不能定义乘法运算。
MATLAB也可以将标量乘法作为特殊矩阵乘法来计算,但是必须考虑矩阵的相容性。
例如
>>a*b
ans=
-32-1
-64-2
-96-3
出现了什么情况?
很简单,a是3×1矩阵,乘以1×3矩阵b,得到的ab是3×3矩阵。
(5)
对于向量,矩阵(ab)ik称为a和b的并积或并矢。
这是矩阵外积的特殊情况,这里标量乘积也算内积。
在MATLAB中通过转置运算符“’”可以实现两个行向量或两个列向量的内积,它是一个一元运算符,容易被误解为英语中的缩写符号。
ans=
-2
but
>>a*b’
ans=
-32-1
-64-2
-96-3
仍然产生并矢。
必须自己考虑矩阵的相容性。
如果a和b是行向量,那么
*a或a*
将产生内积还是外积?
出于这个原因,MATLAB提供了一个特殊的dot函数来取消这种相容性的差别。
>>helpdot
DOTVectordotproduct.
C=DOT(A,B)returnsthescalarproductofthevectorsAandB.
AandBmustbevectorsofthesamelength.WhenAandBareboth
columnvectors,DOT(A,B)isthesameasA’*B.
DOT(A,B),forN-DarraysAandB,returnsthescalarproduct
alongthefirstnon-singletondimensionofAandB.AandBmust
havethesamesize.
DOT(A,B,DIM)returnsthescalarproductofAandBinthe
dimensionDIM.
SeealsoCROSS.
Example.
>>dot(a,b)
ans=
-2
>>dot([1;2;3],[-32-1])
ans=
-2
使用dot函数使得行/列向量的组合不受影响。
向量值
向量的值或模可以通过下式计算:
(6)
MATLAB通过下式计算向量的模。
ans=
3.7417
orwiththebuilt-incommandnorm
>>norm(a,2)
ans=
3.7417
这里sqrt()是预置的平方根函数。
单位向量
单位向量是模为1的向量。
单位向量可以通过归一化处理得到,即:
(7)
例如,
>>ahat=a/norm(a,2)
ahat=
0.2673
0.5345
0.8018
以上除法是标量除法,是矢量的每个元素除以标量。
COMSOLMultiphysics通常根据预置的几何单位向量来描述边界。
nx,ny,nz通常作为边界上指向外部的单位矢量。
较少使用tx和ty作为边界曲线的切线矢量。
通常二维表面有两个正交切线方向,所以有无穷多个切向矢量。
叉积
叉积定义如下:
(8)
这里
是置换张量,当指数ijk为123的正置换时取+1,当是123的负置换时取-1,其它情况均为零。
是包含a和b的平面内的单位标准向量。
是第i个坐标方向的单位向量。
MATLAB提供了一个特殊的函数来计算叉积。
>>helpcross
CROSSVectorcrossproduct.
C=CROSS(A,B)returnsthecrossproductofthevectors
AandB.Thatis,C=AxB.AandBmustbe3element
vectors.
C=CROSS(A,B)returnsthecrossproductofAandBalongthe
firstdimensionoflength3.
C=CROSS(A,B,DIM),whereAandBareN-Darrays,returnsthecross
productofvectorsinthedimensionDIMofAandB.AandBmust
havethesamesize,andbothSIZE(A,DIM)andSIZE(B,DIM)mustbe3.
SeealsoDOT.
Forexample,
>>cross(a,b)
ans=
-8
-8
8
>>cross(b,a)
ans=
8
8
-8
我们看到叉积中的因子阶数决定了叉积的正负号,等效于改变了单位标准向量
的方向。
1.3数组:
简单数组,元包数组和结构体
数组处理本质上就是从FEMLAB中提取数据。
为方便起见,FEMLAB对于多物理场采用fem结构体组织模型,对于扩展多物理场采用xfem结构体组织模型。
从结构体和元包数组中提取有用信息是访问FEMLAB模型(和结果)的一个非常有用的方法。
简单数组
数组有维数(m×n×l…)。
矩阵是二维数组。
每个维数都有长度。
所以size()和length()是两个非常有用的命令。
>>a=[1234;5678];
>>size(a)
ans=
24
数组的尺寸本身就是一个行向量,它的长度等于数组的维数。
>>length(a(1,:
))
ans=
4
第二个自变量的冒号(:
)表示包括第二维的整个范围,在本例中表示元素1到4。
>>length(a(:
3))
ans=
2
>>a(1,2:
4)
ans=
234
实际上冒号相当于低维数的子数组。
a(1,:
)是第一行;a(:
3)是a的第三列。
a(1,2:
4)给出了第1行2到4列元素组成的子数组。
对于更高维数情况,提取出的子数组更加复杂,例如:
>>b=ones(2,2,2)
b(:
:
1)=
11
11
b(:
:
2)=
11
11
>>b(1,:
)
ans=
1111
前两种情况下子数组是矩阵,第三种情况下最终两个维数聚集成一个简单的行向量。
FORTRAN编程人员可能感觉单个元素的寻址比子数组更舒服,可能会使用循环结构来达到相同的目的。
>>a(1,3)
ans=
3
构造数组
数组可以通过冒号元算符自动生成,即
>>a=[0:
0.1:
1]*pi
a=
Columns1through8
00.31420.62830.94251.25661.57081.88502.1991
Columns9through
112.51332.82743.1416
这样产生了从0到π间隔相等的11个值。
a=linspace(0,pi,11)a=
Columns1through8
00.31420.62830.94251.25661.57081.8850
2.1991
Columns9through
112.51332.82743.1416
linspace是一个通用的矩阵自动生成命令,它起着旧编程语言中循环结构的作用。
有的时候也用得到logspace函数。
>>helplinspace
LINSPACELinearlyspacedvector.
LINSPACE(X1,X2)generatesarowvectorof100linearly
equallyspacedpointsbetweenX1andX2.
LINSPACE(X1,X2,N)generatesNpointsbetweenX1andX2.
ForN<2,LINSPACEreturnsX2.
SeealsoLOGSPACE,:
.
>>helplogspace
LOGSPACELogarithmicallyspacedvector.
LOGSPACE(X1,X2)generatesarowvectorof50logarithmically
equallyspacedpointsbetweendecades10^X1and10^X2.IfX2
ispi,thenthepointsarebetween10^X1andpi.
LOGSPACE(X1,X2,N)generatesNpoints.
ForN<2,LOGSPACEreturns10^X2.
SeealsoLINSPACE,:
.
四种其它常见数组生成函数为zeros,ones,rand和eye。
zeros生成全0数组;ones生成全1数组;rand生成均匀分布的随机数组;eye生成单位矩阵。
>>helpzeros
ZEROSZerosarray.
ZEROS(N)isanN-by-Nmatrixofzeros.
ZEROS(M,N)orZEROS([M,N])isanM-by-Nmatrixofzeros.
ZEROS(M,N,P,...)orZEROS([MNP...])isanM-by-N-by-P-by-...
arrayofzeros.
ZEROS(SIZE(A))isthesamesizeasAandallzeros.
>>helpones
ONESOnesarray.
ONES(N)isanN-by-Nmatrixofones.
ONES(M,N)orONES([M,N])isanM-by-Nmatrixofones.
ONES(M,N,P,...)orONES([MNP...])isanM-by-N-by-P-by-...
arrayofones.
ONES(SIZE(A))isthesamesizeasAandallones.
>>helprand
RANDUniformlydistributedrandomnumbers.
RAND(N)isanN-by-Nmatrixwithrandomentries,chosenfrom
auniformdistributionontheinterval(0.0,1.0).
RAND(M,N)andRAND([M,N])areM-by-Nmatriceswithrandomentries.
RAND(M,N,P,...)orRAND([M,N,P,...])generaterandomarrays.
RANDwithnoargumentsisascalarwhosevaluechangeseachtimeit
isreferenced.RAND(SIZE(A))isthesamesizeasA.
>>helpeye
EYEIdentitymatrix.
EYE(N)istheN-by-Nidentitymatrix.
EYE(M,N)orEYE([M,N])isanM-by-Nmatrixwith1’son
thediagonalandzeroselsewhere.
EYE(SIZE(A))isthesamesizeasA.
到目前为止你可能已经注意到,如果知道命令的名字,Matlab就可以给出相关语法。
但是你怎么才能知道命令的名字呢?
在COMSOLScript中,只要输入help就会产生一列命令类型。
随后输入“helptype”命令就可以显示出相关命令。
例如,“helpnumerics”给出了一列数值命令。
然后“helpdaspk”给出调用daspk命令的语法,这是单独为FEMLAB准备的刚性DAE求解器。
标量——数组运算
对数组的标量四则运算等于对数组中元素的四则运算,例如:
>>3*a
ans=
Columns1through8
00.94251.88502.82743.7699
4.71245.65496.5973
Columns9through
117.53988.48239.4248
>>5+a
ans=
Columns1through8
5.00005.31425.62835.94256.2566
6.57086.88507.1991
Columns9through11
7.51337.82748.1416
数组——数组的基元运算
数组对数组的四则运算是一个比较偏的内容。
如果数组大小一致,那么可以对元素采用点运算符:
>>b=linspace(1,11,11)
b=
1234567891011
>>size(a)
ans=
111
>>size(b)
ans=
111
>>a.*b
ans=
Columns1through8
00.62831.88503.76996.2832
9.424813.194717.5929
Columns9through11
22.619528.274334.5575
元包数组和结构体
关于元包数组和结构体可以写整整一章的内容。
对于这两种数据结构,应该注意到它们是不同种类混合数据类型的容器——包括浮点数,复数,矩阵,字符串和其它数组和结构体。
元包数组将数组中的每个元包作为指针。
元包数组通过包含数组基元的括弧来直接定义。
元包命令将会产生一个空的构架,你可以在其中分别填入元素或数组。
>>ca={’every’,’good’,’boy’,’does’,’find’,3+3i,[01;-22]}
ca=
Columns1through6
’every’’good’’boy’’does’’find’[3.0000+3.0000i]
Column7
[2x2double]
通过圆括号内的数组地址可以进行调用,返回元包的元素。
>>ca(3)
ans=
’boy’
通过大括号内的地址数可以返回元包中基元包含的内容。
>>ca{3}
ans=
boy
可能通过矩阵元包更容易理解这一点。
>>ca(7)
ans=
[2x2double]
>>ca{7}
ans=
01
-22
结构体更多的借鉴了域的概念,也常称作枚举法,在C语言中比较常见。
使用结构体和元包数组的最大区别在于如果你改变结构体,增加或减少域并不会改变域的次序。
但是减少或增加元包数组元素会改变元包编号,或在数组中产生“空穴”。
COMSOLMultiphysics用户最常见到的结构体就是fem结构体,这是COMSOLMultiphysics对多物理场模型组织数据和计算结果的结构体。
从COMSOLMultiphysics中导出fem结构体到MATLAB工作空间中产生以下电动流动模型。
>>fem
fem=
version:
[1x1struct]
appl:
{[1x1struct][1x1struct][1x1struct]}
geom:
[1x1geom2]
mesh:
[1x1femmesh]
shape:
{1x7cell}
gporder:
{[4][2]}
cporder:
{[2][1]}
simplify:
’off’
border:
1
outform:
’weak’
form:
’weak’
equ:
[1x1struct]
bnd:
[1x1struct]
pnt:
[1x1struct]
expr:
{’zeta’’-zeta1*(Y+zetar*(1-Y))’’sig’’Y+sigr*(1-Y)’}
elemcpl:
{[1x1struct]}
draw:
[1x1struct]
const:
{1x34cell}
globalexpr:
{1x12cell}
xmesh:
[1x1com.femlab.xmesh.Xmesh]
sol:
[1x1femsol]
以上fem结构体的域列表给出了对各域中内容的描述。
每个域都可以通过“点”号来寻址。
>>fem.expr
ans=
’zeta’[1x22c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微波 仿真 论坛 附录 COMSOLMultiphysics MATLAB 矢量 计算 基础 18