1.6 符号绘图
针对符号表达式,MATLAB专门提供了如下几个绘图函数。
fplot() 在二维平面绘制符号表达图像,结果类似plot()。
fplot3() 在三维空间绘制符号表达图像,结果类似plot3()。
ezpolar() 在极坐标中绘制符号表达图像。
fsurf() 在三维空间绘制符号表达曲面图像,结果类似surf()。
fcontour() 在平面绘制符号表达等高线图,结果类似contour()。
fmesh() 在三维空间绘制符号表达网格,结果类似mesh()。
fimplicit(f)在默认区间[-5 5](对于x 和y)上绘制f(x,y)= 0 定义隐函数。
fimplicit3(f)在默认区间[-5 5](对于x、y和z)上绘制f(x,y,z)= 0 定义三维隐函数。
MATLAB旧版本的ezmesh()、ezplot()、ezsurf()、ezcontour() 等函数已经不推荐使用。这一节介绍几个常用符号表达绘图函数。图1.1展示了fplot() 绘制线图。syms定义了符号表达函数f(x)= sin(x),fplot() 函数输入为f和变量x范围。
图1.1 fplot() 绘制线图
图1.1可由如下代码绘制:
syms f(x) f(x) = sin(x); figure(1) fplot(f,[-2*pi 2*pi],'LineWidth',1) grid off; box off xlabel('x'); ylabel('f(x)');
图1.2和图1.3所示为fcontour() 函数绘制的等高线图和fmesh() 函数绘制的三维网格图。
图1.2 fcontour() 绘制等高线图
图1.3 fmesh() 绘制三维网格图
以下代码绘制图1.2和图1.3。
syms x1 x2 f = x1^2 + 2*x2^2 + x1*x2; g = gradient(f, [x1 x2]) figure(1) fcontour(f, [-1,1,-1,1],'LevelList',[-2:0.2:4]) % [xmin xmax ymin ymax] xlabel('x_1'); ylabel('x_2') axis equal figure(2) subplot(1,2,1) fmesh(g(1),[-1,1,-1,1]) xlabel('x_1'); ylabel('x_2'); zlabel('Gradient x_1') grid off; box off subplot(1,2,2) fmesh(g(2),[-1,1,-1,1]) xlabel('x_1'); ylabel('x_2'); zlabel('Gradient x_2') grid off; box off
另外,读者可以采用subs() 函数将符号表达转换为具体数据矩阵,并配合可视化函数绘制图像。如下代码会同样绘制图1.2和图1.3。
syms x1 x2 f = x1^2 + 2*x2^2 + x1*x2; g = gradient(f, [x1 x2]) [X1, X2] = meshgrid(-1:.1:1,-1:.1:1); F = subs(f, [x1 x2], {X1,X2}); G1 = subs(g(1), [x1 x2], {X1,X2}); G2 = subs(g(2), [x1 x2], {X1,X2}); F = double(F); figure(1) contour(X1,X2,F,'LevelList',[-2:0.2:4]) % [xmin xmax ymin ymax] xlabel('x1'); ylabel('x2') axis equal G1 = double(G1); G2 = double(G2); figure(2) subplot(1,2,1) mesh(X1,X2,G1) xlabel('x1'); ylabel('x2'); zlabel('Gradient x1') grid off; box off subplot(1,2,2) mesh(X1,X2,G2) xlabel('x1'); ylabel('x2'); zlabel('Gradient x2') grid off; box off
图1.4则展示了用subs() 配合contour() 及quiver() 绘图的效果。
图1.4 subs() 配合contour() 及quiver() 绘图
具体代码如下:
syms x1 x2 f = x1^2 + 2*x2^2 + x1*x2; g = gradient(f, [x1 x2]) [X1, X2] = meshgrid(-1:.2:1,-1:.2:1); [XX1, XX2] = meshgrid(-1.2:.05:1.2,-1.2:.05:1.2); F = subs(f, [x1 x2], {XX1,XX2}); G1 = subs(g(1), [x1 x2], {X1,X2}); G2 = subs(g(2), [x1 x2], {X1,X2}); % F = double(F); % G1 = double(G1); % G2 = double(G2); figure(1) contour(XX1,XX2,F,20); hold on quiver(X1, X2, G1, G2) xlabel('x_1'); ylabel('x_2')
这里要特别介绍一下fimplicit() 函数。fimplicit() 函数可以绘制f(x, y)= 0这样的隐函数。图1.5所示为用fimplicit()绘制的二次曲线和椭圆。
图1.5 fimplicit() 绘制二次曲线和椭圆
绘制图1.5的具体代码如下:
syms x y f1 = x.^2 - 2*y.^2 - 1; f2 = x.^2 + 2*y.^2 - 4; figure(1) subplot(1,2,1) % fimplicit(@(x,y) x.^2 - 2*y.^2 - 1, [-3 3 -3 3]) fimplicit(f1, [-3 3 -3 3]) axis equal xlabel('x'); ylabel('y'); box off set(gca, 'XAxisLocation', 'origin') set(gca, 'YAxisLocation', 'origin') subplot(1,2,2) % fimplicit(@(x,y) x.^2 + 2*y.^2 - 4, [-3 3 -3 3]) fimplicit(f2, [-3 3 -3 3]) axis equal xlabel('x'); ylabel('y'); box off set(gca, 'XAxisLocation', 'origin') set(gca, 'YAxisLocation', 'origin')
与fimplicit()类似,fimplicit3()可以绘制f(x, y, z)= 0 这样的三元隐函数。图1.6展示了用fimplicit3()绘制的对顶圆锥三维网格。
图1.6 fimplicit3() 绘制对顶圆锥三维风格
以下代码绘制图1.6。
syms f(x,y,z) f(x,y,z) = x.^2 + y.^2 - z.^2; % f = @(x,y,z) x.^2 + y.^2 - z.^2; figure(1) fimplicit3(f) axis equal xlabel('x'); ylabel('y'); zlabel('z') grid off; box off set(gca, 'FontName', 'Times New Roman','fontsize',8)
这一章介绍了MATLAB常用的符号运算函数,本书下文的数学和优化内容将大量使用这些函数。更多符号数学运算内容,请参考MATLAB文件Symbolic Math Toolbox,相应PDF文件下载地址如下:
https://www.mathworks.com/help/symbolic/
本书后文将大量使用矩阵运算,为了方便读者查询和回顾,表1.6总结了丛书目前为止介绍过的主要矩阵运算法则。
表1.6 常用矩阵运算
续表
续表
续表
续表
续表