加载中…
个人资料
MATLAB技术论坛
MATLAB技术论坛
  • 博客等级:
  • 博客积分:0
  • 博客访问:590,608
  • 关注人气:489
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【原创】Matlab中如何实现二维和三维隐函数绘图

(2009-08-20 21:40:40)
标签:

杂谈

分类: MATLAB

本帖由Matlab技术论坛原创,原帖参见 http://www.matlabsky.com/thread-361-1-19.html

 

Matlab中提供了好几个简易绘图函数,一般都是以ez开头的函数

但是很惋惜的是Matlab近千个函数中却没有提供绘制三维函数的隐函数的函数,真是很大的失败

像Maple、Mathematica中就有类似implicitplot3()的三维隐函数绘图函数

那你是如何绘制隐函数图像的呢?特别是三维隐函数!

自己动手丰衣足食!

下面就讨论下,如何自己实现二维、三维的隐函数绘图问题!

希望大家积极讨论,共同分享下自己的经验
 
 

自定义二维隐函数绘图

Matlab中提供的ez开头的函数,基本都支持二维隐函数绘图

如果细心的网友,肯定注意到了,其实所谓的隐函数绘图,其实器本质是使用了一个contour()函数

下面是我们自己使用contour函数改造的二维隐函数绘图函数
 
function implot(fun,rangexy,ngrid)
%二维隐函数绘图
%
%输入参数说明
           -fun 函数句柄,可以是匿名、inline和M函数
               -rangexy=[xmin xmax ymin ymax] 绘图范围,默认[-2*pi 2*pi]
               -ngrid 绘图时计算的点数,初值是20,然后逐步加细,默认50
%
% Example
% 绘制y^3+exp(y)-tanh(x)=0的图形
%>> f=inline('y^3+exp(y)-tanh(x)','x','y')
% >>implot(f,[-3 3 -2 1])
%
%原理说明:
%其实该函数就是调用了contour()函数,绘制隐函数在xoy平面上的等高线,就得到了二维隐函数的图像
%
%by dynamic
%all rights reserved by www.matlabsky.cn
%

if nargin == 1  ;% 使用默认的rangxy和ngrid
        rangexy=[-2*pi,2*pi,-2*pi,2*pi];
   ngrid=50;
end

if nargin == 2;  % 使用默认ngrid
   ngrid=50;
end
%生成2D网格
xm=linspace(rangexy(1),rangexy(2),ngrid);
ym=linspace(rangexy(3),rangexy(4),ngrid);
[x,y]=meshgrid(xm,ym);
fvector=vectorize(fun);% 将目标函数矢量化
fvalues=f(fvector,x,y); %计算函数值
%fvalues=fvector(x,y); % can also calculate directly from the vectorized inline function
contour(x,y,fvalues,[0,0],'b-');% 绘制z=0的等高线,即隐函数的图形
xlabel('x');ylabel('y');
grid
 

自定义三维隐函数绘制函数

全世界人都知道Matlab那几千个库函数中,可恨的是,却偏偏不提供个三维隐函数的图像绘制的函数,真是郁闷死了

好,下面我们看一个三维隐函数绘制的应用,它灵活的应用了Matlab的isosurface()(等值面函数),绘制出来的图效果还比较好
 
function implot3(fun,rangxyz,ngrid,varargin)
%三维隐函数绘图
%
%输入参数说明
           -fun 函数句柄,可以是匿名、inline和M函数
               -rangexy=[xmin xmax ymin ymax,zmin,zmax] 绘图范围
               -ngrid 绘图时计算的点数
%
%Example
%fun=@(x,y,z)(x+y+z).*(x.*y+x.*z+y.*z)-10*x.*y.*z;
%rangxyz=[1 10 1 10 1 10];ngrid=50;
%implot3(fun,rangxyz,ngrid)
%
%rewrite by dynamic
%all rights reserved by www.matlabsky.cn

x=linspace(rangexy(1),rangexy(2),ngrid);
y=linspace(rangexy(3),rangexy(4),ngrid);
z=linspace(rangexy(5),rangexy(6),ngrid);
[xx,yy,zz]=meshgrid(x,y,z);
fvector=vectorize(fun);% 将目标函数矢量化
f=f(fvector,xx,yy,zz,varargin{:});
p=patch(isosurface(xx,yy,zz,f,0),varargin{:});
set(p, 'FaceColor', 'red', 'EdgeColor', 'none');
daspect([1 1 1])
view(3)
camlight;
lighting phong

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有