学习Mathematica
【转载请注明出处】http://www.cnblogs.com/mashiqi
2017/12/07
0、杂:
Mathematica的自带函数的首字母一定是大写的,参数输入要用中括号[],而不是圆括号()。
一个命令后面加分号“;”表示不输出结果(不加分号就输出结果),这点和Matlab是一样的。最好一行一个命令,不管有没有分号,否则的话结果可能和预期的不一样,这点和Matlab不一样。输入完命令直接按Enter是换行,按Shift+Enter才是执行该命令,至于输不输出结果,那就看有没有加分号。
可以用“Information[x]”来查看x是否被使用了或者怎样定义了。
百分号“%”被用来表示上次的输出结果,有时直接用“%”挺方便的。然后“%%”表示倒数第二次的输出结果,“%%%”表示倒数第三次的输出结果,以此类推。
“/.”这个运算的函数名称是“ReplaceAll”,可以通过键入“ReplaceAll”并选中然后按F1查看文档,“/.”有时可以用来进行变量替换。
“//”这个运算符表示把后面的东西作用到前面。比如“2 // Sin”表示Sin[2]。它也可以接连使用,“2 // Sin // N”就可以计算出Sin[2]的具体值。
comment:(* the things within comment *)
想要清除变量M的值,可以用语句:M=. 另外,Clear[x]是清除变量x的值,Remove[x]是删除x。
1、查询函数:和matlab一样选中函数名然后按F1,或者?Int,?*Int,?Int*,?*Int*,然后Shift+Enter
任何函数,都可以通过在前面加问号?,好查询此函数的使用方法
2、定义函数:f[x_,y_]:=x^2+y^2
指数函数要用Exp[] 或者E^...,圆周率3.1415...是Pi
3、定义分段函数:
f[x_] := Piecewise[{{E^(-1/(1 - x^2)), -1 < x < 0}, {E^(-1/(1 - (2*x)^2)), 0 <= x < 1/2}}, 0]
Plot[f[x], {x, -2, 2}]
其中第一句末尾方括号左边的那个0,表示otherwise时,函数$f(x)$的取值。
4、函数画图:
Plot[f,{x,-1,1},PlotLegends -> "Expressions", PlotRange -> {{-1, 1}, {-2, 2}}] ;
Plot[D[f[x], {x, 1}], {x, -2, 2}]会出错,但是Plot[f'[x], {x, -2, 2}]不会。对,是的!求导可以直接用“'”符号!
Plot3D[f,{x,-1,1},{y,-1,1}] ;
ContourPlot[y^2 == x (x - 1) (x + 1), {x, -2, 2}, {y, -2, 2}] ;
PlotLegends -> "Expressions"表示用函数表达式作为图像曲线的legend;
PlotRange -> {{-1, 1}, {-2, 2}}表示显示范围(横轴-1到1,纵轴-2到2)。
ContourPlot的作用和GrafEq比较像,可以直接根据x和y的隐式关系画图,而不用一定把y写成x的函数。但是我对比过了,同样的图像,GrafEq画的慢但最终结果清晰,Mathematica的ContourPlot画的快但没那么清晰。
Mathematica的Manipulate功能:Clear[f]; f[x_,a_]=Sin[a*x]; Manipulate[Plot[f[x,a],{x,-1,1}],{a,1,2}]
5、Manipulate 动态参数离散化:
Manipulate[ Sum[(2 I*R)^j/((j!)*(t + j + 1))*k^j, {j, 0, Infinity}], {t, 0, 20, 1, Appearance -> "Labeled"}]
{t, 0, 20, 1, ...}中的最后一个“1”是用来指定步长的。指定了之后,Manipulate就会对t进行离散显示了(不指定,就是连续显示)。Appearance -> "Labeled"的作用是将动态参数的具体数值在操作框旁边显示出来。
6、Range产生数组:“x={5,2,1,E^I};”命令可以产生数组。也可以通过“y=Range[1,20];”的方式来产生数组,引用第n个元素是“y[[n]]”。“y[[-1]]”表示引用最后一个元素,“y[[-2]]”表示引用倒数第二个元素。“;;”可实现切面操作,x[[2;;4]]={2,1,E^I}。当x和y都是同样长度的List的时候,“x*y”的作用和Matlab中的点乘“.*”效果一样。
7、Refine,Element, 使用假定:“Refine[Im[I*x], Element[x, Reals]]”命令可得到“x”。但是Refine只能给出一个假定。
我们可以用Assuming来给出多个假定。将多个假定,放在Assuming参数的最前,然后后面是一个具有Refine的表达式:“Assuming[(a>0)&&(b>0),......]”。
Element[x,Reals]表示$x \in \mathbb{R}$,即变量x的取值都将会是实数,所以变量x按照实数处理。
8、求导链式法则:直接输入$Dt[f[g],x]$即可得到$\frac{\text{d}}{\text{d}x} \big( f \circ g \big) (x)$的输出。但是输出结果不是LaTeX格式的,所以可以紧接着用局语句“TeXForm[%]”得到结果的LaTeX表达式。
有时我们需要对PDEs中的各项进行变量替换,比如把$\frac{\text{d}}{\text{d}x} f(x)$换成$\frac{\text{d}}{\text{d}y}g(y)$(其中$f(x)=g(y)$)。比如我想把$x$换成$\frac{1}{x}$,那么我可以令$y = \frac{1}{x}$、令$g(y) = f(x)$,然后用$g$对$y$的各阶导数$g^{(n)}(y)$来表示$f^{(n)}(x)$。那么我们可以使用以下语句:
(* Example 1 *)
y[x_] = 1/x;
Dt[g[y[x]], {x, 2}];
% /. x -> InverseFunction[y][y];
Refine[%,y!=0]
(* Example 2 *)
y[x_] = 1/Sqrt[x];
Dt[g[y[x]], {x, 3}];
% /. x -> InverseFunction[y][y];
Refine[%, y > 0]
9、纯函数(pure function)和Map:
纯函数的作用的在不给函数命名的情况下直接带变量进入一个表达式。具体例子如下:
(* pure function *) (#^2) & [a + b] (* 结果是:(a+b)^2 *) (#1 + #2 + ##3) & [a, b, c, d, e] (* 结果是:a+b+c+d+e *)
后面的方括号就是这个纯函数的参数列表。必须用方括号框起来,这和函数的参数是一样的。
当纯函数只有一个参数值时,可以用Map函数将多个参数组送入纯函数进行计算:
(* single-slot pure function apply to multiple argument *) (#^2) & /@ {a, b, c} (* 结果是:{a^2,b^2,c^2} *) (#^2) & /@ {a + b, c} (* 结果是:{(a+b)^2,c^2} *)
当想讲多组参数组送入一个具有多个参数的纯函数时,可以使用MapThread (MapThread好像没有简写),或者使用Apply (可以简写为@@或者@@@):
{x, y} = {{1, 2, 4}, {3, 4, 6}}; (* multi-slot pure function apply to multiple argument sets, usingMapThread *) MapThread[#1^2 + #2^2 & , {x, y}] (* 结果是:{10,20,52} *) (* multi-slot pure function apply to multiple argument sets, Apply (@@@) *) (#1^2 + #2^2) & @@@ Transpose[{x, y}] (* 结果是:{10,20,52} *)
以下几个操作均看不明白为什么。不明白为什么:
Map[(#^2) & , a + b + c] (* 结果是:a^2+b^2+c^2 *) (#^2) & /@ (a + b + c) (* 结果是:a^2+b^2+c^2 *) Map[(#^2) & , 1 + 2 + 3] (* 结果是:6 *) (#^2) & /@ (1 + 2 + 3) (* 结果是:6 *)
10、算置信区间和分位数:
data = {506, 508, 499, 503, 504, 510, 497, 512, 514, 505, 493, 496, 506, 502, 509, 496}; n := 16; alpha := 0.25; muMin = Mean[data] - Variance[data] / Sqrt[n]* Quantile[StudentTDistribution[n - 1], 1 - alpha/2] %% Quan...部分是计算student分布的概率为1-alpha/2的分位数 muMax = Mean[data] - Variance[data] / Sqrt[n]* Quantile[StudentTDistribution[n - 1], alpha/2] sigma2Min = (n - 1) Variance[data] / Quantile[ChiSquareDistribution[n - 1], 1 - alpha/2] sigma2Max = (n - 1) Variance[data] / Quantile[ChiSquareDistribution[n - 1], alpha/2]
11、everything is an expression:
其实在Mathematica的世界里,一切都是“表达式”。可以看这篇官方的tutorial:http://reference.wolfram.com/language/tutorial/EverythingIsAnExpression.html
12、patterns:
关于下划线(在Mathematica中,下划线叫Blank)在Mathematica中的意义,看这篇:http://reference.wolfram.com/language/ref/Blank.html
关于Patterns,看这篇:http://reference.wolfram.com/language/tutorial/Introduction-Patterns.html
我们可以具体指定某个patterns中的某个expression的具体Types。比如g[x_]是一个pattern,如果我们想让x_这个expression只能是整数,我们可以用x_Integer,所以整个expression就变为了g[x_Integer],这时,只有Head是Integer的expression才能匹配上这个x_Integer了。看这篇:http://reference.wolfram.com/language/tutorial/SpecifyingTypesOfExpressionInPatterns.html