我们都知道Mathematica很棒,但它也经常缺乏关键功能.您在Mathematica中使用哪种外部包/工具/资源?
我将编辑(并邀请任何其他人也这样做)这个主要帖子包括专注于科学研究的一般适用性的资源,并且尽可能多的人会觉得有用.随意贡献任何东西,甚至是小代码片段(正如我在下面做的时间例程).
此外,在Mathematica 7及其他您发现自己,或从一些纸张/网站挖出的无证和有用的功能是非常受欢迎的.
请提供简短描述或评论为什么有什么好东西或它提供的实用程序.如果您使用会员链接链接到亚马逊上的书籍,请提及它,例如,在链接后面加上您的姓名.
包:
LevelScheme是一个大大扩展Mathematica生产美观图的能力的软件包.我使用它,如果没有其他任何东西,那么对框架/轴刻度的大大改进控制.它的最新版本称为SciDraw,它将在今年的某个时候发布.Presentation Package(50美元 - 免费更新)grassmannOps软件包提供了使用Grassmann变量和具有非平凡换向关系的算子进行代数和微积分的资源.GrassmannAlgebra与格拉斯曼(Grassmann)和克利福德代数(Clifford algebras)合作的包和书.工具:
MASH是Daniel Reeves出色的Perl脚本,主要为Mathematica v7提供脚本支持.(现在-script可以选择使用Mathematica 8制作.)alternate Mathematica shell与GNU的readline输入(使用python,*nix中只)资源:
MathSource对于各种应用程序,Wolfram自己的存储库有很多有用的缩小笔记本.另请参阅其他部分,例如
Current Documentation, Courseware 讲座, Demos为了演示.在数学维基教科书.
图书:
我在Mathematica中实现了一个四叉树.我不熟悉像Mathematica这样的函数式编程语言,我想知道我是否可以通过更好地使用模式来改进它或使其更紧凑.
(我知道我可以通过修剪未使用的节点来优化树,并且可能有更好的数据结构,如用于空间分解的kd树.)
此外,每次添加新点时,我仍然不满意复制整个树/表达式的想法.但我的理解是,对整个表达式进行操作而不修改部分是函数式编程方式.我对这方面的任何澄清表示感谢.
MV
代码
ClearAll[qtMakeNode, qtInsert, insideBox, qtDraw, splitBox, isLeaf, qtbb, qtpt];
(* create a quadtree node *)
qtMakeNode[{{xmin_,ymin_}, {xmax_, ymax_}}] :=
{{}, {}, {}, {}, qtbb[{xmin, ymin}, {xmax, ymax}], {}}
(* is pt inside box? *)
insideBox[pt_, bb_] := If[(pt[[1]] <= bb[[2, 1]]) && (pt[[1]] >= bb[[1, 1]]) &&
(pt[[2]] <= bb[[2, 2]]) && (pt[[2]] >= bb[[1, 2]]),
True, False]
(* split bounding box into 4 children *)
splitBox[{{xmin_,ymin_}, {xmax_, ymax_}}] := {
{{xmin, (ymin+ymax)/2}, {(xmin+xmax)/2, …Run Code Online (Sandbox Code Playgroud) SaveDefinitions是一个不错的选择Manipulate.它导致Manipulate在Manipulate面板中存储用于创建的任何定义.以这种方式制作的Manipulate可以复制到空白笔记本中,并且仍然可以单独使用.此外,包含许多此类操作的工作笔记本也不会变成粉红色的盒子,打开时会在其下方打印错误消息.大!
然而,所有这些善良都有它的黑暗面,如果你不知道它,它会让你真的很难受.我已经在我已经工作了几天的笔记本中使用了这个,但是我向您展示了一个重新创建问题的分步玩具示例场景.
在这种情况下,你想创建一个Manipulate漂亮的波浪函数的图,所以你定义这个(请创建一个像这样的窗口大小,这很重要):

定义很好,所以我们下次保留它并使其成为初始化单元.接下来我们添加Manipulate,并执行它.
f[x_] := x^2
Manipulate[
Plot[n f[x], {x, -3, 3}],
{n, 1, 4},
SaveDefinitions -> True
]
Run Code Online (Sandbox Code Playgroud)
一切都很棒,Manipulate真的很闪耀,这是美好的一天.

只是做你的偏执自我,检查定义是否正常:

是的,一切仍然检查出来.精细.但现在你想到一个更好的波浪函数是正弦,所以你改变定义,执行和偏执,检查:

一切都还好.你已经准备好从一天的努力中挽救你的工作并退出.[退出内核]
明天.你重新开始工作了.您评估笔记本中的初始化单元格.定义还好吗?校验.

现在,您向下滚动到Manipulate框(不需要重新执行SaveDefinitions),使用滑块稍微玩一下.并向上滚动.

作为你的偏执狂,你再次检查f的定义:

瞧,有人改变了你背后的定义!Information根据In []数字(In[1]:def为f,In[2]第一个?,In[3]第二个?),在第一个和第二个(?)检查之间没有执行任何操作.
发生了什么?嗯,这Manipulate当然是.A FullForm揭示其内部结构:
Manipulate[Plot[n*f[x],{x, -3, 3}],{{n, 2.44}, 1, 4},Initialization:>{f[x_] := x^2}]
Run Code Online (Sandbox Code Playgroud)
你有罪魁祸首.框的初始化部分再次定义f,但它是旧版本,因为我们Manipulate在修改其定义后没有重新评估.一旦操纵盒出现在屏幕上,它就会被评估,并且您已经恢复了原来的定义.在全球范围内!
当然,在这个玩具示例中,很明显发生了一些奇怪的事情.在我的情况下,我在一个更大的笔记本中有一个更大的模块,在经过一些调试后,我改变了一小部分.它似乎工作,但第二天,同样的错误,在再次击中之前曾经惹过我.我花了几个小时才意识到我用来研究各方面问题的几个操作中的一个是这样做的.
显然,我很想说,这是不受欢迎的行为.现在,对于强制性问题:除了在每次更改可能由他们使用的定义时重新执行笔记本中的每个操作之外,我们还能做些什么来防止这种背后行为Manipulate发生Manipulate?
我想让mathematica对函数第一个大写字母不敏感.例如,它接受"绘图"和"绘图"作为绘图功能.