发现一个坑别人mathematica代码的方法。。
好久没更,之前找工作,之后出差。。最近忙毕设论文,所以来一发短的博文刷个存在感,刷完就撤。。
题目也懒得取了,就这样了。。。
既然想写短的,就不照例扯淡了,起因是这样子的,最近老板要我和一个师弟(以前某博文中的“激萌的抠脚大汉”,现在我们亲切的叫他“高抬腿君”)去为他的某个脑洞idea搞个专利,然后我就mathematica写了个简单的demo仿真,扔给师弟去玩,我赶论文去,今晚师弟突然问我,我之前的那个画图的语句画出来的图有问题。。我看了一下:
嗯,想画两条曲线都没画出来,而且横坐标本来是0.012到0.016的,结果也不对;
首先想到的是,foo[0,t]这个表达式里面除了t,还有别的变量没有被赋值,但是查看了一下,并没有发现问题;
其中foo这个函数是这样子的:
最上面是一些参量,中间定义了几个关于r的函数,最后就是foo的定义;
不过看了一下,foo函数里面只调用了r1j和r2j两个函数,如果Σ求和没问题的话,那么问题只会出现在这两个函数上面了,测试一下:
傻眼了,为毛r2j代了几个数进去的结果不化简?首先想到的就是用大写N转一下变成数值,结果:
居然转不成功,一时没想通,看了一下r2j的定义,其实很简单,就是调用了一下r2,那我就测试一下r2咯。。
可以看出r2这个函数肯定是有问题的,正是因为根号这个形式被hold住了,没法算出一个值来,才导致上面的plot绘图失败的!!
可是r2的函数就是算一个三维空间的距离啊,为什么会出问题,把r2这个函数体复制出来,直接代值。。
这种事情简直无情,以致于一瞬间让我觉得mma有bug。。。
由于上面代码是高抬腿师弟敲的,处于不放心,我自己手敲了一边。。结果:
完全没问题啊,仔细想了一下,前面参数定义里面h的值是10,h的平方100没有被合并,所以问题要么是根号里面前两项有问题,要么最后h的平方出问题。。
然后我把正确的和不正确的notebook文件都保存下来,diff一下两个文件的区别,结果如下:
居然出问题的那个函数的h平方后面多了一个cell,cell里面的东西是个空串。。。所以才会导致化简不掉的。。用Level函数分解一下两个的结果。。。
所以最后的真相就是。。由于不知道什么神奇的操作,使得那个表达式的最后突然多了一个TextCell[""]
,所以根号里面的东西不是一个纯粹的数学表达式,自然绘图就失败了。。
然后我脑洞一开,想到了一个坑人的办法,比如偷偷打开别人的代码,假设函数是3+4,原本可以输出正确的答案7来的,你先在这个正确的函数里面加一个TextCell[""]
,运行出来的结果自然不是7,是原函数的形式,不过这个TextCell[""]
的效果看不到了,然后你把答案复制到原本的表达式中,那么这就出现了一个极其难发现的“坑”了。。【估计就我会这么无聊。。。
最后我问高抬腿师弟究竟是怎么误操作搞出这么个奇葩的。。。他想不起来。。
哟西!!刷完存在感,撤!!
等我回头有空了,吐槽一下之前找工作的破事儿~
【完】
本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com
当看到FCLC外星女头像的博主在zju玩mma的瞬间,我顿时觉得交集足以给我果断搭讪找一个理由了。可惜笨,那page source上找不到你mail…
直接源代码页面搜email。。。。
这个 bug 其实很容易出现,只要没有处理好用快捷键输入的二维表达式(诸如分数、上下标之类的那种)。查 bug 的时候也只要把它改成 InputForm 就能看出来了
没处理好是指什么?我之前也觉得应该跟这个有关,但是没试出搞出这个东西的方法。。
今天重现了一次,按 ctrl 再按左右括号试试?貌似是这样引进来的 ……
嗯,好像是。
不错。也可以在第54~58的任一输出使用FullForm查看。这种神奇的错误一般可以归结为“手抖”,例如前面按多个Ctrl,Alt,空字符串之类的非可见字符。
嗯,InputForm ,FullForm,TextCell平时用的极少,所以一时没想到要这么弄。。所以有没有可以重现这个问题的确切方法?TextCell没有快捷键可以按出来。。也没试出构造这个TextCell的方法。。。
不明但觉厉。厉
好赞,我也去坑一下我师弟~~
每次看到这个长长的文章都各种好玩233
长?
那就短短的好了(邪恶脸
ヾ(*д*)ノ゛我等了一个月,连一千字都不给我。
感觉总是找不到时间来吧长博文写了。。所以屯了一大票草稿。。果然研究生还是一二年级的时候比较闲。。。
虽说没有看懂,不过看这些公式就觉得挺高大上的了,支持支持!!买主机送平板,最后3天!!
虽然没看懂,但是觉着好厉害啊
亲,2015即将来临,开始发福利啰,独立ip主机限时抢啦
你复制粘贴后,看看后面是不是有NOASCII字符?
直接`3+4TextCell[]`就行, 不用加双引号.
东西还不错,支持一下!
好强啊,楼主,我很好奇,整个比特之理是不是一个个人的博客。
是我一个人开来玩的。。
被回复了,好荣幸~~~
额。。。。我又不是什么名人。。
雖然已經比較久遠了,不過我猜是不是把(空)Cell直接作為一段代碼複製到另一個Cell中產生的。