你的Mathematica工具包里有什么?

我们都知道Mathematica很棒,但它也经常缺乏关键功能。 Mathematica使用什么样的外部包/工具/资源?

我将编辑(并邀请其他人也这样做)这篇文章,其中包括侧重于科学研究普遍适用性的资源,尽可能多的人会发现有用的资源。 随意贡献任何东西,甚至是小代码片段(正如我在下面做的定时例程)。

此外,在Mathematica 7及更高版本中,您发现自己或从某些纸张/网站挖出的无证和实用功能是非常受欢迎的。

请包括一个简短的描述或评论为什么伟大或它提供的实用程序。 如果您通过会员链接链接到亚马逊书籍,请提及它,例如,在链接后面加上您的名字。


包:

  • LevelScheme是一个可以大大扩展Mathematica制作好看图的能力的软件包。 如果不用于其他任何东西,那么我会使用它来改善对帧/轴刻度的控制。 它的最新版本被称为SciDraw,它将在今年的某个时候发布。
  • David Park的Presentation Package (50美元 - 免费更新)
  • Jeremy Michelson的grassmannOps软件包提供了用Grassmann变量和运算符进行代数和微积分的资源,这些变量和运算符具有不重要的换向关系。
  • John Brown的GrassmannAlgebra代数包以及与Grassmann和Clifford代数一起工作的书。
  • RISC(符号计算研究院)有多种可供下载的Mathematica(及其他语言)软件包。 特别是,在算法组合软件页面中,有自动定理证明的定理和用于符号求和,差分方程等的众多封装。
  • 工具:

  • MASH是Daniel Reeves出色的Perl脚本,主要为Mathematica v7提供脚本支持。 (现在使用-script选项内置于Mathematica 8中。)
  • 一个带有GNU readline输入的alternate Mathematica shell (仅使用python,* nix)
  • ColourMaths软件包允许您直观地选择表达式的一部分并对其进行处理。 http://www.dbaileyconsultancy.co.uk/colour_maths/colour_maths.html
  • 资源:

  • Wolfram自己的存储库MathSource有很多有用的功能,适用于各种应用的窄型笔记本电脑。 另请查看其他部分,如

  • Current Documentation
  • 讲座Courseware
  • Demos ,以及演示。
  • Mathematica Wikibook。

  • 图书:

  • Mathematica编程:如果您想在Mathematica中进行比For循环更多的操作,则需要阅读Leonid Shifrin( webpdf )的高级介绍。 我们很高兴让Leonid本人在这里回答问题。
  • Quantum Methods with Mathematica作者:James F. Feagin(亚马逊)
  • Stephen Wolfram的Mathematica书(亚马逊)( web
  • Schaum的大纲(亚马逊)
  • Stan Wagon中的Mathematica in Action(亚马逊) - 600页简洁的例子,并且适用于Mathematica第7版。可视化技术特别好,您可以在作者的Demonstrations Page上看到其中的一些。
  • 理查德·盖洛德Mathematica编程基础( pdf ) - 一个很好的简要介绍你需要了解的大部分Mathematica编程知识。
  • 由O'Reilly出版的Sal Mangano的Mathematica食谱2010 832页。 - 着名的O'Reilly Cookbook风格:问题 - 解决方案。 对于中间体。
  • Mathematica微分方程,第3版。 Elsevier 2004 Amsterdam by Martha L. Abell,James P. Braselton - 893 pages对于初学者,同时学习解决DE和Mathematica问题。
  • 未记录(或几乎没有记录)的功能:

  • 如何自定义Mathematica键盘快捷键。 看到this question
  • 如何检查Mathematica自己的函数使用的模式和函数。 看到this answer
  • 如何在Mathematica中实现GraphPlots的一致大小? 看到this question
  • 如何使用Mathematica制作文档和演示文稿。 看到this question

  • 我之前提到过,但我发现最有用的工具是ReapSow一个应用,它模仿/扩展了GatherBy的行为:

    SelectEquivalents[x_List,f_:Identity, g_:Identity, h_:(#2&)]:=
       Reap[Sow[g[#],{f[#]}]&/@x, _, h][[2]];
    

    这使我可以按照任何标准对列表进行分组,并在过程中进行转换。 它的工作方式是标准函数( f )标记列表中的每个项目,然后每个项目由第二个提供的函数( g )转换,并且特定的输出由第三个函数( h )控制。 函数h接受两个参数:标签和具有该标签的收集项目的列表。 这些项目保留原来的顺序,所以如果你设置h = #1&那么你会得到一个未分类的Union ,就像Reap的例子。 但是,它可以用于二次加工。

    作为它的实用程序的一个例子,我一直在与Wannier90一起工作,它将空间依赖的哈密尔顿算子输出到文件中,其中每行是矩阵中的不同元素,如下所示

    rx ry rz i j Re[Hij] Im[Hij]
    

    为了将该列表转换为一组矩阵,我收集了包含相同坐标的所有子列表,将元素信息转换为规则(即{i,j} - > Re [Hij] + I Im [Hij]),然后然后将收集的规则转换为一个SparseArray所有这些都与一行内容相符:

    SelectEquivalents[hamlst, 
          #[[;; 3]] &, 
          #[[{4, 5}]] -> (Complex @@ #[[6 ;;]]) &, 
          {#1, SparseArray[#2]} &]
    

    老实说,这是我的瑞士军刀,它使复杂的事情变得非常简单。 我的其他大多数工具都有些特定于域,所以我可能不会发布它们。 但是,大多数(如果不是全部的话)引用SelectEquivalents

    编辑 :它不完全模仿GatherBy ,因为它不能像GatherBy那样简单地对表达式的多个层次进行GatherBy 。 但是,对于我所需要的大部分内容, Map都能正常工作。

    例如 :@Yaroslav Bulatov要求提供一个独立的示例。 这里有一个来自我的研究已经大大简化了。 所以,假设我们在飞机上有一组点

    In[1] := pts = {{-1, -1, 0}, {-1, 0, 0}, {-1, 1, 0}, {0, -1, 0}, {0, 0, 0}, 
     {0, 1, 0}, {1, -1, 0}, {1, 0, 0}, {1, 1, 0}}
    

    我们希望通过一系列对称操作来减少点数。 (为了好奇,我们正在生成每个点的小组。)对于这个示例,让我们使用围绕z轴的四倍旋转轴

    In[2] := rots = RotationTransform[#, {0, 0, 1}] & /@ (Pi/2 Range[0, 3]);
    

    使用SelectEquivalents我们可以将在这些操作下产生相同图像集的点分组,即它们是等价的,使用以下

    In[3] := SelectEquivalents[ pts, Union[Through[rots[#] ] ]& ] (*<-- Note Union*)
    Out[3]:= {{{-1, -1, 0}, {-1, 1, 0}, {1, -1, 0}, {1, 1, 0}},
              {{-1, 0, 0}, {0, -1, 0}, {0, 1, 0}, {1, 0, 0}},
              {{0,0,0}}}
    

    这产生了3个包含等价点的子列表。 (注意, Union在这里是绝对重要的,因为它确保每个点产生相同的图像。原来,我使用了Sort ,但是如果一个点位于对称轴上,它在关于该轴的旋转下是不变的,给出额外的图像因此, Union消除了这些额外的图像,而且, GatherBy会产生相同的结果。)在这种情况下,点已经在我将使用的形式,但我只需要每个分组的代表点, d喜欢等同点数。 因为我不需要转换每个点,所以我在第二个位置使用Identity函数。 对于第三个功能,我们需要小心。 传递给它的第一个参数将是旋转点下的点的图像,对于点{0,0,0}是包含四个相同元素的列表,使用它将抛出计数。 但是,第二个参数仅仅是包含该标签的所有元素的列表,因此它只包含{0,0,0} 。 在代码中,

    In[4] := SelectEquivalents[pts,  
                 Union[Through[rots[#]]]&, #&, {#2[[1]], Length[#2]}& ]
    Out[4]:= {{{-1, -1, 0}, 4}, {{-1, 0, 0}, 4}, {{0, 0, 0}, 1}}
    

    请注意,最后一步可以轻松地通过

    In[5] := {#[[1]], Length[#]}& /@ Out[3]
    

    但是,使用这个和上面不太完整的例子很容易看出,使用最少的代码可以实现非常复杂的转换。



    托德盖利(沃尔夫勒姆研究)只是给我一个很好的黑客,它允许用任意代码“包装”内置函数。 我觉得我必须分享这个有用的工具。 以下是托德对我的question的回答。

    一些有趣的(?)历史:“包装”内置函数的这种破解方式是由Robby Villegas和I在1994年左右发明的,具有讽刺意味的是函数Message在我为Mathematica Journal编写的名为ErrorHelp的包中发明那时候。 自那以后,它被许多人使用过很多次。 这是一个内幕人士的诡计,但我认为可以说它已经成为将自己的代码注入到内置函数定义中的规范方式。 它很好地完成了工作。 当然,您可以将$ inMsg变量放到您希望的任何私有上下文中。

    Unprotect[Message];
    
    Message[args___] := Block[{$inMsg = True, result},
       "some code here";
       result = Message[args];
       "some code here";
       result] /; ! TrueQ[$inMsg]
    
    Protect[Message];
    
    链接地址: http://www.djcxy.com/p/6041.html

    上一篇: What is in your Mathematica tool bag?

    下一篇: Version control of Mathematica notebooks