这个例子展示了如何使用半无限规划来研究优化问题的模型参数中不确定性的影响。我们将使用该函数制定并解决一个优化问题 这个例子所说明的问题涉及空气污染的控制。具体而言,将在给定的地理区域内建造一套烟囱。随着每个烟囱高度的增加,烟囱污染物的地面浓度降低。然而,每个烟囱的建造成本随着高度的增加而增加。我们将解决一个问题,在地面污染浓度不超过法定限值的情况下,尽量减少烟囱的累积高度,从而降低建筑成本。以下参考资料概述了此问题: 半无限规划的空气污染控制,A.I.F. Vaz和E.C. Ferreira,第二十八届全国环境调查行动大会,2004年10月 在本例中,我们将首先解决上述文章中发布的问题<年代pan class="emphasis">最小的烟囱高度 然后我们扩展了原来的问题,允许风速和方向参数在给定范围内变化。这将允许我们分析这些参数的不确定性对这个问题的最优解的影响。 考虑一个20km × 20km的区域,R,其中将放置10个烟囱。这些烟囱向大气中释放了几种污染物,其中之一就是二氧化硫。栈的x、y位置是固定的,但是栈的高度可以变化。 烟囱的施工人员希望尽量减少烟囱的总高度,从而最大限度地降低施工成本。然而,这一点通过相互冲突的要求得到平衡,即R区地面任何点的二氧化硫浓度不得超过立法规定的最大值。 首先,让我们绘制烟囱的初始高度。注意,我们放大了R的4km×4km分区,其中包含烟囱。 在这个问题中有两个与环境相关的参数,风速和风向。在本例后面,我们将允许这些参数发生变化,但对于第一个问题,我们将这些参数设置为典型值。 现在,让我们绘制整个R区的二氧化硫(SO2)地面浓度图(记住烟囱图是在一个较小的区域)。SO2浓度已在烟囱设置为初始高度的情况下进行计算。 我们可以看到,SO2的浓度在感兴趣的地区有所不同。二氧化硫图表有两个特点: SO2浓度在(x,y)平面的左上角升高 该地区大部分地区的二氧化硫浓度接近于零 简单地说,第一个特征是由于盛行风,在这个例子中,盛行风将SO2吹向(x,y)平面的左上角。第二个因素是由于二氧化硫通过扩散被输送到地面。与盛行风相比,这是一个较慢的过程,因此SO2只到达感兴趣区域左上角的地面。 有关烟囱大气扩散的更详细的讨论,请参阅导言中所引用的参考资料。 粉色的平面表示二氧化硫浓度为<年代pan class="inlineequation">
. 这是R区内二氧化硫浓度不得超过的法定最大值。从图中可以清楚地看出,SO2浓度超过了初始烟囱高度的最大值。 检查MATLAB文件 在解决最小堆栈高度问题之前,我们将概述如何
以致
(线性不等式约束)
(线性等式约束)
(非线性不等式约束)
(非线性等式约束)
(范围) 和
,在那里<年代pan class="inlineequation">
对于<年代pan class="inlineequation">
(非线性半无限约束) 此算法允许您为非线性优化问题指定约束,这些约束必须在辅助变量的间隔内得到满足,<年代pan class="inlineequation">
.请注意,对于 功能 算法的关键部分是对“半无限”约束的处理,<年代pan class="inlineequation">
.在<年代pan class="inlineequation">
这是必需的<年代pan class="inlineequation">
必须在每个值都是可行的<年代pan class="inlineequation">
在这一期间<年代pan class="inlineequation">
.这个约束可以通过考虑的所有局部极大值来简化<年代pan class="inlineequation">
关于<年代pan class="inlineequation">
在这一期间<年代pan class="inlineequation">
. 原始约束相当于要求<年代pan class="inlineequation">
在上面的每一个局部极大值是可行的。 正如我们稍后将看到的,您将在约束函数中创建这个网格。你应该为每一个使用的间距<年代pan class="inlineequation">
网格的坐标由 在算法的每次迭代中,执行以下步骤: 估计<年代pan class="inlineequation">
网状的<年代pan class="inlineequation">
-使用每个网格的当前网格间距的值<年代pan class="inlineequation">
-协调。 的所有局部最大值的近似值<年代pan class="inlineequation">
利用评价<年代pan class="inlineequation">
从步骤1。 更换每个<年代pan class="inlineequation">
在一般半无限问题中,局部最大值集在步骤1-2中找到。现在的问题有有限数量的非线性约束。 检查SQP算法在新点上是否满足任何停止条件<年代pan class="inlineequation">
.如果满足任何条件,则算法终止;如果不是这样, 更新步骤1中用于评估半无限约束的网格间距。 在我们打电话之前 这是一个半无限约束,本节介绍了约束函数的实现。对于最小堆栈高度问题,我们在MATLAB文件中实现了约束 这个函数说明了半无限规划问题约束函数的一般结构。特别地,有一个约束函数 1.定义约束评估的初始网格尺寸 回想一下, 2.定义将用于约束评估的网格 需要创建一个用于约束评估的网格。在注释“定义将对“无限”约束进行计算的网格”后面的三行代码 3.计算网格上的约束 一旦定义了网格,就可以计算它的约束条件。然后将这些约束返回到 注意,在这个问题中,我们还重新缩放了约束条件,使它们在更接近目标函数的尺度上变化。这可以帮助 我们现在可以调用 计算得到的最小累积高度 检查MATLAB文件 回想一下, 注意,二氧化硫浓度可能在(x, y)平面的左上角达到最大值,即在x = -20000m, y = 20000m处。这一点由下图中的蓝点标记,并通过计算这一点的二氧化硫浓度来验证。 检查MATLAB文件 二氧化硫浓度取决于在上述问题中保持在固定值的几个环境因素。其中两个环境因素是风速和风向。有关所有问题参数的更详细讨论,请参阅引言中引用的参考资料。 我们可以研究系统的性能随风速和风向的变化。在示例的这一节中,我们希望确保即使风向从3.82 rad变化到4.18 rad,平均风速在5到6.2 m/s之间变化,二氧化硫限制也能得到满足。 我们需要实现一个半无限约束,以确保二氧化硫浓度不超过r区域的极限。这个约束要求对所有风速和风向对都是可行的。 这种约束将有四个“无限”变量(风速和方向以及地面的x-y坐标) 以合适的形式实现此约束 这意味着这个问题的“无限”变量是风速和方向。要查看这个约束是如何实现的,请查看MATLAB文件 此约束功能可分为与前面相同的三个部分: 1.定义约束评估的初始网格尺寸 注释“初始采样间隔”后面的代码初始化了网格大小。 2.定义将用于约束评估的网格 代码的下一部分使用与最初问题中使用的类似的结构创建一个网格(现在是风速和方向)。 3.计算网格上的约束 代码的其余部分计算风速/方向网格中每个点上的SO2浓度。然后将这些约束返回到 我们现在可以调用 我们现在可以看看在有参数不确定性和没有参数不确定性的情况下,计算出的最小累积堆栈高度之间的差异。您应该能够看到,当不确定性添加到问题中时,最小累积高度会增加。这种预期的高度增加允许二氧化硫浓度保持在规定范围内所有风速/方向对的法定最大值以下。 我们可以通过检查二氧化硫检查点来检查二氧化硫浓度是否超过有关区域的限制。对于给定的(x, y)点,我们在指定范围内绘制风速和风向的最大SO2浓度。注意,我们已经放大了X-Y平面的左上角。 最后,当问题定义中存在不确定性时,我们在烟囱的最优高度绘制烟囱图。 半无限规划算法有很多选择,最小堆叠高度问题
h0=[210;210;180;180;150;150;120;120;90;90];绘图烟囱组(h0,<年代pan style="color:#A020F0">“烟囱初始高度”
%风向(弧度)
plotSulfurDioxide (h0 theta0情况,<年代pan style="color:#0000FF">...
如何
fseminf
非线性约束函数的书写
类型<年代pan style="color:#A020F0">airPollutionCon.m
function [c, ceq, K, s] = airPollutionCon(h, s, theta, U) %空气污染演示的约束函数% %这个%函数首先使用提供的网格%间距s创建一个(X, Y)点的网格。然后在网格的每个点%上计算以下约束:% %二氧化硫浓度在指定风向,THETA和%风速U <= 1.25e-4 g/m^3 % %参见AIRPOLLUTION % Copyright 2008 the MathWorks, Inc. % Initial sampling interval if nargin < 2 || isnan(s(1,1)) s = [1000 4000];定义网格,“无限”约束将被计算在w1x = -20000:s(1,1):20000;w1y = -20000: s(1、2):20000;(t1, t2) = meshgrid (w1x w1y);%最大允许二氧化硫maxsul = 1.25e-4;计算网格上的约束K = concsulphdioxide (t1, t2, h, theta, U) - maxsul;%缩放约束使其为0(1)K = 1e4*K%无有限约束c = []; ceq = [];
解决优化问题
磅= 10 *的(大小(h0));[hsopt, sumh, exitflag] = fseminf(@(h)sum(h), h0, 1, ' ', ' '));<年代pan style="color:#0000FF">...
局部最小值。约束满足。Fseminf停止是因为目标函数中预测的变化小于函数公差的值,约束条件满足到约束公差的值之内。
流(<年代pan style="color:#A020F0">'\n烟囱计算的最小累积高度:%7.2f m\n'
烟囱的最小计算累积高度:3667.19 m
绘图烟囱组(hsopt,<年代pan style="color:#A020F0">“烟囱最佳高度”
检查优化结果
titleStr =<年代pan style="color:#A020F0">“最佳二氧化硫浓度及其最大值(蓝色)”
SO2Max = conc二氧化硫(-20000,20000,hsopt, theta0, U0);流(<年代pan style="color:#A020F0">' x = -20000m, y = 20000m处的二氧化硫浓度:%e /m^3\n'
x=-20000m,y=20000m时的二氧化硫浓度:1.250000e-04 g/m^3
考虑环境因素中的不确定性
类型<年代pan style="color:#A020F0">不确定性空气污染
[c, ceq, K, s] = uncertainAirPollutionCon(h, s) % uncertainAirPollutionCon for air pollution demo % %这个%函数首先使用提供的网格间距s创建一个风速/方向点网格,然后在网格的每个点上计算%以下约束:% %二氧化硫浓度在x = -20000m, y = 20000m <= 1.25e-4 % g/m^3 % %参见AIRPOLLUTIONCON, AIRPOLLUTION % Copyright 2008 The MathWorks, Inc. % Maximum allowed二氧化硫maxsul = 1.25e-4;%初始采样间隔if nargin < 2 || isnan(s(1,1)) s = [0.02 0.04];定义“无限”约束将在w1x = 3.82:s(1,1):4.18上被计算的网格;%风向w1y = 5.0:s(1,2):6.2;%风速[t1,t2] =网格(w1x,w1y);对于所有风速/风向对,我们假设最大SO2浓度在[x, y] =[-20000, 20000] %。我们在这一点上计算SO2约束在[,U]网格上的百分比。K =二氧化硫(-20000,20000,h, t1, t2) - maxsul; % Rescale constraint to make it 0(1) K = 1e4*K; % No finite constraints c = []; ceq = [];
[hsopt2,sumh2,exitflag2]=fseminf(@(h)和(h),h0,1,<年代pan style="color:#0000FF">...
找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。
流(<年代pan style="color:#A020F0">“\n不确定性烟囱的最小计算累积高度:%7.2f m\n”
计算不确定烟囱的最小累积高度:3812.14米
titleStr =<年代pan style="color:#A020F0">“不确定条件下的最佳二氧化硫浓度”
绘图烟囱组(hsopt2,<年代pan style="color:#A020F0">“不确定条件下烟囱的最佳高度”
相关话题