相关疑难解决方法(0)

您的Mathematica工具包里有什么?

我们都知道Mathematica很棒,但它也经常缺乏关键功能.您在Mathematica中使用哪种外部包/工具/资源?

我将编辑(并邀请任何其他人也这样做)这个主要帖子包括专注于科学研究的一般适用性的资源,并且尽可能多的人会觉得有用.随意贡献任何东西,甚至是小代码片段(正如我在下面做的时间例程).

此外,在Mathematica 7及其他您发现自己,或从一些纸张/网站挖出的无证和有用的功能是非常受欢迎的.

请提供简短描述或评论为什么有什么好东西或它提供的实用程序.如果您使用会员链接链接到亚马逊上的书籍,请提及它,例如,在链接后面加上您的姓名.


包:

  1. LevelScheme是一个大大扩展Mathematica生产美观图的能力的软件包.我使用它,如果没有其他任何东西,那么对框架/轴刻度的大大改进控制.它的最新版本称为SciDraw,它将在今年的某个时候发布.
  2. David Park's Presentation Package(50美元 - 免费更新)
  3. Jeremy Michelson的grassmannOps软件包提供了使用Grassmann变量和具有非平凡换向关系的算子进行代数和微积分的资源.
  4. 约翰·布朗(John Brown)GrassmannAlgebra与格拉斯曼(Grassmann)和克利福德代数(Clifford algebras)合作的包和书.
  5. RISC(符号计算研究所)提供各种Mathematica(和其他语言)包可供下载.特别是,有自动定理证明的Theorema,以及Algorithmic Combinatorics小组软件页面中用于符号求和,差分方程等的多个包.

工具:

  1. MASH是Daniel Reeves出色的Perl脚本,主要为Mathematica v7提供脚本支持.(现在-script可以选择使用Mathematica 8制作.)
  2. 一个alternate Mathematica shell与GNU的readline输入(使用python,*nix中只)
  3. ColourMaths包允许您直观地选择表达式的各个部分并对其进行操作.http://www.dbaileyconsultancy.co.uk/colour_maths/colour_maths.html

资源:

  1. MathSource对于各种应用程序,Wolfram自己的存储库有很多有用的缩小笔记本.另请参阅其他部分,例如

  2. 数学维基教科书.

图书:

  1. Mathematica编程: Leonid Shifrin(web,pdf)的高级介绍是必读的,如果你想在Mathematica中做更多的For循环.我们很高兴在Leonid这里回答问题.
  2. 使用Mathematica量子方法作者:James …

resources wolfram-mathematica

149
推荐指数
22
解决办法
3万
查看次数

Mathematica"链表"和表现

在Mathematica中,我创建了单链表,如下所示:

