1.3 优化模型的图形表示
由图1-1可知,设计变量的取值被限定在约束函数规定的区域内,满足约束条件的最优解位于约束函数曲线的交点上。通过将优化模型用图形表示就是优化问题的图解法。Matlab有方便、灵活的绘图函数,对一些二维或三维优化问题应用绘图函数可以帮助了解定目标函数形状。对一些实际问题,通过图形表示可以了解设计变量的取值范围,也可以通过图解直接得出优化问题的解。下面先介绍Matlab常用的绘图函数,然后通过典型优化问题的分析了解基于Matlab的图解法。
Matlab绘图函数包括平面曲线绘图函数plot()、三维曲线绘图函数plot3()、三维曲面绘图函数mesh(),surf(),以及将三维曲面投影到平面上的取等值线函数contour()。要绘制较完美的图形还要对曲线线型(如点画线、虚线等)、线宽、线的颜色、绘图点标记的形状,标记边框颜色、标记填充颜色等进行定义,此外还要对坐标轴刻线、坐标轴名称、坐标轴取值范围、曲线图例等进行说明,对所绘图形修饰性的说明或定义也可在图形绘制完成后在图形显示窗口通过编辑命令来完成。坐标点及网格点生成函数在介绍有关函数时一并介绍。下面分别对plot(),plot3(),mesh,contour()函数进行说明。
plot()函数是在直角坐标系中绘制平面曲线的基本函数,要求输入的参数是横坐标x和纵坐标y的值。x和y用行向量或列向量来表示。
【例1-2】 绘制下面函数的曲线。
y(x)=2sin(x)+ln(x)
解:应用plot()函数绘制该函数曲线的程序如下:
%li_1_2
f=inline('2*sin(x)+log(x)','x')
x=linspace(0.1,2*pi,15);
y=feval(f,x);
plot(x,y,'-rs','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g','MarkerSize',10)
xlabel('0.1\leq\Theta\leq2\pi')
ylabel('2sin(\Theta)+ln(\Theta)');
title('Plotof2sin(\Theta)+ln(\Theta)')
text(pi/4,sin(-pi/4),'\leftarrow2sin(\Theta)+ln(\Theta)','HorizontalAlignment','left')
legend('-')
grid on
所的函数曲线如图1-2所示。
图1-2 【例1-2】函数曲线
【例1-2】中用到的有关函数有内置函数定义函数inline(),坐标点生成函数linspace(),函数取值函数feval()。坐标点生成函数linspace()用于生成等距点,该函数有3个输入参数,前两个参数说明坐标的起止点,第3个参数表示生成的离散点数,总的点数包括两个端点。若不指定第三个参数,则自动认为生成100个点。生成等距坐标点的另一种方法是用分隔符来实现,如x=1:0.1:10,结果是从1开始,按增量0.1递增,直到小于或等于终点。除可生成等距点外,还可生成对数分隔点,所用函数为logspace(),该函数也有3个输入参数,其中前两个参数是以10为底的指数,第3个参数与linspace()函数相同。绘图时,函数内向量元素的个数要相等,计算向量长度,矩阵维数的函数分别是length()和size()。
二维绘图函数还有简洁绘图函数ezplot,绘直方图函数bar,在图形加上误差带数errorbar,用给定精度绘图的函数fplot,绘极坐标图函数polar,绘统计分布图函数hist,绘台阶图函数stairs,绘极坐标统计分布图函数rose,绘火柴杆图函数stem,绘图区填充函数fill,绘矢量场图函数quiver等。
plot3()函数用来绘制三维曲线,它有3个输入参数,分别对应直角坐标系中的x,y,z方向的坐标点,各坐标点以向量表示。
mesh()函数用来绘制网格状三维曲面,它有3个输入参数,每个参数都是二维矩阵,它们分别是与平面矩形区域网格点对应的x,y,z坐标值。因此,要绘制三维曲面首先要在xy平面上根据x,y的取值范围划分网格,然后再计算网格点上与x,y对应的z坐标值。网格坐标生成函数为meshgrid(),该函数根据x,y方向的两个一维向量生成平面网格。
三维曲面等值线函数为contour()。该函数有如下几种常用格式:
contour(z):根据矩阵z绘制三维曲面,x,y坐标用矩阵行、列的序号表示;
contour(z,n):绘制n条等值线;
contour(z,v):按增量v绘制等值线,v为向量;
contour(x,y,z):用给定的x,y坐标在xy平面上绘制z等值线;
contour(x,y,z,n),contour(x,y,z,v),其中的参数n,v含义同上。
contour()函数既可用在三维图形中也可用在二维图形中,应用该函数结合优化问题的约束条件可进行优化问题的图解分析。
【例1-3】 用图形表示如下优化模型,并求解。
(x1-5)2+(x2-5)2-16≤0
解:该绘制目标函数曲面、约束函数曲线及求解程序如下:
(1)绘制目标函数曲面的程序
%li_1_3_1
functionli_1_3_1()
clc;
clear all;
close all;
n=20;
x1=linspace(0,2,n);
x2=linspace(0,6,n);
[xm1,xm2]=meshgrid(x1,x2);
for i=1:n
forj=1:n
xx=[xm1(i,j),xm2(i,j)];
zm(i,j)=fun_obj(xx);
end
end
figure(1)
meshc(xm1,xm2,zm)
xlabel('x1');
ylabel('x2');
zlabel('zm')
(2)绘制约束函数曲线及求解的程序
%li_1_3_2
functionli_1_3_2()
clc;
clear all;
close all;
x0=[1,1];
[x,fval,exitflag,output]=fmincon(@fun_obj,x0,[],[],[],[],[],[],@fun_cons)
n=20;
x1=linspace(0,6,n);
x2=linspace(0,10,n);
[xm1,xm2]=meshgrid(x1,x2);
for i=1:n
forj=1:n
xx=[xm1(i,j),xm2(i,j)];
zm(i,j)=fun_obj(xx);
end
end
figure(1)
f1=inline('sqrt(25-x.^2)','x');
f2=inline('sqrt(16-(x-5).^2)+5','x');
y1=feval(f1,x1);
y2=feval(f2,x1);
y3=sqrt((4*x1.^3)-12-fval+0.01)
plot(x1,y1,x1,y2);
hold on
plot(x1(1:8),y3(1:8),'--r')
hold on
[c,h]=contour(xm1,xm2,zm,20);
clabel(c,h);
xlabel('x1');
ylabel('x2');
function f=fun_obj(x)
f=4*x(1)^3-x(2)^2-12;
function[c,ceq]=fun_cons(x)
c=[x(1)^2+x(2)^2-10*x(1)-10*x(2)+34
-x(1)
-x(2)];
ceq=[x(1)^2+x(2)^2-25];
目标函数曲面及目标函数等值线和约束函数曲线分别示于图1-3和图1-4。
从图1-4可以看出,约束函数曲线在点(1,5)处相交,该点就是目标函数满足约束条件的解。应用Matlab优化工具箱函数fmincon()得出的结果为x=[1.0013 4.8987]。通过图解分析可对优化问题的几何性质有更清晰的认识,从而可得出更为精确的解。
三维绘图函数中surf函数和riobbon函数也很有用,它们分别用来绘制带阴影的三维曲面以及用条带表示的三维曲面或曲线。
除可利用Matlab进行函数曲线绘制和分析外,其他的一些数学软件也能轻松完成类似的工作做,其中应用较广的是Maple、MathCAD和Mathematica。它们与c语言、C++、Visual Basic等结构化数值计算语言最大的区别是可完成代数运算,如多项式因式分解、因式展开、求极限、求导数、求积分等,同时它们也可完成数值计算,显示图形等。这些数学软件交互功能强,易学易用,自带大量数学函数,便于多学科数学问题的求解,与其他高级语言接口方便,因而受到数学及工程科技工作者的欢迎。如Maple软件不但具有精确的数值处理功能,而且具有强大的符号计算功能。Maple的符号计算功能还是MathCAD和Matlab等软件符号处理的核心。Maple提供了2000余种数学函数,涉及范围包括:初等数学、高等数学、线性代数、数论、离散数学、图形学。它还提供了一套内置的编程语言,用户可以开发自己的应用程序。Maple采用字符行输入方式,输出则可以选择字符方式和图形方式,产生的图形结果可以很方便地剪贴到Windows应用程序内。
图1-3 【例1-3】目标函数曲面
图1-4 【例1-3】目标函数等值线约束函数曲线