数学建模社区-数学中国

标题: 【原创】Matlab中二维和三维隐函数绘图实现方法 [打印本页]

作者: 建不了的模。    时间: 2014-8-11 17:15
标题: 【原创】Matlab中二维和三维隐函数绘图实现方法
【原创】Matlab中二维和三维隐函数绘图实现方法
Matlab中提供了好几个简易绘图函数,一般都是以ez开头的函数

但是很惋惜的是Matlab近千个函数中却没有提供绘制三维函数的隐函数的函数,真是很大的失败

像Maple、Mathematica中就有类似implicitplot3()的三维隐函数绘图函数

那你是如何绘制隐函数图像的呢?特别是三维隐函数!

自己动手丰衣足食!

下面就讨论下,如何自己实现二维、三维的隐函数绘图问题!

希望大家积极讨论,共同分享下自己的经验

================================

请注意MATLAB2008b以后使用Mupad作为符号运算的工具,Mupad中具有直接的三维绘图函数,

=361&pid=169862
plot(plot::Implicit3d((x+y+z)*(x*y+x*z+y*z)-10*x*y*z,
x=1..10, y=1..10, z=1..10))
复制代码
由于我第一次给的程序中,有一条语句
fun=vectorize(fun);% 将目标函数矢量化,即加上点运算;
复制代码
进行矢量运算以后得到的字符串,没法进行函数运算,d=361&pid=96631的提醒,解决方法是:
直接将
fun=vectorize(fun);% 将目标函数矢量化,即加上点运算
复制代码
语句删除
或者在这条语句后面添加一条命令,即
fun=vectorize(fun);% 将目标函数矢量化,即加上点运算;
fun=str2func(fun);%将字符串转为函数句柄;
复制代码

自定义二维隐函数绘图

Matlab中提供的ez开头的函数,基本都支持二维隐函数绘图
比如人要绘制x^2+y^2=1这个圆方程的图像,可以很容易的如下实现
ezplot('x^2+y^2=1')
复制代码
至于更加复杂,可以参考这个例子http://www.matlabsky.com/thread-10495-1-1.html

如果细心的网友,肯定注意到了,其实所谓的隐函数绘图,其实其本质是使用了一个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平面上的等高线,就得到了二维隐函数的图像
%

% Modifid at 2008-10-15 8:26:15
%%

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);% 将目标函数矢量化
fun=str2func(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
复制代码

自定义三维隐函数绘制函数

全世界人都知道Matlab那几千个库函数中,可恨的是,却偏偏不提供个三维隐函数的图像绘制的函数,真是郁闷死了

好,下面我们看一个三维隐函数绘制的应用,它灵活的应用了Matlab的isosurface()(等值面函数),绘制出来的图效果还比较好

这里还有一个函数,大家可以试试


[color=rgb(51, 102, 153) !important]复制代码
二维隐函数图像的画法改进
校长的程序本人稍加了改进,可以对任意句柄函数均可以使用的算法,欢迎试试

function implot(fun,rangexy,ngrid)

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);
fvalues=fun(x,y);
contour(x,y,fvalues,[0,0],'b-');% 绘制z=0的等高线,即隐函数的图形
xlabel('x');ylabel('y');
gri



作者: _| ̄|○    时间: 2014-8-11 17:21
难道网址也隐藏了?

作者: 大木木青争    时间: 2014-8-11 17:35
大神啊赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞
作者: 凉梦丶    时间: 2014-8-12 18:20
围观 围观               
作者: 模天大楼    时间: 2014-8-12 19:25
收下了O(∩_∩)O~
作者: 奥霸马2014    时间: 2014-8-13 10:14
顶一个。。。。。。。
作者: 倾听潮声    时间: 2014-8-20 09:54
谢谢楼主的分享
作者: tyyo    时间: 2014-9-13 01:41
来看看~~~~~~~~~




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5