基于MatLab分布式编程模型的机械优化设计算法实验指导书.docx
《基于MatLab分布式编程模型的机械优化设计算法实验指导书.docx》由会员分享,可在线阅读,更多相关《基于MatLab分布式编程模型的机械优化设计算法实验指导书.docx(22页珍藏版)》请在冰点文库上搜索。
基于MatLab分布式编程模型的机械优化设计算法实验指导书
基于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.m
function[x,minf]=minHJ(f,a,b,isDisplay,eps)
%一维黄金分割法
%f:
目标函数的符号表达式
%a:
区间左端
%b:
区间右端
%isDisplay:
是否显示求解结果
%eps:
收敛精度
ifnargin<=3
isDisplay=false;
end
formatlong;
ifnargin<=4
eps=1.0e-6;
end
l=a+0.382*(b-a);
u=a+0.618*(b-a);
k=1;
tol=b-a;
whiletol>eps&&k<100
fl=subs(f,findsym(f),l);
fu=subs(f,findsym(f),u);
iffl>fu
a=l;
l=u;
u=a+0.618*(b-a);
else
b=u;
u=l;
l=a+0.382*(b-a);
end
k=k+1;
tol=abs(b-a);
end
ifk==100000
disp('找不到最小值!
');
x=NaN;
minf=NaN;
return;
end
x=(a+b)/2;
minf=subs(f,findsym(f),x);
ifisDisplay
disp'----------黄金分割法求解结果----------';
fprintf('迭代次数k=%6d\n',k);
fprintf('最优点x*=%6.2f\n',x);
fprintf('最优值f(x*)=%6.2f\n',minf);
end
formatshort;
1.2命令文件
命令文件没有输入参数也没有输出参数,只是一些MATLAB命令和函数的组合。
命令文件可以操作工作空间的变量,也可以生成新的变量,但是当命令文件执行结束后新变量将保存在工作空间中,不会被自动清除。
例1.2:
调用黄金分割法求解一维函数的最优解minHJ_test.m
clc;
symst;
f=t^3-3*t+2;
[x,minf]=minHJ(f,-3,5,true);
在编辑器界面按F5键运行该程序,其运行结果如下:
----------黄金分割法求解结果-----------
迭代次数k=34
最优点x*=1.00
最优值f(x*)=0.00
1.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).优化模型的建立
根据悬臂梁的工作要求,优化模型建立如下:
设计变量:
目标函数:
约束条件:
(2).运用优化工具箱求解
该优化模型是典型的非线性规划问题,因此我们调用工具箱的fmincon函数求解。
●目标函数文件myfun_test.m
function[f]=myfun_test(x)
f=0.25*pi*x
(1)^2*x
(2);
●约束条件文件Confun_test.m
function[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.m
clc;
%calloptimizationtoolbox
options=optimset('GradObj','off','LargeScale','off','Display','iter');
x0=[-0.2,-0.2];
[x,fval]=fmincon(@myfun_test,x0,[],[],[],[],[],[],@ConFun_test,options)
●运行结果
运行上面的命令文件,可得到优化的计算结果:
x=
3.68405.0000
fval=
53.2975
3.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取回运算结果,而无需管理具体的任务调度。
图2描述了四者之间的关系。
图2BasicParallelComputingConfiguration
3.2MDCEService
MATLABDistributedComputingEngine/Server,简称MDCE,可以使并行计算工具箱应用程序得到扩展,从而可以使用运行在任意数量计算机上任意数量的worker来完成计算任务。
MDCE是以服务的形式运行在所有workernode节点上,接受来自调度程序(JM)的job,在节点上建立进程,解释执行MATLAB代码,将结果返回给调度程序。
MDCE的安装及相关操作如下:
(1).安装MDCE服务。
首先,开始->运行->cmd到DOS命令行窗口,假如MATLAB的安装地址为D:
\MATLAB\R2010b,进入D:
\MATLAB\R2010b\toolbox\distcomp\bin目录。
然后,运行如下命令:
D:
\MATLAB\R2010b\toolbox\distcomp\bin>mdceinstall
(2).启动MDCE服务。
去控制台->管理工具->服务,查看MATLABDistributedComputingServer,如果存在说明安装成功了。
按启动按钮可启动该服务,也可回到cmd窗口,运行如下命令启动MDCE服务:
D:
\MATLAB\R2010b\toolbox\distcomp\bin\>mdcestart
(3).启动JM(jobmanager)。
在cmd中运行命令startjobmanager–nameMyJM–clean启动名为MyJM的JM,运行startjobmanager–help命令可查看该命令的详细使用方法。
另外,使用ConfigurationsManager可配置JM的属性,下面以配置MyJM的属性为例说明如下:
在MATLAB的菜单栏上选择Parallel->ManageConfigurations...,启动ConfigurationsManager。
设置Scheduler页面的内容:
设置Jobs页面的内容:
详细设置请参阅MATLAB帮助主题ProgrammingwithUserConfigurations。
(4).启动worker。
在cmd中运行命令startworker–nameworker1–jobmanagerMyJM–jobmanagerhostduanyang–clean启动名为worker1的worker,worker1注册到MyJM,而且该JM运行在计算机duanyang上。
即MyJM负责给worker1分配task。
运行startworker–help命令可查看该命令的详细使用方法。
(5).查看节点状态。
在cmd中运行命令nodestatus命令查看节点的状态。
3.3MATLAB中并行程序开发
(一).分布式应用程序的工作流程
(1).寻找一个JM(或者作业调度程序(scheduler))——网络上可能有一个或多个JM(但是通常只有一个scheduler);用来寻找一个JM或者作业调度程序的函数findResource()在当前MATLAB内核中创建一个对象,用来表示将要运行job的JM或者作业调度程序。
(2).创建一个job——创建job用以产生一个task集合,job存在于JM中,而一个在本地MATLAB内核中的job对象代表相应的job。
(3).创建task——创建task添加到job中去,可以用本地MATLAB内核中的task对象表示job中的每一个task。
(4).提交job到待执行的job队列——当job的每一个task都被定义之后,将它提交到JM或者作业调度程序,它们将task分配到worker中执行。
当各worker的所有task执行完毕后,job将被标记为完成状态。
(5).返还job结果。
(6).销毁job——当所有job完成,结果收集回来后,需要销毁job以释放内存。
(二).应用实例
在本例中,我们将运用MDCE和并行计算工具箱,编写分布式应用程序调用牛顿法来求解无约束问题的最优解。
本例的目标函数为:
是一个二维非线性规划问题,有三个局部极值点。
我们拟定义一个job,该job包含三个task,分别从不同的初始点出发,调用多维牛顿法,将三个局部极值点一次性求解出来,从而实现并行计算。
1)搜索JM,创建对象:
findResource()
%MyJMcfg表示在3.2定义的jobmanager:
MyJM的配置
jm=findResource('scheduler','Configuration','MyJMcfg');
使用findResource函数时,省略所有property和value,可搜索所有局域网内可用的JM。
all_managers=findResource('scheduler','type','jobmanager');
2)创建Job:
createJob()
虽然这个函数在client会话中执行,但实际上是在名叫jm的JobManager上创建了一个名叫job1的Job。
job1=createJob(jm);
3)代码传递:
set()
将求解需要的代码文件传给执行task的所有worker,该过程对client是透明的。
set(job1,'FileDependencies',{'minNT.m','Funval.m'});
4)分配Task:
createTask()
在创建Job之后,使用createTask函数为该Job创建Task。
Task定义了Worker所要执行的函数。
在本例中,每个Task将会从不同初始点出发,调用牛顿法minNT求一个局部解。
createTask(job1,@minNT,2,{fx,[11],[x1x2],0.01,false});
createTask(job1,@minNT,2,{fx,[11.8],[x1x2],0.01,false});
createTask(job1,@minNT,2,{fx,[-0.20.2],[x1x2],0.01,false});
也可用以下方法生成3个Task:
createTask(job1,@minNT,2,{{fx,[11],[x1x2],0.01,false},{fx,[11.8],[x1x2],0.01,false},{fx,[-0.20.2],[x1x2],0.01,false}});
4)提交工作:
submit()
使用submit函数提交Job到JobManager,JobManager将Task分配到已注册的Worker上并开始执行。
submit(job1);
5)等待:
waitForState()
waitForState(job1,'finished');
6)取回计算结果:
getAllOutputArguments()
计算结果存储在每个任务对象的OutputArguments属性中,使用getAllOutputArguments取回所有的结果,运算结果以cell数组的形式返回。
results=getAllOutputArguments(job1);
完整示例代码如下:
clc;
jm=findResource('scheduler','Configuration','MyJMcfg');
job1=createJob(jm);
set(job1,'FileDependencies',{'minNT.m','Funval.m'});
symsx1x2;
fx=x1^4-2*x1^2*x2+x1^2+2*x2^2-2*x1*x2+4.5*x1-4*x2+4;
createTask(job1,@minNT,2,{{fx,[1,1],[x1x2],0.01,false},{fx,[1,1.8],[x1x2],0.01,false},{fx,[-0.2,0.2],[x1x2],0.01,false}});
submit(job1);
waitForState(job1,'finished');
results=getAllOutputArguments(job1);
results{1:
6}
errmsgs=get(job1.Tasks,{'ErrorMessage'});
nonempty=~cellfun(@isempty,errmsgs);
celldisp(errmsgs(nonempty));
destroy(job1);
二、实验一:
MATLAB开发环境和优化工具箱综合实验
1.实验目的
上机操作熟悉MATLAB开发环境,运用编程语言和优化工具箱求解机械优化设计实例。
2.实验要求
(1).实验任务
●熟悉MATLAB的交互式开发平台
●掌握MATLAB编程语言的基础知识
●运用优化工具箱解决实际优化问题
(2).实验预习
预习本实验指导书,并进一步收集更多的相关资料,深入理解实验的目的与任务,熟悉实验步骤和基本环节。
(3).实验报告
编写程序,调用优化工具箱相关函数,求解教材8.3节“二级斜齿轮减速器优化设计”所建立的优化模型。
3.实验步骤
(1).通用操作界面
●CommandWindow窗口操作
CommandWindow是MATLAB执行交互式操作的主窗口,可以进行指令的执行和函数的调用。
例1.求[12+2×(7−4)]÷32的算术运算结果。
用键盘在CommandWindow中输入以下内容
>>(12+2*(7-4))/3^2
在上述表达式输入完成后,按【Enter】键,该就指令被执行。
在指令执行后,CommandWindow中将显示以下结果。
ans=
2
例2.简单矩阵
的输入步骤。
在键盘上输入下列内容
>>A=[1,2,3;4,5,6;7,8,9]
按【Enter】键,指令被执行。
在指令执行后,CommandWindow中将显示以下结果:
A=
123
456
789
MATLAB数学计算功能强大,内置提供了丰富的数学运算函数,现将在优化设计算法中要用到的函数列表简介如下,大家可在CommandWindow中具体测试一下。
常用基本数学函数
abs(x)
纯量的绝对值或向量的长度
sqrt(x)
开平方
Round(x)
四舍五入至最近整数
fix(x)
无论正负,舍去小数至最