1、1)简介 数学系给本科生开设一门课: "符号计算系统", 主要简单讲授 mathematica(以下简称math)软件的使用及其编程,赶兴趣的同学可以找本math书以求更深入的了解. 我们平日用到编程语言时, 大家都知道编程中用到的整型, 实型, 甚至双精度数, 都只是一个近似的数, 其精度有限, 有 效数字有限, 在很多时候达不到实际需要的要求. 符号计算与 数值计算的区别就在于符号计算以准确值记录计算的每一步的 结果, 如果需要时, 可以将精确表示按需要计算成任意位数的 小数表示出来(只要机器内存足够大). 最常见的符号计算系统有maple, mat
2、hematica, redues等, 这些软件各有侧重, 比如,maple内存管理及速度比math好, 但 是图形方面不如math; redues没找到, 没用过, 未明; 而用得 较多的matlab编程环境特好, 和C语言接口极其简单, 遗憾的是 它不是符号计算, 只是数值计算. 所以, 就实用而全面来说, math是一个很好用的软件. math软件不仅能够进行一般的+-*/及科学函数如Sin, Log 等计算, 而且能进行因式分解, 求导, 积分, 幂级数展开, 求 特征值等符号计算, 并且, math有较强的图元作图, 函数作图, 三维作图及动画功能. (2)math
3、ematica入门 mathematica自发布以来, 目前比较常见的有math 1.2 for DOS, math 2.2 for Windows, math 3.0 for win95, math 3.0 for UNIX. DOS下的math的好处就是系统小, 对机器要求低, 在386机 器4M内存下就能运行得很好(机器再低点也是可以用的, 比如 说286/2M). 在DOS下直接键入math<回车>即可进入math系统, 出现的提示符In[1]:=, 这时就可以进行计算了, 键入math函 数, 回车即可进行运算. 如果输入的Quit, 则退出math. 这里
4、 要注意的是, math区分大小写的, 一般math的函数均以大写字 母开始的. windows下的math对机器要求就要高一些了, math3.0更是 庞大, 安装完毕有100M之多(2.2大约十多兆). 同windows下的 其他软件一样, math可以双击图标运行, 在File菜单下有退出 这一项. windows下的math有其优越性, 就是可以在windows下 随心所欲地拷贝粘贴图形. math3.0更是能输入和显示诸如希腊 字母, 积分符号, 指数等数学符号. DOS的math与windows下的 一个区别是DOS的以回车结束一句输入, 而windows的以 +<回车
5、>结束一句输入. DOS下的提示符显示为In[数字]:=, 而 windows下在结束输入后才显示出In[数字]:=及Out[数字]:=字样. (Out为输出提示符) 下面试试几个例子:(In[数字]:=为提示符, 不用键入) In[1]:= 2^100 计算2的100次方 In[2]:= s={{3,7,9},{7,4,3},{1,3,8}} 定义矩阵s In[3]:= Eigenvalues[s] 计算s的特征值 In[4]:= Plot[Sin[x]
6、{x,0,Pi}] 在0,Pi间画Sin In[5]:= Plot[Cos[x],{x,0,Pi}] Cos In[6]:= Plot3D[Sin[x]Sin[y],{x,0,1},{y,0,2}] 三维作图 以In[6]为例说明: math的函数都以大写字母开头的单词 为函数名, Plot3D, Plot, Eigenvalues, Sin等, 常数也是如 此, 如Pi. 函数名后的参数用[]括起, 逗号隔开. math的输出可以作为函数的输入对象, 你可以再试一个: In[7
7、]:=Show[%%,%%%] 这里一个%代表上一个输出, 两个代表 上两个... 也可以直接用Out[n]代表第n个输出. 这里需要补充的是 !command 执行DOS命令 ?name 关于name(函数等)的信息(可以使用通配符) ??name 关于name的额外信息 (3)基本计算 1. 算术运算符 +加-减*乘/除^指数 (乘也可用空格) N[expr]或expr //N 计算expr的数值(6位有效数字) N[expr, n] n表示小数的位数 2. 数
8、学函数 Sqrt[x] x开方 Exp[x] e的x方 Log[x] x的自然对数 Log[b,x] 以b为底, x的对数 Sin[x], Cos[x], Tan[x], ArcSin[x], ArcCos[x] 三角函数 Abs[x] |x| Round[x] 离x最近的整数 Floor[x] 不超过x的最大整数 Quoti
9、ent[n,m] n/m的整数部分 Mod[n,m] n/m的余数 Random[] 0,1间随机数 Max[x,y,...] Min[x,y,...] 最大数和最小数 3. 常数 Pi Pi=3.141592653589793... E e=2.71828... Degree Pi/180 I i=Sqrt[-1]
10、 Infinity 无穷大 Catalan Catalan常数.=0.915966 ComplexInfinity 复无穷 DirectedInfinity 有向的无穷 EulerGamma 欧拉常数gamma=0.5772216 GoldenRatio 黄金分割(Sqrt[5]-1)/2 Indeterminate 不定值 4. 逻辑运算符 ==, !=, >, >=, <, <=, !, &
11、 || Xor 异或 Implies 隐含 If[条件,式1,式2] 如果条件成立, 值式1; 否则得式2 5. 变量 a) 变量名以字母(一般小写)开头; 字母数字组成. (如x2为变量名; 而2x, 2*x, 2 x, x*2, x 2均是x乘以2). b) 赋值 x=value; x=y=value; x=.(清除x值) c) 代换 expr /. x->value 将式中x代换为value expr /. {x->x
12、val, y->yval} 下面就让我们以几个例子来结束本节:(大家还是注意, DOS下的Math, 只要 输入In[num]:=后的指令后按回车, 而windows下则是按+回车.) 大 家看看都有什么输出. In[1]:= 2.7+5.23 In[2]:= 1/3+2/7 In[3]:= 1/3+2/7 //N In[4]:= N[Pi,100] 曾经有人问我, 你是怎么算出Pi的1000位而 没有错误的, 其实很简单, 大家只要把上式的100改为1000即可. In[5]:= Sin[Pi/2]+Exp[2]+Round[1.2]
13、 In[6]:= 10<7 In[7]:= x=5; 如果在输入之后加上一个";", 则只运算不输出. IN[8]:= y=0 (所以In[7]和8完全可以合成一条x=5;y=0, 假如 我不需要x=5的输出) In[9]:= x>y In[10]:= t=1+m^2 In[11]:= t /. m->2 In[12]:= t /. m->5a In[13]:= t /. m->Pi //N (4)代数变换 上一节我们已经学习了Math里的基本运算及逻辑运算, 常用数学函数, 几 个常见的常数
14、 以及变量的使用. 这一节, 我们来学学基本代数变换: Apart, Cancel, Coefficient, Collect, Denominator, Expand, ExpandAll, Exponent, Factor, Numerator, Short, Simplify, Together. Expand[expr] 多项式expr按项展开 Factor[expr] 因子形式 Simplify[expr] 最简形式 In[1]:= Expand[(1+x)^2] In[2]:= Fact
15、or[%] 我们以前说过的哦, %是上一个输出, %%是上上个, %%%是上上上个, ..., %n是第n个输出(即Out[n]) In[3]:= Simplify[%%] In[4]:= Integrate[x^2/(x^4-1),x] 这是积分运算, 详情后叙 In[5]:= D[%,x] 求导 In[6]:= Simplify[%] ExpandAll[expr] 所有项均展开 Together[expr] 通分 Apart[expr]
16、 分离成具有最简分母的各项 Cancel[expr] 约去分子,分母的公因子 Collect[expr] 合并 In[1]:= e=(x-1)^2 (2+x)/((1+x)(x-3)^2) In[2]:= Expand[e] In[3]:= ExpandAll[e] In[4]:= Together[e] In[5]:= Apart[%] In[6]:= Factor[%] Coefficient[expr, form] 表达式中form项的系数 Expon
17、ent[expr, form] form的最高幂次 Numerator[expr] 取分子 Denominator[expr] 取分母 expr //Short 以简短形式输出 In[1]:= e=Expand[(1+3x+4y^2)^2] In[2]:= Coefficient[e, x] In[3]:= Exponent[e, y] In[4]:= q=(1+x)/(2(2-y)) In[5]:= Denominator[%] In[6]:= Expa
18、nd[(x+5y+10)^4] In[7]:= %//Short 把上式输出, 中间项省去, 以<<数字>>表示 省去的项数. 最后, 我们以例子来看看用符号名做客体的标志的好处 In[1]:= 12meters In[2]:= %+5.3meters In[3]:= %/(25seconds) In[4]:= %/.meters->3.78084feet 一下子就把米制变为英尺了. (5)微积分运算(2-1) 学到上一节, 大家会发现怎么还停留
19、在中学的计算中呢, 这一节, 大家就会看到微分D, Dt; 积分Integrate, NIntegrage; 和与积Sum, Product, NSum, NProduct. 下一节我们 介绍解方程Solve, Eliminate, Reduce, NRoot, FindRoot, FindMinimum; 幂级数Series, Normal; 极限Limit; 特殊函数Fourier, InverseFourier, ... 微分 D[f, x] f对x求导 D[f, x_1, x_2, ...] f对x_1, x_2,
20、求导 D[f, {x, n}] f对x求n次导 Dt[f] 全微分df Dt[f, x] 全微商df/dx In[1]:= D[x^n,x] In[2]:= D[f[x],x] In[3]:= D[2x f[x^2],x] In[4]:= D[x^n, {x, 3}] In[5]:= D[x^2 y^3, x, y] In[6]:= Dt[x^n] In[7]:= Dt[x y, x] 积分 Integrate[f,x] f对
21、x积分 Integrate[f, {x, xmin, xmax}, {y, ymin, ymax}, ...] 定积分 NIntegrate[f, {x, xmin, xmax}, {y, ymin, ymax}, ...] 计算积分的数值解 In[1]:= Integrate[Sin[Sin[x]],x] 嘻嘻, 无法计算, 原样输出 In[2]:= Integrate[Log[x], {x,0,6}] 啊, 广义积分也一样算 In[3]:= Integrate[x^2+
22、y^2, {x,0,1}, {y,0,1}] In[4]:= In[3]//N 如果你的上一条输入不是In[3], 注意 调整这一条的输入哦 In[5]:= Integrate[Sin[Sin[x]], {x,0,1}] 怎么还没法计算啊 In[6]:= N[%] 或 NIntegrate[Sin[Sin[x]], {x,0,1}] 呵, 终于可以计算了. 和与积 Sum[f, {i, imin, im
23、ax}, {j, jmin, jmax}, ...] f对i, j, ...分别从imin到imax,jmin到jmax,...求和 Sum[f, {i, imin, imax, di}] 求和的步长为di Product[f, {i, imin, imax}, {j, jmin, jmax}, ...] 求积 NSum 数值解 NProduct 数值解 In[
24、1]:= Sum[x^i/i, {i,1,4}] In[2]:= Sum[x^i/i, {i,1,5,2}] In[3]:= Sum[a/i^3, {i,1,10}] In[4]:= N[%] 或 NSum[a/i^3, {i,1,10}] In[5]:= Sum[1/i^3, {i,1,Infinity}] 可能原样输出, 也可能输出Zeta[3] (依math的版本不同而异) In[6]:= N[%] In[7]:= Sum[x^i*y^j, {i,1,3}, {j,
25、1,i}] 注: 如果想要求带符号上下限的Sum, 在math3.0中, 直接使用Sum函数即可: In[8]:= Sum[1/Sin[i], {i,1,n}] 而如果在旧版本的math, 则可能需要调入包(package) "gospersu.m", 调入 格式一般为 In[8]:= <<"盘符:\\math路径\\packages\\algebra\\gospersu.m" (不同安装目录可能出现不一样) 然后使用函数GosperSum[] (6)微积分运算(2-2) 上一节, 我们一起学习了微分D, Dt; 积分Integrate,
26、 NIntegrage; 和与积Sum, Product, NSum, NProduct. 这一节我们将介绍解方程Solve, Eliminate, Reduce, NRoot, FindRoot, FindMinimum; 幂级数Series, Normal; 极限Limit; 特殊函数Fourier, InverseFourier, ... 最后, 我们说明一下math的函数的定义, 别名的使用, 以及不同输出格式 解方程 Solve[{lhs1==rhs1, lhs2==rhs2,...}, {x,y,...}] 解关于x,y,...的方程组{l
27、hs1==rhs1, lhs2==rhs2,...} Eliminate[{lhs1==rhs1, lhs2==rhs2,...}, {x,y,...}] 在联立方程中消去x,y,... Reduce[{lhs1==rhs1, lhs2==rhs2,...}, {x,y,...}] 给出一组化简后的方程, 包括可能的解 NRoot[poly==0, x] 给出多项式的根的数值逼近 FindRoot[lhs==rhs, {x, x0}] 从x0出发, 求方程的数值解 FindMinimum[f, {x,x0}] 在x0附近找f的极小值
28、 In[1]:= Solve[x^2+2x-7==0, x] In[2]:= Solve[2-4x+x^5==0, x] 呵呵~~~ 输出结果你会发现和没解一样 In[3]:= N[%] 啊, 要数值解啊, 不早说. 这不是么. In[4]:= Solve[{a*x+y==0, 2x+(1-a)y==1},{x,a}] In[5]:= Eliminate[{3x+2y+z==3, 2x-2y-2z==5,x+y-7z==9}, {x,z}] In[6]:= Reduce[a*x+b==0, x] 哇, 好COOL.
29、 a==0, 怎么怎么; a!=0, ... In[7]:= FindRoot[Cos[x]==x,{x,1}] In[8]:= FindMinimum[x Sin[x], {x,2Pi}] 幂级数 Series[expr, {x, x0, n}] 求expr在x0的n阶幂级数 Normal[series] 按标准形式 In[1]:= Series[(1+x)^n, {x,0,3}] 最后还有近似量级呢(大喔O[x]^4) In[2]:= Normal[%] In[3]:= %^2 (1+%)
30、 把大喔量级不要了, 多项式当然可以这么运算 极限 Limit[expr, x->x0] expr中x趋于x0 In[1]:= t=Sin[x]/x In[2]:= t/.x->0 错了吧. 0不能当分母的 In[3]:= Limit[t,x->0] 求极限总可以了吧 特殊函数 Fourier[] 傅利叶变换 InverseFourier[] 反傅利叶变换 In[1]:=
31、{1,1,1,1,-1,-1,-1,-1} In[2]:= Fourier[%] In[3]:= InverseFourier[%] RungeKutta[], ... 等函数 定义函数如下 In[1]:= f[x_]:=x^2+1 math中定义函数:变量后跟_, 然后用:= In[2]:= f[x_, y_]:=x+y 以上两个定义同时存在并不矛盾, 当f仅使用一个参数, 自动用一式; 为两个参数, 则用二式 In[3]:= f[3] In[4]:= f[3,2] 定义别名 In[1]:= par
32、a:=ParametricPlot 用:=来定义别名 In[2]:= para[{Cos[t],t}, {t,0,Pi}] In[3]:= Alas[para] 查看para是什么的别名 (7)矩阵/表的运算 矩阵的定义Table, Array, IdentityMatrix, DiagonalMatrix; 输出 输入TalbeForm, ColumnForm, MatrixForm, list(其他输出TeXForm, FortranForm, CForm); 及运算: 数乘, 矩阵乘法, Inverse, Transpose, Det,
33、 MatrixPower, Eigenvalues, Eigenvectors, 矩阵定义使用的一点 说明. 矩阵的定义 Table[f, {imax}] 包含imax个f的元素(f是规则) Table[f, {i, imin, imax, istep}, {j, ...}, ...] istep=1可省, imin=1也等于1可再省 Array[a, n] 建立向量a[1], a[2], ..., a[n] Array[a, {m,
34、n}] 建mxn矩阵a Array[a, {m1, m2, ..., mn}] n维张量 IdentityMatrix[n] 生成n维单位矩阵 DiagonalMatrix[list] list元素为对角元 In[1]:= Table[x, {4}] In[2]:= Table[i^2, {i, 1, 4}] In[3]:= x^%-1 看看表在运算符作用后的结果 In[4]:= D[%, x] 求导也可以 In[5]:= % /. x
35、>3 代入值看看 In[6]:= Array[a, {3, 2}] 看个2维的(3x2)矩阵 In[7]:= DiagonalMatrix[{1,2,3}] 生成对角元是1,2,3的方阵 矩阵的输出/输入 TableForm[list] 以表列格式显示一个表 ColumnForm[list] 写成一列 MatrixForm[list] 按矩阵形式 list[[i]] 第i个元素(一维); 第i行元素(二维)
36、 list[[i,j]] list的第i行, 第j列元素. In[1]:= a=Table[i+2*j, {i, 1, 3}, {j, 1, 2}] In[2]:= TableForm[%] 看看表格式 In[3]:= ColumnForm[%%] 写成一列 In[4]:= MatrixForm[%%%} 再看看矩阵形式 In[5]:= %[[2]] 把上面的矩阵的第二行(是一维的表了哦)去来 In[6]:= %%[[2,1]] 取第二行第一列元素(是一个数)
37、 注: In[5],In[6]也可用a[[2]]和a[[2,1]]的典型写法. 其他输出格式 TeXForm, FortranForm, CForm TeX(数学排版)格式, Fortran语言, C语言格式输出 In[1]:= (Sqrt[x^3-1]+Exp[y])/Log[x] In[2]:= TeXForm[%] 注意TeX中T和X是大写, e是小写 In[3]:= CForm[%] 矩阵的数学运算 cm 数乘(c标量, m是Table或Array定义的
38、矩阵) a.b 矩阵相乘(注意矩阵乘法的规则) Inverse[m] 逆矩阵(当然要对方阵来说了) Transpose[m] 转置 Det[m] m(方阵)的行列式 MatrixPower[m,n] m(方阵)的n次幂 Eigenvalues[m] m(方阵)的特征值 Eigenvectors[m] m(方阵)的特征向量 Eigenvalues[
39、N[m]], Eigenvectors[N[m]] 数值解 In[1]:= a=Table[i+2*j, {i, 1, 3}, {j, 1, 2}] In[2]:= 5a 看看乘积 In[3]:= b=Table[3*i-2^j, {i, 1, 3}, {j, 1, 3}] In[4]:= b.a 矩阵乘法(注意,此例a.b没有意义) In[4]:= Transpose[%] 转置 In[5]:= Inverse[b] 求一下矩阵的逆(天哪, 是方阵还不行, 还要行列式不为0
40、) In[6]:= Det[b] 果然行列式为0 In[7]:= c=b+{{1,0,0},{0,0,0},{0,0,0}} In[8]:= Inverse[c] 终于可以求逆了 In[9]:= MatrixPower[b,3] b的3次方 In[10]:= Eigenvalues[b] 特征值 In[11]:= Eigenvectors[b] 特征向量 一点说明: 矩阵可以先使用, 再定义; 局部定义和整体定义的顺序也自由. 如: In[1]:= d[1,1]=w; d[1,2]=e; d[2,1
41、]=21; d[2,2]=22; In[2]:= Array[d,{3,3}] 你就会发现, 定义过的有值了, 没定义的还没有值. (8)表的运算.2 表的结构VertorQ, MatrixQ, MemberQ, FreeQ, Length, TensorRank, Dimensions, Count, Position; 取表元First, Last, list[[]], Take, Rest, Drop, Select; 插入元素 Prepend, Append, Insert, Join; 表的集合Union, Intersection, Complement;
42、表的重排Sort, Union, Reverse, RotateLeft, RotateRight, Transpose, Flatten, Partition, Permutations, Apply 计算表的有关结构 VectorQ[list] 检验list是否为向量结构 MatrixQ[list] 检验list是否为矩阵结构 MemberQ[list, form] 检验form是否为list的元素 FreeQ[list, form] 检验form是否不是list的元素
43、 Length[list] list中元素的数目 TensorRank[list] list的深度(看成张量的秩) Dimensions[list] list作为向量或矩阵的维数 Count[list, form] form在list中出现的次数 Position[list, form] form在list中的位置 In[1]:= t={{1,2},3} t是一个表 In[2]:= VectorQ[t] 不是向量 In[3]:= MemberQ
44、[t,3] 3是它的元素 In[4]:= MemberQ[t,2] 2不是它的元素 In[5]:= Length[t] t的长度是2 In[6]:= TensorRank[t] t的深度是1 In[7]:= Dimensions[t] 作为向量,是2维: {1,2}和3 In[8]:= Position[t,3] 3在表t中的位置是{{2}} 在表中取部分元素 First[list] list的首元素 Last[list] list的最后一个元素
45、 list[[n]] list的第n个元素 list[[-n]] list的倒数第n个元素 (以后二者合写为n/-n) list[[n1,n2,...,nm]] 相当list[[n1]][[n2]]...[[nm]] list[[{n1,n2,...,nm}]] list第n1,n2,...,nm元组成新表 list[[{i1,i2,...},{j1,j2,...}]]
46、 list的i1,i2...行,j1,j2,...列 Take[list, n/-n] 取list的前/后n个元素 Rest[list] 去掉首元的list Drop[list, n/-n] 去掉前/后n个元素的list Select[list, crit] 从list中选出满足crit的元素 In[1]:= t={{2,1},{1}}; In[2]:= VectorQ[t] 函数名最后字母为Q,其值为True/False In[3]:= aa={{a,b,c
47、d},{e,f,g,h},{i,j,k,l}}; In[4]:= aa[[1]] 看看以下几个, 体会一下取元素/子表 In[5]:= aa[[1]][[2]] In[6]:= aa[[1,2]] In[7]:= aa[[{1,2}]] In[8]:= aa[[{1},{2}]] In[9]:= Select[{a,23,12,0,3.5},EvenQ] 看看Select怎么用 这里EvenQ[expr]判断expr是否偶数; OddQ[.]奇数?; NumberQ[.]数?; IntegerQ[.]整数?; PrimeQ[.]素
48、数? AtomQ[.]简单表达式?... 表中插入元素 Prepend[list, elem] 表头加elem(PrependTo函数修改list) Append[list, elem] 在表尾加elem(AppendTo修改list) Insert[list, elem, n/-n] 在正/倒数第n个位置插入elem Join[list1, list2, ...] 连接list1, list2, ... In[1]:= Prepend[{a,b,c},x] 在{a,b,c}前加x元素 In[2]:= Inser
49、t[{a,b,c},x,2] 在{a,b,c}的第2个位置插入x In[3]:= Join[{1,2,3},{xy},{m,{2,3},3}] 看看Join 集合函数 Union[list1, list2, ...] 去掉重复元并排序后的Join Intersection[list1, list2, ...] 取各list的公共元 Complement[t, list1, list2, ...] 在t中, 不在各list中的元素 In[4]:= Union[{1,2,3},{xy},{m,{2,3},3}] 看看Union In[
50、5]:= Complement[{a,b,c,d,e},{a,d},{e,f}] 看看Complement 表的重排 Sort[list] 将list排序 Union[list] 去掉重复元 Reverse[list] 倒序 RotateLeft[list, n/-n] 将list向左/右转n个元素(n=1可省) RotateRight[list, n/-n] 将list向右/左转n个元素(n=1可省) Transpose[list]






