自定义二维隐函数绘图 
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=feval(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 
end 
说明:1. "=="是判断两边对应元素是否相等,相等则为 1,否则为 0 
            2. inline 是用来定义内联函数的,内联函数是用户用来自定义函数的一种形式,一般
用于定义一些比较简单的数学函数。用命令 inline 定义,因此叫内联函数。   
matalb7.x 后的版本中推荐用户使用匿名函数取代内联函数,前者可以实现后者的
几乎全部功能而速度和方便性却比后者高很多。 
                比如说: 
                y=inline('sin(x)','x')          %第一个参数是表达式,第二个参数是函数变量 
                y(0)                %计算 sin(0)的值 
                y(pi)                %计算 sin(pi)的值 
                q=quad(y,0,1);      %计算 sin(x)  在 0 到 1 上的积分 
            3. vectorize 的含义就是将乘转成点乘等。例如: 
 
clear 
str='x*y'; 
f=inline(str) 
ff=inline(vectorize(str)) 
x=[1,2,3;4,5,6]; 
y=[7,8,9;10,11,12]; 
ff(x,y) %没有问题 
f(x,y) %出错 
使用 contour 指令画隐函数 
例如:画出 x^2+y^2=1 的函数图 
代码: 
x=linspace(-1,1,30); 
y=linspace(-1,1,30); 
[x1,y1]=meshgrid(x,y); 
z1=x1.^2+y1.^2; 
z1=z1-1; 
contour(x1,y1,z1,1); 
axis image; 
 
自定义三维隐函数绘制函数 
全世界人都知道 Matlab 那几千个库函数中,可恨的是,却偏偏不提供个三维隐函数的图像
绘制的函数,真是郁闷死了 
 
好,下面我们看一个三维隐函数绘制的应用,它灵活的应用了 Matlab 的 isosurface()(等值面
函数),绘制出来的图效果还比较好 function implot3(fun,rangexyz,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;   
%rangexyz=[1 10 1 10 1 10];ngrid=50; 
%implot3(fun,rangexyz,ngrid) 
% 
%rewrite by dynamic 
%all rights reserved by www.matlabsky.cn   
 
x=linspace(rangexyz(1),rangexyz(2),ngrid); 
y=linspace(rangexyz(3),rangexyz(4),ngrid); 
z=linspace(rangexyz(5),rangexyz(6),ngrid); 
[xx,yy,zz]=meshgrid(x,y,z);   
%fvector=vectorize(fun);%  将目标函数矢量化 
f=feval(fun,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 
end 
 
 
 
 
 
contour 命令显示矩阵 Z 的等高线,clabel 命令可以标注等高线。contour(Z)
画出矩阵 Z 的等高线图,这里 Z 是相对于 x-y 平面的高度,至少是一个 2×2 矩
阵。等高线的层数和层值自动选择;contour(Z,n):画出矩阵 Z 的 n 层等高线图;
contour(Z,v):在向量 v 指定的数值处画出 Z 的等高线图,层数等于 length(v);
contour(X,Y,Z),contour(X,Y,Z,n),contour(X,Y,Z,v):和上面类似,X 和 Y
确 定 x 轴 和 y 轴 的 范 围 , 如 果 是 矩 阵 , 则 必 须 和 Z 有 相 同 的 阶 数 ;
contour( … ,LineSpec) : 等 高 线 使 用 的 线 型 和 颜 色 指 定 。 举 例 :
[x,y]=meshgrid(-2:0.2:2);z=exp(-x.^2-y.^2);C=contour(x,y,z,6);clabel(
C); 
 
 
 
 
 
感谢楼上朋友回答,由于我的隐函数表达式比较复杂,中间有调用到其他函数来
生成的, 
也就是说隐函数表达式没有办法直接的写出自变量 
 
例如,A=[sinxcosy, e^siny], B=[siny,1+e^(x/y)] 
C=sqrt(A*B')-1 
C(x,y)=0 为隐函数 
 
 
如果用 2 楼的办法, 
eq=‘sqrt(A*B')-1’或者 eq=‘C’ 
然后 solve 得到的还是 sqrt(A*B')-1 或者 C 
我也尝试用 sym 命令,既 ep=sym(sqrt(A*B')-1),然后求解得到的是数值表达
式,而不是最终的数值 
 
如果用 4 楼的办法, 
A,B 的矩阵表达式该怎么写呢? 
另外 4 楼的朋友能不能说下 fzero 的用法,后面那个 1 表示什么意思啊 
 
A  = @(x,y) [sin(x)*cos(y), exp(sin(y))];B = @(x,y) [sin(y),1+exp(x/y)]; 
C = @(x) @(y) sqrt(A(x,y)*B(x,y)')-1; 
Y = @(x) fzero(C(x),1) 
Y =  
    @(x)fzero(C(x),1) 
>> Y(1) 
ans = 
-8.4211e-018 
>> Y(2) 
ans = 
-6.4283e-016 
>> Y(3) 
ans = 
-7.2065e-016 还有一种就是先用符号计算把 C 的符号表达式算出来,然后再生
成匿名函数:复制内容到剪贴板代码: 
syms x y 
A  = [sin(x)*cos(y), exp(sin(y))];B =  [sin(y),1+exp(x/y)]; 
C = sqrt(A*B')-1; 
eval(['fun = @(x) @(y)' ,char(C)]); 
Y = @(x) fzero(fun(x),1) 
fun =  
    
@(x)@(y)(exp(sin(y))*(exp(conj(x)/conj(y))+1)+sin(conj(y))*cos(y)*sin
(x))^(1/2)-1 
Y =  
    @(x)fzero(fun(x),1) 
>> Y(1) 
ans = 
-8.4211e-018 
>> Y(2) 
ans = 
-6.4283e-016 
>> Y(3) 
ans = 
-7.2065e-016