首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你的数学工具箱里有什么?

你的数学工具箱里有什么?
EN

Stack Overflow用户
提问于 2010-11-16 21:06:29
回答 25查看 32.4K关注 0票数 158

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

我将编辑(并邀请其他人也这么做)这个主要的帖子,包括资源,这些资源集中在科学研究的一般适用性上,而且尽可能多的人会发现这些资源是有用的。可以随意贡献任何东西,即使是小的代码片段(就像我下面为定时例程所做的那样)。

此外,数学7和更高版本中的无文档和有用的特性--你发现了自己,或者是从一些纸/站点中挖出来的--是最受欢迎的。

请包括一个简短的描述或评论,为什么某件事是伟大的,或它提供了什么效用。如果你链接到亚马逊上的书籍与会员链接,请提到它,例如,通过将你的名字放在链接后面。

包:

  1. LevelScheme是一个软件包,它极大地扩展了Mathematica生成好看的图形的能力。我使用它,如果没有其他任何东西,那么,大大改进了对框架/轴滴答的控制。它的最新版本叫做SciDraw,它将在今年的某个时候发布。
  2. 大卫·帕克的Presentation Package (50美元--更新不收费)
  3. Jeremy的grassmannOps软件包为使用具有非平凡交换关系的Grassmann变量和运算符做代数和微积分提供了资源。
  4. 约翰布朗的GrassmannAlgebra包和书籍与格拉斯曼和克利福德代数工作。
  5. 符号计算研究所有多种数学软件包(和其他语言)可供下载。特别是,定理用于自动定理证明,还有大量用于符号求和、差分方程等的包在算法组合组的软件页面上。

工具:

  1. MASH是Daniel出色的Perl脚本,本质上提供了对Mathematica v7的脚本支持。(现在内置于Mathematica 8,带有-script选项。)
  2. 带有GNU输入的alternate Mathematica shell (只使用python,*nix )
  3. ColourMaths包允许您直观地选择表达式的部分并对它们进行操作。maths.html

资源:

  1. Wolfram自己的存储库MathSource为各种应用程序提供了许多有用的、虽然很窄的笔记本。还可以查看其他部分,如
