第一次来数学版发帖.......害怕.......我想大家都是用(过)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 图片: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编辑了帖子]
|
|
|
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之类的。 |
|
|