【Wolfram 到底有多厉害】- 神奇代码系列 05
书接上文:
原作者是Martin Büttner, 由知乎回答者 AlephAlpha 汉化翻译, 这里已或授权转发, 并且我再整理补充一点内容, 中文链接您可以在最下阅读原文找到链接.
另外,这里的很多代码片段仅适用于Mathematica 10及以上版本。
这个相当好玩。你给Manipulate函数任意一个表达式,它会通过一组变量来把这个表达式参数化,然后返回一个小部件,让你可以调整这些参数,并实时地看到表达式怎样随参数的变化而变化。 这里的表达式可以是某种图表。如果你要在讲座中用Mathematica演示一组解怎样随参数的变化而变化,Manipulate会特别有用。上面的代码展示了抛物线如何随系数a和b的变化而缩放和平移。
还记得长度为29的代码片段里的极坐标绘图吗?我们还可以在三维中干类似的事情。事实上,Mathematica中有两个相关的函数:用于柱面坐标的RevolutionPlot3D和用于球面坐标的SphericalPlot3D。和Graphics3D一样,Mathematica中所有的三维绘图都可以自动旋转,因此你无须为寻找一个好的角度而烦恼。上面的代码绘制的是一个类似于球谐函数的东西。
之前说过会为大家展示更多CellularAutomaton的魔法。这一代码片段计算了康威生命游戏在初始条件i下的前n步,并返回中间每一步的结果。
关于函数参数的一点说明:2是细胞状态的数量。{{2,2,2},{2,1,2},{2,2,2}}为3x3邻域中的9个细胞加权,这确保了细胞本身的状态与其周围8个细胞之和有所区分。{1,1}指的是这个元胞自动机规则取决于两个方向上距离不超过一格的细胞。最后,224是这个元胞自动机规则的数字编码。算出这个数字并不是一件容易的事情,不过Mathematica的文档里有一份还不错的教程。更复杂的元胞自动机往往不会使用数字编码,因为这个数字会特别大。后面会有相关的例子。
总之,如果令i为一个随机的点阵,n为200,用ArrayPlot绘制出结果并制成动画,就是这个样子.
回到实用的功能。除了一般的方程组,Mathematica还能解微分方程组。这个例子中的严格说来只是一个微分方程的边值问题, 不过你可以把它当成由3条方程组成的方程组来提交给DSolve。就像积分一样,DSolve用来求精确解,NDSolve则用来求数值解。上面的方程解出来是规则形式给出. 你可以用它来进行进一步的计算或绘图。
这是最后一个元胞自动机的例子。这是一种叫Wireworld的元胞自动机。这次不再将规则编码成一个简单的数字,一来是因为这个数字很可能会大得离谱 (作者懒得把它算出来),二来是为了展示CellularAutomaton的另一种用法。这次的规则用一个纯函数来指定,这个函数接收一个细胞的邻域的状态并返回这个细胞的新状态。对于超过两种颜色/状态的元胞自动机,这是更可行的用法。总之,下图中的i用的维基百科里的例子 (两个时钟发生器和一个异或门),并让它走了50步.
利用函数迭代40次, 生成的几何变换图形.
3D可视化显示 RGB 的颜色空间
这里将Wolfram的Logo按照字符串进行旋转形成的图形.
作者一直想着以某些漂亮的Geo函数作为长度为100的代码片段,但最终在Tweet-a-Program上找到了一个漂亮的例子,因此只需要把它偷过来。上面的代码生成了一幅展示当前地球上能被太阳找到的地方的地图。它在一个浮雕地图上为夜半球覆盖上了一层半透明的阴影。
Wolfram语言之中已经可以查询到非常多著名人物的信息, 如果是演员的话, 所出演的电影(这里以布拉德皮特)海报展示出来.
之前提到Mathematica可以求方程的数值解,也可以解微分方程。现在我想举一个很有价值的例子。
假设在一杆上的双摆问题(即两个单摆连在一起),并且每个杆都是单位长度。每个单摆都是单位质量。在此,我也用到单位重力来缩短公式。下面143个字符的代码片段解出了这个系统运动所遵循的拉格朗日方程(未知参量为单摆的角度和角动量)。更详细的戳这里,当然,如果你熟悉拉格朗日理论的话,这只是个很简单的练习。代码很难读,是为了这143字符的长度.
这篇知乎回答到此结束, 感谢AlephAlpha朋友. 未来还有更好精彩的代码会在之后的神奇代码系列继续介绍, 我们下次再继续探索......
祝各位春节假期愉快!
相关文章: