![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=1739360976-kKrQrEmt1JazYjoRoXG1Fylhz7GDEJwv-0-e09460500a6761935c742bef8aadd3a8)
图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=1739360976-RY5z5bW2hkinTB3qkpZHxATJ9HoAKeIQ-0-f2a9712839bed4b85c8bafce694f13c2)
图1.2 fcontour() 绘制等高线图
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-P44_3712132.jpg?sign=1739360976-i2n7sJApuv9OPiBvVIgowrGSOFaoxHEJ-0-cd69a64f5d05eb082f4e6ea9af89b7a6)
图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=1739360976-rYLZmGKBi3Yq2nPkL934SenUkPHxInhm-0-4f471e3d151271ebef4fb7e4fb61bbce)
图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=1739360976-RWHDodzN52lD1MgvJJvRO0jXDBJxF4L6-0-df1363d34520d0e5fb1807c36e19d63e)
图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=1739360976-MoGNKOXqKGQXkv3aOSg0DNJMJqNKjAvL-0-fb4e68937ba44eb0c036ffa409bbbed2)
图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=1739360976-uofbNGvVobHZv76ZX7OqfgSeVvEjzNMQ-0-df10136b42abd6cad3d7c7ed44e21638)
续表
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-T49_3712150.jpg?sign=1739360976-Lr96SrW6KdiGCP4pKIABzC66LH5qeTeK-0-cca49d475e2e79d6b154eb44c20d0405)
续表
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-T50_3712151.jpg?sign=1739360976-9n1o8pSWLeFjGBYEaKfurY6JYEfcntJq-0-f4db43dd649c411a23229890c0b68c6f)
续表
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-T51_3712152.jpg?sign=1739360976-IZDNjVJE3txnKxxQG1kiqQTsxyA0VDKA-0-f72a8b934105df5cca007bb01a01752a)
续表
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-T52_3712153.jpg?sign=1739360976-zC1ahDjTahtQg3cmEeD9PtpZvtiRf4Ha-0-93fd877e9147d1a2ce52e43e4bd59e93)
续表
![](https://epubservercos.yuewen.com/745BB7/19549640201517806/epubprivate/OEBPS/Images/Figure-T53_3712154.jpg?sign=1739360976-7YBu4V10vaMTKgFk0SO9MXUONzIEymNl-0-87a2155f83ad62ea1152e34df9fd6705)