Mathematica
您可能需要从上至下阅读此书,因为这是它的编写顺序,并且一些解释将参考以前的摘录,或者从更下层开始进行解释。
该列表增长了很长的时间。我已经开始删除不太有趣的代码段,现在我将开始跳过这些代码段。参见修订历史记录的片段长达41对于一些真正的宝石的完整列表,请访问片段81,64,44,23,19,12和8。
长度为143和144的摘要
终于……我已经等了一段时间了(打高尔夫球已经有那么久了,所以我不必再等了)。前面我提到过,您还可以数值方程式,也可以求解微分方程式。我想展示一个简单的例子。
考虑杆上的双摆(即,一个摆与另一个摆相连)。每个杆都有单位长度,两个摆锤的重量都有单位质量。我还使用了单位重力来简化方程式。以下143个字符的代码片段求解了这种系统的拉格朗日运动方程(根据摆的角度和角动量)。可以在此PDF中找到派生方法,尽管如果您熟悉拉格朗日力学的话,这是相当简单的练习。
这是非常难以理解的,因为我不得不将它压低很多:
d=θ@t-φ@t;NDSolve[{#''@t==-#4#2''[t]Cos@d-##3#2'@t^2Sin@d-Sin@#@t&@@@{{θ,φ,1,.5},{φ,θ,-1,1}},θ@0==2,φ@0==1,θ'@t==φ'@t==0/.t->0},{θ,φ},{t,0,60}]
整洁的是,Mathematica立即显示了解决方案的大致缩图:
好的,但是有点la脚。我们想知道摆子的运动实际上是什么样的。因此,这是一个144个字符的代码段,它在描绘出下摆的轨迹时对摆进行了动画处理:
Graphics@{Line@{{0,0},p=θ~(h={Sin@#@#2,-Cos@#@#2}&)~t,p+φ~h~t},White,{0,0}~Circle~2.2}~Show~ParametricPlot[θ~h~u+φ~h~u,{u,0,t}]~Animate~{t,0,60}
产生的动画如下所示:
我不得不稍微作弊:如果您在之外绘图t = 30
,则ParametricPlot
默认情况下使用的绘图点太少,并且线条变得锯齿状。但是大多数有趣的动态变化都是在那之后发生的,因此我使用该选项PlotPoints -> 200
使动画的后半部分看起来更平滑。两者之间没有什么实质性的区别,而且上半部分无论如何看起来都无法区分。
我认为这将是我的最后一句话,除非我提出了令人难以置信的东西。希望你喜欢这个!
长度为100片段
GeoGraphics[{GeoStyling[Opacity[0.5]], NightHemisphere[]}, GeoBackground -> GeoStyling["ReliefMap"]]
我当时在考虑Geo
100代码段的一些不错的功能,但最终我在Tweet-a-Program上发现了一些非常不错的东西,我只是不得不窃取。上面的代码通过将半球半夜形状的浮雕图覆盖在地形图上,从而生成了当前时间和日期的非常漂亮的地球太阳图:
长度81片段
CellularAutomaton[{{0,2,3,If[0<Count[#,1,2]<3,1,3]}[[#[[2,2]]+1]]&,{},{1,1}},i,n]
我保证这是最后的细胞自动机。但是那是Wireworld中的81个字符。这次我没有将规则编码为一个数字,a)因为我认为规则太大了(我不想弄清楚),并且b)向您展示了的另一用法CellularAutomaton
。这次,将规则简单指定为一个纯函数,该函数接收一个单元邻域并返回该单元的新值。对于具有两种以上颜色/状态的细胞自动机,这是一种更可行的方法。
无论如何,我已经在Wikipedia中建立了示例i
(两个时钟生成信号和一个XOR门),并使其运行约50个步骤:
如果您有兴趣,实际的绘图和动画可能是片段77:
ListAnimate[ArrayPlot[#,ColorRules->{0->Black,1->Blue,2->Red,3->Yellow}]&/@w]
长度69片段
DSolve[r^2*R''[r]+2r*R'[r]-R[r]==0&&(R[r]==1&&R'[r]==2/.r->1),R[r],r]
回到有用的东西。除了正常的方程组外,Mathematica还可以求解微分方程组。以上从技术上讲只是一个带边界条件的微分方程,但您也可以将其作为三个方程的系统来提供。与积分函数相似的DSolve
是精确的解决方案,而NDSolve
将数值地求解系统。以上产生一个解决方案
{{R[r] -> 1/2 r^(-(1/2) - Sqrt[5]/2) (1 - Sqrt[5] + r^Sqrt[5] + Sqrt[5] r^Sqrt[5])}}
现在可以轻松地将其用于进一步的计算或作图。
长度为64片段
CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},{2,2,2}}},{1,1}},i,n]
我答应了你更多的CellularAutomaton
魔法!此摘要使用步骤的初始条件i
来计算Conways的生命游戏,n
并为您提供所有中间时间步的结果。
关于参数的几句话:2
是单元状态的数量。{{2,2,2},{2,1,2},{2,2,2}}
给出3x3邻域中9个单元的权重。它确保了小区本身与8个邻居的总和是可区分的。{1,1}
说,CA规则取决于在任一方向上相距1步的像元。最后,224
是将实际更新规则编码为单个数字。弄清楚这个数字可能有些棘手,但是文档中有一个相当有用的教程。对于更复杂的自动机,一个数字不会删减它(因为这个数字很大)。也许明天再到那儿!;)
无论如何,如果我将随机网格馈入i
,将200 馈入n
,并通过animation发送结果ArrayPlot
,则可以看到它实际上在工作:
长度59片段
SphericalPlot3D[Re[Sin[θ]Cos[θ]Exp[2I*φ]],{θ,0,π},{φ,0,2π}]
还记得片段26中的极坐标图吗?我们可以在3D中做同样的事情!(实际上,有两个功能:RevolutionPlot3D
用于圆柱极坐标和SphericalPlot3D
球形极坐标。)就像Graphics3D
在Mathematica中所有三维图都可以自动旋转一样,因此您不必担心预先准备好的相机角度。上面绘制了类似球谐函数的东西(虽然不完全),看起来像:
长度52片段
Manipulate[Plot[x^2a+x*b,{x,-3,3}],{a,.1,3},{b,0,3}]
这个很漂亮。Manipulate
接受任何表达式,使用一堆变量对其进行参数化,然后提供一个小部件,您可以在其中微调参数并实时查看表达式的变化。作为表达,您通常会有某种情节。如果您在讲座中使用Mathematica来演示解决方案系列如何响应修改参数,则此功能特别有用。上面显示了a
和b
系数如何缩放和移动抛物线:
长度48片段
Import["http://www.google.com/doodles","Images"]
Import
是一个非常强大的命令。它既可以用来从光盘上加载文件,也可以用来从网络上加载文件。它知道很多不同的文件格式,并且对于其中某些文件格式(例如HTML页面),它实际上可以立即提取数据。上面的代码从Google的Doodle页面下载了所有图像。
长度为45片段
EdgeDetect@ExampleData@{"TestImage","Splash"}
是时候进行一些图像处理了。Mathematica附带了一堆示例数据,包括图像(如Lena),纹理,3D模型和音频片段。首先,我们加载其中一个:
要检测边缘吗?这是一个函数调用:
长度为44片段
ArrayPlot@CellularAutomaton[110,{{1},0},100]
最后,我有足够的字符来使用CellularAutomaton
并呈现结果。:)据我所知,CellularAutomaton
是Mathematica中与CA相关的唯一功能。但是斯蒂芬·沃尔夫拉姆(Stephen Wolfram)在细胞自动机方面似乎认为自己是第一人,因此此功能非常强大。上面显示了最简单的用法。这将模拟一个100步的一维元胞自动机-并且实际上将在每个步骤中返回自动机的状态,因此结果是二维的。规则是第一个参数,可以通过列表详细指定,也可以仅编码为一个数字。在此示例中,我选择了比较著名的图灵完成规则110。{{1},0}
定义初始条件:单个1
在零背景前。CellularAutomaton
当我有更多可用的字符时,也许将来我会展示一些更多的功能:它可以使用更大的邻域和两个以上的州来模拟更高维度的CA。
ArrayPlot
是另一个不错的绘图工具,它只是将2D列表绘制为纯色网格以指示其值。在最简单的情况下,0
将映射为白色和1
黑色。该代码段的结果是:
长度为43片段
HighlightGraph[graph,FindVertexCover@graph]
自从我提到图表以来已经有一段时间了。Mathematica内置了很多常见的图形理论问题,以及漂亮的可视化工具。对于给定的值graph
,以上内容将找到图的最小顶点覆盖,然后使用高亮的那些顶点来渲染图。例如,如果graph
是PetersenGraph[7,2]
从片段18回,我们得到:
长度42片段
Animate[Plot[Sin[t-x],{x,0,10}], {t,0,10}]
在Mathematica中对事物进行动画处理非常简单(它们甚至不必是图像)。您只需为其提供要针对每个框架进行评估的表达式,以及一堆随框架而变化的参数。上面只是简单地绘制了正弦波的动画。动画将类似于以下GIF:
长度40片段
SortBy[PlanetData[#, "EscapeVelocity"]&]
SortBy
达到您的期望:根据将给定函数映射到每个列表元素所获得的值对列表进行排序。但是,等等,上面的调用根本不包含列表。从Mathematica 10开始,支持对某些功能进行周期性或部分应用。这不是像更纯粹的功能语言中那样的语言功能,而是只是为通常有用的全部功能手动实现的。这意味着上面的代码片段返回一个新函数,该函数仅获取一个列表,然后按给定的函数进行排序。如果您在整个代码中经常使用这种排序顺序,则这将非常有用。
是的,还有另一个不错的*Data
功能-上面的功能将根据行星的逃逸速度对行星名称进行排序。
长度39片段
f[1]=1
f[2]=1
f[n_]:=f[n]=f[n-1]+f[n-2]
我答应让斐波那契功能更有效。此摘要显示了Mathematica中的琐碎记忆。请注意,所有更改仅是f[n]=
第三行中的附加内容。因此,当f
调用新值时(例如f[3]
),f[3]=f[3-1]+f[3-2]
将对其进行评估。这将进行计算f[2]+f[1]
,然后将其分配给f[3]
(使用=
,而不是使用:=
!),并最终返回初始调用的值。因此,调用此函数将为此值添加一个新定义,该定义显然比一般规则更具体-因此将用于以后f
对该值的所有调用。
还记得其他的斐波那契函数花了30秒的4秒值吗?300,000个值需要3秒。
长度37片段
l//.{a___,x_,b___,x_,c___}:>{a,x,b,c}
在上一个片段中,我提到了模式。这些是规则中最常用的规则(除其他事项外),这些规则可用于修改与特定模式匹配的结构。因此,让我们看一下这段代码。
{a___,x_,b___,x_,c___}:>{a,x,b,c}
是一个规则。x_
带有单个下划线的模式是指单个任意值(其本身可以是列表或类似值)的模式。a___
是一个序列模式(另请参见代码段15),它表示0或更多值的序列。请注意,我使用了x_
两次,这意味着列表的这两部分必须具有相同的值。所以这个模式匹配包含两次值的任何名单,称该元素x
,并呼吁各地这两个因素的三个序列a
,b
和c
。替换为{a,x,b,c}
-即x
删除了第二个。
现在//.
将应用规则,直到模式不再匹配为止。因此,以上代码段从列表中删除了所有重复项l
。但是,它的功能要强大得多://.
在所有级别应用规则。因此,如果l
本身包含列表(不限深度),这些子列表中的重复项也将被删除。
长度36片段
f[1]=1
f[2]=1
f[n_]:=f[n-1] + f[n-2]
是时候使用新的语言功能了!Mathematica关于定义函数有一些好处。首先,您可以为相同的名称,不同数量或类型的参数提供多个函数定义。您可以使用模式来描述定义适用于哪种参数。此外,您甚至可以为单个值添加定义。然后,Mathematica将为任何函数调用选择最特定的适用定义,并对未定义的调用进行评估。与其他If
基本情况相比,这使得(除其他外)以更自然的方式编写递归函数。
关于上述摘要,需要注意的另一件事是我同时使用=
和:=
。不同之处在于=
,在定义时,其右侧仅被评估一次,而:=
每次引用左侧时都被重新评估。实际上,:=
甚至在分配变量时也可以使用,这些变量将具有动态值。
因此,以上内容当然只是斐波那契函数。效率很低。计算前30个数字在我的计算机上花费大约4秒钟。不久我们将看到如何在不脱离递归定义的情况下提高性能。
长度35片段
StreamPlot[{x^2,y},{x,0,3},{y,0,3}]
一个非常整洁的图,它输出2D矢量场的流线。这类似于法线向量图,因为每个箭头都与向量场相切。但是,箭头不是放置在固定网格上,而是连接成线(流线)。这些线的意义在于,如果矢量场是速度场,它们将指示粒子的轨迹(例如在流体中)。上面的输入看起来像:
长度34片段
Solve[a*x^4+b*x^3+c*x^2+d*x==0, x]
Mathematica也可以求解方程式(或方程式系统,但现在我们只有这么多的字符)。像往常一样,结果将是象征性的。
{
{x -> 0},
{x -> -(b/(3 a)) - (2^(1/3) (-b^2 + 3 a c))/(3 a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) + (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)/(3 2^(1/3) a)},
{x -> -(b/(3 a)) + ((1 + I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 - I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/(6 2^(1/3) a)},
{x -> -(b/(3 a)) + ((1 - I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 + I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/( 6 2^(1/3) a)}
}
请注意,解决方案是作为规则给出的,我可能会在以后的一些摘要中更详细地说明。
长度为33的摘要
Dynamic@EdgeDetect@CurrentImage[]
感谢benwaffle的这个想法。CurrentImage[]
加载您的网络摄像头的当前图像。EdgeDetect
将图像转换为黑白图像,边缘为白色,其余部分为黑色(有关示例,请参见代码段45)。真正的乐趣来自Dynamic
于表达式本身的更新。因此,这样做的结果将实际上是从网络摄像头流式传输图片并对其进行实时边缘检测。
长度为32片段
NumberLinePlot[x^2<2^x,{x,-2,5}]
一种非常不寻常的情节类型。它可以沿数字线绘制一系列不同的事物,例如点和间隔。您还可以为其指定条件,它将向您显示该条件为真的区域:
箭头指示该区域继续无穷大。白色圆圈表示这些是开放时间间隔(端点不是时间间隔的一部分)。对于封闭端,将填充圆圈。
长度28片段
Graphics3D@{Sphere[],Cone[]}
是时候制作一些3D图形了。上面的代码使用默认参数渲染了叠加的球体和圆锥体,看起来像水晶球:
在Mathematica中,您实际上可以单击并拖动此小部件来旋转它。
长度27片段
CountryData["ITA", "Shape"]
更多*Data
!CountryData
非常疯狂。塑造一个国家的形态甚至都不是冰山一角。关于国家/地区的数据太多,您可能会写一本关于此功能的完整书籍。就像...有FemaleLiteracyFraction
。您还可以查询该数据的不同时间点。有关完整列表,请参见参考。
长度26片段
PolarPlot[Sin[5θ],{θ,0,π}]
是时候进行更有趣的情节了。PolarPlot
只是极坐标图。您可以为给定的角度θ指定半径r,而不是为给定的x指定y:
长度25片段
{{1,5},{2,3},{7,4}}.{8,9}
我们终于有了足够的字符来进行一些矢量数学运算。上面的代码计算了2x3矩阵和第2行矢量的矩阵乘法:
{53, 43, 92}
长度23片段
Rotate[Rectangle, Pi/2]
h 呵呵。您认为您知道这是什么。但是你没有。Rectangle
本身只是一个命名函数。要真正获得代表矩形的对象,您需要使用一些参数来调用该函数。那么,当您尝试旋转时,您认为会发生什么Rectangle
呢?这个:
长度22片段
30~ElementData~"Color"
另一个内置*Data
功能。是的,对于化学元素,您不仅可以获得原子序数,熔点和名称之类的东西,还可以在室温下获得它们的颜色。上面给出了锌的颜色:
SlateGray
长度21片段
Integrate[E^(-x^2),x]
我们前段时间有所区别。整合时间。Mathematica可以处理定积分和不定积分。特别是,Integrate
它将为您提供精确的解决方案,并且可以处理大量标准积分和积分技术(对于数值结果,请参见NIntegrate
)。如果您知道微积分,您会注意到上面的高斯积分实际上没有闭合形式的不定积分...除非您考虑误差函数闭合形式。Mathematica返回:
1/2 Sqrt[π] Erf[x]
长度为20片段
"Sun"~StarData~"Age"
返回内置数据。*Data
对于可能想到的所有功能,至少必须有两个功能。它们每个都为您想要数据的事物提供一个标识符,并获取一个属性(或属性列表)。上面的内容只是您可以得到的最短的内容之一Sun
,Star
而且Age
都非常简短,因为我迫不及待想要展示此功能。
哦,是的,我是否提到Mathematica(自9开始)支持单位数量?(稍后会有更多说明。)上面的计算结果为:
Quantity[4.57*10^9, "Years"]
显示为
长度19片段
MandelbrotSetPlot[]
是的...非常有用的功能...我一直都在使用它。(有时,他们支持任何可能可计算的事物的愿望可能会变得有些远...)
在防御方面,该功能比这有用得多:您可以为它指定要绘制的图形的特定部分。
长度18片段
PetersenGraph[7,2]
从Mathematica 8开始,它了解什么是图形,因此它附带了各种与图形理论相关的功能。如果它不包含大量内置函数,则不是Mathematica。上面生成了广义Petersen图的图数据。它确实产生了可以操纵的实际数据结构,但是Mathematica立即以图形方式显示该图形数据:
长度17片段
Plot[x^x,{x,0,2}]
最后,足够的字符来做一些绘图。以上实际上只是一维绘图的最简单示例。我保证以后会炫耀一些阴谋
长度15片段
{##4,#,#2,#3}&
这显示了两个更强大的功能(以及高尔夫有用的功能)。整个过程是一个未命名的纯函数,与lambda
Python中的s或Ruby中的Procs 相当。纯函数仅以终止&
。该运算符的优先级非常低,因此它通常包含几乎所有剩余的优先级。纯函数的参数由引用#
,有时后面还有其他内容。第一个参数是#
or #1
,第二个参数是#2
,依此类推。
另一个功能是Sequence
s。这些基本上就像其他语言中的splats一样。序列就像列表,列表周围没有列表-实际上,它只是一个值序列,可以在列表,函数参数等##
中使用。特别是所有纯函数参数的序列。##2
是从第二个开始的所有参数的序列。因此,如果我们将上面的函数命名为f
,并将其命名为
f[1,2,3,4,5]
我们会得到
{4,5,1,2,3}
因此该函数将输入参数向左旋转3个元素。请注意,##4
将4,5
其中提到的内容展平到列表中。
长度12片段
D[x^y^x,x,y]
偏微分。D
会相对于其他参数依次区分第一个表达式,从而为您提供一个符号表达式。因此,上面是d²(x ^ y ^ x)/ dxdy(其中d s是局部的),Mathematica报告说是
x^y^x (y^(-1 + x) + y^(-1 + x) Log[x] + x y^(-1 + x) Log[x] Log[y]) +
x^(1 + y^x) y^(-1 + x) Log[x] (y^x/x + y^x Log[x] Log[y])
长度9片段
Exp[I*Pi]
我们还没有完成任何复杂的算术运算!如您所见,π
实际上只是的别名Pi
。无论如何,以上内容实际上将正确返回integer -1
。
长度8片段
Sunset[]
是的 谈论疯狂的内置程序。如果没有参数,则实际上不会为您提供当前位置下一个日落的日期时间对象。它还需要其他日期,其他位置等的参数。这就是我现在的样子:
长度7片段
9!/43!!
该代码片段展示了一些很酷的东西。
Mathematica不仅具有内置的阶乘运算符!
,还具有双阶乘!!
(将每个其他数字从n
向下乘以)相乘1
。此外,它支持任意精度的整数。该43!!
会准确地评估,到最后一位。此外,还将对有理数进行精确评估。因此,由于分子和分母都有整数,因此Mathematica将尽可能减少分数,然后为您提供
128/198893132162463319205625
当然,您可以随时使用浮点数,但是通常,如果输入不包含浮点数,则结果将是准确的。
长度4片段
Here
现在是时候开始使用Mathematica丰富的疯狂内置函数了。上面的内容如其在罐子上所说的,并且(对我而言)评估为GeoPosition[{51.51, -0.09}]
。
长度3片段
x-x
只是为了展示原始的Factoid:即使x
尚未定义,上述方法仍然有效,并且0
在这种情况下实际上会产生结果。
长度2片段
3x
通过并列相乘!如果很明显一个标识符结束并且另一个开始,则您不需要一个*
或什至空格将它们相乘。这几乎适用于所有内容,包括尚无值的字符串和变量。打高尔夫球非常方便。;)
长度1片段
π
猜猜是Pi。实际上,它不是某种近似的浮点表示形式,恰好是Pi,因此,如果已知,则所使用的各种复杂和三角函数都将产生精确的结果。
类固醇
Mathematica可以执行符号操作,因此变量不需要值即可使用它们。
Translate[Scale[Rectangle, 80], {0, 0, 100}]
那么这个巨大的字词Rectangle
会浮现在您的显示器前吗?