对多元二次函数的理解

本文探讨了多元二次函数的性质,通过实例展示了函数图形随系数变化的情况,解释了函数从凸到非凸的过程,并列举了多种二次函数形成的特殊曲面,如螺旋线、椭圆柱面、双曲抛物面等。同时,文章还介绍了如何使用colormap调整图像颜色以及进行旋转、灯光和透明度处理。

对多元二次函数的理解

         本学期学习了《工程优化》的课程,平时没有好好地上课听讲,快考试了才发现这门课程还是挺有用的。老师上课讲的优化问题都是针对多元二次函数的,而且大部分是二元二次,比较简单。之前自己并没有对多元二次函数有过多认识,学东西也是浑沦吞枣,这两天细细地看书,感觉多元二次函数的图像特别有意思。
         这里,我们以二元二次函数为例,利用MATLAB对其进行可视化。
         一、先以一个二次型为例:
         函数形式为

       

 例如函数:

         Z=X1.^2+X2.^2,

X1,X2取值范围为[-6,6],

 其图形为:

       因为上述二次型的Q为正定对称矩阵,所以这明显是一个凸函数,且最优值唯一。
      观察上图可知,它的等高线都是以(0,0)为圆心的圆族,圆心处就是最优解。
      对上式进行稍加改变:

      Z=X1.^2+X2.^2+1*X1.*X2,X1,X2取值范围为[-6,6],图形变化为:


      此时,函数同样是一个凸函数,因为Q同样是正定矩阵,此时,


      但是它的等高线已不是圆,而是一个椭圆族。

      而此时如果把函数改为:

      Z=X1.^2+X2.^2+2*X1.*X2,X1,X2取值范围为[-6,6],图形变化为:



      此时,函数已经不再是凸函数,因为Q已经不再是正定矩阵。此时,


      而且,此时的等高线很有意思,已经不是一些闭合曲线,说明,此时没有极值点。

      函数为Z=X1.^2+X2.^2+8*X1.*X2时,图形为:


      下面,看一下标准形式的二次函数图像,其函数形式为:


      例如:函数为Z=2*X1.^2+2*X2.^2+2*X1.*X2+30*X1, X1,X2取值范围为[-6,6],其图像为:

      从图像看,好像此时的函数已经不是凸函数,等高线也不是闭合曲线,其实这样下结论是错的。此时的Q为

      不难判断Q正定,所以函数应该是严格凸函数。实际上,完整的图像应该如下所示,上图是受限于X的取值范围所致。


      此时的取值范围为[-60,60]。所以二次函数的凹凸性与b,c无关,至于矩阵Q有关。
     上面的工作只是简单地对二次函数进行了可视化,没有什么技术可言,还望看客不要取笑。下面提供画一些高数中的函数图像的程序和这些函数的图像。

一、螺旋线

1.静态螺旋

a=0:0.1:20*pi;
h=plot3(a.*cos(a),a.*sin(a),2.*a,'b','linewidth',2);
axis([-50,50,-50,50,0,150]);
grid on
set(h,'erasemode','none','markersize',22);
xlabel('x轴');ylabel('y轴');zlabel('z轴');
title('静态螺旋线');

 Matlab画函数图像 - 往事随风 - 行者随风

2.动态螺旋线

t=0:0.1:10*pi;

i=1;

h=plot3(sin(t(i)),cos(t(i)),t(i),'*','erasemode','none');

grid on

axis([-2 2 -2 2 0 35])

for i=2:length(t)

    set(h,'xdata',sin(t(i)),'ydata',cos(t(i)),'zdata',t(i));

    drawnow

    pause(0.01)

end

title('动态螺旋线');

(图略)

3.圆柱螺旋线

t=0:0.1:10*pi;

x=r.*cos(t);

y=r.*sin(t);

z=t;

plot3(x,y,z,'h','linewidth',2);

grid on

axis('square')

xlabel('x轴');ylabel('y轴');zlabel('z轴');

title('圆柱螺旋线')

Matlab画函数图像 - 往事随风 - 行者随风

 

二、旋转抛物面

b=0:0.2:2*pi;

[X,Y]=meshgrid(-6:0.1:6);

Z=(X.^2+Y.^2)./4;

meshc(X,Y,Z);

axis('square')

xlabel('x轴');ylabel('y轴');zlabel('z轴');

title('旋转抛物面')

或直接用:ezsurfc('(X.^2+Y.^2)./4')   

Matlab画函数图像 - 往事随风 - 行者随风

三、椭圆柱面

load clown

ezsurf('(2*cos(u))','4*sin(u)','v',[0,2*pi,0,2*pi])

view(-105,40)              %视角处理

shading interp            %灯光处理

colormap(map)          %颜色处理

grid on                        %添加网格线

axis equal                  %使x,y轴比例一致

xlabel('x轴');ylabel('y轴');zlabel('z轴');                   %添加坐标轴说明

title('椭圆柱面')          %添加标题

Matlab画函数图像 - 往事随风 - 行者随风

四、椭圆抛物面

b=0:0.2:2*pi;

