此示例显示如何使用该函数GlobalSearch
和多层的
.
这个例子特别展示了全局优化工具箱的功能GlobalSearch
和多层的
,可以帮助确定电磁干扰模式的最大值。为简化建模,图案是由单色光偏振光从点光源扩散而来。
由于点X和时间T在极化方向上测量的电场
在哪里源是零的阶段的阶段,是光速,是光的频率,是源的振幅吗, 和是距离来源的距离到.
对于不动点光的强度是净电场的平方的时间平均值。净电场是所有来源的电场之和。时间平均只取决于电场的大小和相对相位.为了计算净电场,用相量法将个体的贡献相加。对于相量,每个源贡献一个矢量。矢量的长度是振幅除以到源的距离,矢量的角度,是这一点的相位。
对于此示例,我们定义了具有相同频率的三个点源()和振幅(),但初始阶段有所不同()。我们在固定平面上安排这些来源。
%频率与峰的数量成比例Relfreqconst = 2 * pi * 2.5;amp = 2.2;阶段= - [0;0.54;2.07];numsources = 3;高度= 3;%所有点源对齐[x_i,y_i,z]xcocord = [2.4112 0.2064 1.6787];ycocord = [0.3957 0.3927 0.9877];zcoords =身高*的(numSources, 1);来源= [xcoords ycoords zcoords];
现在让我们把z = 0平面上干涉图样的切片形象化。
正如你可以从下面的图中看到的,有许多峰和谷,表示建设性和破坏性的干涉。
通过匿名函数传递附加参数:WaveIntityS_X = @(x)WaveInts(x,amp,阶段,......relFreqConst numSources,起源);%生成网格(X, Y) = meshgrid (4:0.035:4 4:0.035:4);%计算网格上的强度z = Arrayfun(@(x,y)waveInts_x([x y]),x,y);%绘制表面和轮廓图SURF(X,Y,Z,“EdgeColor”,“没有”)Xlabel(“x”)ylabel('是') zlabel (“强度”)
我们感兴趣的是这种波强度达到最高点的位置。
波强度(),当我们离开源时,衰减成正比.因此,让我们通过给问题添加约束来限制可行解的空间。金宝搏官方网站
如果我们用孔径来限制光源的曝光,那么我们可以预期最大曝光量在孔径在观测平面上的投影的交点上。我们通过将搜索限制在以每个源为中心的圆形区域来模拟孔径的影响。
我们还通过给问题加上界来限制解空间。尽管这些边界可能是多余的(给定非线性约束),但它们是有用的,因为它们限制了起始点生成的范围(参见GlobalSearch和MultiStart如何工作的更多信息)。
现在我们的问题变成了:
受
在哪里和坐标和孔径半径分别点光源。每个光源都有一个半径为3的孔径。给定的界限包含可行区域。
我们的目标()非线性约束函数在单独的MATLAB®文件中定义,waveIntensity.m
和apertureConstraint.m
,它们在本例的末尾列出。
现在让我们把重叠的非线性约束边界的干涉图的轮廓形象化。可行区域是三个圆(黄、绿、蓝)交点的内部。变量的边界由虚线框表示。
可视化干涉面的轮廓域= [-3 5.5 -4 5];图;ezcontour(@(X,Y) arrayfun(@(X,Y) waveIntensity_x([X Y]),X,Y),domain,150);持有在%绘图限制x = @(x,y) (x-xcoords(1))。^ 2 + (y-ycoords(1))。^ 2 - 9;G2 = @(x,y) (x- xcoordds (2))^ 2 + (y-ycoords(2))。^ 2 - 9;G3 = @(x,y) (x-xcoords(3))^ 2 + (y-ycoords(3))。^ 2 - 9;h1 = ezplot (g1、领域);h1。Color = [0.8 0.7 0.1];%的黄色h1。线宽= 1.5;h2 = ezplot (g2、领域);h2。Color = [0.3 0.7 0.5];% 绿色h2。线宽= 1.5;h3 = ezplot (g3、领域);h3。Color = [0.4 0.4 0.6];% 蓝色的h3。线宽= 1.5;%画界限Lb = [-0.5 -2];Ub = [3.5 3];线([磅(1)磅(1)]、[磅(2)乌兰巴托(2)),“线型”,“——”[b(1) b(1)],[b(2) b(2)],“线型”,“——”[lb(1) ub(1)],[lb(2) lb(2)]“线型”,“——”)线([LB(1)UB(1)],[UB(2)UB(2)],“线型”,“——”)标题(“带有约束边界的模式轮廓”)
鉴于非线性约束,我们需要一个受限制的非线性求解器,即,粉刺
.
让我们建立一个描述优化问题的问题结构。我们想要最大化强度函数,所以我们对返回的值求反波浪度
.让我们选择恰好在可行区域附近的任意开始点。
对于这个小问题,我们将使用粉刺
的SQP算法。
通过匿名函数传递附加参数:apertureconstraint_x = @(x)apertureconstraint(x,xcoords,ycoords);%建立了粉刺的选择x0 = [3 -1];opts = Optimoptions(“fmincon”,“算法”,“sqp”);问题= createOptimProblem (“fmincon”,“目标”,......@ (x) -waveIntensity_x (x)“x0”x0,“磅”,磅,'UB'乌兰巴托,......'nonlcon'apertureConstraint_x,“选项”、选择);%叫fmincon[xlocal, fvallocal] = fmincon(问题)
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。Xlocal = -0.5000 0.4945 fvallocal = -1.4438
现在,让我们看看我们如何通过显示结果粉刺
在等高线图中。请注意,粉刺
没有达到全球最大值,也在图上注释。请注意,我们只会绘制解决方案中处于活动状态的绑定。
[〜,maxidx] = max(z(:));Xmax = [x(maxidx),y(maxidx)]图轮廓(x,y,z)保持在%显示界限线([磅(1)磅(1)]、[磅(2)乌兰巴托(2)),“线型”,“——”)创建textarrow显示xlocal的位置注释(“textarrow”(0.25 - 0.21), (0.86 - 0.60),'textedgecolor',[0 0 0],......“TextBackgroundColor”(1 1 1),“字形大小”,11,'细绳',{“单一运行结果”});创建textarrow显示xglobal的位置注释(“textarrow”,[0.44 0.50],[0.63 0.58],'textedgecolor',[0 0 0],......“TextBackgroundColor”(1 1 1),“字形大小”,12,'细绳',{“全球最大”});轴([-1 3.75 -3 3])
Xmax = 1.2500 0.4450
GlobalSearch
和多层的
给定一个任意的初始猜测,粉刺
在附近的局部最大值处卡住。特别是全局优化工具箱求解器GlobalSearch
和多层的
,让我们有更好的机会找到全球最大,因为他们会尝试粉刺
从多个生成的初始点(或我们自己的自定义点,如果我们选择)。
我们的问题已经成立问题
结构,所以现在我们构建了求解器对象并运行它们。第一个输出来自跑步
是找到最好结果的位置。
%构造一个GlobalSearch对象gs = GlobalSearch;%基于我们的GlobalSearch属性构造多右天式对象女士= MultiStart;rng (4“旋风”)%的再现性% GlobalSearch运行抽搐;[xg, ~, ~, ~, solsgs] =运行(gs、问题);toc xg%运行MultiStart,其中15个随机生成的点抽搐;[xms, ~, ~, ~, solsms] = (ms,问题,15);toc xms
GlobalSearch停止了,因为它分析了所有的试验点。所有14个本地求解器运行都以一个正的本地求解器退出标志收敛。运行时间为0.229525秒。MultiStart从所有起点完成运行。所有15个本地求解器都以一个正的本地求解器退出标志运行。运行时间为0.109984秒。XMS = 1.2592 0.4284
让我们检查两个求解器返回的结果。需要注意的一件重要的事情是,结果将根据为每个求解器创建的随机起始点而变化。再运行一次这个示例可能会得到不同的结果。最好结果的坐标xg
和xms
打印到命令行。我们将显示返回的唯一结果GlobalSearch
和多层的
在对全球解决方案的邻近方面,突出显示每个求解器的最佳结果。
每个求解器的第五输出是发现的载体,其中包含不同的最小值(或在这种情况下最大值)。我们会绘制结果的(x,y)对,solsgs
和solsms
,对我们以前使用的轮廓图。
%使用“*”标记绘制GlobalSearch结果xgs = cell2mat({solsgs(:)。x}');散射(XGS(:,1),XGS(:,2),‘*’,“MarkerEdgeColor”(0 0 1),“线宽”, 1.25)使用圆标记的%绘制多际艺术结果XMS = Cell2mat({solsms(:)。x}');散射(XMS(:,1),XMS(:,2),“o”,“MarkerEdgeColor”,[0 0 0],“线宽”传说,1.25)('强度',“约束”,“GlobalSearch”,“MultiStart”,'地点',“最佳”)标题('Globalsearch和Multistart结果')
由于问题的界限很紧,两者都有GlobalSearch
和多层的
我们能够在这次运行中找到全局最大值。
在实践中,当我们对目标函数或约束条件知之甚少时,很难找到严格的边界。一般来说,我们可以猜测出一个合理的区域,在这个区域中我们想限制起始点的集合。出于演示的目的,让我们放宽边界,定义一个更大的区域来生成起始点,并重新尝试求解器。
%放松界定的界限问题。磅= 5 * 1 (2,1);问题。乌兰巴托= 5 * 1 (2,1);% GlobalSearch运行抽搐;[xg, ~, ~, ~, solsgs] =运行(gs、问题);toc xg%运行MultiStart,其中15个随机生成的点抽搐;[xms, ~, ~, ~, solsms] = (ms,问题,15);toc xms
GlobalSearch停止了,因为它分析了所有的试验点。所有4个本地求解器的运行都收敛到一个正的本地求解器退出标志。运行时间为0.173760秒。MultiStart从所有起始点完成运行。所有15个本地求解器都以一个正的本地求解器退出标志运行。运行时间为0.134150秒。XMS = 2.4947 -0.1439
%显示轮廓图轮廓(x,y,z)保持在创建textarrow显示xglobal的位置注释(“textarrow”,[0.44 0.50],[0.63 0.58],'textedgecolor',[0 0 0],......“TextBackgroundColor”(1 1 1),“字形大小”,12,'细绳',{“全球最大”});轴([-1 3.75 -3 3])%使用“*”标记绘制GlobalSearch结果xgs = cell2mat({solsgs(:)。x}');散射(XGS(:,1),XGS(:,2),‘*’,“MarkerEdgeColor”(0 0 1),“线宽”, 1.25)使用圆标记的%绘制多际艺术结果XMS = Cell2mat({solsms(:)。x}');散射(XMS(:,1),XMS(:,2),“o”,“MarkerEdgeColor”,[0 0 0],“线宽”, 1.25)%突出显示每个的最佳结果:%Globalsearch导致红色,MultiStart导致蓝色情节(xg (1) xg (2),'SB','Markersize',12,“MarkerFaceColor”,[10 0]) plot(xms(1),xms(2),'SB','Markersize',12,“MarkerFaceColor”,[0 0 1])图例('强度',“GlobalSearch”,“MultiStart”,'最好的gs',“最好的女士”,'地点',“最佳”)标题('GlobalSearch and MultiStart Results with Relaxed Bounds')
最好的结果GlobalSearch
是由红方所显示的最佳结果吗多层的
是由蓝色方块表示的。
GlobalSearch
参数请注意,在此运行中,给定由边界定义的较大区域,既不能够识别最大强度的点。我们可以尝试以几种方式克服这一点。首先,我们检查GlobalSearch
.
请注意,GlobalSearch
只有跑步粉刺
几次。为了增加找到全局最大值的机会,我们希望运行更多的点。为了将起始点集限制在最有可能找到全局最大值的候选点上,我们将通过设置StartPointsToRun
财产界限 - ineqs.
.此外,我们将设置MaxWaitCycle
和basinradiusfactor.
属性,这样GlobalSearch
就能迅速识别出狭窄的山峰。减少MaxWaitCycle
原因GlobalSearch
使吸引半径的盆地减小basinradiusfactor.
比默认设置更频繁。
%增加候选总分,但过滤掉不可行的gs = GlobalSearch (gs,'startpoinstorun',“bounds-ineqs”,......'maxwaitcycle'3,“BasinRadiusFactor”, 0.3);% GlobalSearch运行抽搐;xgs = run(gs,问题);toc xg
GlobalSearch停止了,因为它分析了所有的试验点。所有10个本地求解器都以一个正的本地求解器退出标志运行。运行时间为0.242955秒。XGS = 1.2592 0.4284
多层的
的并行功能提高我们找到全局最大值的机会的一种强力方法就是尝试更多的起点。再次强调,这可能并不适用于所有情况。在我们的例子中,到目前为止,我们只尝试了一小组,运行时间也不是很长。所以,尝试更多的起点是合理的。为了加快计算速度,我们将运行多层的
如果并行计算工具箱™可用,则采用并行方式。
%设置MultiStart的UseParallel属性= MultiStart女士(女士,“UseParallel”,真的);尝试demoopenedpool = false;%如果不存在并行池,请创建并行池%(需要并行计算工具箱)如果max(大小(gcp)) = = 0%如果没有池parpool demoOpenedPool = true;结束抓我警告(消息(“globaloptim: globaloptimdemos: opticalInterferenceDemo: noPCT”));结束%运行求解器抽搐;xms =运行(女士,100年问题);toc xms如果DemoopenedPool.%如果在此示例中创建一个,请务必删除池删除(gcp)删除存储池结束
MultiStart完成了所有起始点的运行。所有100个本地解算器运行融合,并使用正本地求解器出口标志。经过时间为0.956671秒。XMS = 1.2592 0.4284
在这里,我们列出了定义优化问题的函数:
功能p = waveIntensity (x, amp,阶段,relFreqConst numSources,起源)% WaveIntensity光干涉强度函数演示。2009年Mathworks,Inc。d = distanceFromSource (x, numSources起源);ampVec =[总和(amp。/d .* cos(phase - d*relFreqConst));总和(amp。/d .* sin(phase - d*relFreqConst));强度为||AmpVec||^2p = ampVec ' * ampVec;
功能测查[c] = apertureConstraint (x, xcoords ycoords)%孔径约束光学干涉孔径约束函数演示。2009年Mathworks,Inc。CEQ = [];c =(x(1) - xcoords)。^ 2 +(x(2) - ycoords)。^ 2 - 9;
功能d = distanceFromSource (v, numSources起源)% distanceFromSource Distance for opticalInterferenceDemo。2009年Mathworks,Inc。d = 0 (numSources, 1);为d(k) = norm(origins(k,:) - [v 0]);结束