首页 > Mathematica > 发现一个坑别人mathematica代码的方法。。

发现一个坑别人mathematica代码的方法。。

2014年12月12日 发表评论 阅读评论

好久没更,之前找工作,之后出差。。最近忙毕设论文,所以来一发短的博文刷个存在感,刷完就撤。。

题目也懒得取了,就这样了。。。

既然想写短的,就不照例扯淡了,起因是这样子的,最近老板要我和一个师弟(以前某博文中的“激萌的抠脚大汉”,现在我们亲切的叫他“高抬腿君”)去为他的某个脑洞idea搞个专利,然后我就mathematica写了个简单的demo仿真,扔给师弟去玩,我赶论文去,今晚师弟突然问我,我之前的那个画图的语句画出来的图有问题。。我看了一下:

mma1

嗯,想画两条曲线都没画出来,而且横坐标本来是0.012到0.016的,结果也不对;

首先想到的是,foo[0,t]这个表达式里面除了t,还有别的变量没有被赋值,但是查看了一下,并没有发现问题;

mma2

其中foo这个函数是这样子的:

mma3

最上面是一些参量,中间定义了几个关于r的函数,最后就是foo的定义;

不过看了一下,foo函数里面只调用了r1j和r2j两个函数,如果Σ求和没问题的话,那么问题只会出现在这两个函数上面了,测试一下:

mma4

傻眼了,为毛r2j代了几个数进去的结果不化简?首先想到的就是用大写N转一下变成数值,结果:

mma5

居然转不成功,一时没想通,看了一下r2j的定义,其实很简单,就是调用了一下r2,那我就测试一下r2咯。。

mma6

可以看出r2这个函数肯定是有问题的,正是因为根号这个形式被hold住了,没法算出一个值来,才导致上面的plot绘图失败的!!

可是r2的函数就是算一个三维空间的距离啊,为什么会出问题,把r2这个函数体复制出来,直接代值。。

mma7

这种事情简直无情,以致于一瞬间让我觉得mma有bug。。。

由于上面代码是高抬腿师弟敲的,处于不放心,我自己手敲了一边。。结果:

mma8

完全没问题啊,仔细想了一下,前面参数定义里面h的值是10,h的平方100没有被合并,所以问题要么是根号里面前两项有问题,要么最后h的平方出问题。。

然后我把正确的和不正确的notebook文件都保存下来,diff一下两个文件的区别,结果如下:

mma9

居然出问题的那个函数的h平方后面多了一个cell,cell里面的东西是个空串。。。所以才会导致化简不掉的。。用Level函数分解一下两个的结果。。。

mma10

所以最后的真相就是。。由于不知道什么神奇的操作,使得那个表达式的最后突然多了一个TextCell[""],所以根号里面的东西不是一个纯粹的数学表达式,自然绘图就失败了。。

然后我脑洞一开,想到了一个坑人的办法,比如偷偷打开别人的代码,假设函数是3+4,原本可以输出正确的答案7来的,你先在这个正确的函数里面加一个TextCell[""],运行出来的结果自然不是7,是原函数的形式,不过这个TextCell[""]的效果看不到了,然后你把答案复制到原本的表达式中,那么这就出现了一个极其难发现的“坑”了。。【估计就我会这么无聊。。。

1

最后我问高抬腿师弟究竟是怎么误操作搞出这么个奇葩的。。。他想不起来。。

哟西!!刷完存在感,撤!!

等我回头有空了,吐槽一下之前找工作的破事儿~


【完】

本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com

分类: Mathematica 标签:
  1. yujie zhou
    2014年12月12日07:42 | #1

    当看到FCLC外星女头像的博主在zju玩mma的瞬间,我顿时觉得交集足以给我果断搭讪找一个理由了。可惜笨,那page source上找不到你mail…

  2. Flycici
    2014年12月12日09:02 | #3

    这个 bug 其实很容易出现,只要没有处理好用快捷键输入的二维表达式(诸如分数、上下标之类的那种)。查 bug 的时候也只要把它改成 InputForm 就能看出来了

    • 2014年12月12日13:10 | #4

      没处理好是指什么?我之前也觉得应该跟这个有关,但是没试出搞出这个东西的方法。。

      • Flycici
        2015年1月28日17:20 | #5

        今天重现了一次,按 ctrl 再按左右括号试试?貌似是这样引进来的 ……

    • floral
      2014年12月20日22:05 | #7

      不错。也可以在第54~58的任一输出使用FullForm查看。这种神奇的错误一般可以归结为“手抖”,例如前面按多个Ctrl,Alt,空字符串之类的非可见字符。

      • 2014年12月21日15:35 | #8

        嗯,InputForm ,FullForm,TextCell平时用的极少,所以一时没想到要这么弄。。所以有没有可以重现这个问题的确切方法?TextCell没有快捷键可以按出来。。也没试出构造这个TextCell的方法。。。

  3. 2014年12月13日11:42 | #9

    不明但觉厉。厉

  4. 2014年12月13日23:32 | #10

    好赞,我也去坑一下我师弟~~

  5. 2014年12月15日20:43 | #11

    每次看到这个长长的文章都各种好玩233

  6. 2014年12月21日08:12 | #14

    ヾ(*д*)ノ゛我等了一个月,连一千字都不给我。

    • 2014年12月21日14:51 | #15

      感觉总是找不到时间来吧长博文写了。。所以屯了一大票草稿。。果然研究生还是一二年级的时候比较闲。。。

  7. 2014年12月27日14:24 | #16

    虽说没有看懂,不过看这些公式就觉得挺高大上的了,支持支持!!买主机送平板,最后3天!!

  8. 2014年12月29日15:50 | #17

    虽然没看懂,但是觉着好厉害啊

  9. 2014年12月30日15:11 | #18

    亲,2015即将来临,开始发福利啰,独立ip主机限时抢啦

  10. 2015年1月24日17:33 | #19

    你复制粘贴后,看看后面是不是有NOASCII字符?

  11. 2015年5月4日19:03 | #20

    直接`3+4TextCell[]`就行, 不用加双引号.

  12. 2015年5月16日12:09 | #21

    东西还不错,支持一下!

  13. 2015年10月6日12:28 | #22

  14. 2015年10月6日12:28 | #23

  15. 呼嘎
    2016年1月9日17:41 | #24

    好强啊,楼主,我很好奇,整个比特之理是不是一个个人的博客。

  16. Kalabaka
    2016年9月13日23:06 | #28

    雖然已經比較久遠了,不過我猜是不是把(空)Cell直接作為一段代碼複製到另一個Cell中產生的。

验证码:4 + 2 = ?

友情提示:留言可以使用大部分html标签和属性;

添加代码示例:[code lang="cpp"]your code...[/code]

添加公式请用Latex代码,前后分别添加两个$$