自定义二维隐函数绘图
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