• UID162
  • 登录2018-10-14
  • 粉丝7
  • 发帖46
  • 科研点数1点
优异服役勋章
OODLL 发布于2018-07-24 09:20
1/398

【娱乐】GrafEq-几个漂亮的函数图像

楼层直达
第一次来数学版发帖.......害怕.......我想大家都是用(过)Matlab的,一定会用Matlab画函数图像的。比如,我使用Matlab和Mathematica画了这样一个函数的图像:e^(sinx+cosy)=sin(e^(x+y))。但是可惜,它们画的并不正确——csdn有人用牛顿迭代法写了一个画函数图像的软件,也可以看出这一点:

图片:matlab.png

by Matlab

图片:Wolfram_Alpha.png

by Wolfram-Alpha

图片:opencv.png


by 牛顿迭代法

所以,我推荐下面的这个软件——GrafEq,一个无限试用期的绘图软件,功能也只有一个:绘制x-y=1之类的二元隐函数的图像,体积2Mb不到,谢天谢地的是它终于更新了......上一个版本是针对Windows XP开发的。这个图是GrafEq绘制的:

图片:img1.png


by GrafEq

可以看出,GrafEq绘制的图形一定是正确的——从上面几个绘图来看,它的图像是一块块的,并且一个区块是很密集的。自然的,方程的图像不可能是大方块,除非这个范围里全有解导致点非常的密集。不过这个好像有点简单(巨难......请想一下怎么用算法实现这个绘图......这个方程在一些范围的变化率上天所以想要找出解几乎不可能),试试其它几个复杂的方程:

图片:img2.png

图片:img3.png

图片:img4.png

图片:img5.png

图片:img6.png


有没有更漂亮的?我个人认为最漂亮的当然是下面这个不等式啦:

图片:imgb.png

那么更帅的呢?我个人认为是幂指函数:

图片:img_b2.png

那么,它是怎么实现的呢?在Jeff Tupper提及自我指涉公式的论文(这是超链接,点击可以阅读到)中,提到了GrafEq的实现方法,本文中一些图像也来自于那篇论文。下面是某人的简要摘录:首先,我们把整个平面当成该表达式全部成立,然后开始细分——从一个很大的范围开始,一步步的细分。注意,计算表达式的时候不是用具体的值,用的是x,y所在的区间来计算,这说得上是核心。为了更好的看到这个过程,我自己按照那篇论文的算法一写了一套很烂的实现,下面是它绘制出x-y>1这个不等式图像的过程。在GrafEq中,你可以看到这个过程很快的闪过。但是由于作者没有透露相关源代码,无法看到具体的实现。只好硬着头皮弄一下了:

图片:img_m1.png

图片:img_m3.png



可以看见,每一步计算的区间(准确的说是x,y所在的范围)长度都变得更小,一直到一个很小的值才算完成整个图像。不过,需要注意的是,由于区间计算本身的误差积累,这个表达式计算最困难的地方,我个人认为是判断上面。当前我的这套程序还存在很多问题,比如曲线边缘不平滑(这个是大问题!会导致图像断断续续的),若是有朝一日写好,成功了,就再谈这个过程。
GrafEq官方网页: http://www.peda.com/grafeq/。当然,那个网站上还有一些有趣的软件,可以看看。
顺便提一下,因为论坛没有公式编辑器(或者...我没找到),也没发现可以插入HTML代码的位置,因此一些公式是人工输入的。下面是使用的输入字体:
变量(x,y,z什么的):Times New Roman(斜体)
函数(sin,cos...):Times New Roman
第一次在数学版发贴啊....害怕.........
[OODLL于2018-07-24 09:44编辑了帖子]
桂棹兮兰桨,击空明兮溯流光。渺渺兮予怀,望美人兮天一方。[url=http://www.arcll.cn/]我的个人网页[/url]欢迎您去看看(论坛不支持UBB???)声明:本人发帖,未注明转载的均为原创。转载务必保留来源
  • UID162
  • 登录2018-10-14
  • 粉丝7
  • 发帖46
  • 科研点数1点
优异服役勋章
OODLL 发布于2018-08-14 12:16
沙发F
续:
前面所提到的带点绘图法非常的可行,十分以及特别的可行。
当然,我需要提醒有兴趣自己做的人要注意精度问题,区间运算的不确定性是一个两面的玩意,在得到很不错的轮廓的时候,也会得到误差。并且,我在自己的软件中取消了那个迭代细分的过程——因为我发现这样和直接带点一个结果,那样细分只是可以减少计算量而已。然后就是判断结果:
比如a>b,可以得到下面的三种结果:存在、不确定、不存在。按照这三种结果,存在和不存在的不需要计算,只需要继续计算不确定区域的即可。
下面是我的程序完成的图像,虽然不够完美。一些图像并没有被100%的完成,由于计算的精度问题,在我设置的精度上依然没有完成整个图像。图中深一点的绿色表示一定确定的区域,略微浅的绿色(如果有的话)表示尚未确认的区域:

图片:96.bmp

这张没完成的部分是y轴那里,被挡住了

图片:97.bmp

这张。。很大片都没完成

图片:98.bmp

这张完成率100%

图片:99.bmp


这一张有几个像素点处于未确定状态
当然,你可以和GrafEq对比一下,可能会有差异,因为它的判断方式可能不一样。引用一句GrafEq中的话:“没有任何一个软件可以准确的画出所有的函数图像”。但是很能确定的一点是,GrafEq的原理大致就是这样的。下面是我的程序绘制的简单的几个图像:

图片:83.bmp

不知道叫什么,对勾函数两边套了个绝对值

图片:84.bmp

等轴双曲线

图片:85.bmp


在实现过程中,个人认为这个运算必须考虑“并区间”的情况,比如[0,1]∪[3,4]。在出现负指数幂的时候,这一点非常有用。说到负指数幂,你需要自己写一个,因为系统的math.h中的有个问题——无法计算负数的非整数幂,尽管它们是可以存在的。比如:(-1)^1.2之类的。

桂棹兮兰桨,击空明兮溯流光。渺渺兮予怀,望美人兮天一方。[url=http://www.arcll.cn/]我的个人网页[/url]欢迎您去看看(论坛不支持UBB???)声明:本人发帖,未注明转载的均为原创。转载务必保留来源
您需要登录后才可以回帖
发表回复

杩斿洖椤堕儴