- MATLAB金融風險管理師FRM(高階實戰)
- 姜偉生 涂升 李蓉
- 1067字
- 2021-03-26 23:39:50
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 常用矩陣運算

續表

續表

續表

續表

續表
