【原创】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近千个函数中却没有提供绘制三维函数的隐函数的函数,真是很大的失败
像Maple、Mathematica中就有类似implicitplot3()的三维隐函数绘图函数
那你是如何绘制隐函数图像的呢?特别是三维隐函数!
自己动手丰衣足食!
下面就讨论下,如何自己实现二维、三维的隐函数绘图问题!
希望大家积极讨论,共同分享下自己的经验
自定义二维隐函数绘图
Matlab中提供的ez开头的函数,基本都支持二维隐函数绘图
如果细心的网友,肯定注意到了,其实所谓的隐函数绘图,其实器本质是使用了一个contour()函数
下面是我们自己使用contour函数改造的二维隐函数绘图函数
如果细心的网友,肯定注意到了,其实所谓的隐函数绘图,其实器本质是使用了一个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
%二维隐函数绘图
%
%输入参数说明
%
%
%
% 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
end
if nargin == 2;
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()(等值面函数),绘制出来的图效果还比较好
好,下面我们看一个三维隐函数绘制的应用,它灵活的应用了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
%三维隐函数绘图
%
%输入参数说明
%
%
%
%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