QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5683|回复: 7
打印 上一主题 下一主题

【原创】Matlab中二维和三维隐函数绘图实现方法

[复制链接]
字体大小: 正常 放大

2620

主题

162

听众

1万

积分

升级  0%

  • TA的每日心情
    开心
    2015-3-12 15:35
  • 签到天数: 207 天

    [LV.7]常住居民III

    社区QQ达人 发帖功臣 新人进步奖 优秀斑竹奖 金点子奖 原创写作奖 最具活力勋章 助人为乐奖 风雨历程奖

    群组第六届国赛赛前冲刺培

    群组国赛讨论

    群组2014美赛讨论

    群组2014研究生数学建模竞

    群组数学中国试看培训视频

    跳转到指定楼层
    1#
    发表于 2014-8-11 17:15 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    【原创】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()(等值面函数),绘制出来的图效果还比较好

    这里还有一个函数,大家可以试试
    游客,如果您要查看本帖隐藏内容请回复


    • 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  LaterComer of MATLAB技术论坛
    • % Modifid at 2010-10-15 8:31:45
    • %
    • 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

    [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


    zan
    转播转播0 分享淘帖0 分享分享1 收藏收藏0 支持支持1 反对反对0 微信微信

    0

    主题

    11

    听众

    211

    积分

    升级  55.5%

  • TA的每日心情
    奋斗
    2014-12-11 19:31
  • 签到天数: 74 天

    [LV.6]常住居民II

    自我介绍
    数模加油

    社区QQ达人

    群组数模专题强化培训

    回复

    使用道具 举报

    0

    主题

    13

    听众

    403

    积分

    升级  34.33%

  • TA的每日心情
    难过
    2015-2-25 13:36
  • 签到天数: 140 天

    [LV.7]常住居民III

    自我介绍
    将数模进行到底,为自己加油!

    社区QQ达人

    群组高等数学串讲

    群组建模思维养成培训

    群组数模专题强化培训

    群组国赛讨论

    回复

    使用道具 举报

    凉梦丶        

    0

    主题

    13

    听众

    145

    积分

    升级  22.5%

  • TA的每日心情
    无聊
    2015-12-10 17:06
  • 签到天数: 47 天

    [LV.5]常住居民I

    自我介绍
    那些陪伴你走过的欢笑与泪水,终将在剩余的青春里,渐行渐远、

    社区QQ达人

    群组国赛讨论

    回复

    使用道具 举报

    0

    主题

    16

    听众

    666

    积分

    升级  16.5%

  • TA的每日心情
    无聊
    2018-8-4 15:30
  • 签到天数: 77 天

    [LV.6]常住居民II

    自我介绍
    爱数学

    群组数模专题强化培训

    群组2014年地区赛数学建模

    群组国赛讨论

    群组第二届数模基础实训

    回复

    使用道具 举报

    1

    主题

    11

    听众

    586

    积分

    升级  95.33%

  • TA的每日心情
    开心
    2014-9-26 14:03
  • 签到天数: 58 天

    [LV.5]常住居民I

    群组Matlab讨论组

    回复

    使用道具 举报

    2

    主题

    11

    听众

    46

    积分

    升级  43.16%

  • TA的每日心情
    奋斗
    2014-8-21 08:19
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    自我介绍
    努力学习
    回复

    使用道具 举报

    tyyo        

    0

    主题

    1

    听众

    2

    积分

    升级  40%

    该用户从未签到

    自我介绍
    ...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-5-17 16:24 , Processed in 0.936990 second(s), 102 queries .

    回顶部