您现在的位置: 晨光科技 >> 文章 >> 技术理论 >> 数学 >> 正文  
  Mathematica 到底有多厉害?           
Mathematica 到底有多厉害?
[ 作者:佚名    转贴自:https://www.zhihu.com/question/27834147    点击数:24    更新时间:2021/10/13    文章录入:LA ]
[注:本站登载的某些文章并不代表本站支持或反对其观点或肯定其真实性]
作者:AlephAlpha
链接:https://www.zhihu.com/question/27834147/answer/38337425
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Programming Puzzles & Code Golf Stack Exchange上,有人发起了这么一个游戏(popularity contest - Showcase your language one vote at a time ):每个回答者选一种编程语言,先说一点关于这门语言的有趣事实;然后,如果获得N个赞,就可以添上长度从1到N不等的至多N条代码片段(中间可以跳过一些数字)来展示这门语言的各种特性。


目前(北京时间2015年1月28日21时)排在第一位的语言是Mathematica,获得了144个赞,恰好是第二名的两倍,比起Python、MATLAB之类的更是不知高到哪里去了。


这个回答的作者是Martin Büttner。我就搬运一下,顺便翻译一下。原回答是按从长到短排列的,我把它倒了过来,还补上了若干作者已经删掉的代码片段。翻译得不好。欢迎去看原回答,有stackexchange帐号的话可以顺便点个赞。这个问题里其它语言的回答同样精彩。


另外,这里的很多代码片段仅适用于Mathematica 10。


-----


事实

Mathematica可以执行符号操作,所以在处理变量的时候变量不需要有值。


长度为1的代码片段

π

猜猜看?这就是π。它不是用浮点数表示的近似值,它就是π的精确值,因此涉及到π的复变函数和三角函数的运算可以得到精确的结果。


长度为2的代码片段

3x

把两个东西放在一起,就可以做乘法,不需要添加*或者空格,只要能明确识别出一个标识符的结束和另一个标识符的开始。乘法的因数还可以是字符串或者未赋值的变量。


长度为3的代码片段

x-x

只是展示一下“事实”里说的:不需要知道x的值,也能算出结果是0。


长度为4的代码片段

Here

该展示一下Mathematica中各种疯狂的内建函数了。这段代码可以给出你所在的地理位置;比如说,作者的运行结果是GeoPosition[{51.51, -0.09}]。(看来作者在伦敦……)


长度为5的代码片段

Green

Mathematica把颜色作为一种内建类型,还包含了一批预定义的颜色。更好的是,Mathematica会把它显示成一个这种颜色的小方块:

你可以复制这个小方块,把它用在你的代码当中,就像使用别的符号一样。


长度为6的代码片段

23^^H5

让我们回到数学。在Mathematica中,你可以用从2到36的各种不同的进制来输入数字,可以用大写或小写字母,也可以混用。还可以用这种方法来输入浮点数。这里输入是23进制的H5,结果是396。


长度为7的代码片段

9!/43!!

Mathematica中不仅有表示阶乘的运算符(!),还有表示双阶乘的运算符(!!)(n的双阶乘是n*(n-2)*(n-4)*…)。而且,它还支持任意精度的整数,因此43!!可以算出精确值。此外,有理数也会被精确地计算。因此,这里Mathematica不会给出一个浮点数的结果,而是把它约分,最终给出:

128/198893132162463319205625

当然,只要你需要,也可以随时进行浮点数的运算。一般地,如果你的输入不含浮点数,就会得到精确的结果。


长度为8的代码片段

Sunset[]

又一个疯狂的内建函数。不给任何参数的话,这个函数会返回你所在的地方的下一次日落的时间。也可以输入日期和地点作为参数。这是作者当时运行的结果:


长度为9的代码片段

Exp[I*Pi]

到这里还没有做过复数运算。你可以看到,π只是Pi的一个别名。这段代码会返回精确的答案:整数-1。


长度为10的代码片段

f=Exp@*Cos

Mathematica 10中新增了@*这个运算符来表示一个原有的函数:Composition。上面的代码把f定义为Exp和Cos的复合:先将Cos作用于参数,然后将Exp作用于其结果。因此f[Pi]会返回1/E。Mathematica 10中还有/*这个运算符,表示的是RightComposition,它先应用的是左边的函数,比如说Cos/*Exp就相当于Exp@*Cos。


长度为11的代码片段

Tuples[l,n]

来点组合数学。这段代码会给出以列表l中的元素为元素的所有n元组。比如说,如果l是{1, 2, 3},n是2,你就会得到:

{{1, 1}, {1, 2}, {1, 3}, {2, 1}, {2, 2}, {2, 3}, {3, 1}, {3, 2}, {3, 3}}


长度为12的代码片段

D[x^y^x,x,y]

偏微分。D会给出第一个参数(某个表达式)对于后面的参数的偏导数,结果以符号表达式的形式给出。所以上面的代码的意思是∂²(x^y^x)/∂x∂y,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])


长度为13的代码片段

l~Riffle~" "

首先,这里展示了另一种调用双参数的函数的方式:x~f~y是f[x, y]的中缀表达式。其次,Riffle是一个相当使用的函数,它以一个列表和一个值作为参数,然后在那个列表每相邻两个元素间插入那个值。比如说,上面的例子会在l的每相邻两个元素间插入一个" "。


长度为14的代码片段

Prime~Array~9

这是构造列表的一种方式。Array会对从1到它的第二个参数的每一个整数调用它的第一个参数(本身也是个函数)。上面的例子会给出前9个素数的列表:

{2, 3, 5, 7, 11, 13, 17, 19, 23}


长度为15的代码片段

{##4,#,#2,#3}&

这里展示了两个更强大的特性。这整个东西是一个未命名的纯函数。类似于Python中的lambda和Ruby中的Procs。纯函数以&结尾。&这个运算符的优先级非常低,因此往往会把左边的一切东西包含进去。纯函数的参数用#来表示,有时候会在#后面添上别的东西。第一个参数是#或者#1,第二个参数是#2,以此类推。

另一个特性是Sequence(序列)。它类似于某些语言中的*。你可以把它理解为两边的括弧的列表——它只是一序列的值,可以用在列表或函数的参数中。##表示纯函数的全部参数的序列,##2则表示纯函数的从第二个开始的参数的序列。所以,如果我们把上面的例子中的纯函数命名为f,那么,

f[1,2,3,4,5]

的结果会是

{4,5,1,2,3}

所以这个函数只是把左边的三个参数挪到右边。注意这里##4表示的是序列4, 5,并且被压平到列表当中。


长度为16的代码片段

Partition[l,2,1]

Partition是一个非常实用的处理列表的函数,它有一大堆的重载。上面是作者最常用的一种形式。它会给出列表l的所以长度为2的子列表(这里的1使得子列表互相交叠)。如果l是{1, 2, 3},你会得到

{{1, 2}, {2, 3}, {3, 4}}


长度为17的代码片段

Plot[x^x,{x,0,2}]

终于有足够的字符数可以画图了。这只是绘制一维图表的一个最简单的例子。后面还会展示一些更加酷炫的图表。


长度为18的代码片段

PetersenGraph[7,2]

Mathematica 8引进了图这个内建类型,随之而来的是一大批图论方面的函数。如果它没有这么多内建函数,它就不是Mathematica了。上面的代码生成了一个广义的佩特森图。Mathematica生成的事实上是一个可以进行各种操作的数据结构,但显示出来的就是一幅……图:


长度为19的代码片段

MandelbrotSetPlot[]

嗯……非常“有用”的函数……有时,他们支持各种可能的计算的意愿走得有点太远了……

其实这函数比这个要更有用一些:可以指定作图的区域。


长度为20的代码片段

"Sun"~StarData~"Age"
作者:AlephAlpha
链接:https://www.zhihu.com/question/27834147/answer/38337425
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

回到内建的数据。Mathematica中有一大批以Data结尾的函数,包含了任何你可能想到的数据。使用这些函数的时候,你只需要输入你想要查找数据的东西,和你想要检索的属性。上面只是一个最短的例子,Sun、Star和Age都很短,因为作者等不及要展示这一特性。

从第9版开始,Mathematica支持带单位的量。上面的例子算出来是:

Quantity[4.57*10^9, "Years"]

在Mathematica中显示成:


长度为21的代码片段

Integrate[E^(-x^2),x]

前面展示过了微分。现在该展示积分了。Mathematica能计算定积分和不定积分。Integrate会给你一个精确的解,它能处理很多种不同的积分;NIntegrate则会给出数值解。如果你学过微积分,你会记得上面的高斯积分并没有解析解,除非把误差函数也当作是解析解。Mathematica返回的是:

1/2 Sqrt[π] Erf[x]


长度为22的代码片段

30~ElementData~"Color"

又一个内建的以Data结尾的函数。对于化学元素,你不仅可以得到原子序数、熔点、名字之类的东西,还可以得到它在室温下的颜色。上面的代码给出了锌的颜色:

SlateGray


长度为23的代码片段

Rotate[Rectangle, Pi/2]

嘿嘿。你以为你知道这段代码干的是什么,其实你不知道。Rectangle本身只是一个函数的名字。要真正地得到一个长方形,你必须调用这个函数,给它一些参数。所以这段代码是在干什么呢?其实:


长度为24的代码片段

Series[ArcSin@x,{x,0,9}]

又一个有趣的功能。Mathematica能够求出一个函数在任意点处的泰勒展开。上面的例子给出的是反正弦函数在0处的直到9次的泰勒展开:

SeriesData[x, 0, {1, 0, 
 Rational[1, 6], 0, 
 Rational[3, 40], 0, 
 Rational[5, 112], 0, 
 Rational[35, 1152]}, 1, 10, 1]

显示为:


长度为25的代码片段

{{1,5},{2,3},{7,4}}.{8,9}

终于有足够的字数可以展示向量的运算了。上面的代码展示了一个2x3的矩阵乘以一个2维的列向量:

{53, 43, 92}


长度为26的代码片段

PolarPlot[Sin[5θ],{θ,0,π}]

又一个有趣的绘图功能。PolarPlot绘制的是极坐标下的图像。你需要的是对每个θ给出一个r,而不是对每个x给出一个y。


长度为27的代码片段

CountryData["ITA", "Shape"]

又一个Data。CountryData是一个相当强大的函数。获取国家的形状仅仅是其功能的冰山一角。关于国家的数据太多了,你可以为这个函数写一本书。比如说,有一个数据叫FemaleLiteracyFraction。你甚至可以查询不同时间的数据。完整的列表见Mathematica参考资料中心


长度为28的代码片段

Graphics3D@{Sphere[],Cone[]}

该是三维的图像了。这是绘制的是重叠起来的默认参数下的一个球面和一个圆锥,看起来像一个水晶球:

在Mathematica中,你可以点击并拖动来旋转这个图形。


长度为29的代码片段

Piecewise[{{13+2x^2,x>0}},13]

Piecewice让你可以定义在不同区域有不同定义的函数。它显示出来就跟标准的数学表达式一样:

作为展示,如果绘制它从-5到5的图像,你会得到:


长度为30的代码片段

FourierTransform[E^(-x^2),x,k]

跟别的东西一样,只要可能的话,傅立叶变换算出来也是精确解:

E^(-(k^2/4))/Sqrt[2]


长度为31的代码片段

Permutations[{1,1,2,3,3,4},{3}]

再来一点组合数学。这段代码给出了由这个列表的元素组成的所有3个元素的组合。即使列表中的元素有重复,给出的组合也不会重复:

{{1, 1, 1}, {1, 1, 3}, {1, 1, 4}, {1, 3, 1}, {1, 3, 3}, {1, 3, 4}, {1, 4, 1}, {1, 4, 3}, {3, 1, 1}, {3, 1, 3}, {3, 1, 4}, {3, 3, 1}, {3, 3, 4}, {3, 4, 1}, {3, 4, 3}, {4, 1, 1}, {4, 1, 3}, {4, 3, 1}, {4, 3, 3}}


长度为32的代码片段

NumberLinePlot[x^2<2^x,{x,-2,5}]

一个不太寻常的绘图。它可以在数轴上绘制一系列不同的东西,比如说点和区间。你还可以给出一个条件,它会绘制出使条件成立的区域:

这里的箭头表示这个区域会延伸到无穷大,空心的圈圈则表示这是开区间。如果是闭区间,圈圈会变成实心。


长度为33的代码片段

ExampleData[{"TestImage","Lena"}]

Mathematica包含了一系列的范例数据,从图片、纹理、声音片段到3D模型(比如说犹他茶壶)。Lena的名字相当短,也还算出名,所以作者选择了她:


长度为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)}
}

注意解是以规则的形式给出。后面可能会有关于规则的更具体的例子。


长度为35的代码片段

StreamPlot[{x^2,y},{x,0,3},{y,0,3}]

一个非常漂亮的绘图,绘制的是一个二维向量场的流线。类似于常规的向量图,它的每一个箭头都相切于向量场;不过,箭头不是按固定的点阵来排列,而是首尾相接连成流线。如果这个向量场是流体的速度场,这些线就是流体中粒子的轨迹(我觉得作者这里说得并不准确……)。上面的例子的输出为:


长度为36的代码片段

f[1]=1
f[2]=1
f[n_]:=f[n-1] + f[n-2]

又该展示新的语言特性了。Mathematica中有几个定义函数方面的好处。首先,你可以给一个函数名提供不同的定义,只要参数的数量或类型不同。你可以用模式来描述参数的类别。而且,你还可为给单独的值添加定义。调用函数的时候,Mathematica会自动选取最特殊的定义;如果没有符合的定义,则会不进行任何计算。这使得可以以更自然的方式来定义递归函数,而不必用If来在不同情况间切换。

另一点要注意的是这里同时用到了=和:=。不同之处在于=的右边只是在定义的时候计算一次,而:=的右边则是在每次调用的时候计算。其实在定义变量的时候也可以用:=,这时变量就会有动态的值。

因此上面定义的就是斐波那契数列。不过这是一个非常低效的定义,在作者的电脑上计算前30个数就画了4秒。在后面我们会看到,只要稍作改进,甚至不用改掉递归,便能大大提高其性能。


长度为37的代码片段

l//.{a___,x_,b___,x_,c___}:>{a,x,b,c}

上一个代码片段中提到了模式。模式常被用在规则中,规则则常用于修改匹配某一模式的结构。让我们来看看这个代码片段。

{a___,x_,b___,x_,c___}:>{a,x,b,c}是一个规则。x后面跟着一个下划线(x_)是一个模式,它可以代表任意的值(这个值本身也可以是一个列表或者类似的东西)。a___则是一个序列模式(参见长度为15的代码片段),它可以代表长度为0或者更长的序列。这里x_出现了两次,说明其代表的是相同的值。因此,整个模式{a___,x_,b___,x_,c___}匹配的是一个有重复元素的列表,两个x代表的是重复的元素,a、b和c代表的是围绕这两个元素的序列。根据规则,它被替换为{a,x,b,c},也就是去掉了第二个x。

//.会重复地执行一个规则,直到找不到可以匹配这个模式的结构。因此,上面的代码会去掉列表l中所有重复的元素。不过,它的功能并不仅限于此://.会在任何层次上运用规则,因此如果l中的某个元素也是列表,这个列表中重复的元素也会被去掉。


长度为38的代码片段

RegionPlot[x^y>2&&y

又回到绘图。它绘制的是是条件成立的二维区域。当你想绘制一个不以显式表示区域的话,这个函数非常有用。上面的代码画出来是:


长度为39的代码片段

f[1]=1
f[2]=1
f[n_]:=f[n]=f[n-1]+f[n-2]

前面说过要把斐波那契数列的定义改得更高效。这段代码展示了menmoization在Mathematica中是多么平凡。这里唯一的改动就是在第三行增加一个f[n]=。这样,每次f计算一个新的值,比如说f[3]的时候,执行了f[3]=f[3-1]+f[3-2]。这计算了f[2]+f[1],然后把结果赋值给f[3](注意这里用的是=而非:=)。因此,每次调用f计算一个没计算过的值的时候,它就会为这个值添加一条新的定义;这一定义显然比一般的定义更特殊,因此在再次计算这个值的时候就会直接使用这个定义。

在长度为36的代码片段中,计算前30个斐波那契数画了4秒;而这里计算前300000个只需要3秒(请勿在内存太小的计算机上尝试)。


长度为40的代码片段

SortBy[PlanetData[#, "EscapeVelocity"]&]

和你预料的一样,SortBy的功能是根据一个列表中每个元素应用某个给定的函数的结果来给列表排序。不过等等,这里调用SortBy的时候并没有给它一个列表!其实,在Mathematica 10中,某些函数开始支持柯里化和部分应用。与某些纯函数式的语言不同,这不是一个语言特性,只是一批特定的函数的功能。上面这段代码返回的是一个新的函数,这个函数仅仅以一个列表为参数,并且根据前面给定的函数来为这个列表排序。当你在代码中要多次用到同一个排序规则的时候,这个用法会非常有用。

另外,这里又出现了一个Data。这是根据逃逸速度来给行星的名字排序。


长度为41的代码片段

Thread[{"foo","bar","hm"}<>{"a","b","c"}]

差点忘了Thread。如果你有两个长度相同的列表,想对位置相应的每一对元素进行某个操作。当然,你可以对列表长度进行迭代;也可以连接两个列表,转置这个矩阵,然后对每对元素进行操作。不过Thread让这一切变得更加简单。大致上,它就是把最顶层的Head(函数或类型)往下“推”一层。所以上面的代码算出来是:

{"foo"<>"a","bar"<>"b","hm"<>"c"}

而<>表示字符串的连接,因此最终的结果是:

{"fooa","barb","hmc"}

Thread这个函数非常实用。比如,如果你有一组“左边”和一组“右边”,可以用它来生成一个方程组。


长度为42的代码片段

Animate[Plot[Sin[t-x],{x,0,10}], {t,0,10}]

在Mathematica中,让东西动起来很简单,它们甚至不必是图像。你只要给出一个在每帧进行计算的表达式,以及随帧数变化的变量。上面的代码会生成一个正弦波的动画,看起来就像下面这个gif一样(啊,知乎不支持动图?那我贴图片地址好了:i.stack.imgur.com/EOPuu):


长度为43的代码片段

HighlightGraph[graph,FindVertexCover@graph]

前面提到过图。Mathematica中有大量常用的图论方面的功能,除了解决各种图论问题的函数外,还有漂亮的可视化工具。例如上面的代码,对于给定的图graph,找出一个顶点数最小的顶点覆盖,并且将图中的这些顶点突出显示。例如,如果graph是长度为18的代码片段中的PetersenGraph[7,2]的话,会得到:


长度为44的代码片段

ArrayPlot@CellularAutomaton[110,{{1},0},100]

终于有足够多的字数来用上CellularAutomaton这个函数并画出其结果了。据作者所知,这是Mathematica中唯一一个关于元胞自动机的函数。但Stephen Wolfram似乎认为自己是元胞自动机领域的第一人,因此这个函数尤其强大。这里展示的只是它最简单的用法。它模拟的是一个一维元胞自动机的前100步,事实上它返回的是每一步的状态,因此结果是一个二维的数组。函数的第一个参数是元胞自动机的规则,可以用一个列表来详细地指定,也可以只用一个简单的数字编码。在这个例子中,作者选择了著名的图灵完备元胞自动机,Rule 110。{{1},0}定义了初始条件:单独的一个1,以及作为背景的0。在后面会展示CellularAutomaton的更多特性:它可以模拟更高维数、更大邻域、更多状态的元胞自动机。

ArrayPlot是又一个绘图的工具,用于绘制二维数组,以不同颜色的方块表示数组中不同的值。在最简单的情形下,0对应于白色,1对应于黑色。这段代码的运行结果是:


长度为45的代码片段

EdgeDetect@ExampleData@{"TestImage","Splash"}

然后是图像处理。Mathematica包含了一系列的范例数据,包括图像(例如Lena)、纹理、3D模型和声音片段。我们首先加载其中一个范例图像:

想要查找边缘?只要调用一个函数!



长度为48的代码片段

Import["http://www.google.com/doodles","Images"]

Import是一个相当强大的命令。它既可以导入磁盘中的文件,也可以下载网上的文件。它懂得很多种不同的文件格式,还可以从其中的一些(例如HTML)直接提取数据。上面的代码会下载Google Doodle页面的所有图片。


长度为52的代码片段

Manipulate[Plot[x^2a+x*b,{x,-3,3}],{a,.1,3},{b,0,3}]

这个相当好玩。你给Manipulate函数任意一个表达式,它会通过一组变量来把这个表达式参数化,然后返回一个小部件,让你可以调整这些参数,并实时地看到表达式怎样随参数的变化而变化。 这里的表达式可以是某种图表。如果你要在讲座中用Mathematica演示一组解怎样随参数的变化而变化,Manipulate会特别有用。上面的代码展示了抛物线如何随系数a和b的变化而缩放和平移。


长度为59的代码片段

SphericalPlot3D[Re[Sin[θ]Cos[θ]Exp[2I*φ]],{θ,0,π},{φ,0,2π}]

还记得长度为29的代码片段里的极坐标绘图吗?我们还可以在三维中干类似的事情。事实上,Mathematica中有两个相关的函数:用于柱面坐标的RevolutionPlot3D和用于球面坐标的SphericalPlot3D。和Graphics3D一样,Mathematica中所有的三维绘图都可以自动旋转,因此你无须为寻找一个好的角度而烦恼。上面的代码绘制的是一个类似于球谐函数的东西。


长度为64的代码片段

CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},{2,2,2}}},{1,1}},i,n]

之前说过会为大家展示更多CellularAutomaton的魔法。这一代码片段计算了康威生命游戏在初始条件i下的前n步,并返回中间每一步的结果。

关于函数参数的一点说明:2是细胞状态的数量。{{2,2,2},{2,1,2},{2,2,2}}为3x3邻域中的9个细胞加权,这确保了细胞本身的状态与其周围8个细胞之和有所区分。{1,1}指的是这个元胞自动机规则取决于两个方向上距离不超过一格的细胞。最后,224是这个元胞自动机规则的数字编码。算出这个数字并不是一件容易的事情,不过Mathematica的文档里有一份还不错的教程。更复杂的元胞自动机往往不会使用数字编码,因为这个数字会特别大。后面会有相关的例子。

总之,如果令i为一个随机的点阵,n为200,用ArrayPlot绘制出结果并制成动画,就是这个样子:

(动图,图片地址:i.stack.imgur.com/ny4Fw


长度为69的代码片段

DSolve[r^2*R''[r]+2r*R'[r]-R[r]==0&&(R[r]==1&&R'[r]==2/.r->1),R[r],r]

回到实用的功能。除了一般的方程组,Mathematica还能解微分方程组。这个例子中的严格说来只是一个微分方程的边值问题, 不过你可以把它当成由3条方程组成的方程组来提交给DSolve。就像积分一样,DSolve用来求精确解,NDSolve则用来求数值解。上面的方程解出来是:

{{R[r] -> 1/2 r^(-(1/2) - Sqrt[5]/2) (1 - Sqrt[5] + r^Sqrt[5] + Sqrt[5] r^Sqrt[5])}}

你可以用它来进行进一步的计算或绘图。


长度为81的代码片段

CellularAutomaton[{{0,2,3,If[0

这是最后一个元胞自动机的例子。这是一种叫Wireworld的元胞自动机。这次不再将规则编码成一个简单的数字,一来是因为这个数字很可能会大得离谱(作者懒得把它算出来),二来是为了展示CellularAutomaton的另一种用法。这次的规则用一个纯函数来指定,这个函数接收一个细胞的邻域的状态并返回这个细胞的新状态。对于超过两种颜色/状态的元胞自动机,这是更可行的用法。

总之,下图中的i用的维基百科里的例子(两个时钟发生器和一个异或门),并让它走了50步:

(动图,图片地址:i.stack.imgur.com/yMhPe

事实上,这里的绘图和动画可以用一个长度为77的代码片段来完成:

ListAnimate[ArrayPlot[#,ColorRules->{0->Black,1->Blue,2->Red,3->Yellow}]&/@w]

长度为100的代码片段

GeoGraphics[{GeoStyling[Opacity[0.5]], NightHemisphere[]}, GeoBackground -> GeoStyling["ReliefMap"]]

作者一直想着以某些漂亮的Geo函数作为长度为100的代码片段,但最终在Tweet-a-Program上找到了一个漂亮的例子,因此只需要把它偷过来。上面的代码生成了一幅展示当前地球上能被太阳找到的地方的地图。它在一个浮雕地图上为夜半球覆盖上了一层半透明的阴影。


长度为143和144的代码片段

(感谢评论中

的翻译)

最后这一刻我等了好久,有些迫不及待了。我之前提到Mathematica可以求方程的数值解,也可以解微分方程。现在我想举一个很有价值的例子。

假设在一杆上的双摆问题(即两个单摆连在一起),并且每个杆都是单位长度。每个单摆都是单位质量。在此,我也用到单位重力来缩短公式。下面143个字符的代码片段解出了这个系统运动所遵循的拉格朗日方程(未知参量为单摆的角度和角动量)。更详细的戳这里,当然,如果你熟悉拉格朗日理论的话,这只是个很简单的练习。

代码很难读,是为了这143字符的长度

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立即给出了一个非常整齐的答案,用缩略图像展示了方程的解:

但上述结果有些生硬,我们想知道双摆的运动实际是什么样子的。因此,我写了这个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}

结果如图:(动图,图片地址:i.stack.imgur.com/3WS9q

PS:我不得不作点弊:如果画图超过t=30,ParametricPlot将会画很少的点,并且线条将会变成锯齿状。但有趣的动力学刚好发生在这个时
间后,因此我用了这个选项PlotPoints -> 200 来使下半部分的运动更顺滑。没什么实质的区别,而且上半部分会看不出什么不同。


(译者注:如果要尝试运行这两段代码,在运行143之后,144之前,应该要加一个{θ, φ} = {θ, φ} /. %[[1]] 。作者省去了这一步。)

---


以上是全文。


最后,有兴趣的可以关注一下我的这个收藏夹,专门收集Mathematica在知乎里的各种奇妙应用:Mathematica - 收藏夹

继续浏览内容
知乎
发现更大的世界
打开
Chrome
继续
我拿来玩比较多……正经计算少,已经完全不是编程、计算工具类。

首先,绘图

以前用数学函数 plot 坐标轴 绘制的皮卡丘。
那么我们就可以依据这个特征来制作动画
有屏幕的地方就有东方Project的Bad apple。
视频点击
acfun.tv/v/ac1709546

然后我们来玩下乐器演奏功能。

mathematica里面内置了估计又100种左右的音色,具体请自行查找关于SoundNote的信息。

另外还不止这些,它除了可以输出超低音C-1到高音B9,还可以输出半音那种东西,像上面写的C#,Cb这些,所以只要稍微有点了解音乐乐谱和mathematica的话,就可以拿它来演出音乐了~

为了方便后面的演奏,我们需要写个简单的函数先,可以输出从指定的一个音,比如说C4,往上数或者往下数n个音的那个音符,比如C4+7=C5,C4+1=D4,C4-1=B3这种:

Letter2Num[letter_] := 
  Switch[ToUpperCase[letter], "C", 1, "D", 2, "E", 3, "F", 4, "G", 5, 
   "A", 6, "B", 7];
Number2Letter[num_] := 
  Switch[num, 1, "C", 2, "D", 3, "E", 4, "F", 5, "G", 6, "A", 7, "B"];
GetTone[base_, idx_] := 
 Module[{tone = Characters[base][[1]], step = Characters[base][[2]]}, 
  Number2Letter[Mod[Letter2Num[tone] - 1 + Mod[idx, 7], 7] + 1] <> 
   ToString[ToExpression[step] + Floor[idx/7]]]
实践测试《一闪一闪亮晶晶》
GetMusicSingleTone[i_] := 
  Module[{}, 
   If[i == 0, Play[0, {t, 0, 1}], SoundNote[GetTone["C4", i], 1]]];
(*一闪一闪亮晶晶*)
xingxing = Flatten[Riffle[{
     IntegerDigits[1155665],
     IntegerDigits[4433221],
     IntegerDigits[5544332],
     IntegerDigits[5544332],
     IntegerDigits[11556654433221]
     }, 0]];
Sound[Table[GetMusicSingleTone[#[[i]]], {i, 1, Length[#]}], 
   20] &[xingxing]

第一人称视角模拟游戏

这是一个叫Vespa的博主做的一个游戏。他是浙大研究生,印象中是图像处理跟微波光子学专业的,恩,也是跟我一样拿Mathematica当玩具玩的,不过他玩得溜。

Mma设置3D视角有很多参数,他只用两个:ViewVector和ViewAngle。
前者可以指定两个点,表示视角是站在A点往B点方向看过去。
后者是模拟相机的半角,可以直接理解成视角大小,效果上等价于缩放;因为我们绘图的窗口是恒定大小的,现在看的位置和方向也指定好了,那么这个角度越小,说明显示在绘图窗口的东西只是在3D世界中很小的一点,但是这一点却要放满整个窗口(我们的眼睛),换言之我们可以看到更多细节,也就是放大效果;【其实这个跟我们想模拟的没什么关联,毕竟跑酷运动员眼睛是不可能任意改变视野角度的是吧,但是Mma比较烦一点就是,你不设置这个,它就自己“自适应”地变化,无奈之下只好手动把这个参数定死】。
代码:github.com/Vespa314/Mat

2048游戏

2D版本 blog.wolfram.com/2014/0
3D版本 Poor performance from Graphics3D

下载:
百度盘 pan.baidu.com/s/1gdGNnC
360云盘 yunpan.cn/cKxn6p6nQZScY (提取码:ffd7)
迅雷快传 kuai.xunlei.com/d/yKEuA

推箱子游戏
下载链接:
百度盘 pan.baidu.com/s/1hqipo6
360云盘 yunpan.cn/cKxnRtGNsIknL (提取码:497d)
迅雷快传 kuai.xunlei.com/d/yKEuA

解24点游戏
Poke24[nums_] := Module[{toExprs, expand, next, exprs}, 
toExprs[x_, y_] := 
"(" <> # <> ")" & /@ 
Flatten[{x <> # <> y, y <> # <> x} & /@ {"+", "-", "*", "/"}]; 
expand[set_] := 
Flatten[ 
Function[sub, 
Append[Complement[set, sub], #] & /@ toExprs @@ sub] /@ 
Subsets[set, {2}], 1]; 
next[sets_] := Flatten[expand /@ sets, 1]; 
exprs = Flatten[Nest[next, {ToString /@ nums}, Length[nums] - 1]]; 
Select[DeleteDuplicates[exprs], Quiet[ToExpression[#] == 24] &]] 


In[2] := Poke24[{3, 4, 5, 7}] 
Out[2] := {((3*4)+(5+7)),((5+7)+(3*4)),((3*4)+(7+5)),((7+5)+(3*4)),((3*4)*(7-5)),((7-5)*(3*4)),(7+(5+(3*4))),((5+(3*4))+7),(7+((3*4)+5)),(((3*4)+5)+7),(5+(7+(3*4))),((7+(3*4))+5),(5+((3*4)+7)),(((3*4)+7)+5),((4*3)+(5+7)),((5+7)+(4*3)),((4*3)+(7+5)),((7+5)+(4*3)),((4*3)*(7-5)),((7-5)*(4*3)),(7+(5+(4*3))),((5+(4*3))+7),(7+((4*3)+5)),(((4*3)+5)+7),(5+(7+(4*3))),((7+(4*3))+5),(5+((4*3)+7)),(((4*3)+7)+5),((3+5)*(7-4)),((7-4)*(3+5)),((5+3)*(7-4)),((7-4)*(5+3)),((4*5)-(3-7)),((5*4)-(3-7)),(4-(5*(3-7))),(4-((3-7)*5)),((7-3)+(4*5)),((4*5)+(7-3)),((7-3)+(5*4)),((5*4)+(7-3)),(4+(5*(7-3))),((5*(7-3))+4),(4+((7-3)*5)),(((7-3)*5)+4),(3*(7-(4-5))),((7-(4-5))*3),(3*(7+(5-4))),((7+(5-4))*3),(3*((5-4)+7)),(((5-4)+7)*3),(7-(3-(4*5))),(7+((4*5)-3)),(((4*5)-3)+7),((7+(4*5))-3),(((4*5)+7)-3),(7-(3-(5*4))),(7+((5*4)-3)),(((5*4)-3)+7),((7+(5*4))-3),(((5*4)+7)-3),(3*(5-(4-7))),((5-(4-7))*3),(3*(5+(7-4))),((5+(7-4))*3),(3*((7-4)+5)),(((7-4)+5)*3),(3*((5+7)-4)),(((5+7)-4)*3),(3*((7+5)-4)),(((7+5)-4)*3),(4*(3*(7-5))),((3*(7-5))*4),(4*((7-5)*3)),(((7-5)*3)*4),(3*(4*(7-5))),((4*(7-5))*3),(3*((7-5)*4)),(((7-5)*4)*3)}

甚至更复杂的创建符号数学所支持的计算机动画
作者:加刘景长
链接:https://www.zhihu.com/question/27834147/answer/38388593
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



游戏《模拟城市3000》(SimCity 3000)就有利用 Mathematica 实时生成数学上正确的道路网。


图片去水印
调用Mathematica的Inpaint函数,Mma语法支持直接把图片当做参数直接传进去。

抓取相册图片

调用变量XMLElement,结构化源文件。也是Vespa写的API。
DownLoadDouBan[CurPage_, URL_] := 
 Block[{st, PicAddress, rawpic, NextPage},
  (*Print[URL];*)
  (*读取源文件*)
  st = Import[URL, "XMLObject"];
  (*获取图片URL*)
  PicAddress = Cases[st,
    XMLElement["li", {___, "data-id" -> ___, ___},
      {___, XMLElement["div", {"class" -> "cover"},
        {___, XMLElement["a", {"shape" -> "rect", "href" -> ___},
          {___, XMLElement["img", {"src" -> src_}, {}], ___}
          ], ___}
        ], ___}] :> src, {0, Infinity}];
  (*转成大图URL*)
  rawpic = StringReplace[#, "thumb" -> "raw"] & /@ PicAddress;
  Print[rawpic];
  (*输出*)
  Export["e://" <> StringSplit[#, "/"][[-1]], Import[#]] & /@ rawpic;
  NextPage = Cases[st,
    XMLElement[
      "a", {___, "href" -> src_, ___}, {ToString[CurPage + 1]}] :> 
     src, {0, Infinity}];
  If[Length[NextPage] != 0, 
   DownLoadDouBan[CurPage + 1, NextPage[[1]]], Return]
  ]



统计字母频率,加密、破解字母频率密码
调用DictionaryLookup函数,它可以返回各门语言的单词,还可以根据正则表达式之类的输入来搜索单词,想要找出字母组成的单词代码如下。

获取所有单词的信息,代码和结果

把上面的结果以列表的形式显示出来,对每个字母出现的频率排序。


寻找最相似的汉字
这个是顾森(Matrix67)的博客看到的,嗯,还是要吐槽下这数学达人是北京大学中文系应用语言学……

调用函数Rasterize,以图片的格式输出运算结果。比如,下面这个句子可以打印出 (x+1)^n 的展开式的“倒影”:

可以利用这个函数很方便地分析汉字在图象上的性质。函数 Binarize 可以把图象转换为单色单通道, ImageData 则可以把图象转换成数组的形式,以便我们定量分析。

可以把一个汉字转换成 12*12 的 01 矩阵:

利用这个特征,可以做一张“汉字视力表”。

制作蒙太奇马赛克拼图
imagePool = Map[With[{i = Import[#]}, {i, Mean[Flatten[N[i[[1, 1]]], 1]]}] &, FileNames["Pool/*.jpg"]];
closeMatch[c_] := RandomChoice[Take[SortBy[imagePool, Norm[c - #[[2]]] &], 20]][[1]];
Grid[Reverse[Map[closeMatch, Import["MasterImage.tif"][[1, 1]], {2}]], Spacings -> {0, 0}]
”Pool/*.jpg”是图库;”MasterImage.tif”是目标图片。


构建一个显示所有气象站的地球仪
显示出世界各地气象站位置的地球仪。
map = Join @@ ((List @@ First@CountryData[#, "Polygon"]) & /@ 
     CountryData[]);
coordsToXYZ[list_] := 
  Transpose[{Cos[#[[1]]]*Cos[#[[2]]], Cos[#[[1]]]*Sin[#[[2]]], 
      Sin[#[[1]]]} &@Reverse@Transpose[list*Pi/180.]];
stations = WeatherData[];
coords = coordsToXYZ[{WeatherData[#, "Longitude"], 
      WeatherData[#, "Latitude"]} & /@ stations];
globe = First@
   ParametricPlot3D[.99*{Sin[u] Sin[v], Cos[u] Sin[v], 
      Cos[v]}, {u, -\[Pi], \[Pi]}, {v, -\[Pi], \[Pi]}, 
    MaxRecursion -> 4, Axes -> None, PlotStyle -> Opacity[.5]];
Graphics3D[{globe, Black, Line /@ coordsToXYZ /@ map , Red, 
  Point@coords}, Boxed -> False, ImageSize -> Medium, 
 Lighting -> "Neutral"]
分析图像中的分段细胞
对分段图像采用 blob 分析技术,标记显微镜图像中完整且不重叠的细胞位置和大小。

分析道路网络
与图像处理功能结合,建立并分析道路网络. 突出显示预定区域内的街道。
img = WolframAlpha["Champaign IL", {{"Map:CityData", 1}, "Image"}];
g = MorphologicalGraph[Binarize[ColorNegate[img]], 
   EdgeStyle -> LightGray];
Row[{img, 
  HighlightGraph[g, NeighborhoodGraph[g, 400, 20], 
   ImageSize -> {256, 278}, VertexSize -> {400 -> 15}]}]


人脸识别
调用函数FindFaces以边界框列表的形式返回检测到的人脸


从图像提取字符
调用TextRecognize函数识别图像中的文本并返回一个字符串。


识别条纹码跟二维码

调用BarcodeRecognize函数识别图像中的条形码、二维码并将其作为字符串返回。




查找单词
调用WordData函数,可以查找单词意思。
In[8]:= WordData["需要查的单词", "Definitions"]


Mathematica的强大甚至能导入导出所有标准光栅、向量以及三维几何和建模格式,比如 Maya、3DS、VRML、 FLV、POV、DXF、SVG、EPS、PDF、TIFF、GIF 等等,先进的图形指令支持光源、曲面的镜面反射度、几何上正确的透明度等,与数据库、网络服务、C/C++、Java和.NET 框架,以及带有自动输出的 C 和 Fortran 代码即时连接。皮克斯、工业光魔、迪士尼那些都有用这个开发特效算法的程序。


参考资料
[1]Vespa的个人博客 http://www.kylen314.com/
[2]Matrix67的个人博客 matrix67.com/
[3]wolfram官方文档 wolfram.com/support/?
[4]制作蒙太奇马赛克拼图 blog.wolfram.com/2008/0
[5]解24点游戏
demonstrations.wolfram.com
douban.com/group/topic/
[6]人脸识别 FindFaces—Wolfram Language Documentation
[7]画皮卡丘的方程 Sina Visitor System

暂时这样吧,以后想到好玩的再更新。
 
 
 
作者:mmjang
链接:https://www.zhihu.com/question/27834147/answer/38296157
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

爬网页
老爸没事喜欢看看糗事百科,所以就到糗事百科网站上爬了一通制成电子书扔进kindle给他看了。随手写的,很乱:
page = 99(*最大可以是1000*);
CreateDirectory["qiushi"];
getContent = 
  Cases[#, XMLElement[
      "div", {"class" -> "content", "title" -> _}, {str_String}] :> 
     StringReplace[str, "\n" :> ""], Infinity] &;
getPicture = 
  Cases[#, XMLElement[
      "div", {"class" -> "thumb"}, {_, 
       XMLElement[
        "a", _, {"\n", 
         XMLElement["img", {"src" -> str_String, _}, {}], "\n"}], 
       "\n\n"}] :> str, Infinity] &;
Print[Dynamic[n]];
allArticle = 
  Flatten[Table[
    x = n; {getContent[#], getPicture[#]} & /@ 
     Cases[Import[
       "http://www.qiushibaike.com/month/page/" <> ToString[n], 
       "XMLObject"], 
      XMLElement[
       "div", {"class" -> "article block untagged mb15", 
        "id" -> _}, _], Infinity], {n, 1, page, 1}], 1];
htmlExport[{{content_String}, {img_String}}, num_] := 
  Module[{image}, 
   image = Export["qiushi//" <> ToString[num] <> ".jpg", Import[img]];
    "
" <> content <> "
\n ToString[num] <> ".jpg\"/>\n

<---------------->

\n " ]; htmlExport[{{content_String}, {}}, num_] := Module[{image}, "
" <> content <> "
\n

<---------------->

\n\[IndentingNewLine]"]; htmlExport[{{}, {img_}}, num_] := Module[{image}, " ToString[num] <> ".jpg\"/>\n

<---------------->

\n" ]; htmlExport[{{}, {}}, num_] := ""; joined = StringJoin@text; n = 0; text = (n++; htmlExport[#, n]) & /@ allArticle; joined = StringJoin @@ text; Export["qiushi/qiushibaike.html", "" <> joined <> "", "Text"]

此程序最后会在文档的qiushi文件夹下生成一个html文件:

然后calibre等等软件就可以生成epub、mobi等等文件

串口通讯
Y同学有段时间一直在调试一个单片机上用的速度传感器,搞得焦头烂额,因为想观察传感器的实时变化情况。沃用Mma大法的第10版新出串口通讯功能给他做了个类似于示波器的东西:
obj = DeviceOpen["Serial", "COM3"]
DeviceReadList[obj, 14]
{62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 61, 61, 61}
bug = ConstantArray[0, 250];
getStream := DeviceReadList[obj, 14] // FromCharacterCode;
list := ToExpression@StringSplit[getStream][[2]];
append := AppendTo[bug, DeviceRead[obj]];
Dynamic[append; bug = Take[bug, -250]; 
 ListLinePlot[bug, PlotRange -> {{0, 250}, {0, 200}}, 
  ImageSize -> 300]]
Dynamic[Slider[DeviceRead[obj], {0, 180}]]

没法上图了,这得插上单片机才有用。

汉字拼图
轻松用汉字拼出任意图片!
characters=Flatten[Table[FromCharacterCode[{i,j},"CP936"],{i,160+16,160+55},{j,161,254}]];
CurrentImage[];
Pause[5];
img=ColorConvert[CurrentImage[],"Grayscale"];
i=0;
lightFunction[ch_]:=Total[Flatten[ImageData[Binarize@Rasterize[ch]]]]/(13*16);
Print[Dynamic[i]];
(i++;light[#]=lightFunction[#])&/@characters;
i
i=0;
Print[Dynamic[i]];
result=Map[(i++;SortBy[RandomSample[characters,1000],Function[ch,Abs[light[ch]-#]]][[1]])&,ImageData[ImageResize[img,100]],{2}];
i
Export["hanzi.txt",Append[#,"\n"]&/@result//StringJoin//StringJoin]//SystemOpen;
程序运行时间比较长,结束后应该会弹出一个记事本文档,在菜单-格式-字体里将字号设小一点应该就能看到效果了:
 
作者:燕南
链接:https://www.zhihu.com/question/27834147/answer/38428144
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

題主要看一些有趣的應用,Wolfram 公司的官方博客有個精華區 blog.wolfram.com/catego,裡面有不少很養眼的例子。

Mathematica / Wolfram語言 的一些特性,如函数式编程,符号計算,模式匹配,還有近期(第9、10版 Mathematica)開始發展出的 knowledge-based programming 的概念,等等,使得她在適合她的問題上可写出代码密度异常高而優雅的解決方案。目前排名排名第一的

的回答(及其引用的 codegolf.stackexchange.com 原帖「popularity contest」)里有相當的體現。

另一例:幾年前看到過一則 Wolfram 官方博客(原帖: Always the Right Time for Mathematica…),用 Mathematica 和 MATLAB 分別來畫一個會走的鐘,大致樣子如下:


用 Mathematica 程序實現的代碼長度比 MATLAB 短很多(這是一個人為選擇的例子,不要過度解讀):

和任何武器一樣,很多特性都是有代價的,是優點還是雞肋甚或是缺點,在實際中往往需要由使用者的需求和「敵人」的特徵決定。沒有一個工具是真正全能全強的。
 
5.11更
——————————————
之前的功能太简陋了,又加了一点
 

电影Interstellar中的黑洞视觉特效初期是使用Mathematica完成的(Creating Academy Award-Winning Visuals Starts with Mathematica and the Wolfram Language),该电影获得第87届奥斯卡最佳视觉效果奖。

电影Arrival中对外星人heptapods语言的分析是真实用Mathematica完成的(Analyzing and Translating an Alien Language: Arrival, Logograms and the Wolfram Language)。一个相关项目已经在github上开源(WolframResearch/Arrival-Movie-Live-Coding)。



作者:每半年改一次
链接:https://www.zhihu.com/question/27834147/answer/179732497
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

电影Interstellar中的黑洞视觉特效初期是使用Mathematica完成的(Creating Academy Award-Winning Visuals Starts with Mathematica and the Wolfram Language),该电影获得第87届奥斯卡最佳视觉效果奖。

电影Arrival中对外星人heptapods语言的分析是真实用Mathematica完成的(Analyzing and Translating an Alien Language: Arrival, Logograms and the Wolfram Language)。一个相关项目已经在github上开源(WolframResearch/Arrival-Movie-Live-Coding)。



作者:每半年改一次
链接:https://www.zhihu.com/question/27834147/answer/179732497
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 
作者:HyperGroups
链接:https://www.zhihu.com/question/27834147/answer/2122655819
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Wolfram到底有多厉害,虽然我经常看到这个问题,也一直想回答,但是我的风格是玩的东西很多,精心整理不多,因为社畜996嘛,就一直没有当回事。

具体的其实也有原因,就是我在mathematica的能力上限上进行探索的时候,经常发现这玩意不太行。——!一边要吹着它多厉害,一边想着这玩意怎么这么lj——,是不是有点难受。哈哈。




先通用点评一下。找找自己历史的作品中,有没有能让人震惊的东西。

1、核心语言里面,有各种范式的编程,语言法糖,可以变着花样吃。

早期的时候玩语言多,后来不太玩,目标是想着办法把一个东西快速弄出来。

工作中的话,后续迭代,加入了数据结构之类的功能,可以用来刷题。


2、数据分析、数据处理里面,可以快速进行临时性的变着花样的写代码,快速完成一些处理。

多媒体数据的集成处理是一个好玩的点,文本、数据、图像、视频、图、点云、3维数据等等。

3、可视化这一块,除了通用的可视化,大家了解得比较多以下,另一个扩展的话,是与三维软件对接去做可视化,直接在Mathematica或用Link或在其他软件生成最终Sota成品效果级的作品。

12.3加入了MaterialShading功能,也扩展了这一方向。

作为3D软件的Mathematica

家居设计软件,造房子和装修使用


4、机器学习这一块一直在跟进,可以训练一些模型用于生产级别。

这是我的专栏,里面有不少例子,不过懒得更新,大家参与度也不够,欢迎一起来玩哈。

可以优雅地结合-传统图像处理+机器学习+深度学习,单步单步输出结果,可视化去玩,方便初学者。

要说震惊嘛:反正别的软件能搞的咱们也差不多都能搞嘛,这样这个科学计算器就让人震惊了

图像识别一键打谱,训练围棋AI等等。


5、符号计算,

做作业,画图,图文结合,随便翻了一个自己以前的作业例子

可以把数学系所有课后习题全部用mma做一遍。

还能调matlab\maple一起来做作业,也能模仿matlab\maple的语法来写命令

6、太大了,偏数学


7、字符串和文本

这个是最有用的,StringCases等可以用字符串模式提取结构化信息,而不用学正则表达式。当然学了更强大。

7.1、在阅读时,把你希望的生词全部标记出来。

写一个DIY的搜索推荐系统

8、图论,Pass,可以结合爬虫做。迷宫啊,搜索啊,路径啊,做题啊有许多可玩性。

9、图像处理

那可玩的太多了,还能在图片-几何-3维之间互转换。以图搜图,图片特效,图像生成。

9.1、图像处理之彩球填充动态版

9.2、设计笔记本贴膜


特效,结合曲线、曲面、图像处理等等功能

weibo有不少作品。

9、几何,我的菜。

10、声音

10.1、音频分割,之前做听力的时候,整个事情临时起意,2个小时最终全部完成。

10.2、乐器音乐生成与MIDI处理,几行代码就可以切换音色了。

11、实体表示,这一块蛋疼的就是下载太慢。

12、实序数据

偏向滤波、信号处理等底层支撑函数,但是可以直接或辅助生成音乐-图片作品,像拉冬变换等函数均可以用于图片的特效层。

绝世好剑最终效果


13、地理数据与可视化,14、科学医节数据,玩得不多。

15、工程计算、图像处理、信号处理,上面已经提到。

16、金融,今年做过一个区块链和数字货币的数据分析,没整理。

17、语言学,单词相关的案例

18、Notebook是个可编程对象,可以把处理Cells之类的,做一些开发。实现一些好玩的,比如把文档输出成HTML或MarkDown格式。

网页设计,图文排版之类的。


先这样吧,我自己都看不过来我自己玩过的东西。。。


最后,最近发起了一个【Wolfram帝国时代计划】话题已建立,首先是个人向的,这个计划是这样的,扩展Wolfram技术在业界的应用上限,让各界朋友们参与进来,探讨解决一些痛点问题,搞些实际的项目,欢迎一起来参与玩呀,玩的多了我们可以再弄个【Wolfram宇宙计划】——!

 
 
 
 
 
 
 
 
 
  • 上一篇文章: 如何理解偏微分和全微分

  • 下一篇文章: 辛钦常数
  •    
    [注:标题搜索比内容搜索快]
    发表评论】【告诉好友】【打印此文】【关闭窗口
     最新5篇热点文章
  • 轨道钢承重计算公式及应用[109]

  • 【选型】如何为变频器选取阻值…[82]

  • AIS2023参展厂商名录[343]

  • AGV综合选型[170]

  • APIE 2023第4届亚太国际智能装…[138]

  •  
     最新5篇推荐文章
  • 外媒:正在唤醒中国的习近平[305]

  • 中国反伪科学运动背后的CIA黑手…[494]

  • [转载]袁隆平真言:中国最大的…[667]

  • 台专家:当年我们造IDF时 大陆…[572]

  • 旅日华人:中国严重误判日本民…[577]

  •  
     相 关 文 章
    没有相关文章

      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
        没有任何评论
    设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 | 
    版权所有 Copyright© 2003 晨光科技        站长:璀璨星辰        页面执行时间:269.53毫秒
    Powered by:MyPower Ver3.5