声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2068|回复: 4

[绘图技巧] 求助:如何画三个变量的隐函数图形?

[复制链接]
发表于 2006-6-13 07:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
<v:shapetype><FONT size=7> </FONT><SUP><FONT size=7>-Z^2+3X^2+Y^2-8XY=6的图形应该怎么画呢?<br><br>多谢了!</FONT></SUP></v:shapetype>
[此贴子已经被ericlin于2006-6-13 13:08:16编辑过]

回复
分享到:

使用道具 举报

发表于 2006-6-13 13:13 | 显示全部楼层
X=1:100;Y=1:100;<BR>Z=-sqrt(6-3*X.^2-Y.^2+8.*X.*Y)<BR>plot3(X,Y,Z)<BR><BR>我也是外行,不知道这样行不?
发表于 2006-6-13 14:56 | 显示全部楼层
<P>% 画三维隐式曲面f(x,y,z)=0,fun为函数表达式,s为变量名称列表(默认为x,y,z),range_xyz为x,y,z范围,ngrid为网格剖分数<BR>function test=implot3(fun,range_xyz,ngrid,s)<BR>if nargin==0   %无参数时,默认在区域[-1,1, -1,1,-1,1]画单位园,网格剖分为20<BR>    fun=inline('x^2+y^2+z^2-1','x','y','z');<BR>    s=[sym('x'),sym('y'),sym('z')];<BR>    range_xyz=[-1,1,-1,1,-1,1];<BR>    ngrid=20;<BR>end<BR>if nargin==1   <BR>    s=[sym('x'),sym('y'),sym('z')];<BR>    range_xyz=[-1,1,-1,1,-1,1];<BR>    ngrid=20;<BR>end<BR>if nargin==2<BR>    s=[sym('x'),sym('y'),sym('z')];<BR>    ngrid=20;<BR>end<BR>if nargin==3<BR>    s=[sym('x'),sym('y'),sym('z')];<BR>end<BR>xm=linspace(range_xyz(1),range_xyz(2),ngrid);<BR>ym=linspace(range_xyz(3),range_xyz(4),ngrid);<BR>zm=linspace(range_xyz(5),range_xyz(6),ngrid);<BR>[xx,yy,zz]=meshgrid(xm,ym,zm);<BR>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<BR>%%%%%%%%%%%%%%%%                inline形式的可通过sym(char(fun))化为sym形式的,实际上以下这段代<BR>%%%%%%%%%%%%%%%%                码可以省去,<BR>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<BR>if isa(fun,'inline')%%%判断fun是否inline型,是的话返回1,否则返回0<BR>    c=findsym(sym(char(fun)));<BR>    for k=1:3:length(c);<BR>        w1(1+(k-1)/3)=sym(c(k));<BR>    end<BR>    f=vectorize(fun);%vectorize函数举例:fun=inline('x^2+y^2+z^2-1','x','y','z'),则f=x.^2+y.^2+z.^2-1,即在^前加了个“.”号<BR>    if length(w1)==3    %%如果变量个数为3时执行的命令<BR>        fvalues=feval(f,xx,yy,zz);<BR>    elseif length(w1)==2    %%如果变量个数为2时执行的命令<BR>        if char(w1(1))==char(s(1))&amp;char(w1(2))==char(s(2))<BR>            fvalues=feval(f,xx,yy);<BR>        end<BR>        if char(w1(1))==char(s(1))&amp;char(w1(2))==char(s(3))<BR>            fvalues=feval(f,xx,zz);<BR>        end    <BR>        if char(w1(1))==char(s(2))&amp;char(w1(2))==char(s(3))<BR>            fvalues=feval(f,yy,zz);<BR>        end   <BR>    elseif length(w)==1    %%如果变量个数为1时执行的命令<BR>        if char(w1(1))==char(s(1))<BR>            fvalues=feval(f,xx);<BR>        end<BR>        if char(w1(1))==char(s(2))<BR>            fvalues=feval(f,yy);<BR>        end<BR>        if char(w1(1))==char(s(3))<BR>            fvalues=feval(f,zz);<BR>        end<BR>    else<BR>        test=length(w);<BR>        return;%error('error');<BR>    end<BR>end<BR>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<BR>if isa(fun,'sym')%%%判断fun是否sym型,是的话返回1,否则返回0<BR>    r=findsym(fun); %%%%找到sym型的fun中变量的个数,返回的r为char类型,所以之后的一个for循环将char转化为sym<BR>    for k=1:3:length(r)<BR>        w(1+(k-1)/3)=sym(r(k));%因为如果有三个变量,则r=[x, y, z],即有7个元素:r(1)=x,r(2)=逗号,r(3)=空格,........<BR>    end<BR>    if length(w)==3    %%如果变量个数为3时执行的命令<BR>        fvalues=subs(fun,w,{xx,yy,zz});<BR>    elseif length(w)==2    %%如果变量个数为2时执行的命令<BR>        if char(w(1))==char(s(1))&amp;char(w(2))==char(s(2))<BR>            fvalues=subs(fun,w,{xx,yy});<BR>        end<BR>        if char(w(1))==char(s(1))&amp;char(w(2))==char(s(3))<BR>            fvalues=subs(fun,w,{xx,zz});<BR>        end    <BR>        if char(w(1))==char(s(2))&amp;char(w(2))==char(s(3))<BR>            fvalues=subs(fun,w,{yy,zz});<BR>        end   <BR>    elseif length(w)==1    %%如果变量个数为1时执行的命令<BR>        if char(w(1))==char(s(1))<BR>            fvalues=subs(fun,w,{xx});<BR>        end<BR>        if char(w(1))==char(s(2))<BR>            fvalues=subs(fun,w,{yy});<BR>        end<BR>        if char(w(1))==char(s(3))<BR>            fvalues=subs(fun,w,{zz});<BR>        end<BR>    else<BR>        test=length(w);<BR>        return;%error('error');<BR>    end<BR>end<BR>isosurface(xx,yy,zz,fvalues,0); %p=isosurface(x,y,z,fvalues,0); %set(p, 'FaceColor', 'interp', 'EdgeColor', 'red');<BR>xlabel('x');<BR>ylabel('y');<BR>zlabel('z');<BR>grid;<BR><BR>写的有点罗唆了,不过可以用<BR>&gt;&gt;fun=inline('-z^2+3*x^2+y^2-8*x*y-6')<BR><BR>fun =</P>
<P>     Inline function:<BR>     fun(x,y,z) = -z^2+3*x^2+y^2-8*x*y-6<BR>&gt;&gt;implot3(fun,[-2*pi,2*pi,-2*pi,2*pi,-2*pi,2*pi])<BR></P>
发表于 2006-6-13 14:57 | 显示全部楼层
在6.5中运行的<BR>7.0我没用过,好像有命令直接可以画<BR>你问问别人
发表于 2006-6-13 16:08 | 显示全部楼层

回复:(yqchenlolo)在6.5中运行的7.0我没用过,好像...

<DIV class=quote><B>以下是引用<I>yqchenlolo</I>在2006-6-13 14:57:33的发言:</B><BR>在6.5中运行的<BR>7.0我没用过,好像有命令直接可以画<BR>你问问别人</DIV>
<br>matlab7也只能用ezplot画2维的,三维的隐函数没有对应的命令可以用
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-14 08:06 , Processed in 0.064738 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表