COMSOLMULTIPHYSICS和数值分析基础_第1页
COMSOLMULTIPHYSICS和数值分析基础_第2页
COMSOLMULTIPHYSICS和数值分析基础_第3页
COMSOLMULTIPHYSICS和数值分析基础_第4页
COMSOLMULTIPHYSICS和数值分析基础_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章COMSOLMULTIPHYSICS及数值分析基础W。B.J.ZIMMERMAN,B.N.HEWAKANDAMBYDepartmentofChemicalandProcessEngineering,UniversityofSheffield,NewcastleStreet,SheffieldS13JDUnitedKingdomE—mail:w。zimmerman@shef.ac.uk本章主要介绍COMSOLMultiphysics在零维和一维模型数值分析方面的几个关键内容。这些内容包括求根、步进式数值积分、常微分方程数值积分和线性系统分析。这几乎是全部的化工过程数学分析方法。下面通过COMSOLMultiphysics中的一些常见化工过程应用实例来介绍这些方法,包括:闪蒸、管式反应器设计、集中反应系统和固体中热传导。1.简介本章内容很多,可以分为几个不同的目标。首先介绍了COMSOLMultiphysics的主要工作特性;其次介绍了如何使用这些特性来分析一些简洁的,位于零维空间、一维空间或“空间-时间"系统中的化工问题.本章还盼望通过展现COMSOLMultiphysics和MATLAB工具在化工过程分析中的强大功能,激发读者对使用COMSOLMultiphysics进行建模与仿真的爱好。由于COMSOLMultiphysics不是一个通用的问题求解工具,所以一些目标需要迂回实现。作者在使用FORTRAN、Mathematica和MATLAB解决化工问题方面有着丰富的教学阅历,并用这些工具实现过这里全部的例子。而且,扩展化工问题的数值分析也已经在POLYMATH[1]中实现,这似乎只在化工委员会的CACHE项目中使用过。本书前一版已经介绍过在零维空间中求解非线性代数方程和与时间有关的常微分方程的内容.从概念上讲,零维域就是一个简洁的有限元。通过讨论某一特定有限元中的变化对理解有限元方法格外有用。但是,COMSOLMultiphysics通过独立对话框设置,使得零维几何方程和与时间相关的常微分方程求解变得格外简洁。所以本章将同时采纳这两种方法求解这些例子。2.方法1:求根典型的数值分析课程会讲解多种求根方法,但是从实际阅历来看,只有两种算法格外有用——二分法和牛顿法。我们这里没有列出全部方法,而是重点考虑为什么求根是最有效的数值分析工具。在线性系统中求根格外简洁,但是对于非线性系统这就是一个挑战,而全部感爱好的动力学问题几乎都是非线性系统.对非线性系统的求根起源于对反函数的描述。为什么呢?由于对于大多数非线性函数,“正向"y=f(u)很好表示,但是它的反函数u=f--1(y)可能不能显式表示、多值(无意义)或根本不存在。如果反函数存在的话,求解反函数其实就是求根的过程——求解满意F(u)=0的u等价于求解F(u)=f(u)-y=0。由于大多数数值分析的目标是在系统约束下计算求解,所以这也等价于对全部的约束取反.COMSOLMultiphysics拥有求解非线性问题的核心函数—-femnlin,本节主要介绍用它求解零维非线性问题。femnlin函数使用牛顿方法求解,由于只有一个变量u,牛顿法通过对一阶倒数迭代来求根。该方法首先估量函数的斜率范围,然后再逼近根。该斜率可以通过理论分析(牛顿—拉夫逊方法)和数值(正割法)方法求得。如果能用任何一种方法求得斜率,就可以用泰勒定律来逼近根。其基本思想就是使用目前推测值u0的泰勒展开式:ﻩﻩﻩﻩﻩﻩ(1)该公式可以化简,忽视(u—u0)的高阶项,计算根如下:ﻩﻩ ﻩﻩﻩﻩﻩ(2)这个方法可以快速地扩展到多维求解空间,例如将u看作未知矢量,“被除”看作“乘以f的雅克比矩阵的逆”。下一节介绍COMSOLMultiphysics中的求根过程。2。1求根:COMSOLMultiphysics非线性求解器的应用实例如上节所述,求根本身是一个“零维”活动,至少对于“空间-时间”系统多维未知矢量u来说是这样的。COMSOL多物理场没有零维模式,所以我们临时采纳一维模式。这在方面增加了我们不需要的冗余功能。但是由于问题规模较小,COMSOLMultiphysics编码效率高,且现代微处理器的运算速度快,这点就不成为问题了。启动MATLAB并在命令窗口键入COMSOLMultiphysics。屏幕闪烁几秒后,会消灭一个模型导航窗口。依据表1所示步骤,建立一个零维应用模式来解决非线性多项式方程:ﻩﻩﻩﻩﻩﻩﻩ (3)通过在“Physics”菜单、“Subdomainsettings"选项中的设定,使得表1中的每个子域都满意该方程.注意左上角,这是以矢量符号给出的方程。在一维模式下,这个方程可以简化为:ﻩ ﻩﻩ (4)显然,α、γ和β在一维简化里是多余的。既然我们是求零维的根,全部公式4左侧的系数都可以设为0。通过重新组合多项式,我们发现a=4和f=u+u+2。注意我们是通过设定最大基元尺寸为1、将域离散化为只有一个基元的域,从而得到零维空间的!表1系数模式下的求根实例。文件名称:rootfinder。mph.ModelNavigator选择1D空间维数,COMSOLMultiphysics:PDEmodes:PDE,coefficient形式Draw菜单Specifyobjects:Line。Coordinates弹出菜单。x:01名称:interval,完成Physics菜单:Boundarysettings选择域:1和2(按住Ctrl键同时选中)选择Neumann边界条件采纳默认设置q=0g=0,完成Physics菜单:Subdomainsettings选择域:1设定:c=0;a=4;f=u^3+u^2+2;=0应用,选择Init选项卡:设定u(t0)=-2,完成Mesh菜单:Meshparameters设定最大基元尺寸1点击remesh,完成Solve菜单:Solverparameters求解器选择Stationarynonlinear,求解,完成Post-processingPointEvalution选择边界1,表达式:u,完成设定初始推测值为u(t)=-2,下面我们来寻找最接近这个值的根.你可能对为什么设置a=4而不是把全部有关参数放进f中感到奇怪,那是由于对公式(4)右侧有限元离散后得不到一个奇异刚度矩阵。后处理阶段在输出窗口中显示出结果:Value:-2.732051,Expression:u,Boundary:1。解析解得出的根为-1—,数值解能够很好的与其吻合。依据代数中二次公式的解知道,另外一个根是—1+,第三个根是1.回到子域设置中来,如果最初设置的推测值为u(t0)=-0.5,则COMSOLMultiphysics解出u=0.762051,又一个很好的近似数值解。如果u(t0)=1.2作为最初猜想时,得到u=1。该练习体现了非线性求解器和问题的两个特性——(1)非线性问题可以有多个解;(2)最初推测值对于求解很关键。牛顿法通常收敛到最接近的解,但是在高阶非线性问题中,这点可能不成立。这些特性在多维求解空间和“空间-时间”相关系统中同样适用。COMSOLMultiphysics模型mph文件(rootfinder.mph)中包含了全部的MATLAB/COMSOLScript源代码和FEMLAB的扩展功能,以便再次恢复到FEMLAB当前图形用户界面。该文件在网页HYPERLINK”http://eyrie。shef.ac.uk/femlab"http://eyrie。shef.ac.uk/femlab中可以得到.只需打开“Menu”菜单,选择“Openmodelm-file”选项,在弹出的“Openfile”对话框中选中它,你就可以在“Subdomainsettings"中快速设定非线性函数,给定初始推测值,然后用非线性求解器得到收敛解.但是如果函数中没有线性项可以放在公式(4)左侧怎么办?例如,FEMLAB将tan(u)-u2+5=0放在公式(4)左侧时,会生成奇异刚度矩阵。建议在子域中设定一个u的二次派生系数,c=1。通过与Neumann边界条件相结合,这个人为集中因素不能转变基元中解为常数的事实,但是它可以避开刚度矩阵奇异。在一般模式下求根tan(u)—u2+5=0中奇异刚度矩阵的问题可以通过一般模式来避开,它可以求解下式:ﻩﻩﻩﻩﻩ ﻩ(5)其中Г(u,ux)和(4)式中的系数项功能类似,但是被求解器处理方式不同。在系数模式中,认为系数与u无关,除非使用数值雅可比矩阵,这会产生一些非线性依靠关系-—迭代次数增加。一般模式下构建刚度矩阵时,精确雅可比矩阵会将Г和F对u进行微分。通常一般模式比使用数值雅可比矩阵的系数模式需要的迭代次数少。下面使用的雅可比矩阵,不需要任何特殊处理来避开刚度矩阵奇异.总的来说,一般模式在处理非线性问题时比系数模式更加有用。从我的个人观点看来,系数模式是COMSOLMultiphysics的一个遗传特性--MATLAB的偏微分方程工具箱,它在很多方面是FEMLAB和COMSOLMultiphysics的先驱,它广泛使用了系数形式.此外,数值雅克比矩阵系数公式是一个长期存在的标准有限元方法,所以相对于其它代码,它是一种格外有用的公式.表2给出了应用一般模式的步骤——对我们刚才的步骤做了小小改动.表2一般模式下的求根实例。文件名:rtfingen.mphModelNavigator1D,COMSOLMultiphysics:PDEmodes,general模式Options设定Axes/Grid为[0,1]Draw名称:Interval;Start=0;Stop=1Physics菜单:BoundarySettings设定两个端点(域)为Neumann边界条件Physics菜单:SubdomainSettings设定Г=0;=0;F=u3+u2—4*u+2初值u(t0)=-0。5Mesh模式设定最大基元尺寸,general=1;点击RemeshSolve使用默认设置(nonlinearsolver,exactJacobian)Post-Processing经过5次迭代,结果收敛。点击图片读出u=0.732051。转变初始条件找到另外两个根虽然这里给出了单变量简洁函数求根的模板(rtfindgen.mph),但是实际上MATLAB有更简洁的计算子程序,通过内置函数fzero和函数声明来求根,现在COMSOLMultiphysics图形用户界面可以使用帮助方程中的帮助变量来求解几何约束,该变量称为状态变量。作为对一般模式求根模型的补充,使用状态变量v依据表3的步骤来求解一个非线性方程。表3在ODE设置中求根Physics菜单:ODEsettings名称:v。方程:tanh(v)—v^2+5,完成Solve菜单:Solverparameters选择Stationarynonlinear求解器,求解,完成Post-processing选择Pointevaluation,边界2,表达式:vReport窗口值:—2.008819,表达式:v,边界:2下一节我们将非线性求根方法应用到一个常见的化工实例中——闪蒸,它用到了COMSOLMultiphysics图形用户界面的更多新特性。2。2求根:闪蒸实例化学热力学中广泛存在求根法的应用实例,由于化学平衡和质量守衡的约束条件很充分,再加上状态方程,就产生了和问题中未知变量个数相同的约束条件。在本节中,我们以闪蒸为例来介绍简洁的求根方法,构建只有一个自由度的系统,这里以相分率作为未知变量。表4闪蒸单元的初始组分以及平衡时的安排系数K组分XI65℃,3.4bar下的Ki乙烷0。007916。2丙烷0.12815.2i-丁烷0.08492。6n-丁烷0.26901.98i-正戊烷0.05890。91n-正戊烷0.13610.72己烷0.31510。28液相碳氢化合物混合物通过闪蒸到65℃、3.4bar状态。液相组成和每种组分闪蒸“K"值见表4.我们盼望知道闪蒸过程中气相和液相产物的成分和液相的比例。表4给出了原始成分。组分i的质量平衡满意以下关系ﻩ ﻩﻩ (6)Xi是闪蒸前液体的莫尔分数,xi是闪蒸后液体莫尔分数,yi是蒸发产物莫尔分数,是液相产物与总供应摩尔流率的比值。平衡系数的定义为:Ki=yi/xi。将该方程消去质量平衡中的xi,得到一个关于yi和Xi的方程:ﻩﻩﻩﻩ ﻩﻩ (7)由于各yi相加为1,所以我们有的非线性方程:ﻩﻩﻩﻩﻩﻩ(8)其中n是组分数量。该函数可用root(s)求解,将计算结果回代就可以得到全部产物的莫尔分数。牛顿-拉夫逊方法需要知道当前导数来决定计算方向,在COMSOLMultiphysics中将解析计算该值。通过下式很容易得到牛顿-拉夫逊迭代方法:ﻩﻩﻩ ﻩﻩ(9)现在再回到COMSOLMultiphysics求根计算。作为一个练习,我们用一般PDE模式来计算求解。我们可以只载入rootfinder。mph或rtfindgen.mph并加以修改来计算这个问题,但是熟识COMSOLMultiphysics功能也是格外重要的目的.表5闪蒸实例ModelNavigator选择1D,COMSOLMultiphysics:PDEmodes:PDE,general形式Draw菜单Specifyobjects:Line,Coordinates弹出菜单,x:01名称:interval,完成Options菜单:Constants输入表4中数据X1,0.0079X2,0.1281X3,0.0849X4,0.2690X5,0.0589X6,0.1361X7,0.3151Options菜单:ScalarExpressions为(8)式中右侧各项定义表达式t1-X1/(1-u*(1—1/K1))t2-X2/(1-u*(1-1/K2))t3-X3/(1-u*(1—1/K3))t4-X4/(1—u*(1-1/K4))t5—X5/(1-u*(1-1/K5))t6-X6/(1—u*(1-1/K6))t7-X7/(1-u*(1-1/K7))Physics菜单:Boundarysettings选择域:1和2(按住Ctrl键)选择Neumann边界条件采纳默认设置q=0,g=0完成Physics菜单:Subdomainsettings选择域:1设定F=1+t1+t2+…+t7;=0选择Init选项卡,设定u(t0)=0.5Mesh菜单:Meshparameters设定最大基元尺寸为1点击Remesh,完成Solve菜单:Solverparameters选择Stationarynonlinear求解器求解,完成Post—processing:PointEvaluation选择边界:1,表达式:u,完成Report窗口,值:0。458509,表达式:u启动COMSOLMultiphysics,打开模型导航栏.如果你已经打开COMSOLMultiphysics对话框,那么将你的工作空间保存为mph文件或者将命令保存为m文件,然后打开“File”菜单选择“New”。依据表5的步骤建立闪蒸模型。注意本例中有两个新增内容--“Options:Constants”和“Options:Expressions”.在这里可以定义常数,然后在COMSOLMultiphysics中任何可以使用纯数字的输入框中使用定义的常数。表达式和常数类似,可以在任何COMSOLMultiphysics数字输入框中使用,但是不同之处在于表达式依靠于因变量。定义的常数和表达式同样可以在后处理过程中使用。后处理过程显示t1和t2为:Value:—0.013865,Expression:t1,Boundary:1Value:—0.203441,Expression:t2,Boundary:1另外求解器日志中常常包含有用的信息。打开“solver"菜单,在最底部选择“ViewLog”,会弹出求解器日志对话框。它显示了求解器何时开头计算,执行了什么命令,如何从初始状态得到计算结果。这里经过三次迭代,肯定误差达到10—9。如果你的解不是不收敛或收敛很慢的话,很容易得到这样的信息。练习计算方程的根.由于该函数是三次多项式,所以存在解析的无理数解,。uexp(u)—1计算方程的根。这是个超越方程,意味着不存在解析的无理数解.如果你使用系数模式,设c=1来帮助收敛。3.方法2:步进法数值积分数值积分是数值分析的支柱.在有计算机之前,科学计算的首要工作是制作特殊方程手册,其中几乎包括了全部特殊常微分方程的解。那么用什么方法计算得到的?就是用一维数值积分。一维数值积分分为两种:初值问题(IVP)和边界值问题(BVP)。我们下一节再介绍边界值问题.最容易积分的是初值问题,由于全部的初始条件都在一点定义,可以依据一阶导数直接步进积分。显然,如果常微分方程是一阶的,例如: ﻩ ﻩﻩ(10)那么当△t→0时,(10)中其次项严格成立。它满意欧拉法的条件,是积分一阶常微分方程最简洁的方法.对于一维情况,可以简洁地依据f在(xn,yn)点的导数向前步进积分,这里n是指积分过程中的第n次离散化步骤。所以,ﻩﻩﻩ ﻩﻩ(11)这里假设导数变化不超过步进量h,这只对线性函数才严格成立。对于任何有曲率的函数,该假设都不成立。下面考虑在图1中,如果步进量h取得过大会造成什么错误.显然,欧拉法需要改进的一点就是增大步进量,由于它需要小步进量以保证精准性。欧拉法也被称作“一阶"精准性,由于误差只能降低到一阶h的程度.图1数值积分中的欧拉步进龙格库塔方法所以如果我们盼望增大步进量,那么就需要一个“更高阶的方法",随着步进量的减小,误差快速降低.k阶方法误差大约在hk量级。假设我们忽视了曲率,可以通过计算斜率f(x)在xn和xn+1之间几个中间点的值来计算y(x)的曲率。可以首先依据初始导数计算间隔中点的值,然后再用整个间隔中点的微分值来获得二阶精准性。ﻩ ﻩﻩ ﻩ(12)这样我们通过对两个函数的计算又得到一阶精准性.所以,如果使用一阶方法,N次计算得到O(1/N)误差,而二阶方法2N次计算得到O(1/4N2)误差,如果使用一阶方法的话,这需要N2次计算。更高阶龙格库塔方法我们可以做的更好吗?显然,如果用三个中间点可以获得三阶精准性,用四个中间点可以获得四阶精准性等等。不过更高阶的方法需要更多的编程工作,所以也要考虑我们的时间.但是从本质上讲,我们计算函数的k阶导数不肯定光滑。可能在增加“近似精准性”的同时,高阶导数的整体误差会变得很大,如果是这样,每次连续步进都可能导致误差的急剧增大。这表明高阶方法没有低阶方法稳定。常微分方程通常选用四阶龙格库塔方法积分,这样程序比较紧凑,精准性高,也有很好的稳定性。其它方法在数值积分编程的时候,还需要注意两个问题:数值稳定性:即使使用高阶精准性的方法,你的积分结果与检验值偏差仍然很大,这可能就是由于你的数值方法不稳定。你可以通过降低步进量来获得数值稳定性,但是这也意味着更长的计算时间。如果你的计算量很大,计算时间太长,可以选用半隐式方法,例如猜测校正法等。刚性系统:物理机理起作用时,刚性系统通常会有两个完全不同的长度或时间尺度。刚性系统可能会消灭上面提到的“系统非稳定性”现象,或者非物理现象的振荡。可以参考Gear[2]的书来解决这个问题。3.1数值积分简洁实例高阶常微分方程通常通过降阶和步进法求解,考虑如下方程:ﻩﻩﻩﻩ ﻩ (13)除非q(x)和r(x)是常数,那么你很幸运能够从大多数分析方法教材中找到答案。也有一些特殊的q(x)和r(x)可以求得解析解,但是最好能计算出各种情况下的数值解。为什么呢?由于为了搞清楚y(x),你需要画出曲线,得到解析解时你也需要花费肯定的精力在作图上.那么应该怎么做?首先将上面的二阶系统降低为两个一阶系统:上式的常微分方程能够仿照(11)和(12)进行时间步进法数值积分。举个简洁例子:ﻩﻩ ﻩﻩﻩﻩ(14)降阶产生了两个一阶常微分方程:ﻩﻩﻩ ﻩ ﻩ(15)假设初始条件为u1=1,u2=0,可以建立零维空间系统来积分这一对常微分方程。打开COMSOLMultiphysics,等待模型导航栏窗口。如果已经打开一个COMSOLMultiphysics窗口,把工作空间保存为mph文件或者把命令保存为m文件,然后在“File"菜单中选择“New”选项。依据表6的步骤进行设置。表6时间步进积分的简洁实例ModelNavigator选择1D,COMSOLMultiphysics:PDEmodes:PDE,general模式,插入因变量:u1u2Draw菜单Specifyobjects:Line。Coordinates弹出菜单,x:01名称:interval,完成Physics菜单:Boundarysettings选择域:1和2(按住Ctrl键)选择Neumann边界条件保持默认选项q=0,g=0完成Physics菜单:Subdomainsettings选择域:1设定F1=—u2,F2=u1选择Init选项卡,设定u1(tw)=1Mesh菜单:Meshparameters设置最大基元尺寸为1点击Remesh,完成Solve菜单:Solverparameters选择timedependent求解器,在General选项卡中输入Times:linspace(0,2*pi,50)求解,完成Post-processing:Cross-sectionplotparametersPoint选项卡,接受u1的默认设置General选项卡,接受全部时间的默认设置完成这个例子给了我们两个独立变量u1、u2和空间坐标x。注意“Subdomainsettings”窗口左上角方程中的矢量标志.由于是矢量变量,全部输入选项卡都是矢量(F)或者矩阵(da)输入。MATLAB命令linspace(0,2*pi,50)生成50个基元的矢量,给出从0到2π的数据,u1(t=2π)=1.004414.假设解析解是u1(t=2π)=1,结果不够精准(0.4%误差)。之前FEMLAB允许用户在MATLAB和FEMLAB中选择针对时间积分的预置的求解器。也允许用户在求解器变量对话框的通用选项卡中调整容错值(相对和肯定)。将相对误差调整为0。001,肯定误差调整为0.0001,得到一个相对较好的计算结果u1(t=2π)=0.998027.注意累积的全局误差与求解方法精准性0。001的量级全都.图2一个周期的u1(t)图3一个周期的u2(t)图2和图3表明如果设定足够小的步进时间,FEMLAB能够完成高精度的正弦和余弦函数数值积分。虽然我们一般认为正弦和余弦是“解析函数”,但是通过比较,还是能清楚地看到解析函数和需要数值积分的函数是似是而非的——没有比Bessel函数和椭圆方程更有解析性的函数。练习使用物理场菜单中的常微分方程设置和相同的初时条件,试着积分方程(15),假设状态变量为v1和v2。基于时间的常微分方程和代数方程的唯一区分就是必须使用符号代替dv1/dt和v1t等。4.管式反应器数值积分本节介绍在化工管式反应器设计时,如何同时求解一阶非线性常微分方程组。通常管式反应器设计的关键要素是反应器的长度。一个气态酒精脱水管式反应器,工作在2bar和150℃下。反应方程式为:已有试验表明反应速率可以表示如下,其中CA是酒精浓度(mol/L),R是酒精的消耗速率(mol/s/m3):反应器直径为0.05m,入口酒精流速为10g/s。问:如何确定反应器的长度,进而获得各种酒精转化率?我们盼望确定酒精出口摩尔分数分别为0.5,0.4,0.3,0.2和0.1时的反应器长度。化工设计理论假设反应热很小,反应器内为柱状流,抱负气体,可以确定反应流体由四个常微分方程掌握,其中独立变量为CA,CW(水浓度),V(速度)和x(反应器长度): ﻩﻩ ﻩﻩ (16)最后一个方程说明表面速度使得反应器长度和反应物在反应器内的存在时间之间存在一个平衡.初始入口条件为:ﻩﻩﻩﻩ ﻩ (17)方法从初时条件和化学计量系数可以看出,CW=CE(酒精浓度),由于温度和压力设为常数,所以浓度C也为常数,可以看作是抱负气体,有:ﻩ ﻩﻩﻩﻩﻩ(18)初始进口速度V0可以由给定流速、入口密度(酒精分子量为46kg/kmol)和管的横截面积计算出。该方程需要对时间t数值积分到需要的酒精摩尔分数。使用较为简洁的欧拉方法或者龙格库塔方法积分。读者也许注意到,积分CA可能不需要其它变量,但是CW,V和x与时间t严格相关。但是由于我们需要求出对应摩尔分数的x值,所以最好同时求解四个变量。部分结果计算得到的数值解为:ﻩ ﻩﻩ ﻩﻩﻩ(19)其中CA/C如图4所示。图4酒精浓度随时间t变化曲线COMSOLMultiphysics计算我们盼望再次建立虚拟的零维模拟空间,这次使用四个独立变量。打开COMSOLMultiphysics,等待模型导航栏窗口。依据表7的步骤建立管式反应器模型。该模型给出四个独立变量u1、u2、u3、u4和一个空间坐标x。由于变量比较多,建议用变量名称进行常数设定.进一步来说,由于使用了速度定律,用矢量表达式更为便利.表7COMSOLMultiphysics中管式反应器设计建模步骤ModelNavigator选择1D空间维数,COMSOLMultiphysics:PDEmodes:PDE,general形式设定独立变量:u1u2u3u4选择Element:Lagrange—Linear,完成Draw菜单Specifyobjects:Line,Coordinates弹出菜单,x:01名称:interval,完成Options菜单:Constants如下填写变量表格:名称ExpressionP200000T423R8314MM46Flowrate0。01Dia0。05CP/(RT)areapi*Dia^2/4rhoMM*CvelFlowrate/rho/aera完成Options菜单:ScalarExpressions定义rate=52.7*u1^2/(1+0.013/u1)Physics菜单:Boundarysettings选择域:1和2(按住Ctrl键)选择Neumann边界条件默认设置q=0g=0,完成Physics菜单:Subdomainsettings选择域1F选项卡;设定F1=-rate*(1+u1/C);F2=rate*(1-u2/C);F3=rate*u3/C;F4=u3/CInit选项卡;设定u1(t0)=C;u3(t0)=vel,完成Mesh菜单:Meshparameters设定最大基元尺寸为1点击Remesh,完成Solve菜单:Solverparameters选择timedependent求解器,在General选项卡中输入Times:linspace(0,10,100)求解,完成Post—processingCross-sectionplotparametersPoint选项卡,接受u1的默认设置General选项卡,接受全部时间的默认设置完成试着在整个时间范围内画出u1,u2,u3和u4的曲线,与图4是否保持全都?与之前计算结果是否相符?练习计算以下方程组中(x=1)的值,并画出随x变化曲线,x取0到3区间。连续搅拌反应器中的一阶可逆反应系统可以用线性常微分方程组表示。例如,考虑如下异构反应:正向反应速率为k1和k3,相应逆向反应速率为k2和k4。一阶动力学常微分方程组为:ﻩﻩﻩﻩﻩ(20)你也许会感到奇怪,由于该方程组为线性,它有通用的解析解。虽然是通用解析解,但是对动力学系统的反映并不多。假设刚开头时,CA=1,k1=1Hz,k2=0Hz,k3=2Hz,k4=3Hz。针对该初值问题,画出浓度随时间变化的曲线。5。方法3:常微分方程数值积分前一节介绍了步进法数值积分,通常也称作“时间步进",但是在反应器设计中,多是空间积分问题。步进法是挨次求解未知项,而其它常见积分方法是同时求解某一网格点的全部未知独立变量。步进法只能求解初值问题(IVP),初值个数必须严格等于常微分方程组的阶数。但是对于二阶或者更高阶的系统,可能会用到其次类边界条件-—边界值问题,在一维情况下,这些边界条件只消灭在域的起点和终点,这就是两点边界值问题。步进法也能够牵强求解边界值问题——人为设定初值,通过尝试和误差修正找到满意边界值问题的初始条件。对于更高维数的偏微分方程,边界值问题发生在整个域的每一个边界上。有限元方法的一个最主要优点就是能够很容易地求解两点边界值问题。例如,一维反应和集中方程:ﻩﻩﻩﻩﻩ ﻩﻩ(21)这里u是组分浓度,D是集中系数,L是域的长度,R(u)是反应消耗速率,x是无量纲空间坐标。如果未知函数u(x)在x=xj=j△x网格点能够用不连续值uj=u(xj)近似,那么依据中心差分,方程变为:ﻩ ﻩﻩﻩ(22)其中Rj=R(uj),Mij是对角元素为-2,上、下对角元素为1的三对角矩阵:ﻩ ﻩﻩﻩﻩﻩ(23)。通过矩阵转置和对uin进行积分可以求解该方程,这里n指第n次推测:ﻩﻩﻩﻩﻩﻩ (24)Rj=R(uin-1)。无论是初值问题还是边界值问题,都可以将(23)式中矩阵M的行向量变得符合边界条件.(23)式假设在x=0和x=1处都有u=0。这是狄利克雷边界条件,也是有限微分法的自然边界条件-—说它自然是由于如果在设定边界条件时没有转变(23)式中的行向量,那么就会消灭这样的边界条件。下面介绍如何用COMSOLMultiphysics在一维域上求解方程(21),对于一阶反应R(u)=ku,典型的无量纲变量Damkohler数为:ﻩﻩﻩﻩﻩ(25)边界条件为x=0时u=1,在u=1处没有流量。下面结合MATLAB来做这个练习,进而了解COMSOLMultiphysics如何表示计算数据和模型输出的结构.在windows中,结合MATLAB的COMSOLMultiphysics是一个可选的桌面图标,在UNIX/linux中,该功能可以通过在命令栏中执行以下语句实现:Comsolmatlabpath-mlnodesktop-mlnosplash其中“matlab”告知femlab打开一个matlab命令窗口,“path"依据COMSOL命令库建立matlab命令窗口。首先运行COMSOLMultiphysics和模型导航栏窗口,然后依据表8中的步骤建立模型.该实例给了一个独立变量u和一个一维空间坐标x。h和r是系数模式中狄利克雷边界条件的两个句柄。如果你盼望边界速度u为常数U0,可以通过设定h=1,r=U0来实现。点击三角形按钮生成默认网格(15个),然后点击两个嵌套三角形按钮加密网格(30个).表8反应-集中系统中两点边界值问题的常微分方程实例ModelNavigator选择1D空间维数,COMSOLMultiphysics:PDEmodes:PDE,coefficient形式设置因变量:u选择Element:Lagrange-Linear,完成Draw菜单Specifyobjects:Line,Coordinates弹出菜单,x:01名称:interval,完成Physics菜单:Boundarysettings选择域1选择Dirichlet边界条件,设定h=1;r=1选择域2选择Neumann边界条件,完成Physics菜单:Subdomainsettings选择域1设定C=—1;f=0。833*u;=0选择Init选项卡;设定u(t0)=1-x完成Meshing点击三角形按钮进行网格划分Solve菜单:SolverparametersStationarylinear求解器默认设置,完成General选项卡,设定解的形式为“Coefficient"求解(=)Post-processing:Pointevalution选择边界2,输入表达式u。Reports窗口显示:值:0.861167,表达式:u,边界:2依据计算结果可以画出图5,显然边界条件需要满意:x=0处u=1,在x=1处斜率减为零。但是COMSOLMultiphysics有没有依据我们设想的求解呢?图5稳态下的浓度曲线现在用稳态非线性求解器再计算一次。首先查看求解器菜单中的日志,迭代13次收敛.你注意到最终值从0。86降到0.69了吗?为什么会这样呢?线性(系数型)求解器只在初始时刻u(t0)=1—x时计算一次R(u),所以方程(24)只需要一次迭代。而非线性求解器在每次迭代时计算一次R(u),计算时使用上次迭代的u值.所以非线性求解器在向收敛靠近时,经过几次迭代可能完全“忘记”了初时推测。检验一下这种解释对不对。转变初值将会转变稳定的线性解.返回子域设置对话框,设定初值为u(t0)=1,最终得到的u(x=1)是多少?再试一下稳态非线性求解器,能得到和其它初值一样的结果吗?该例说明为方程选择正确求解器的重要性.如果函数f依靠于任何非独立变量,就应该选择非线性求解器。线性求解器更快,但是它假设偏微分方程的系数不依靠于非独立变量u(否则为非线性问题)。如果不确定,还是应该用非线性求解器。别忘了,(21)式满意R(u)=ku,是线性问题,但是COMSOLMultiphysics使用非线性求解器才得到正确解!收敛比较慢也是模型形式导致的结果——选中雅克比求解器选项,非线性求解器只需要两次迭代就可以得出正确结果.我们一开头认为(22)式是该问题有限微分矩阵方程,但是实际上最后用(24)式描述COMSOLMultiphysics的有限元问题。由于我们这里使用拉格朗日线性微元,在这种特殊情况下有限元和有限微分矩阵全都。依据这一点,我们看一下MATLAB/COMSOLScript如何计算该COMSOLMultiphysics问题.打开“File”菜单,选择“ExportFEMStructureasfem”。这就把现在的计算结果转化为MATLAB/COMSOLScript工作空间的数据结构,然后用MATLAB/COMSOLScript预置的函数和命令来计算它。在MATLAB/COMSOLScript工作空间输入以下命令:〉〉x=fem.mesh。p;〉>u=fem.sol.u;>〉plot(x,u)将会弹出一个包含网格节点u值的MATLAB/COMSOLScript图形窗口。不要怀疑你的图形失真。这是由于COMSOLMultiphysics存储网格点和对应结果的方式是为了使矩阵变得稀疏和紧凑。可以用MATLAB排序命令对网格点进行排序,进而使图形有意义。在MATLAB工作空间输入以下命令:〉>[xx,idx]=sort(x);>>plot(xx,u(idx))最后考虑MATLAB对有限元矩阵的访问。Fem文件结构没有包含有限元刚度矩阵,但是它包含重建这个矩阵的FEMLAB函数的必要信息。这对有限元方法格外重要,这个FEMLAB函数是assemble,输入以下命令:>>[K,L,M,N]=assemble(fem);>>K’/15这张图包含上次COMSOLMultiphysics的计算结果,类似图5。实际上,我们之所以能够快速搞清楚fem求解结果的结构,是由于这是只有一个独立变量的一维问题。多变量和多维产生的网格和结果的数据结构只能用COMSOLMultiphysics的工具/函数来读取。图6给出了由MATLAB命令spy(K’)产生的松散结构。很有必要将它与(23)式相互比较,由于能够清楚地看到具有统一网格划分的一维拉格朗日线性基元和生成矩阵方程的有限微分法是类似的。图6由MATLAB命令spy()产生的松散结构下面看一下MATLAB中矩阵的松散结构,全部的元素只有1,-2和1,位于三条对角线上。这是有限元法的刚度矩阵,对于未知类型,它等于(23)式.如果返回“Subdomainsettings”对话框的“element”选项卡,选择拉格朗日二次元素,再次求解并导出FEM,生成上面的K,你会发现虽然矩阵也很疏松,但是和拉格朗日线性元素完全不同。练习偏微分方程的系数形式有一项αu,令α=0.833,f=0,再次计算以上“反应—集中"的例子,比较稳态线性和非线性求解器得出的结果。你能解释为什么这样的表达式会导致这样的结果吗?这样的表达式对刚度矩阵K又有什么影响?如果把Da选为某特定值,例如Da△x2=2,使得对角元素几乎为零,你认为求解时会消灭什么困难?6。方法4:线性系统分析MATLAB和COMSOLMultiphysics的核心是线性系统分析.本节将简要回顾线性算法理论—-本科生工程数学中的“矩阵方程”就是这类典型问题。好消息是不需要你自己动手编程处理矩阵,这就是MATLAB的用途:供应一个工程矩阵计算子程序库的用户界面。应当注意到,对于本章的例子,COMSOLScript也能很好地实现这个功能.以前科学计算主要集中在矩阵计算的高效和松散方法上。Golub和VanLoan[3]的书是一本很好的专家级矩阵计算指南,但是对于MATLAB入门水平,Hanselman和Littlefield[4]的书是个不错的选择。简洁来讲,标准的矩阵方程如下:ﻩﻩﻩﻩ (26)这里有N个与M方程有关的未知变量xj。系数aij和右侧常数项bi都是未知数。在工程应用中,通常将模型转化为这样的线性方程系统.例如,质量和能量守恒通常都会生成这样的线性方程系统。求解可能性当N=M时,约束条件和未知数相同,所以可能求出唯一解xj。但是如果一个或者多个方程彼此线性相关(行退化),或者全部的方程都只含由某些特定变量组成的未知数(列退化),就不能得出唯一解。对于稀疏矩阵,行退化和列退化相同,退化方程会导致奇异。但是从数值求解讲,至少还有两点会导致错误:如果方程彼此不是严格线性相关,一些方程也可能在计算过程中由于舍入误差而导致变得格外接近线性相关。求解过程中累积的舍入误差可能会“沉没”真实解,这在N比较大的时候容易发生。这种情况下,计算过程没有出错,但是计算结果会不满意原始方程。线性系统指南没有“典型”的线性方程系统,但是一个粗略的想法就是舍入误差变得不行忽视:当N在20—50之间时,可以用单精度常规方法求解,不需要对以上两种错误进行修正.当N在几百数量级时可以用双精度求解。当N在几千数量级时,如果系数矩阵稀疏(几乎都是零),由于系数特性可以求解.对于稀疏矩阵,MATLAB有特殊的数据形式和一套针对性的函数.但是在工程实际和物理过程中,有很多问题本身就是奇异或者格外接近奇异的。你可能会发现N=10也很难求解.用奇异值分解法有时可以解决奇异值问题,将其分解为非奇异值。数值线性代数的常规任务方程(26)可以写为紧凑矩阵方程形式:ﻩﻩﻩﻩ ﻩ ﻩ(27)求解未知矢量x,这里A是方阵,b是已知矢量。A为常数,求解多个b矢量时的解。计算方阵A的逆矩阵A—1.计算方阵A的行列式。如果M〈N,或者M=N但是方程退化,这时有效方程数比未知量少-—欠定系统。这种情况下可能没有解或者有多个解。解空间由特殊解xp乘以任何线性相关的N-M维矢量构成,称为矩阵A的化零空间.我们的任务是通过奇异值分解找出解空间。如果M〉N,通常没有符合(26)的矢量解x。常常会消灭这种过定系统,我们的任务主要是寻找最接近于满意方程的折衷解。通常接近程度以(26)方程左右两侧差值的“最小二乘法"来表示。MATLAB矩阵计算通过inv(矩阵)命令可以很容易获得逆矩阵。矩阵方程的解以矩阵除法运算符“\”表示:>>A=[3—10;—16—2;0-210];〉〉B=[1;5;26];〉〉X=A\BX=1.00002.00003。0000行列式行列式多用在稳定理论和评估矩阵奇异性上。为什么需要知道行列式?大多数时候你是想知道行列式是否为零。但是,当行列式为零、或者数值上格外接近于零时,由于前面提到的“舍入误差”缘由很难进行数值计算。这是奇异值分解的另一个实例.MATLAB用det(A)命令计算奇异值.在MATLAB命令行中手工输入以下矩阵,或者从matrix2。dat文件中复制以下矩阵:〉>A=[0。45,—0.244111,-0.0193373,0.323972,-0。118829;-0.244111,0.684036,-0.103427,0。205569,0。00292382;-0.0193373,—0。103427,0.8295,0.0189674,—0。011169;0.323972,0。205569,0.0189674,0.659479,0。197388;-0。118829,0.00292382,-0.011169,0.197388,0.776985]用det命令可以计算出行列式:>>det(A)ans=—1。9682e—008主轴理论:特征值和特征向量MATLAB有预置的计算矩阵特征值和特征向量的函数:>〉eig(A)ans=-0.00000。70000。80000.90001.0000当使用以下形式调用eig()函数时,它会以矩阵V的列向量形式返回特征向量:>>[V,D]=eig(A)V=—0.68360。0000-0。5469-0。4785—0。0684—0.41810。61620.18310。4530—0.4547-0.08370.40030。6189-0。62320。24790.54090.2582-0。2415-0.4042-0.6474—0.2416—0。62720.4755—0.1190—0。5550D=-0。0000000000.7000000000。8000000000.9000000001。0000eigs()函数是eig()函数的变形,它能够计算稀疏矩阵的特征值和特征向量。在下一节中将结合COMSOLMultiphysics介绍它的应用。如果矩阵A的行列式格外接近于零,那么一个特征值也格外接近于零。特征向量是矩阵A的化零空间——给出映射到零的方向:>〉A*V(:,1)ans=1.0e-007*0。26690.16330.0327-0.21120.0943全部特征向量可以通过乘以特征值等于矩阵A的特性来证明这一点,例如:>〉A*V(:,2)./V(:,2)ans=0.70000。70000.70000。70000.7000在MATLAB中,“./"符号表示元素对元素的除法,上面的冒号表示矩阵全部的列。由于系统接近奇异,全部包含该矩阵的解都很差,对这一点我们不应该感到奇怪。例如:>>B=[0;1;0;1;0];>〉A\Bans=1.0e+006*2.14871.31420.2631-1。70010.7593由于A的全部元素都是个位数,被除数B矢量元素也是个位数,方程(27)的解也应该由个位数组成,而不是百万量级。对于化学工程师,这意味着对于一个质量守恒系统,入口流速为1kg/hr,由于质量守恒限制出口也为1kg/hr,但是反应器中流速为1000000kg/hr。这是不行能的。但这就是由近奇异矩阵给出的计算结果。奇异值分解(SVD)奇异值分解在很多情况下可以给出一个较好的解。类似于特征值和特征向量的主轴理论,全部矩阵都只有唯一的分解:ﻩ ﻩﻩﻩ ﻩ(28)这里的U和V都是正交方阵,diag是包含奇异值的对角矩阵.在解出U,V和diag的基础上,(27)式可以轻易解得ﻩ ﻩ ﻩﻩﻩ(29)U和V为正交矩阵意味着其转置矩阵也是其逆矩阵.对角阵的逆矩阵为对角元素取倒数.所以求解的唯一问题就是何时一个或多个奇异值(diagj)接近于零.这时(1/diagj)是一个格外大的数,导致求解结果错误.一个比较好的近似方法是将这些奇异值的(1/diagj)设为零!ﻩﻩﻩﻩ ﻩ (30)几乎为零元素的替代向量应该在数量级上最小,近似满意方程。在我们矩阵A的例子中,如果只有一个输出,MATLAB命令svd()给格外异值,如果有三个输出,命令svd()给出:>>[U,D,V]=svd(A)U=-0。0684-0。47850。54690.0000-0。6836-0。45470.4530-0。1831-0.6162—0.41810.2479-0.6232-0.6189—0.4003-0.0837-0。6474-0.40420。2415—0.25820.5409-0.5550—0.1190—0.47550。6272-0。2416D=1.0000000000.9000000000。8000000000.70000000-0.00001。0000V=-0。0684-0.47850.54690.0000-0。6836—0.45470.4530—0.1831-0.6162-0。41810.2479-0.6232—0.6189-0.4003-0。0837—0.6474—0.40420。2415—0.25820.5409-0.5550—0。1190-0.47550。6272-0.2416由于A为对称矩阵,必定有U=V。最小数量级的奇异值分解命令如下:>>ss=[1.1./0。91./0.81./0.70];>〉dinv=diag(ss);〉>V*dinv*U’*Bans=0。08931.28200。14791。0317-0.2130这是一个物理上更容易接受的答案,例如,前面商量的质量守恒系统中的内部气体流速。由于有限元方法基于矩阵,所以线性系统理论对于COMSOLMultiphysics建模格外重要。当产生的刚度矩阵变得接近奇异时,COMSOLMultiphysics可能不能给出满意要求的结果.MATLAB中的矩阵计算和稀疏化方法可轻易地用于检查COMSOLMultiphysics结果的合理性,也可以用于对系统自然动力学的特征分析。这些想法将在下一节中作为COMSOLMultiphysics的一个模型例子加以介绍。6.1非均匀介质中的热传导常常遇到的稳态热传导方程,是可以分析求解的最简洁的偏微分方程:泊松方程。但是对于简洁几何情况,会比较难处理。作者认为某些通解很难推导和收敛[5]。所以,数值解比通解更好,进一步讲,传热过程的任何转变都可能会破坏分析结果.本节我们考虑非均匀厚板中的一维传热问题,在板中有分布热源:ﻩ ﻩﻩﻩﻩﻩ(31)打开耦合MATLAB/COMSOLScript的COMSOLMultiphysics模型导航栏:依据表9中的步骤建立有分布热源的介质传热问题。依据计算结果可以画出一条几乎线性的曲线,斜率为-1。由于这是个线性问题,求解器日志显示两步迭代收敛。计算结果得T|x=0。5=0.474097,而解析解为T|x=0.5~0。475:ﻩﻩﻩﻩﻩﻩ (32)下面尝试k=1-x/2。这种情况下也有解析解,但是由于数值简洁性,需要采纳对数和分支切割。解析解为T|x=0。5~0。550,你的计算结果呢?表9非均匀介质中的热传导——分布热源情况ModelNavigator选择1D空间维数,COMSOLMultiphysics:HeatTransfer:Conduction:Steadystateanalysis,设定因变量:u选择Element:Lagrange—Linear,完成Draw菜单Specifyobjects:Line,Coordinates弹出菜单,x:01名称:interval,完成Physics菜单:Boundarysettings选择边界1设定边界条件为:温度;T0=1选择边界2设定边界:T1=0,完成Physics菜单:Subdomainsettings选择域1设定k=1;Q=-x*(1—x)选择Init选项卡;设定T(t0)=1-x,完成Meshing点击三角形按钮,划分网格Solver点击求解按钮(=)Post-processingDatadisplay设定x=0。5值:0.474097[K],表达式:T,位置:(0。5)下面来看线性系统理论。打开“File"菜单,选择“ExportFEMstructureasfem”。这是我们其次次导出为FEM结构,有必要简洁介绍一下。对于任何MATLAB/COMSOLScript变量,在命令行中输入变量名字,MATLAB/COMSOLScript将会给出变量值或其数据结构。试一下:>〉femfem=version:[1x1struct]appl:{[1x1struct]}geom:[1x1geom1]mesh:[1x1femmesh]border:1outform:’general’form:’general’units:’SI’equ:[1x1struct]bnd:[1x1struct]draw:[1x1struct]xmesh:[1x1com.femlab。xmesh.Xmesh]sol:[1x1femsol]当然,你也可以进一步查看FEM结构,了解整个树的干、枝、叶.我们已经剪除了fem.sol。u,fem。mesh。p1不同的分支包含了完整的COMSOLMultiphysics模型-—为fem.geom中保存的几何结构定义了方程(fem.appl{1}.equ)和边界条件(fem.appl{1}.equ).与其它变量相同,这些结构可以被MATLAB/CO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论