资源描述
(1)简介
数学系给本科生开设一门课: "符号计算系统", 主要简单讲授 mathematica(以下简称math)软件的使用及其编程,赶兴趣的同学可以找本math书以求更深入的了解.
我们平日用到编程语言时, 大家都知道编程中用到的整型, 实型, 甚至双精度数, 都只是一个近似的数, 其精度有限, 有 效数字有限, 在很多时候达不到实际需要的要求. 符号计算与 数值计算的区别就在于符号计算以准确值记录计算的每一步的 结果, 如果需要时, 可以将精确表示按需要计算成任意位数的 小数表示出来(只要机器内存足够大).
最常见的符号计算系统有maple, mathematica, redues等, 这些软件各有侧重, 比如,maple内存管理及速度比math好, 但 是图形方面不如math; redues没找到, 没用过, 未明; 而用得 较多的matlab编程环境特好, 和C语言接口极其简单, 遗憾的是 它不是符号计算, 只是数值计算. 所以, 就实用而全面来说, math是一个很好用的软件.
math软件不仅能够进行一般的+-*/及科学函数如Sin, Log 等计算, 而且能进行因式分解, 求导, 积分, 幂级数展开, 求 特征值等符号计算, 并且, math有较强的图元作图, 函数作图, 三维作图及动画功能.
(2)mathematica入门
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. 这里 要注意的是, math区分大小写的, 一般math的函数均以大写字 母开始的.
windows下的math对机器要求就要高一些了, math3.0更是 庞大, 安装完毕有100M之多(2.2大约十多兆). 同windows下的 其他软件一样, math可以双击图标运行, 在File菜单下有退出 这一项. windows下的math有其优越性, 就是可以在windows下 随心所欲地拷贝粘贴图形. math3.0更是能输入和显示诸如希腊 字母, 积分符号, 指数等数学符号. DOS的math与windows下的 一个区别是DOS的以回车结束一句输入, 而windows的以 +<回车>结束一句输入. 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],{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]:=Show[%%,%%%] 这里一个%代表上一个输出, 两个代表 上两个... 也可以直接用Out[n]代表第n个输出.
这里需要补充的是
!command 执行DOS命令
?name 关于name(函数等)的信息(可以使用通配符)
??name 关于name的额外信息
(3)基本计算
1. 算术运算符
+加-减*乘/除^指数 (乘也可用空格)
N[expr]或expr //N 计算expr的数值(6位有效数字)
N[expr, n] n表示小数的位数
2. 数学函数
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的最大整数
Quotient[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]
Infinity 无穷大
Catalan Catalan常数.=0.915966
ComplexInfinity 复无穷
DirectedInfinity 有向的无穷
EulerGamma 欧拉常数gamma=0.5772216
GoldenRatio 黄金分割(Sqrt[5]-1)/2
Indeterminate 不定值
4. 逻辑运算符
==, !=, >, >=, <, <=, !, &&, ||
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->xval, 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]
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里的基本运算及逻辑运算, 常用数学函数, 几 个常见的常数, 以及变量的使用. 这一节, 我们来学学基本代数变换: 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]:= Factor[%]
我们以前说过的哦, %是上一个输出, %%是上上个, %%%是上上上个, ..., %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] 分离成具有最简分母的各项
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项的系数
Exponent[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]:= Expand[(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)
学到上一节, 大家会发现怎么还停留在中学的计算中呢, 这一节, 大家就会看到微分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, ...求导
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对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+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, imax}, {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[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,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, 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,...的方程组{lhs1==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的极小值
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. 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+%) 把大喔量级不要了, 多项式当然可以这么运算
极限
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]:= {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]:= para:=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, 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, 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->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行元素(二维)
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]] 取第二行第一列元素(是一个数)
注: 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定义的矩阵)
a.b 矩阵相乘(注意矩阵乘法的规则)
Inverse[m] 逆矩阵(当然要对方阵来说了)
Transpose[m] 转置
Det[m] m(方阵)的行列式
MatrixPower[m,n] m(方阵)的n次幂
Eigenvalues[m] m(方阵)的特征值
Eigenvectors[m] m(方阵)的特征向量
Eigenvalues[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)
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]=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; 表的重排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的元素
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[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的最后一个元素
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,...}]]
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,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[.]素数? 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]:= Insert[{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[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]
展开阅读全文