![MATLAB金融风险管理师FRM(高阶实战)](https://wfqqreader-1252317822.image.myqcloud.com/cover/187/36862187/b_36862187.jpg)
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范围。
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-P43_3712128.jpg?sign=1739310979-Oz5IdTbyqRzKa5O7qW9j3qKfojtv7iQp-0-676c60b9e1c01629e90b0a8f0555a727)
图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() 函数绘制的三维网格图。
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-P44_3712131.jpg?sign=1739310979-UsJpFSGcmFxMx9ZTDbW6MlfEce3kd7kJ-0-f212f089e296768b0abd6ca3fe4f30bc)
图1.2 fcontour() 绘制等高线图
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-P44_3712132.jpg?sign=1739310979-5zyHtU3UalRRfVD3kIkBZbZe94hd4ErU-0-35b625591805a68071e99270fab46d34)
图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() 绘图的效果。
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-P46_3712137.jpg?sign=1739310979-bvtHGNf1z9FIZAS2VZEaXdpmTtVwCmLk-0-714d2367043e42baafaa30b3905c6d1b)
图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()绘制的二次曲线和椭圆。
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-P46_3712140.jpg?sign=1739310979-u4wD7Y481sjoYxm9UMwbCIySQXJmduce-0-347d8306f92fe22734bdc0ea7a367565)
图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()绘制的对顶圆锥三维网格。
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-P47_3712144.jpg?sign=1739310979-qRdUKRZ2NZJHmOEkVfAXTFpVER1yuTMD-0-e81477c81adb62f09994bacc5ab12047)
图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 常用矩阵运算
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-T48_3712149.jpg?sign=1739310979-vsw6egA0i09e0uDgvBLBZjoCmUGkyxuy-0-fa2fd1471b8f083ff86260df4a026b57)
续表
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-T49_3712150.jpg?sign=1739310979-UrBRx0eZJJdZsfyvGYhDtM3DJyS0qFzs-0-bd875b12db57bd7fb37a4fb4a5fac410)
续表
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-T50_3712151.jpg?sign=1739310979-TNSedZvdSnHVwVFD1cv2DLGb2x2NR0YY-0-44c14663969dee8ab3a2302b6561bd40)
续表
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-T51_3712152.jpg?sign=1739310979-KdWbfmBPb6tTzbuRZ38NVPpubYQ0wfYL-0-e2c05020fd9506eab2a019eab41599f6)
续表
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-T52_3712153.jpg?sign=1739310979-Re9pWvVt3N4iGmKpCsLsaZOVk9ZnCpcu-0-163bfc1fe22c17755e4c60a8c5b2d1f0)
续表
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-T53_3712154.jpg?sign=1739310979-HJT5xSoBcLTqY8XX1ysVsG5XGfVdd1qQ-0-dc24a11df314347f2ebc27e6c25cb977)