注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

徐小湛的博客

高等数学课件、函数图形动画、数学软件应用

 
 
 

日志

 
 

【引用】MATLAB绘图详解  

2011-12-17 12:02:17|  分类: Matlab |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一.  三维绘图

(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') % 用来表现在格点上计算函数值

【引用】MATLAB绘图详解 - calculus - 徐小湛的博客

 

例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','隶书');

【引用】MATLAB绘图详解 - calculus - 徐小湛的博客

 

(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的应该知道“光源”和“材质”是配合使用的

【引用】MATLAB绘图详解 - calculus - 徐小湛的博客

 

(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]) 

【引用】MATLAB绘图详解 - calculus - 徐小湛的博客

 

(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的图形绘制, plot(X(1,:),Z(1,:))可以验证。

MATLAB三维绘图技巧 - 阿英 - Mr.Right

 

mesh(Y,X,Z)是左手系图形的绘制:下面是mesh(Y,X,Z)的结果。可以发现X方向无限延伸,Z值随着Y方向的增大而增大, 结果与[X,Y] = meshgrid(-8:.5:8); Z=Y;mesh(X,Y,Z)相同。

MATLAB三维绘图技巧 - 阿英 - Mr.Right


 例2

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; %如下图,右边那个色卡

MATLAB三维绘图详解 - 阿英 - Mr.Right

xx是平行于x轴的“行扫描线”,xx的每一行与x相同;yy是平行于y轴的“列扫描线”,yy的每一列与y相同。

 注意zz=xx.*exp(-xx.^2-yy.^2)是关于xx的奇函数,关于yy的偶函数。surf(xx, yy, zz)中的zz中的行对应平行于xx方向的值,zz中的列对应平行于yy方向的值。plot (yy((1:25),15),zz(1:25,15))是绘制第15列的结果,可以看出结果是个关于15列yy((1:25),15)的偶函数。

 plot (xx(10,(1:25)),zz(10,1:25))是绘制第10行的结果,可以看出结果是关于xx(10,(1:25))的奇函数。

下图是 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);结果相同。

MATLAB三维绘图详解 - 阿英 - Mr.Right

 

(6)Mathematica三维绘图与Matlab三维绘图对比(三维曲面)

1》Mathematica 绘制 f(x, y) = sin(x * y)

Options[Plot3D]可以查看Plot3D函数可以带的各个选项。

MATLAB及Mathematica绘图详解 - 阿英 - Mr.Right
 ?*Plot*可以查看所有Plot函数
MATLAB及Mathematica绘图详解 - 阿英 - Mr.Right
 

Plot3D[Sin[x * y], {x, -3, 3}, {y, -3, 3}, AxesLabel -> {x, y, z}]

注意Mathematica中缺省的ViewPoint是直角坐标系下的点{1.3,-2.4,2}

MATLAB三维绘图详解 - 阿英 - Mr.Right

 2》Matlab 绘制 f(x, y) = sin(x * y)

数上述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 是球坐标下的点:  AZ = -37.5, EL = 30.

xlabel('x'),ylabel('y'),zlabel('z')

shading interp

view(42,48)

MATLAB三维绘图详解 - 阿英 - Mr.Right

 (7)Mathematica三维绘图与Matlab三维绘图对比(Contour)
1》mathematica
ContourPlot[Sin[x*y], {x, -3, 3}, {y, -3, 3}, AxesLabel -> Automatic]

MATLAB及Mathematica三维绘图详解 - 阿英 - Mr.Right

 2》matlab,注意默认的x,y轴的位置与mathematica中不同
x=linspace(-3,3,17);
[X, Y] = meshgrid(x);
Z=sin(X.*Y);
contourf(X,Y,Z)
axis square
xlabel('x'),ylabel('y')

MATLAB及Mathematica三维绘图详解 - 阿英 - Mr.Right

.  二维绘图
MATLAB绘图的坐标轴均在边框上,绘制坐标轴位于原点的图形很困难。Mathematica绘制坐标轴位于原点的图形却很EASY。
1》Mathematica
Plot[{Sin[x], Sin[x]/x}, {x, -10, 10}]

MATLAB及Mathematica绘图详解 - 阿英 - Mr.Right

 2》MATLAB
x= -10:.49:10; %注意不要让x经过x=0点, x= -10:.5:10是不行的,你知道为什么吗!
x_axis = zeros(size(x)); %绘制x轴y = 0的数据点
plot(x,sin(x),x,sin(x)./x)
hold on
plot(x,x_axis,'k') %x轴

MATLAB及Mathematica绘图详解 - 阿英 - Mr.Right

 
  评论这张
 
阅读(535)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016