logo资料库

Matlab关于隐函数绘图与求根的总结.pdf

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
自定义二维隐函数绘图 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
分享到:
收藏