基于MATLAB分布式编程模型的机械优化设计算法实验指导书一、实验所需基础知识MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它在很大程度上摆脱了传统非交互式程序设计语言(如C、Java)的编辑模式。本指导书重点阐述在MATLAB的编程环境下,如何运用优化工具箱(OptimizationToolbox)、分布式计算服务(MATLABDistributedComputingServer,简称MDCE)和并行计算工具箱(ParallelComputingToolbox)实现机械优化设计的算法,有关MATLAB操作环境和编程语言的详细基础知识请参考帮助文件或其它相关资料。1.MATLAB语言编程简介MATLAB开发环境除了提供命令窗口(CommandWindow),实现人机交互式操作外,还提供编辑器(Editor),用户可以编制自己的程序文件。用MATLAB语言编写的可以在MATLAB环境中运行的程序称为M文件,M文件用扩展名.m结尾,可在命令行中执行,也可被其它程序调用。M文件分为两种:命令文件和函数文件,它们有各自的特点。1.1函数文件函数接收输入参数,返回输出参数。函数文件与程序文件类似也是以“.m”为扩展名的文本文件,而程序文件与函数文件的主要区别在于,函数允许通过数值进行参数传递,而且函数使用局部变量而不是全局变量操作。另外函数文件的第一行必须包括“function”这个关键字。函数文件的文件名必须和函数定义的函数名称相同。MATLAB的函数M文件通常由以下几个部分组成:函数定义行函数M文件的第一行用关键字“function”把M文件定义为一个函数,并指定它的名字,并且与文件名必须相同,同时定义了函数的输入和输入参数。输入参数的定义用小括号(),如果有多个输入参数则用逗号分隔;输出参数的定义用中括号[],如果有多个输出参数则用逗号分隔。H1行所谓H1行指帮助文本的第一行,它紧跟在定义行之后并以“%”符号开头,用于概括说明函数名和函数的功能。函数帮助文本帮助文本指位于H1行之后函数体之前的说明文本,同样以“%”符号开头,一般用来比较详细地介绍函数的功能和用法。在命令窗口用help命令时将显示函数的H1行和所有帮助文本。当然,帮助文本是可选项,不是必选项。函数体是函数的主体部分,包括进行运行和赋值操作的所有MATLAB程序代码,其中可以有流程控制、输入输出、计算、赋值、注释以及函数调用等操作。注释除了函数开始独立的帮助文本外,还可以在函数体中添加对语句的注释。注释必须以“%”符号开头,MATLAB在编译执行M文件时把每一行中“%”后面的全部内容作为注释不进行编译。例1.1:黄金分割法求一维问题最优解算法函数minHJ.mfunction[x,minf]=minHJ(f,a,b,isDisplay,eps)%一维黄金分割法%f:目标函数的符号表达式%a:区间左端%b:区间右端%isDisplay:是否显示求解结果%eps:收敛精度ifnargin=3isDisplay=false;endformatlong;ifnargin=4eps=1.0e-6;endl=a+0.382*(b-a);u=a+0.618*(b-a);k=1;tol=b-a;whiletoleps&&k100fl=subs(f,findsym(f),l);fu=subs(f,findsym(f),u);ifflfua=l;l=u;u=a+0.618*(b-a);elseb=u;u=l;l=a+0.382*(b-a);endk=k+1;tol=abs(b-a);endifk==100000disp('找不到最小值!');x=NaN;minf=NaN;return;endx=(a+b)/2;minf=subs(f,findsym(f),x);ifisDisplaydisp'----------黄金分割法求解结果----------';fprintf('迭代次数k=%6d\n',k);fprintf('最优点x*=%6.2f\n',x);fprintf('最优值f(x*)=%6.2f\n',minf);endformatshort;1.2命令文件命令文件没有输入参数也没有输出参数,只是一些MATLAB命令和函数的组合。命令文件可以操作工作空间的变量,也可以生成新的变量,但是当命令文件执行结束后新变量将保存在工作空间中,不会被自动清除。例1.2:调用黄金分割法求解一维函数的最优解minHJ_test.mclc;symst;f=t^3-3*t+2;[x,minf]=minHJ(f,-3,5,true);在编辑器界面按F5键运行该程序,其运行结果如下:----------黄金分割法求解结果-----------迭代次数k=34最优点x*=1.00最优值f(x*)=0.001.3子函数一个M文件中可以定义多个函数,其中第一个定义的函数称为主函数,主函数名必须与M文件名相同,其它函数称为子函数。子函数只能被定义它的文件中的函数调用,其它函数和文件不能调用。1.4局部函数把一些文件放在private目录下,那么这些文件中定义的函数就是局部函数。局部函数只能被其父母目录中的函数或文件调用,其它函数和文件无权调用。1.5M文件的执行当Matlab遇到一个新的名称(命令、函数、变量)时,按如下次序查找这个名称:(1)当前的工作空间;(2)子函数名称;(3)局部函数名称;(4)setpath指定的路径。要想使自己编写的函数或命令能够在命令窗口自由的使用,一个比较好的处理方法是建立一个目录,并把这个目录加到SetPath指定的目录中,将自己编写的M文件都存放到这个目录中。2.MATLAB优化工具箱(OptimizationToolbox)我们除了可以运用MATLAB语言自己编写优化算法外,还可以直接调用优化工具箱来解决工程设计中的优化问题。2.1MATLAB优化工具箱的常用函数MATLAB优化工具箱由一系列函数组成,主要包括:边界约束条件下的非线性最小化Fminbnd求解多变量函数的最小化Fminunc求解无约束非线性最小化Fminsearch求解线性规划问题Linprog求解二次规划问题Quadprog求解有约束的非线性最小化Fmincon求解多目标规划的优化问题Fgoalattain求解最小、最大化问题Fminimax各个函数的语法结构和适用解决优化问题的类型,请参阅MATLAB帮助文件。另外,在MATLAB的命令窗口键入命令helpoptim结果显示该工具箱中所有函数清单,部分函数如下图示。2.2函数调用时需要注意的问题使用优化工具箱时,由于优化函数要求目标函数和约束条件满足一定的格式,所以需要用户在进行模型输入时注意以下几个问题:(1).目标函数最小化优化函数fminbnd、fminsearch、fminunc、fmincon、fgoalattain、fminmax和lsqnonlin都要求目标函数最小化,如果优化问题要求目标函数最大化,可以通过使该目标函数的负值最小化即-f(x)最小化来实现。近似地,对于quadprog函数提供-H和-f,对于linprog函数提供-f。(2).约束非正优化工具箱要求非线性不等式约束的形式为Ci(x)≤0,通过对不等式取负可以达到使大于零的约束形式变为小于零的不等式约束形式的目的,如Ci(x)≥0形式的约束等价于-Ci(x)≤0;Ci(x)≥b形式的约束等价于-Ci(x)+b≤0。2.3应用实例设计一圆形截面的悬臂梁,该梁在悬臂端作用有集中载荷P=1000kgf,扭矩M=1000kgf.cm。悬臂伸出长度的允许取值范围为5cm≤l≤15cm,直径的允许取值范围为2cm≤d≤10cm。试求在满足强度、刚度条件下,用料最省的设计方案。(1).优化模型的建立根据悬臂梁的工作要求,优化模型建立如下:设计变量:12xdXxl目标函数:22114FXxx约束条件:112132423512361437122010050150/1006.660/0.9650gXxgXxgXxgXxgXxxgXxgXxx(2).运用优化工具箱求解该优化模型是典型的非线性规划问题,因此我们调用工具箱的fmincon函数求解。目标函数文件myfun_test.mfunction[f]=myfun_test(x)f=0.25*pi*x(1)^2*x(2);约束条件文件Confun_test.mfunction[c,ceq]=ConFun_test(x)ceq=[];c(1)=-x(1)+2;c(2)=x(1)-10;c(3)=-x(2)+5;c(4)=x(2)-15;c(5)=-x(1)^3/x(2)+10;c(6)=-x(1)^3*+6.66;c(7)=-x(1)^4/x(2)^3+0.965;调用fmincon函数命令文件test_toolbox.mclc;%calloptimizationtoolboxoptions=optimset('GradObj','off','LargeScale','off','Display','iter');x0=[-0.2,-0.2];[x,fval]=fmincon(@myfun_test,x0,[],[],[],[],[],[],@ConFun_test,options)运行结果运行上面的命令文件,可得到优化的计算结果:x=3.68405.0000fval=53.29753.MATLAB分布式计算服务(MDCE)和并行计算工具箱(ParallelComputingToolbox)云计算(cloudcomputing)是一种基于互联网的计算方式,核心思想是将大量用网络连接的计算资源统一管理和调度,构成一个计算资源池向用户按需服务。MDCE和并行计算工具箱是Mathworks公司的云计算解决方案,通过它们我们可以充分利用联网计算机(多处理器和多核)的计算能力来解决复杂系统模型的计算问题。图1基础结构图如图1所示,使用ParallelComputingToolbox开发并行应用程序。利用该工具箱,应用程序能够在包含多达八个本地worker(左)的桌面建立原型。并且,通过MDCE(右),可以扩展应用程序,将其应用到一个集群上的多台计算机(可理解为Mathworks的“云”)。3.1几个重要的概念(1).job:是在MATLAB的会话中要执行的大量操作运算。一个job可以分解成不同的部分,称为Task。Client可以决定如何更好地将job划分为task,各task可以相同也可以不同。(2).clientsession:制定job和task的MATLAB会话,通常就是你用MATLAB编程的那台计算机。Client运用并行计算工具箱(ParallelComputingToolbox)来完成job和task的定义,MDCE负责执行job的task,并将结果返回给client。(3).jobmanager(JM):是MDCE的一个组成部分,用来协调各个job及其task在各个worker上的执行。JM可以运行在网络的任何一台计算机上,它按job被提交的顺序来执行这些job。当然,job队列中每个job的优先级可以提升或降低,job也可以被取消和销毁。(4).worker(集群时也称为lab):是执行task的工作单元,每个worker每次只能执行一个正在运行job的一个task,执行完成后把结果返回给JM。在一个分布计算系统中通常包括多个worker,以便同时执行多个Task,以提高运算速度。对client来说,具体哪一个task由哪一个worker执行是透明的。也就是说,使用者只需关心如何将job提交到JM和从JM取回运算结果,而无需管