几个令人惊叹的函数图像

    国外有人发现一个鲜为人知的古董级函数作图软件—— GrafEq 。这个软件只有 2M 大小,它的功能就只有一个:作出形如 x2 + y2 = 1 的二元等式或者不等式的图像。令人惊叹的是,这个软件的图像绘制能力异常强大, Mathematica 等大型专业数学软件完全不是它的对手。
    这个软件早就没再更新了。它的“最新版本”是 2.12 ,只支持 Windows 95 到 Windows XP 的系统,或者 PowerPC 7.12 到 MacOS 9.2 的系统,可见其年代久远。神奇的是,这个软件的官方网站依然健在,而且软件竟然也都能下载。如果你有幸还能装上这款软件,你将有机会重温一次 Windows 95 时代的软件安装画面。


    一些带有三角函数的方程,某些地方的图像变化非常剧烈,连 Mathematica 也无法准确地描绘出来:

      

    然而, GrafEq 却能很好地描绘出来:

      

    注意,方程的图像显然无法形成实心的方块,这只是因为图像太密集罢了。

    既然有机会见到各种方程图像的真容,我们当然要多尝试一些更复杂的方程。下面是另外几个例子:

      

 
      

 
      

 
      

 
    要比哪个图像最帅,还是要数 GrafEq 官方网站上提供的一个示例

      

 
    2011-10-07 Update: 今天,我碰巧看到了这个软件的来头(事实上,本页 29 楼的网友 zhangyoufu 也提到了)。这个软件的算法是 Jeff Tupper 在 2001 年的一篇论文中提出的,感兴趣的读者可以在这里看到: http://www.dgp.toronto.edu/people/mooncake/papers/SIGGRAPH2001_Tupper.pdf

    在这篇论文中, Jeff Tupper 创作了很多漂亮的函数图像,其中一个就是著名的 Tupper 自我指涉公式 。论文中还有几个精彩的图像,我也重新绘制了一遍,贴出来和大家一同分享。

 
      

 
      

 
      

