MATLAB金融风险管理师FRM(高阶实战)
上QQ阅读APP看书,第一时间看更新

1.6 符号绘图

针对符号表达式,MATLAB专门提供了如下几个绘图函数。

 fplot() 在二维平面绘制符号表达图像,结果类似plot()。

 fplot3() 在三维空间绘制符号表达图像,结果类似plot3()。

 ezpolar() 在极坐标中绘制符号表达图像。

 fsurf() 在三维空间绘制符号表达曲面图像,结果类似surf()。

 fcontour() 在平面绘制符号表达等高线图,结果类似contour()。

 fmesh() 在三维空间绘制符号表达网格,结果类似mesh()。

 fimplicit(f)在默认区间[-5 5](对于xy)上绘制fx,y)= 0 定义隐函数。

 fimplicit3(f)在默认区间[-5 5](对于xyz)上绘制fx,y,z)= 0 定义三维隐函数。

MATLAB旧版本的ezmesh()、ezplot()、ezsurf()、ezcontour() 等函数已经不推荐使用。这一节介绍几个常用符号表达绘图函数。图1.1展示了fplot() 绘制线图。syms定义了符号表达函数fx)= 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() 函数可以绘制fx, 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()可以绘制fx, 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 常用矩阵运算

续表

续表

续表

续表

续表