MATLAB及Mathematica绘图详解

一.
(1)函数可表示成z = f(x, y)
例1
clf,x=-4:4;y=x;[X,Y]=meshgrid(x,y); % 生成 x-y 坐标“格点”矩阵
Z=X.^2+Y.^2; % 计算格点上的函数值
surf(X,Y,Z);hold on,colormap(hot)
stem3(X,Y,Z,'bo') % 用来表现在格点上计算函数值
例2
[x, y]=meshgrid(-4:.2:4);
R=sqrt(x.^2+y.^2);
z=-cos(R);
mesh(x,y,z)
xlabel('x\in[-4,4]','fontweight','bold');
ylabel('y\in[-4,4]','fontweight','bold');
zlabel('z=-cos(sqrt(x^2+y^2))','fontweight','bold');
title('旋转曲面','fontsize',15,'fontweight','bold','fontname','隶书');
(2)函数不可表示成z = f(x, y)
在函数不能表示成z = f(x, y)时,需要用surf函数。比如x2+y2+z2=1.
先需要用柱面坐标或者球坐标来表示。这里用柱面坐标表示为 r2+z2=1
X=sqrt(1–Z.^2).*cos(theta);
X = sqrt(1 - Z.^2).*cos(theta);
Y = sqrt(1 - Z.^2).*sin(theta);
surf(X,Y,Z); axis square
(3)如何利用“非数” NaN ,对图形进行剪切处理。
clf;
t=linspace(0,2*pi,100); r=1-exp(-t/2).*cos(4*t); % 旋转母线
[X,Y,Z]=cylinder(r,60); % 产生旋转柱面数据
ii=find(X<0&Y<0); % 确定 x-y 平面第四象限上的数据下标
Z(ii)=NaN; % 剪切
surf(X,Y,Z);colormap(spring),shading interp
light('position',[-3,-1,3],'style','local') % 设置光源
material([0.5,0.4,0.3,10,0.3]) % 设置材质属性,懂OpenGL的应该知道“光源”和“材质”是配合使用的
(4) 裁切的表现
clf,x=[-8:0.2:8];y=x;[X,Y]=meshgrid(x,y);ZZ=X.^2-Y.^2;
ii=find(abs(X)>6|abs(Y)>6); % 确定超出 [-6,6] 范围的格点下标
ZZ(ii)=zeros(size(ii)); % 强制为 0
surf(X,Y,ZZ), shading interp; colormap(copper)
light('position',[0,-15,1]);lighting phong
material([0.8,0.8,0.5,10,0.5])
(5) (X,Y,Z)中自变量X,Y的顺序对三维绘制结果的影响
例1
[X,Y] = meshgrid(-8:.5:8);
Z = X;
mesh(X,Y,Z);可以发现Y方向无限延伸。固定一个Y值,XOZ平面上恰好是Z=X,Z随着X值的增大而增大。可以这样理解:mesh(X,Y,Z)是右手系X,Y,Z的图形绘制,
mesh(Y,X,Z)是左手系图形的绘制:下面是mesh(Y,X,Z)的结果。可以发现X方向无限延伸,Z值随着Y方向的增大而增大,
x=linspace(-2, 2, 25); % 在x轴上取25点
y=linspace(-2, 2, 25); % 在y轴上取25点
[xx,yy]=meshgrid(x, y); % xx和yy都是25x25的矩阵
zz=xx.*exp(-xx.^2-yy.^2); % 计算函数值,zz也是25x25的矩阵
surf(xx, yy, zz); % 画出立体曲面图
colorbar; %如下图,右边那个色卡
xx是平行于x轴的“行扫描线”,xx的每一行与x相同;yy是平行于y轴的“列扫描线”,yy的每一列与y相同。
下图是 surf( yy,xx, zz);的结果,可以看出左手系下将x轴y轴的位置互换,结果与zz=xx.*exp(-xx.^2-yy.^2)一致。在右手系下,该结果说明zz是关于xx的偶函数,关于yy的奇函数,与zz=yy.*exp(-yy.^2-xx.^2);surf(xx, yy, zz);结果相同。
(6)Mathematica三维绘图与Matlab三维绘图对比(三维曲面)
1》Mathematica 绘制 f(x, y) = sin(x * y)
Options[Plot3D]可以查看Plot3D函数可以带的各个选项。
Plot3D[Sin[x * y], {x, -3, 3}, {y, -3, 3}, AxesLabel -> {x, y, z}]
注意Mathematica中缺省的ViewPoint是直角坐标系下的点{1.3,-2.4,2}
数上述Mathematica图形中x轴和y轴上分别有17条线,所以在Matlab中x轴和y轴也设置为17个点就行。
x=linspace(-3,3,17);
[X, Y] = meshgrid(x);
Z=sin(X.*Y);
surf(X,Y,Z) %
MATLAB中缺省的ViewAngel 是球坐标下的点:
xlabel('x'),ylabel('y'),zlabel('z')
shading interp
view(42,48)