84 条评论

  • Aule

    哎哟 又是沙发 甚善甚善 马了再看

  • summerdawn

    可以通过改参数让mathematica把这些图也做出来么?我刚试了,mathematica做上述所有图都完败。

  • Aule

    最后一个图让我想起了那个网格电阻啊

  • summerdawn

    已测试,vista支持

  • cgy4ever

    赞一个,一直很纳闷为什么那些专业“数学”软件的作图能力为什么比较低下,随便奇怪一点的东西都画不好……

    尝试了很多以前画不出的东西,收获不小。这里就给出其中一个吧:
    sin(x^2+y^2)=sin(x)^sin(y)+sin(y)^sin(x)
    在远距离的时候“画出来”几乎就是一格一格的“铜板”镶嵌的图案。
    在原点附近有个比较好玩的事情,逆时针转45度,正好能看到一个小丑脸形状(是不是我太能YY了?……)。
    比较不爽的是它卡在52.7%就一直不走了,也不知道最后会成什么样子。

    还有就是“画图像”这个事情(算法?)应当如何定义呢?
    有一个粗暴的想法,大概是这样的:
    对于屏幕上每一个像素,其为黑当且仅当对应的坐标正方形中“图像的总长度”不小于这个正方形的边长。
    有空的话我想自己尝试一下制作这类东西。

  • 土豆

    是不是grafeq支持次像素渲染而mathematica不支持?

  • nanoapple

    构造了一下:sin(x^sin(y)+y^cos(x))=cos(y^x+x^y),发现x和y从-30到0的图像特别美。

  • nanoapple

    继续构造:sin(x^cos(y)+y^cos(x))=cos(sin(y)^x+sin(x)^y),x和y从0到50也很牛。

  • Matrix76

    Matrix67:你懂的笑话,呵呵~~
    女孩说:我怀孕了。 男人继续低头吃饭,说:我早结扎了。
      女孩愣了一会儿:我和你开玩笑呢。
      男人抬起头看了她一眼,喝了口水说:我也是…
      (这个故事剧情太复杂,内涵太深刻了)

  • biohu

    图像相当给力!

  • Quotation

    我推测这个软件所使用的作图方法是基于像素的,对窗口区域内的每一个像素,看坐标是否满足方程,如果满足则画出黑点。这样不管方程多复杂,处理方法都是一致的、简单的。一个证据是此软件画的图都没有做反锯齿。

    而Mathematica这样的软件应该是去解方程,所以方程太复杂时就可能求出的解不完整,绘图效果就不好了。

    这种方法的主要困难是对像素坐标是否满足方程的判断,因为一个像素是一个正方形区域,所以不能直接带入方程检验,可能需要看等号两端是否差距在一定阈值内。

  • wynn

    地基楼层的这位:“图像的总长度”该如何定义?或者说,如何在算法上体现?
    12楼的这位:应该不是这么回事,屏幕上每个像素对应的事实上是一个方形区域,而代入坐标的方式只能判定一个点,那么用哪个点呢?最自然的想法是使用中心点的坐标,那么假设坐标原点恰好在某个像素点的正中间(很自然的定位系统),那么对于方程 x+y > 0,如果使用中心坐标判定,这个像素应该为白色,但是实际上,这个像素对应的这一整个区域是完全黑的,只有中心无限小的一个点是白,因此像素应该涂黑才更有道理。
    这里的图已经被缩小过了,不太好判定具体的机制可能是什么样,等我去下一个来实际运行瞧瞧。

  • wynn

    实际试画了几个图瞧了瞧,感觉计算和绘制两个过程是分离的。
    计算的过程应当是使用逐步细分的模式来计算,一开始以某个步长(例如说,1),把整个平面细分成边长为1的方格,每个方格内用中心点的结果代表整个方格。计算完一轮之后再把步长减半,进行下一轮,直到细到某个特定程度(应该是考虑了浮点计算的精度和屏幕上每个像素对应的坐标长度来决定的)。
    在每一步计算完成之后,根据对应结果去绘制图片。

  • error 404

    这个应该只是离散值和绘制算法的区别……吧

  • 依云

    @右京样一 我试过 sage 了,算了几千个点,结果和这个不一样。

  • pingz

    @依云 不是很明白, 但是按我的想法, gnuplot应该和matlibplot一样, 只能表现2D/3D的数组, 所以, 如果图出的有问题, 应该是给他们的数组有问题, 而不是他们本身有问题. 等会我试一下.

  • Yu Jianrong

    用JS尝试了一下:
    http://yujianrong.bitbucket.org/JsTool/Plot/plot.html
    虽然使用了动态细分的办法,但效果还是不够理想,不知道应该用什么办法才能做得比较好。

    尝试第一个的话要写成
    sin(pow(E,x+y)) = pow(E,sin(x)+cos(y))

    可以用以下Javascript数学库的函数/常数:
    E LN2 LN10 LOG2E LOG10E PI SQRT1_2 SQRT2 abs acos asin atan atan2 ceil cos exp floor log max min pow round sin sqrt tan

    注意 a^b 要写成 pow(a,b) 这种形式,要不然会被当作异或操作

  • pingz

    最快渲染办法可能还真的如wynn所说, 不过我不会就这么死心的…

  • alvin969

    搜索引擎也可以画出来:http://www.wolframalpha.com/input/?i=ContourPlot%5BCos%5By%5D+%2B+Sin%5Bx%5D+%3D%3D+Sin%5BE^%28x+%2B+y%29%5D%2C+{x%2C+-10%2C+10}%2C+{y%2C+-10%2C+10}%5D

  • 石头

    我擦,XP的系统居然也装不上

  • 甘薯

    为什么这个软件画不出来这个页面的图形?
    http://www.matrix67.com/blog/archives/480

  • cartman

    beyond my imagination

  • iveney

    Mac 版只有 PPC 的, 神牛是在win上跑的嗎

  • zhangyoufu

    我记得这个软件和M67曾经提到的自我指涉函数有关,貌似可以用来绘图的样子,应该是高精的。用这个软件录入公式也非常棒!个人很喜欢这个软件,很早以前就存档了。

  • zhangyoufu

    Jeff Tupper自我指涉函数:http://www.dgp.toronto.edu/people/mooncake/papers/SIGGRAPH2001_Tupper.pdf
    论文里直接提到了这个软件的说。。我是考据党。。。

  • esetlzn

    这可以理解虽然我还没试验,但我认为Mathematica作为通用系统有些性能Mathematica设计人员故意放弃折中的。

  • jjx01

    这个应该是求近似解的画法吧

  • 放艾一条生路

    确实很惊奇

  • abc

    不知道为何画不了阴阳图。。倒是简单粗暴的Graphing Calculator表现良好

  • 幻风

    64位WIN7完全不支持。
    随便翻了下,没太细看。
    The program also features successive refinement plotting, which deletes regions of the plane that do not contain solutions, revealing the regions that do contain solutions. Plotting is completed by proving which pixels contain solutions. This technique enables the graphing of implicit relations, in which no single variable can be readily isolated. Such relations cannot be graphed at all by the typical computer graphing utility or graphics calculator. Successive refinement plotting also permits the plotting of singularities.(http://www.peda.com/grafeq/description.html )

    有这么一句Plotting is completed by proving which pixels contain solutions.证实了猜测。so,差不多就这意思吧,要是其他数学软件也加上这么个算法就好了。

  • rufi

    重写了一下这软件,可以兼容64位系统:
    http://www.cnblogs.com/rufi/archive/2011/06/28/GraphPlot.html

    btw,画阴阳图需要极坐标

  • ziyo

    真正专业的理科、数学网站,厉害啊
    那些图像好有数学的味道

  • aman

    好像对三维作图的无能为力

  • softboy

    win7家庭版32位的也支持,好强大…

  • BMC

    函数 天啊 我最头疼的事

  • ASTAN

    函数让我害怕

  • trek jerseys

    函数真的是蛮有难度的

  • zhj

    那个Batman equation绘图失败。
    ((x/7)^2sqrt(abs(abs(x)-3))/(abs(x)-3)+(y/3)^2*sqrt(abs(y+3sqrt(33)/7))/(y+3sqrt(33)/7)-1)(abs(x/2)-((3sqrt(33)-7)/112)x^2-3+sqrt(1-(abs(abs(x)-2)-1)^2)-y)(9sqrt(abs((abs(x)-1)(abs(x)-75))/((1-abs(x))(abs(x)-75)))-8abs(x)-y)(3abs(x)+0.75sqrt(abs((abs(x)-0.75*(abs(x)-0.5)))/(((0.75-abs(x))*(abs(x)-0.5))))-y)*(6sqrt(10)/7+(1.5-0.5abs(x))sqrt(abs(abs(x)-1)/(abs(x)-1))-6sqrt(10)/14*sqrt(4-(abs(x)-1)^2)-y)=0

  • foolish

    32 bit win 7支持

  • booster

    M67神牛啊,我倒是有这个软件,也用,但是苦于至今没激活,您的激活码是怎么搞到的?

  • specialized cycling jersey

    哈哈 可以值得研究下。。

  • 独自

    KDEEDU-MATH中的KmPlot完全可以胜任上面的全部图

  • cervelo

    对于屏幕上每一个像素,其为黑当且仅当对应的坐标正方形中“图像的总长度”不小于这个正方形的边长。

  • Mathematica控

    ContourPlot[Sin[x^2 + y^2] == Cos[x*y], {x, -10, 10}, {y, -10, 10},
    PlotPoints -> 100]
    这样子就平滑了

  • Zaodie

    我在其官网上下到了2.13版本……更新了!!!!

  • Zaodie

    “方程的图像显然无法形成实心的方块”的说法有问题,如果有取模、取整?

  • 怎么办

    没办法copy成tex,edit菜单这个选项不知道是干什么的

  • 深邃

    敢问大神,塔珀那个公式是用什么软件画的,grafeq貌似会爆掉啊。。。

  • batman

    Mathematica中可以这样画:

    range = Range[-10, 10, 0.006];
    Compile[{},
    With[{y = range},
    Table[-UnitStep[(E^(Sin[x] + Cos[y]) – Sin[E^(x + y)])], {x,
    y}]]][] // ArrayPlot[#, DataReversed -> True] &

    ContourPlot[
    E^(Sin[x] + Cos[y]) == Sin[E^(x + y)], {x, -10, 10}, {y, -10, 10},
    MaxRecursion -> 0, PlotPoints -> 800]

  • qirenrui

    52l,你的智商啊。。。只是针对那个特定的方程。。。
    然后,本人win8装上了这个软件!!!!!!!!!!

  • error108

    莫非M67也看xamuel的blog?(点昵称)

  • 群英会娱乐城

    有喜有悲才是人生,有苦有甜才是生活。宽容是一种看不见的幸福。宽容更是一种财富,拥有宽容,是拥有一颗善良、真诚的心。宽容和忍让是人生的一种豁达,是一个人有涵养的重要表现

  • wurui1994

    用Marching Squares算法,2000*2000的网格密度下还是不够光滑,这货肯定提高了局部密度。

  • skdom

    Win10支持

  • Scris Ds

    真不错!

  • 阿畅

    不是很清楚这个软件是不是出了BUG,参数函数x=arcsin(t);y=arccos(t)的时候的图像就是无数个倾斜了45度的正方形,我本来想的是如果写成x=-arcsin(t);y=-arccos(t)的时候应该是图像向右移动半个周期,结果出来的图像出乎意料,评论没有办法发图,我也没有办法用图片来展示我的状况,自己还是学生,对于数学也是一知半解,更不用说软件,也只是会一点皮毛,但这种反直觉的状况我觉得还是要去怀疑一下,不知道博主怎么看这个是bug还是本身我的想法是有问题的

  • HareInWeed

    阴阳图只需再加上一句 r>0 即可画出

  • 亚特人

    几何画板不行啊啊。。。

  • JuYan

    这个软件看起来像细分……以白色代表完全不可能,然后你绘图的颜色表示至少存在一个解。简单的试了试那个点的细分发现不行。它应该是进行一个区间计算的,而不是单纯的带点

  • JuYan

    还是简单的试试了一下。感觉还是区间计算。我用点的迭代做到了10秒一张图,但是很多方程(目前只能画方程)比如exp(sin(x)+cos(y))-sin(exp(x+y))还是有残缺…….

  • 清爽

    win 10也支持的

  • 木易小次郎

    赞!从博客园引到此地,还是原文更赞啊~涨见识了。

  • 昵称*

    亲测win10支持

  • 我就是我

    这不叫函数,叫符合方程的点集或者轨迹

  • 用python做了个,效果挺好!

  • JuYan

    我完全相信它是区间代数了,不仅看完了那篇论文,而且成功实现了除了最后两小节里面的所有图像。我在计划把它包装成Python库。一晃三年过去,突然感觉自己老了hhhhhh

回复给 取消回复

3  ×  1  =