代码语言:javascript
复制
- [`Current Documentation`](http://reference.wolfram.com/), 
- [`Courseware`](http://library.wolfram.com/infocenter/Courseware/) for lectures, 
- and [`Demos`](http://library.wolfram.com/infocenter/Demos/) for, well, demos.

  1. 数学维基百科

图书:

  1. Mathematica编程: Leonid (webpdf)的高级介绍,如果您想要做的不仅仅是数学循环,就必须阅读。我们很高兴有Leonid自己在这里回答问题。
  2. JamesF.Feagin (亚马逊)的数学量子方法
  3. Stephen (亚马逊) (web)的数学书
  4. Schaum的轮廓(亚马逊)
  5. 在行动中的斯坦货车(亚马逊) - 600页的整洁的例子,并上升到数学版本7。可视化技术特别好,你可以看到其中一些在作者的Demonstrations Page
  6. 数学编程基础由理查德盖洛德(pdf) -一个很好的简要介绍,你需要了解的大部分关于数学编程。
  7. 数学烹饪由萨尔曼加诺出版,O‘’Reilly,2010年832页。-用著名的O‘’Reilly风格写成:问题解决方案。中间产物。
  8. 数学微分方程,第三版。Elsevier 2004阿姆斯特丹由MarthaL.Abell,JamesP.Braselton- 893页为初学者,学习解决DEs和数学在同一时间。

无文档(或几乎没有文档)的特性:

  1. 如何定制Mathematica键盘快捷键。见this question
  2. 如何检查Mathematica自己的函数所使用的模式和函数。请参阅this answer
  3. 如何在数学中实现GraphPlots的一致大小?见this question
  4. 如何用Mathematica制作文档和演示。见this question
EN

回答 25

Stack Overflow用户

回答已采纳

发布于 2010-11-19 14:16:38

我以前提到过,但我发现最有用的工具是ReapSow的应用程序,它模拟/扩展了GatherBy的行为

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

这允许我根据任何标准对列表进行分组,并在此过程中对它们进行转换。它的工作方式是,标准函数(f)标记列表中的每个项,然后由第二个提供的函数(g)转换每个项,并由第三个函数(h)控制特定的输出。函数h接受两个参数:一个标记和一个包含该标记的集合项列表。项目保留其原始顺序,因此如果设置h = #1&,则会得到一个未排序的Union,如示例 for Reap中所示。但是,它可以用于二次加工。

作为其实用程序的一个例子,我一直在使用Wannier90,它将空间相关的哈密顿量输出到一个文件中,其中每一行都是矩阵中的不同元素,如下所示

代码语言:javascript
复制
rx ry rz i j Re[Hij] Im[Hij]

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

代码语言:javascript
复制
SelectEquivalents[hamlst, 
      #[[;; 3]] &, 
      #[[{4, 5}]] -> (Complex @@ #[[6 ;;]]) &, 
      {#1, SparseArray[#2]} &]

老实说,这是我的瑞士军刀,它使复杂的事情非常简单。我的大多数其他工具在某种程度上是特定于领域的,所以我可能不会发布它们。然而,大多数(如果不是全部)引用SelectEquivalents

编辑:它并不完全模仿GatherBy,因为它不能像GatherBy那样简单地对表达式的多个级别进行分组。但是,Map对我所需的大部分内容都很好。

示例:@Yaroslav要求提供一个独立的示例。这是我的研究中的一个,已经被大大简化了。所以,假设我们在一个平面上有一组点

代码语言:javascript
复制
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轴的四折旋转轴。

代码语言:javascript
复制
In[2] := rots = RotationTransform[#, {0, 0, 1}] & /@ (Pi/2 Range[0, 3]);

使用SelectEquivalents,我们可以使用以下方法对在这些操作下生成相同图像集的点进行分组,即它们是等效的

代码语言:javascript
复制
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也会产生同样的结果。)在这种情况下,这些点已经以我将要使用的形式出现了,但是我只需要每个分组中的一个有代表性的点,并且我想要一个等价点的计数。由于不需要转换每个点,所以我在第二个位置使用了Identity函数。对于第三个功能,我们需要小心。传递给它的第一个参数是旋转下的点的图像,对于点{0,0,0}是一个由四个相同元素组成的列表,使用它将抛出计数。但是,第二个参数只是具有该标记的所有元素的列表,因此它将只包含{0,0,0}。在密码中,

代码语言:javascript
复制
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}}

注意,这最后一步也可以很容易地通过

代码语言:javascript
复制
In[5] := {#[[1]], Length[#]}& /@ Out[3]

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

票数 30
EN

Stack Overflow用户

发布于 2011-03-27 18:25:00

Mathematica笔记本界面的优点之一是它可以用任何语言计算表达式,而不仅仅是Mathematica。作为一个简单的示例,请考虑创建一个新的Shell输入单元类型,该类型将包含的表达式传递给操作系统外壳进行计算。

首先,定义一个将文本命令的计算委托给外部shell的函数:

代码语言:javascript
复制
shellEvaluate[cmd_, _] := Import["!"~~cmd, "Text"]

第二个论点是必要的,并被忽视,其原因将在以后变得显而易见。接下来,我们要创建一个名为Shell的新样式。

  1. 打开一个新笔记本。
  2. 选择菜单项格式/编辑样式表.
  3. 在对话框中,旁边输入一个样式名称:键入Shell
  4. 选择新样式旁边的单元格括号。
  5. 选择菜单项单元格/显示表达式
  6. 用下面给出的步骤6文本覆盖单元格表达式。
  7. 再次选择菜单项Cell/Show表达式
  8. 关闭对话框。

使用以下单元格表达式作为步骤6文本

代码语言:javascript
复制
Cell[StyleData["Shell"],
 CellFrame->{{0, 0}, {0.5, 0.5}},
 CellMargins->{{66, 4}, {0, 8}},
 Evaluatable->True,
 StripStyleOnPaste->True,
 CellEvaluationFunction->shellEvaluate,
 CellFrameLabels->{{None, "Shell"}, {None, None}},
 Hyphenation->False,
 AutoQuoteCharacters->{},
 PasteAutoQuoteCharacters->{},
 LanguageCategory->"Formula",
 ScriptLevel->1,
 MenuSortingValue->1800,
 FontFamily->"Courier"]

该表达式大部分是直接从内置程序样式复制的。关键的变化是以下几行:

代码语言:javascript
复制
 Evaluatable->True,
 CellEvaluationFunction->shellEvaluate,
 CellFrameLabels->{{None, "Shell"}, {None, None}},

Evaluatable启用单元格的SHIFT+ENTER功能。计算将调用将单元格内容和内容类型作为参数传递的CellEvaluationFunction (shellEvaluate忽略后一个参数)。CellFrameLabels只是一个让用户识别这个单元格不寻常的精确性。

有了所有这些之后,我们现在可以输入并计算一个shell表达式:

  1. 在上述步骤中创建的笔记本中,创建一个空单元格并选择单元格括号。
  2. 选择菜单项格式/样式/Shell。
  3. 在单元格中键入有效的操作系统shell命令(例如Unix上的'ls‘或Windows上的'dir’)。
  4. 按SHIFT+ENTER.

最好将这种定义的样式保留在一个位于中央的样式表中。此外,像shellEvaluate这样的评估函数最好被定义为使用DeclarePackageinit.m中的存根。这两项活动的细节超出了本答复的范围。

使用此功能,可以创建包含任何感兴趣的语法的输入表达式的记事本。评估函数可以用纯Mathematica编写,也可以将评估的任何部分或所有部分委托给外部机构。请注意,还有其他与单元格评估相关的钩子,如CellEpilogCellPrologCellDynamicExpression

一种常见的模式包括将输入表达式文本写入临时文件,以某种语言编译文件,运行程序并捕获输出,以便在输出单元格中最终显示。在实现这类完整的解决方案时,有很多细节需要解决(比如正确捕获错误消息),但我们必须意识到,这样的事情不仅是可能的,而且是切实可行的。

就个人而言,正是这样的特性使笔记本界面成为我编程世界的中心。

更新

下面的辅助函数对于创建这样的单元格很有用:

代码语言:javascript
复制
evaluatableCell[label_String, evaluationFunction_] :=
  ( CellPrint[
      TextCell[
        ""
      , "Program"
      , Evaluatable -> True
      , CellEvaluationFunction -> (evaluationFunction[#]&)
      , CellFrameLabels -> {{None, label}, {None, None}}
      , CellGroupingRules -> "InputGrouping"
      ]
    ]
  ; SelectionMove[EvaluationNotebook[], All, EvaluationCell]
  ; NotebookDelete[]
  ; SelectionMove[EvaluationNotebook[], Next, CellContents]
  )

因此,它被用于:

代码语言:javascript
复制
shellCell[] := evaluatableCell["shell", Import["!"~~#, "Text"] &]

现在,如果计算shellCell[],输入单元将被删除并替换为一个新的输入单元格,该单元格将其内容计算为一个shell命令。

票数 59
EN

Stack Overflow用户

发布于 2011-03-01 01:44:01

Todd (Wolfram )给我发了一个很好的黑客,允许用任意代码“包装”内置函数。我觉得我必须分享这个有用的工具。下面是托德在我的question上的回答。

有点有趣(?)历史:在1994年左右,Robby和我发明了一种“包装”内置函数的方式,具有讽刺意味的是,这是我为“数学杂志”写的一个名为“ErrorHelp”的软件包。自那时以来,它已被许多人多次使用。这是一种内部技巧,但我认为可以公平地说,它已经成为将您自己的代码注入到内置函数定义中的典型方法。工作做得很好。当然,您可以将$inMsg变量放入您希望的任何私有上下文中。

代码语言:javascript
复制
Unprotect[Message];

Message[args___] := Block[{$inMsg = True, result},
   "some code here";
   result = Message[args];
   "some code here";
   result] /; ! TrueQ[$inMsg]

Protect[Message];
票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4198961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档