[X,Y]=meshgrid(-6:0.1:6);

Z=X.^2./9+Y.^2./4;

meshc(X,Y,Z);

axis('square')

xlabel('x轴');ylabel('y轴');zlabel('z轴');

title('椭圆抛物面')

或直接用:ezsurfc('X.^2./9+Y.^2./4')

Matlab画函数图像 - 往事随风 - 行者随风

五、'双叶双曲面

ezsurf('8*tan(u)*cos(v)','8.*tan(u)*sin(v)','2.*sec(u)',[-pi./2,3*pi./2,0,2*pi])

axis equal

grid on

axis square

xlabel('x轴');ylabel('y轴');zlabel('z轴');

title('双叶双曲面')

Matlab画函数图像 - 往事随风 - 行者随风

六、双曲柱面

load clown

ezsurf('2*sec(u)','2*tan(u)','v',[-pi/2,pi/2,-3*pi,3*pi])

hold on              %在原来的图上继续作图

ezsurf('2*sec(u)','2*tan(u)','v',[pi/2,3*pi/2,-3*pi,3*pi])

colormap(map)

shading interp

view(-15,30)

axis equal

grid on

axis equal

xlabel('x轴');ylabel('y轴');zlabel('z轴');

title('双曲柱面')

Matlab画函数图像 - 往事随风 - 行者随风

七、双曲抛物面(马鞍面)

[X,Y]=meshgrid(-7:0.1:7);

Z=X.^2./8-Y.^2./6;

meshc(X,Y,Z);

view(85,20)

axis('square')

xlabel('x轴');ylabel('y轴');zlabel('z轴');

title('双曲抛物面')

或直接用:ezsurfc('X.^2./8-Y.^2./6')

 Matlab画函数图像 - 往事随风 - 行者随风

八、抛物柱面

[X,Y]=meshgrid(-7:0.1:7);

Z=Y.^2./8;

h=mesh(Z);

rotate(h,[1 0 1],180)                %旋转处理

%axis([-8,8,-8,8,-2,6]);

axis('square')

xlabel('x轴');ylabel('y轴');zlabel('z轴');

title('抛物柱面')

或直接用:ezsurfc('Y.^2./8')

 Matlab画函数图像 - 往事随风 - 行者随风

九、环面

ezmesh('(5+2*cos(u))*cos(v)','(5+2*cos(u))*sin(v)','2*sin(u)',[0,2*pi,0,2*pi])

axis equal

grid on

xlabel('x轴');ylabel('y轴');zlabel('z轴');

title('环面')

Matlab画函数图像 - 往事随风 - 行者随风

十、椭球

ezsurfc('(5*cos(u))*sin(v)','(3*sin(u))*sin(v)','4*cos(v)',[0,2*pi,0,2*pi])

axis equal

grid on

xlabel('x轴');ylabel('y轴');zlabel('z轴');

title('椭球')

Matlab画函数图像 - 往事随风 - 行者随风

十一、单叶双曲面

ezsurf('4*sec(u)*cos(v)','2.*sec(u)*sin(v)','3.*tan(u)',[-pi./2,pi./2,0,2*pi])

axis equal

grid on

xlabel('x轴');ylabel('y轴');zlabel('z轴');

title('单叶双曲面')

Matlab画函数图像 - 往事随风 - 行者随风

十二、旋转单叶双曲面

load clown

ezsurf('8*sec(u)*cos(v)','8.*sec(u)*sin(v)','2.*tan(u)',[-pi./2,pi./2,0,2*pi])

colormap(map)

view(-175,30)

%alpha(.2)                   %透明处理

axis equal

grid on

axis square

xlabel('x轴');ylabel('y轴');zlabel('z轴');

title('旋转单叶双曲面')

Matlab画函数图像 - 往事随风 - 行者随风

十三、圆柱面

subplot(1,2,1)

ezsurf('(2*cos(u))','2*sin(u)','v',[0,2*pi,0,2*pi])

grid on

shading interp

axis equal

xlabel('x轴');ylabel('y轴');zlabel('z轴');

title('圆柱面')

subplot(1,2,2)

cylinder(30)

shading interp

axis square

title('调用cylinder函数所得圆柱面')

Matlab画函数图像 - 往事随风 - 行者随风

下面给出用colormap()改变图像颜色的例子:(用了灯光效果"shading interp")

 colormap();     %hot/cool/copper/gray/hsv/spring/summer/winter...

Matlab画函数图像 - 往事随风 - 行者随风

                                    colormap(hsv)

Matlab画函数图像 - 往事随风 - 行者随风

                                               colormap(hot)

Matlab画函数图像 - 往事随风 - 行者随风

                                     colormap(gray)

Matlab画函数图像 - 往事随风 - 行者随风

                                              colormap(cool)

Matlab画函数图像 - 往事随风 - 行者随风

                                              colormap(copper)

   下面做了旋转("view([ ])")、灯光(“shading interp”)、透明(“alpha()”)处理:

 Matlab画函数图像 - 往事随风 - 行者随风


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值