Mathematica基础教程
本文介绍mathematica的基础内容,帮助读者快速地入门Mathematica
1.基础知识
Mathematica中输入语句按shift+enter执行,如果不想显示输出结果,则在句尾加入分号,一次性可输入多条语句。
?+函数名查找帮助
*……*是注释内容
2.变量
2.1变量的取名
变量名以英文字母开头,背后可以跟字母数字,一般来说,推荐变量用小写字母。
2.2变量的赋值
变量的赋值有以下几种形式
1、“等号赋值”
x=value 给x赋值value
x=y=value 给x和y同时赋值value
{x,y}={value1,value2} 给x赋值value1, 给y赋值value 2
x=. 给x赋予空值,即消除x的值
Clear[x] 清除变量x的定义和值
2.3变量替换
expr/.lhs->rhs 用rhs替换lhs
expr/.{lhs1->rhs1, lhs2->rhs2, ……} 分别用rhs替换lhs
注意替换的内容可以是表达式中的任意成分,可以为变量名,也可以为函数名
3.表
List数据结构就是用花括号括起来,用逗号分隔的一类数据类型,里面的元素可以为任意类型,和Python当中的List类似
3.1表的生成
3.1.1建表函数
Table[ ]用通项公式生成列表
Range[ ]制定初值,终值和步长生成表
详见MMA帮助文档
3.2表中元素的引用
s[ [ i ] ]表示表s中第i个元素
s[ [ -i ] ]表示表s倒数第i个元素
多维list中 :
s[ [ i ] ]表示第i 个子表
(千万注意索引的数字是要加上一个方括号的)
3.3表的运算
表的运算和Python当中多维数组运算时一样的,都是逐元素操作。
表还可以作集合运算,计算有关集合的问题,调用Union函数计算并集,调用Intersection函数计算交集,调用Complement函数计算补集
4.函数
圆括号用来表示运算的组合关系,函数变量都是在方括号里面。MMA中的函数首字母都是大写的
4.1自定义函数
要采用“f[x_]:=……”的形式定义,注意两个点,左边的变量x_一定要加下划线,右边的等号是“:=”(因为x_表示任意变量名为x的单一表达式,类似于形式参数)
例如:
In[1]:=f[x]=x+1
Out[1]=x+1 (这说明并没有定义函数,只是把f[x]当做是一个变量而已,这个变量是x+1)
In[2]:=f[1]
Out[2]=f[1] (这说明仅仅是定义了f[1]这个变量)
In[3]:=f[x_]=x+1
In[4]:=f[3]
Out[5]=4
还可以定义任意多元的函数f[x_,y_,z_……]:=epxr
后面的函数体还可以是多条语句
f[x_]:=(y=Max[x];z=Min[x];y^2+z^2)
另外,还可以定义只对某一类型变量生效的函数,参数数目可变的函数,用的较少,具体参见中科大Mathematica教程。
4.1.1“=”与“:=”的区别
“=”是即时赋值,赋值号右边的等式在定义的时候立刻被求值
“:=”是延时赋值,赋值等式右边的表达式在定义的时候不会被立刻求值,而是在执行调用规则的时才会被求值
例如:
In[1]:=x=1;
In[2]:=f[x_]=x^2
Out[2]=1
In[3]:=g[x_]:=x^2
In[4]:={f[3],g[3]}
Out[4]:={1,9}
In[5]:=h[y_]=2y
Out[5]:=2y
In[6]:={h[3],h[4]}
Out[6]:={6,8}
4.1.2 纯函数
纯函数就是类似于Python中的匿名函数,用于想定义一个函数,但是重新定义一个变量或起一个函数名又嫌麻烦的时候。
形式:
纯函数定义的形式 | 意义 |
---|---|
Function[变量,表达式] | 一个变量的纯函数 |
Function[变量表,表达式] | 多个变量的纯函数 |
[变量(表),表达式]& | 相当于是Function定义纯函数的缩写 |
例子详见中科大Mathematica教程
5.表达式
5.1算数运算符
+、-、*、/、^
5.2关系运算符
运算符 | 意义 |
---|---|
== | 等于 |
!= | 不等 |
> | 大于 |
< | 小于 |
<= | 小于等于 |
>= | 大于等于 |
5.3 逻辑运算符
逻辑运算符 | 意义 |
---|---|
&& | 与 |
|| | 或 |
! | 非 |
Xor | 异或关系 |
Implies | 蕴含关系 |
Implies[p,q]表示,此式为真当且仅当p,q同真同假
5.4 模式替换规则
lhs->rhs定义了一个模式替换规则,而且是即时替换。相应的还有延时替换,但是用的较少,具体可以见中科大的Mathematica教程,就不细说了。
形式 | 说明 |
---|---|
expr/.rules | 对表达式expr所有的部件调用一次规则 |
expr//.rules | 对表达式expr的所有部件反复调用rules,直到结果不再变化 |
例子:
In[1]:=f[5]/.f[x_]->xf[x-1]
Out[1]:=5f[4]
In[2]:=f[5]//.{f[1]->1,f[x_]->xf[x-1]}
Out[2]:=120
In[3]:=log[a*b*c]//.log[x_*y_]->log[x]+log[y]
Out[3]:=log[a]+log[b]+log[c]
6.程序结构设计
6.1局部变量
6.1.1Module和局部变量
Module[{局部变量表},body]
body就是表达式,多条表达式之间用分号分隔,以最后一个表达式作为输出值。
例子:
In[1]:=Module[{x,y},x=1;y=2;x=x+1;x+y]
Out[1]=4
6.1.2With和局部变量
With[{x=x0,y=y0,……},body]
定义局部常量x,y……的值为x0,y0……,body是复合表达式。也就是说x,y被赋值之后是不能再次赋值的
6.2条件控制结构
6.2.1 If语句结构
If语句形式 | 含义 |
---|---|
If[逻辑表达式,表达式1] | 逻辑表达式为真,计算表达式1,表达式1的值就是整个If结构的值 |
If[逻辑表达式,表达式1,表达式2] | 逻辑表达式为真,计算表达式1;若为假,则计算表达式2 |
If[逻辑表达式,表达式1,表达式2,表达式3 | 逻辑表达式为真,计算表达式1;若为假,则计算表达式2;既非真又非假,计算表达式3 |
6.2.2 Which语句结构
Which语句结构 | 含义 |
---|---|
Which[条件1,表达式1,条件2,表达式2……] | 依次计算条件i,计算第一个条件为True的表达式的值,作为整个结构的值。如果所有条件为False,则不做任何运算 |
Which[条件1,表达式1,条件2,表达式2……,True,表达式] | 和上面类似,只不过这时候当前面的条件判断都为False的时候,计算到True必然会执行最后一个表达式 |
6.2.3 Switch结构
Switch[expr,模式1,表达式1,模式2,表达式2,……]
将表达式expr的值与模式1,模式2……依次比较,给出第一个与expr匹配的模式i对应的表达式的值,如果没有匹配的值则整个结构的值为Null
6.3循环结构
6.3.1Do语句结构
Do语句形式 | 含义 |
---|---|
Do[expr,{i,i0,i1,s} | 循环变量i从i0到i1,每次增加s,计算表达式expr |
Do[expr,{i,i1}] | 同上,当i0=1,步长=1时可以省略不写 |
Do[expr,{n}] | 计算表达式n次 |
Do[expr,{i,i0,i1,is},{j,j0,j1,js}] | i从i0到i1按步长is递增;对于每一个i,j从j0到j1按步长js递增,计算表达式expr |
6.3.2While语句结构
While[条件,循环体]
当条件为True时,执行循环体,一直循环到条件非真的时候停止
与C语言一样,也可以用k++,k–
6.4转向控制
6.4.1复合表达式内的转向控制
函数 | 意义 |
---|---|
Label[name] | 用标识符标出复合表达式的一个位置 |
Goto[name] | 转向当前过程中Label[name]位置后执行 |
6.4.2退出循环结构
函数 | 说明 |
---|---|
Return[expr] | 退出函数中的所有过程和循环,返回expr的值 |
Break[] | 结束本层循环 |
Continue[] | 直接转向下一层循环 |
Throw[expr] | 返回expr作为最近的外层的catch的值 |
例子:
In[1]:=Catch[a; b; Throw[c]; d; e]
Out[1]=c
In[2]:=f[x_] := If[x > 10, Throw[overflow], x!]
In[3]:=Catch[f[2] + f[11]]
Out[3]=overflow
6.5 程序包的设计
BeginPackage[“程序包名”]
Begin[“Private`”]
f[变量]=表达式(写包的主体)
……
End[]
EndPackage[]
7.输入和输出
常用命令 | 意义 |
---|---|
Print[expr1,expr2,expr3……] | 依次输出表达式,两个结果之间不留空格 |
Input[ ] | 读入一个表达式 |
Input[“提示”] | 显示提示之后再读入表达式 |
InputString[ ] | 读入一个输入的字符串 |
InputString[“提示”] | 显示提示之后,再读入字符串 |