toLinkedList[x_List] := Fold[pair[#2, #1] &, pair[], Reverse[x]];

fromLinkedList[ll_pair] := List @@ Flatten[ll];

emptyQ[pair[]] := True;
emptyQ[_pair] := False;    
Run Code Online (Sandbox Code Playgroud)

使用paircons单元格的符号具有Flatten安全工作的优点,即使列表包含Mathematica样式List,并允许您使用MakeExpression/ 定义自定义表示法MakeBoxes,这使得一切都更加愉快.为了避免不得不捣乱$IterationLimit,我编写了使用While循环或NestWhile使用递归来处理这些列表的函数.当然,我想看看哪种方法会更快,所以我写了两个候选人,所以我可以看到他们的战斗:

nestLength[ll_pair] := 
 With[{step = {#[[1, -1]], #[[-1]] + 1} &},
  Last@NestWhile[step, {ll, 0}, ! emptyQ@First@# &]];

whileLength[ll_pair] := 
 Module[{result = 0, current = ll},
  While[! emptyQ@current,
   current = current[[2]];
   ++result];
  result];
Run Code Online (Sandbox Code Playgroud)

结果很奇怪.我测试了长度为10000的链表上的函数,whileLength通常快了大约50%,大约0.035秒到nestLength0.055秒.但是,偶尔whileLength需要约4秒钟.我认为可能存在一些缓存行为,所以我开始生成新的随机列表来检查,并且whileLength在第一次运行时使用新列表不一定会很慢; 可能需要几十次才能看到减速,但之后它不会再发生(至少不是我在每个列表中尝试的200次运行).

可能会发生什么?

作为参考,我用于测试的功能是这样的: …

wolfram-mathematica

23
推荐指数
2
解决办法
2359
查看次数

IntegerPartition的变体?

IntegerPartitions[n, {3, 10}, Prime ~Array~ 10]
Run Code Online (Sandbox Code Playgroud)

在Mathematica中,这将列出所有方法,将n作为前十个素数中三到十的总和,允许根据需要重复.

如何有效地找到等于n的总和,允许每个元素只使用一次

使用前十个素数只是一个玩具的例子.我寻求一个对任意参数有效的解决方案.在实际情况下,即使使用多项式系数,生成所有可能的和也会占用太多内存.

我忘了包括我正在使用Mathematica 7.

wolfram-mathematica

10
推荐指数
3
解决办法
826
查看次数

面向对象的数学编程

我想知道如何一般地做到这一点,最好的策略是什么等等.我已经看到了一些解决方案,其中一些看起来非常难/乏味.我工作的那个使用纯函数来实现对象函数和头像OBJECT [].在类编码方面使用起来非常困难.在定义函数和构造函数时(特别是继承部分很难),我感到头晕目眩.

因此,我的问题的编码是关于类的编码部分的优点.理想情况下,我正在寻找可以如下工作的东西.首先,我们定义一个类,例如汽车如下:

beginClass["vehicle"];
   public startTheEngine;
   private fuel;
   vehicle[args_]:=Block[{},...];
   startTheEngine[thrust_]:=Block[{}...];
endClass

beginClass["car", "vehicle"];
public TurnTheRadioOn;
private frequency;
car[args_] := Block[{...},];
TurnTheRadioOn[]:=
   Block[{},
      use private variable frequency
   ]
endClass;
Run Code Online (Sandbox Code Playgroud)

请注意,私有/公共函数的定义几乎与"普通"mathematica代码一样非常重要.这就是主要要求.

该课程将被用作

car1 = newObject["car", args];
car1.StartTheEngine[];
car1.TurnOnTheRadio[];
Run Code Online (Sandbox Code Playgroud)

我很好奇那个人要考虑什么?为了构建像上面这样的东西可能涉及Mathematica的许多方面,例如如何修复".".语法等.如果您建议现有的软件包,我将不胜感激,如果您可以原则上评论它是如何工作的.

我天真的期望是封装部分可以通过BeginPackage结构修复.所有对象都可以存储在专门为每个类设计的名称空间中.我认为对象看起来像

car1 = OBJECT["car"][fuel$1,frequency$1,....];
car2 = OBJECT["car"][fuel$2,frequency$2,....];
Run Code Online (Sandbox Code Playgroud)

我认为必须构建类似编译器的东西,将上面的类定义代码转换为类.m文件.此外,在某种程度上,第二个主要问题是如何构建这样的编译器.

关心佐兰

ps我之所以问这个问题,是因为我真的需要多次这样的东西.

wolfram-mathematica

10
推荐指数
2
解决办法
9144
查看次数

删除重复列表元素,保留外观顺序

我正在制作10 ^ 6到10 ^ 7实数的平面列表,其中一些正在重复.

我需要删除重复的实例,只保留第一次出现,而不修改列表顺序.

这里的关键是效率,因为我有很多要处理的清单.

示例(假):

输入:

  {.8, .3 , .8, .5, .3, .6}
Run Code Online (Sandbox Code Playgroud)

期望的输出

  {.8, .3, .5, .6}  
Run Code Online (Sandbox Code Playgroud)

除了注意

用Union删除重复元素(不保留顺序)给我的穷人的笔记本电脑:

DiscretePlot[a = RandomReal[10, i]; First@Timing@Union@a, {i, 10^6 Range@10}]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

wolfram-mathematica

9
推荐指数
3
解决办法
2417
查看次数

通过Mathematica的交互式树进行代码处理

这个问题让我思考一种编辑代码的交互方法.我想知道是否有可能在Mathematica的动态功能下实现这样的东西.

考虑一个表达式:

Text[Row[{PaddedForm[currentTime, {6, 3}, NumberSigns -> {"", ""}, NumberPadding -> {"0", "0"}]}]]
Run Code Online (Sandbox Code Playgroud)

它的TreeForm:

在此输入图像描述

我希望能够直接编辑该树,然后将结果转换回Mathematica代码.至少应该能够:

  • 重命名节点,替换符号
  • 删除节点,将其叶子恢复到上面的节点
  • 重新排序节点和叶子(参数的顺序)

我相信有些语言或环境专门用于这种操作,我觉得这并不具有吸引力,但我有兴趣为特殊目的进行这种交互式树编辑.

tree wolfram-mathematica interactive

8
推荐指数
1
解决办法
1616
查看次数

在Mathematica中安全地设置"结构"

关于在Mathematica中创建记录的问题已在少数几个地方讨论过,例如Mathematica中的Struct数据类型?.

所有这些方法的问题在于,人们似乎失去了对每个参数进行特定额外检查的能力,就像人们做的那样x_?NumericQ.

我的问题是:在Mathematica中有没有办法制作记录或结构,但是能够在各个元素上使用上述检查?

我试图找到一种方法来使用,因为我厌倦了在它们上面调用10个参数的函数(有时候一个人无法避免这种情况),即使我试图使每个函数都非常具体,最小化数量参数,一些功能只需要很多参数来完成特定的工作.

首先,我展示了我所知道的三种方法.

方法1

foo[p_]:=Module[{},
    Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
foo[p]
Run Code Online (Sandbox Code Playgroud)

优点:安全,好像我将符号'从'更改为其他东西,它仍然有效.如下例所示.

foo[p_]:=Module[{},
    Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
from=-1; (* By accident the symbol from was set somewhere. It will work*)
foo[p]
Run Code Online (Sandbox Code Playgroud)

方法2

Clear[p,foo];
foo[p_]:=Module[{},
    Print[p];
    Plot[Sin[x],{x,p["from"],p["to"]}]
]
p["from"] = -Pi;
p["to"]   = Pi;

foo[p]
Run Code Online (Sandbox Code Playgroud)

优点:也是安全的,字符串是不可变的.不必担心"从"值的变化.但到处都有字符串不太可读?

方法3

Clear[p,to,from];
foo[p_]:=Module[{},
    Plot[Sin[x],{x,p[from],p[to]}]
]
p[from] = -Pi;
p[to]   = Pi;

foo[p]
Run Code Online (Sandbox Code Playgroud)

缺点:如果任何符号'从'或'到'某处被覆盖,将导致问题,如

from=-4; (*accidentally the symbol from is assigned a value*)
foo[p]   
Run Code Online (Sandbox Code Playgroud)

所以.我认为方法(1)是最安全的.但现在我失去了这样做的能力:

foo[from_?NumericQ, to_?NumericQ] := Module[{},
    Plot[Sin[x], {x, from, to}] …
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica

5
推荐指数
1
解决办法
1720
查看次数