哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 Mathematica表达式及其运算规则表达式及其运算规则 在本节中,我们将主要介绍在本节中,我们将主要介绍Mathematica进行数进行数学运算的基本工作原理及特殊符号的输入方式学运算的基本工作原理及特殊符号的输入方式1、1、 西腊字母及命令的直观输入西腊字母及命令的直观输入 在在Notebook中,有两种输入西腊字母的方法,一中,有两种输入西腊字母的方法,一种是调用种是调用File→Palettes→BasicInput、、BaiscTypesetting 或或CompleteCharacters→Letters→Greek菜单,此时菜单,此时会弹出一个含有西腊字母的数学工具面板,单击此面会弹出一个含有西腊字母的数学工具面板,单击此面板的符号即可;另一种是直接通过键盘输入西腊字母板的符号即可;另一种是直接通过键盘输入西腊字母所代表的标准名称,其格式为所代表的标准名称,其格式为\[Greek_name],,例如,例如,在在Notebook中输入中输入\[Beta]后后(注意大小写注意大小写),将会显,将会显示示β,,下面是一些常用西腊字母的标准名称表。
下面是一些常用西腊字母的标准名称表 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 另外,在刚开始使用另外,在刚开始使用Mathematica时,一般对时,一般对有关数学运算命令及数学公式的输入都不是太熟悉,有关数学运算命令及数学公式的输入都不是太熟悉,这时可以通过菜单这时可以通过菜单File→Palettes的各个下级子菜单的各个下级子菜单输入相关命令及公式,不过这种输入方法效率不高,输入相关命令及公式,不过这种输入方法效率不高,建议还是少用为好建议还是少用为好 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 2、2、 表达式与表结构表达式与表结构 Mathematica能够处理多种类型的数据形式:数能够处理多种类型的数据形式:数学公式、集合、图形等等,学公式、集合、图形等等,Mathematica将它们都称将它们都称为表达式使用函数及运算符为表达式使用函数及运算符(+, -, *, /,^等等)可组成可组成各种表达式。
各种表达式• FullForm[]可显示出表达式在系统内部可显示出表达式在系统内部存贮的标准格式,而存贮的标准格式,而Head[]可得到某个可得到某个表达式的头部,这对我们确定表达式的表达式的头部,这对我们确定表达式的类型很有用处类型很有用处上面的上面的{1,2,3,4}称为表称为表(List),,表是表是Mathematica中非常有用的结构首先,中非常有用的结构首先,表可以理解成数学意义下的集合,例如表可以理解成数学意义下的集合,例如对集合对集合{1,{2,3},4,{5,6,7},8,9},它是它是含有含有6个元素的子集合个元素的子集合,其中其中{2,3}及及{5,6,7}此集合的子集合此集合的子集合 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 作为集合,有下面的各种集合运算作为集合,有下面的各种集合运算•Append[list,element]在集合在集合list的末尾加入元素的末尾加入元素element•Apply[Plus,list]将集合将集合list中的所有元素加在一起中的所有元素加在一起•Apply[Times,list]将集合将集合list中的所有元素乘在一起中的所有元素乘在一起•Complement[list1,list2]求在求在list1中而不在中而不在list2中元素中元素集合集合•Delete[list,{i,j}]删除集合第删除集合第i,j处的元素处的元素•Delete[list,i]删除集合删除集合list的第的第i个元素个元素•Flatten[list]展开集合展开集合list中的各个子集,形成一个一中的各个子集,形成一个一维表维表 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 •FlattenAt[list,n]展开集合展开集合list中的第中的第n级子集级子集•Insert[list,element,{i,j}]插入第插入第i个子集合的第个子集合的第j 个元素个元素处处•Insert[list,element,i]在在list第第i个元素的前面插入个元素的前面插入element•Intersection[list1,list2,…]这是数学意义下的求交集命这是数学意义下的求交集命令令•Join[list1,list2,…]将集合首尾相连,形成一个新的集将集合首尾相连,形成一个新的集合合•Length[list]集合集合list中元素的个数中元素的个数•list[[i,j]]集合集合list中第中第i个子集合的第个子集合的第j个元素个元素 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 •list[[i]]集合集合list中第中第i个元素个元素•Partition[list,n]将集合将集合list分成分成n个元素一组个元素一组•Prepend[list,element]在集合在集合list的开头加入元素的开头加入元素element•ReplacePart[list,element,{i,j}]替换替换list中的第中的第i,j处的元处的元素素•ReplacePart[list,element,i]替换集合替换集合list中的第中的第i个元素个元素•Reverse[list]翻转集合翻转集合list中的元素中的元素•Sort[list]将集合将集合list中的元素按升序排序中的元素按升序排序 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 •Table[f,{i,imin,imax},{j,jmin,jmax}]建立二维表或矩建立二维表或矩阵阵•Table[f,{i,imin,imax}]建立一个一维表或向量建立一个一维表或向量•Take[list,{m,n}] 给出给出list中从中从m到到n之间的所有元素之间的所有元素•Take[list,n] 给出前给出前n个,个,Take[list,-n] 给出后给出后n个个•Union[list]合并集合合并集合list中的重复元素中的重复元素•Union[list1,list2,…]这是数学意义下的求集合的并集这是数学意义下的求集合的并集命令命令下面是有关集合方面的一些运算下面是有关集合方面的一些运算: 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 其次,对于一维表,可以理解成数学意义下的向其次,对于一维表,可以理解成数学意义下的向量,对于二维表,可以理解成矩阵,因此,有如下量,对于二维表,可以理解成矩阵,因此,有如下的矩阵函数,其中的矩阵函数,其中a,b为向量,为向量,p,q为常量,为常量,M为方阵,为方阵,A,B为同阶普通矩阵为同阶普通矩阵,具体例子参见下一节。
具体例子参见下一节•Dot[a,b]或或a.b 向量向量a与与b的数量积的数量积•Cross[a,b] 向量向量a与与b的矢量积的矢量积•P*A+q*B 矩阵与数的乘法运算矩阵与数的乘法运算•A*B A与与B的对应元素相乘的对应元素相乘•M^2 将矩阵将矩阵M中的每个元素平方中的每个元素平方•P.Q 矩阵乘法运算矩阵乘法运算,其中其中P为为m×k阶矩阵,阶矩阵,Q为为k×n阶矩阵阶矩阵 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 •Det[M] 求方阵求方阵M的行列式的行列式•MatrixForm[A] 以矩阵的形式显示A以矩阵的形式显示A•MatrixPower[M,n] 矩阵矩阵M的的n次幂次幂•Transpose[A] 矩阵矩阵A的转置矩阵的转置矩阵•Eigenvalues[M] 求矩阵求矩阵M的特征值的特征值•Eigenvectors[M] 求矩阵求矩阵M的特征向量的特征向量•Eigensystem[M] 求矩阵求矩阵M的特征值与特征向量的特征值与特征向量•IdentityMatrix[n] 建立一个建立一个n×n的单位阵的单位阵•DiagonalMatrix[list] 建立一个对角阵,其对角线建立一个对角阵,其对角线元素为表元素为表list 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 •Inverse[M] 求方阵求方阵M的逆矩阵的逆矩阵•LinearSolve[A,b] 求线性方程组求线性方程组AX=b的解的解•NullSpace[A] 求满足方程求满足方程AX=0的基本向量组,即零的基本向量组,即零解空间解空间•RowReduce[A] 将矩阵将矩阵A进行行变换进行行变换•QRDecomposition[M] 矩阵矩阵M的的QR分解分解•SchurDecomposition[M] 矩阵矩阵M的的Schur分解分解•JordanDecomposition[M] 矩阵矩阵M的的Jordan分解分解•LUDecomposition[M] 矩阵矩阵M的的LU分解分解 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 3、3、Mathematica中数的类型与精度中数的类型与精度 在在Mathematica中,进行数学运算的中,进行数学运算的“数数”有四有四种类型,它们分别是种类型,它们分别是Integer(整数整数)、、Rational(有理数有理数)、、Real(实数实数)、、Complex(复数复数)。
不带有小数点的数,不带有小数点的数,系统都认为是整数,而带有小数点的数,系统则认为系统都认为是整数,而带有小数点的数,系统则认为是实数对两个整数的比,如是实数对两个整数的比,如12/13,系统认为是有理,系统认为是有理数,而数,而a+b*I形式的数,系统认为是复数形式的数,系统认为是复数 Mathematica可表示任意大的数和任意小的数,其它可表示任意大的数和任意小的数,其它计算机语言比如计算机语言比如C、、Basic是做不到这一点的,例如是做不到这一点的,例如 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 其中其中//N表示取表达式的数值解,默认精度为表示取表达式的数值解,默认精度为16位,它等价于位,它等价于N[expr],一般形式为一般形式为N[expr,n],,即取表即取表达式达式n位精度的数值解如位精度的数值解如 使用使用Rationalize[expr,error]命令可将表达式转换命令可将表达式转换为有理数,其中为有理数,其中error表示转换后误差的控制范围。
表示转换后误差的控制范围例如例如 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 Mathematica中的变量以字母开头,变量中不能中的变量以字母开头,变量中不能含有空格及下划线,因此,上面的含有空格及下划线,因此,上面的2I表示表示2*I(I为虚数为虚数),乘号可用空格代替,在很多情况下,乘号可以省,乘号可用空格代替,在很多情况下,乘号可以省略,如略,如(1+I)(1+2I)中的两个乘号如果某个表达式中的两个乘号如果某个表达式的结果为复数,的结果为复数,Mathematica就会给出复数的结果就会给出复数的结果对下面的3次方程对下面的3次方程 上面的行列式上面的行列式|A|的计算结果,系统给出的是一的计算结果,系统给出的是一个分数值,在个分数值,在Mathematica中,不同类型的数进行运中,不同类型的数进行运算,其结果是高一级的数,如有理数与实数运算的结算,其结果是高一级的数,如有理数与实数运算的结果是实数,复数与实数的运算结果是复数,依此类推果是实数,复数与实数的运算结果是复数,依此类推。
由于整数与有理数的运算级别最低由于整数与有理数的运算级别最低, 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 因此,在进行数学计算中,如果可能的话,就尽量因此,在进行数学计算中,如果可能的话,就尽量用精确数,即整数或有理数另外,用精确数,即整数或有理数另外,“==”称为逻称为逻辑等号,定义一个等式要用逻辑等号辑等号,定义一个等式要用逻辑等号其中其中Inverse[]是求逆矩阵命令在是求逆矩阵命令在Mathematica中,中,一行中可以输入多个命令一行中可以输入多个命令,各命令间用分号分隔另各命令间用分号分隔另外,分号还有一个作用是通知外,分号还有一个作用是通知Mathematica,,只在内只在内存中计算以分号结尾的命令,但不输出此命令的计存中计算以分号结尾的命令,但不输出此命令的计算结果 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 如果表达式太长,一行写不下,可以分2行写,系统如果表达式太长,一行写不下,可以分2行写,系统会自动判断一个表达式是否输入完毕。
对于需要多行会自动判断一个表达式是否输入完毕对于需要多行输入的表达式,建议每行用运算符结尾下面我们简输入的表达式,建议每行用运算符结尾下面我们简要说明一下要说明一下Mathematica的赋值符号及相关命令在的赋值符号及相关命令在Mathematica中,对变量赋值,有两种方法中,对变量赋值,有两种方法A:=expr的意思是将表达式的意思是将表达式expr的值赋给的值赋给A,,但但Mathematica并并不立即执行此项操作,一直到用到不立即执行此项操作,一直到用到A的值时,的值时,Mathematica才真正的将才真正的将expr的值赋给的值赋给A,,即所谓的延即所谓的延迟赋值在大部分情况下,我们都采用延迟赋值的形迟赋值在大部分情况下,我们都采用延迟赋值的形式为表达式赋值另一种赋值方法是我们所熟悉的赋式为表达式赋值另一种赋值方法是我们所熟悉的赋值形式,即值形式,即A=expr或或A=B= expr的形式,一般称为立的形式,一般称为立即赋值只要一执行该命令,即赋值只要一执行该命令,Mathematica将将expr的值赋给的值赋给A 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 另外,对于变量,另外,对于变量,Mathematica不像不像C语言那样,语言那样,需要申请后再使用,也不用事先确定变量的类型,这需要申请后再使用,也不用事先确定变量的类型,这些问题都由些问题都由Mathematica来自动处理。
对于不需要的来自动处理对于不需要的变量,可以使用变量,可以使用Clear命令将变量从内存中清除出去,命令将变量从内存中清除出去,以节省内存空间,例如以节省内存空间,例如• Clear[A] 清除变量清除变量A,,其简写形式是其简写形式是A=.•Clear[A,B,W] 清除变量清除变量A、、B、、W•Clear[“A*”,”B*”] 清除以清除以A、、B开头的所有变量开头的所有变量 可以使用可以使用Precision[expr]或或Accuracy[expr]返回表返回表达式的精度达式的精度 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 其中,其中,∞在系统中是一个内部常数,其完整的命令是在系统中是一个内部常数,其完整的命令是Infinity,,这样的常数有:这样的常数有:Pi(π)、、EE(实数实数e)、、ComplexInfinity(复数复数的无穷大的无穷大)、、I(复数复数i)、、Degree(1π/180)、、CC(不定积分的任不定积分的任意常数意常数),另外,D,另外,D(导数运算符导数运算符),N,N(取精度运算符取精度运算符)、、O(泰泰勒展开的高阶无穷小量勒展开的高阶无穷小量)。
哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 上面上面Print[]命令的功能是打印表达式或者字符串,其命令的功能是打印表达式或者字符串,其格式为格式为 Print[expr1,,expr2,,……]expr1,expr2,……可以为任意合法的可以为任意合法的Mathematica表达表达式,如果为字符串,则需要双引号将字符串括起来式,如果为字符串,则需要双引号将字符串括起来在实际计算过程中,可能得到的结果中含有很小的数,在实际计算过程中,可能得到的结果中含有很小的数,为了以后计算上的方便,我们如果想去掉这样的数,为了以后计算上的方便,我们如果想去掉这样的数,可以使用命令可以使用命令•Chop[expr,dx] 若若expr中的某个数小于中的某个数小于dx,,则用则用0来来代替该数代替该数•Chop[expr]若若expr中的数小于中的数小于10-10,则用,则用0来代替该来代替该数数 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 下面是一个多项式曲线拟合问题的实际例子下面是一个多项式曲线拟合问题的实际例子 可以用下面的几个函数来判断表达式运算结果的类型,可以用下面的几个函数来判断表达式运算结果的类型,其中其中True和和False是系统内部的布尔常量。
是系统内部的布尔常量•NumberQ[expr]判断表达式是否为一个数,返回判断表达式是否为一个数,返回True或或False•IntegerQ[expr]判断表达式是否为整数判断表达式是否为整数, 返回返回True或或False 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 •EvenQ[expr]判断表达式是否为偶数,返回判断表达式是否为偶数,返回True或或False•OddQ[expr]判断表达式是否为奇数,返回判断表达式是否为奇数,返回True或或False•PrimeQ[expr]判断表达式是否为素数,返回判断表达式是否为素数,返回True或或False•Head[expr]判断表达式的类型判断表达式的类型 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 4、4、 常用数学函数常用数学函数 Mathematica的数学运算,主要是依靠其内部的的数学运算,主要是依靠其内部的大量数学函数完成的,下面我们依次列出常用的数学大量数学函数完成的,下面我们依次列出常用的数学函数,其中函数,其中x、、y、、a、、b代表实数,代表实数,z代表复数,代表复数,m、、n、、k为整数。
所有的函数或者是它的英文全名,或者是为整数所有的函数或者是它的英文全名,或者是其它计算机语言约定俗成的名称,函数的参数表用方其它计算机语言约定俗成的名称,函数的参数表用方括号括号[]括起来,而不是用圆括号另外,括起来,而不是用圆括号另外,Mathematica对大小写敏感对大小写敏感 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 数值函数数值函数•Round[x] 最接近最接近x的整数的整数•Floor[x] 不大于不大于x的最大整数的最大整数•Celing[x] 不小于不小于x的最小整数的最小整数•Sign[x] 符号函数符号函数•Abs[z] 若若z为实数,则求绝对值,为复数,则取模为实数,则求绝对值,为复数,则取模•Max[x1,x2,…]或或Max[{x1,x2, …},…] 求最大值求最大值•Min[x1,x2,…]或或Min[{x1,x2, …},…] 求最小值求最小值•x+Iy,Re[z],Im[z],Conjugate[z],Arg[z] 关于复数的基本关于复数的基本运算运算 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 随机函数随机函数•Random[] 返回一个区间返回一个区间[0,1]内的一个随机数内的一个随机数•Random [Real,{xmin,xmax}]返回一个区间返回一个区间[xmin,xmax]内的随机数内的随机数•Random[Integer] 以以1/2的概率返回的概率返回0或或1•Random[Integer,{imin,imax}]返回位于返回位于[imin,imax]间的一个整数间的一个整数•Random[Complex] 模为模为1的随机复数的随机复数•Random[Complex,{zmin,zmax}] 复平面上的随机复数复平面上的随机复数•SeedRandom[] 使用系统时间作为随机种子使用系统时间作为随机种子•SeedRandom[n] 使用整数使用整数n作为随机种子作为随机种子 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 整数函数及组合函数整数函数及组合函数•Mod[m,n],Quotient[m,n] m/n的余数及商的余数及商•GCD[n1,n2,…],LCM[n1,n2, …] 最大公约数及最小公最大公约数及最小公倍数倍数•FactorInteger[n] 返回整数返回整数n的所有质数因子表的所有质数因子表•PrimePi[x],Prime[k]返回小于返回小于x的质数个数及第的质数个数及第k个质个质数数•n!, n!! 整数整数n的阶乘及双阶乘的阶乘及双阶乘•Binomial[n,m]Binomial[n,m]计算计算 排列组合数排列组合数•Signature[{i1,i2,…}]Signature[{i1,i2,…}]排列的正负符号排列的正负符号 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 初等超越函数初等超越函数 这些函数的名称一目了然,我们不多加解释。
它这些函数的名称一目了然,我们不多加解释它们是:们是: Sqrt[z]、、z1^z2、、Exp[z]、、Log[z]、、Log[b,z]、、Sin[z]、、Cos[z]、、Tan[z]、、Cot[z]、、Csc[z]、、Sec[z]、、ArcSin[z]、、ArcCos[z]、、ArcCsc[z]、、ArcSec[z]、、ArcTan[z]、、ArcCot[z]、、Sinh[z]、、Cosh[z]、、Tanh[z]、、Coth[z]、、 Csch[z]、、Sech[z]、、ArcSinh[z]、、ArcCosh[z]、、ArcTanh[z]、、ArcCoth[z]、、ArcCsch[z]、、ArcSech[z] 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 正交多项式正交多项式•LegendreP[n,x], LegendreP[n,m,x] 勒让德多项式勒让德多项式•ChebyshevT[n,x],ChebyshevU[n,x] 切比雪夫多项切比雪夫多项式式•HermiteH[n,x] Hermite多项式多项式•LaguerreL[n,x] Laguerrel[n,a,x] 拉盖尔多项式拉盖尔多项式•JacobiP[n,a,b,x] 雅可比多项式雅可比多项式 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 特殊函数特殊函数 此处我们将不给出特殊函数的具体表达式,读者此处我们将不给出特殊函数的具体表达式,读者可查阅相关资料。
可查阅相关资料•Beta[a,b],Beta[z,a,b] Bata函数及不完全函数及不完全Beta函数函数•Gamma[z],Gamma[a,z] Gamma函数及不完全函数及不完全Gamma函数函数•Erf[z],Erf[z0,z1] 误差函数及广义误差函数误差函数及广义误差函数•BesselJ[n,z],BesselY[n,z] 贝赛尔函数贝赛尔函数•BesselI[n,z],BesselK[n,z] 修正的贝赛尔函数修正的贝赛尔函数•ExpIntegralE[n,z],LogIntegral[z] 指数积分与对数积指数积分与对数积分分 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 数学软件包的读入方法数学软件包的读入方法:在讲义上的此部分在讲义上的此部分,提供了一种数学软件包的读入提供了一种数学软件包的读入mathematica中的方法中的方法,下面是一种更为简单的方下面是一种更为简单的方法法我们下面要读入软件包我们下面要读入软件包:目录目录:C:\Program Files\Wolfram Research\Mathematica\5.0\AddOns\StandardPackages\LinearAlgebra文件名文件名: Orthogonalization.M 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 执行以下的执行以下的mathematica菜单菜单:在在弹出的文件打开框中弹出的文件打开框中,一直找到上面的文件为止一直找到上面的文件为止.在此文件框中打开此在此文件框中打开此文件文件,则则mathematica并没有真正打开文件并没有真正打开文件,而是返回了文件所在而是返回了文件所在的路径的路径 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 最后最后,在此返回路径的前面加上在此返回路径的前面加上2个个“<<”并运行并运行,即即可读入此软件包可读入此软件包,它是关于向量正交化的它是关于向量正交化的.使用任何一个编辑软件打开此软件包文件使用任何一个编辑软件打开此软件包文件,你会发现你会发现如下如下:GramSchmidt::usage ="GramSchmidt[vectors] performs the GramSchmidt orthogonalization process on a list of vectors. Note that an inner product can be specified,allowing, for instance, a function space to used. Also, the option Normalized can be set to determine whether or not the basis is orthonormal." 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 它是它是线性代数中的施密特向量正交化函数线性代数中的施密特向量正交化函数,当然当然,此此软件包中还有许多其它的函数软件包中还有许多其它的函数.下面是一个例子下面是一个例子,此例子一定要在读入软件包后此例子一定要在读入软件包后,才才能使用能使用. 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 5、自定义函数5、自定义函数 在在Mathematica中定义一个新函数后,其用法与中定义一个新函数后,其用法与内部函数是一样的,其定义形式为内部函数是一样的,其定义形式为 fun[var1_,var2_,…]:=expr 或或 fun[var1_,var2_,…]=expr 其中函数变量后面的下划线必不可少,以上面的其中函数变量后面的下划线必不可少,以上面的var1_为例,其意思是让为例,其意思是让var1匹配所有表达式,但我匹配所有表达式,但我们可以在下划线的后面限定变量的类型,如们可以在下划线的后面限定变量的类型,如f[n_Integer]的意思是变量的意思是变量n是一个整数。
例如是一个整数例如 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 Mathematica中的函数调用是递归的,就是说,函数中的函数调用是递归的,就是说,函数可以调用自身,下面是计算阶乘的函数子程序可以调用自身,下面是计算阶乘的函数子程序 由于限制由于限制k为整数,所以对为整数,所以对a[10.0],,Mathematica是不会计算的系统中的许多内部函数都是利用递归是不会计算的系统中的许多内部函数都是利用递归调用实现的,调用实现的,$RecursionLimit是系统进行递归调用是系统进行递归调用的最大次数,默认值为的最大次数,默认值为256,你可以将它修改为一个,你可以将它修改为一个合适的值,这只需对合适的值,这只需对$RecursionLimit重新赋值即可重新赋值即可 对于复杂的函数定义,可以用模块对于复杂的函数定义,可以用模块Module[]定义,定义,其形式为其形式为 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 fun[var1_,var2_,…]:= Module[{x,y,…},statement 1; statement 2; …; statement N];其中变量其中变量x,y称为局部变量,它只在此函数定义的内部称为局部变量,它只在此函数定义的内部起作用起作用(实际上,实际上,Module[]就是其它计算机语言中的函就是其它计算机语言中的函数子程序,更进一步解释见第5节数子程序,更进一步解释见第5节)。
另外,对于复另外,对于复杂的函数定义,一般要应用条件判断及循环结构,第杂的函数定义,一般要应用条件判断及循环结构,第5节我们将要详细介绍这方面的内容例如,上面计5节我们将要详细介绍这方面的内容例如,上面计算阶乘的例子可用模块形式书写为算阶乘的例子可用模块形式书写为 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 如果没有如果没有Return[expr]命令,命令,Module[]返回最后一次返回最后一次计算结果作为函数值还有,在某些情况下,你可能计算结果作为函数值还有,在某些情况下,你可能需要更改需要更改Mathematica内部函数定义,以适合自己某内部函数定义,以适合自己某种特殊要求例如对种特殊要求例如对Log[x^s]和和Log[x y],,系统并不系统并不直接化成直接化成s Log[x]和和Log[x]+Log[y]的形式,这我们可的形式,这我们可以通过更改以通过更改Mathematica对函数对函数Log[]的定义来做到这的定义来做到这一点,这要用到以下函数一点,这要用到以下函数•Unprotect[command] 移去系统对命令移去系统对命令command的保的保护状态护状态•Protect[command] 加上系统对命令加上系统对命令command的保护的保护状态状态 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 请看下面的具体做法请看下面的具体做法:Mathematica中的函数定义还有以下形式:中的函数定义还有以下形式:•Function[x,body] 定义以定义以body为函数体的纯函数,其为函数体的纯函数,其中中x可以为用户提供的任何变量来代替可以为用户提供的任何变量来代替•Function[{x1,x2,…},body] 同上,但定义多个变量的同上,但定义多个变量的纯函数纯函数 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 •Body& 若函数体若函数体body是单变量函数,此变量规定为是单变量函数,此变量规定为#,若为多个变量,则第一个变量为,若为多个变量,则第一个变量为#1,第二个变量,第二个变量#2,依此类推,依此类推 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 6、函数及表达式的变换规则6、函数及表达式的变换规则•expr/.rules 变换法则变换法则rules只对只对expr中的每项使用一次中的每项使用一次其中其中“→”是键入是键入“->”的结果。
另外,如果变换条的结果另外,如果变换条件只有一个,可以不用集合定界符件只有一个,可以不用集合定界符{},例如,例如 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 •expr//.rules 反复对反复对expr使用使用rules,,直到结果不变为直到结果不变为•Nest[f,x,n] 函数函数f以以x为变量,进行为变量,进行n次复合运算次复合运算实质上,实质上,f是函数的头,即是函数的头,即Head[f],,例如例如 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 •NestList[f,x,n] 同上,但形成一个复合函数序列的集合同上,但形成一个复合函数序列的集合•Compose[f,g,…,h,x] 函数复合,生成函数复合,生成f[g[…h[x]]]•Composition[f,g,…,h] 同上,但不带有自变量同上,但不带有自变量•ComposeList[{f,g,…,h},x]生成复合序列生成复合序列{x,f[x],g[f[x]],…} 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 •FixedPoint[f,x] 对对x重复重复f运用,直到结果不变为止运用,直到结果不变为止•FixedPointList[f,x] 同上,但列出所有中间计算结果同上,但列出所有中间计算结果•FixedPointList[f,x,SameTest->Comp] 对两个连续的结对两个连续的结果运用比较关系果运用比较关系comp,,比较结果为真时停止运算比较结果为真时停止运算下面以利用牛顿迭代法求5开平方根为例,说明其用法下面以利用牛顿迭代法求5开平方根为例,说明其用法•FoldList[f,x,{a,b,…}] 构成集合构成集合{x,f[x,a],f[f[x,a],b],…}•Fold[f,x,{a,b,…}] 给出函数给出函数FoldList的最后一个元素的最后一个元素 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 •Apply[f,{a,b,c,…}] 对集合运用对集合运用f,,得到得到f[a,b,c,…]•Apply[f,expr] 对表达式的最高层应用对表达式的最高层应用f•Apply[f,expr,level] 对表达式的指定层应用对表达式的指定层应用f•Map[f,expr] 将函数将函数f作用到表达式第一层的每个部作用到表达式第一层的每个部件上件上•Map[f,expr,level] 将将f作用到表达式第作用到表达式第n层的每个部件层的每个部件上上•MapAll[f,expr] 对表达式对表达式expr的所有部件应用的所有部件应用f•MapThread[f,{expr1,expr2,…}] 对对expr1及及expr2的相的相应元素运用应元素运用f• MapThread[f,{expr1,expr2,…},lev]对给定层的表达对给定层的表达式运用式运用f 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 •Scan[f,expr] 依次计算对依次计算对expr中的每个元素运用中的每个元素运用f的值的值•Scan[f,expr,level]同上,但在指定层上计算同上,但在指定层上计算•Array[f,n] 生成表生成表{f[1],f[2],…,f[n]}•Array[f,{n1,n2}] 同上,但生成一个二维表同上,但生成一个二维表 哈哈 工工 程程 大大 学学 数数 值值 计计 算算 软软 件件 电电 子子 教教 案案 •Seclect[expr,f] 在在expr中挑选出函数中挑选出函数f为为True的元素的元素•Seclect[expr,f,n] 同上,但只选出前同上,但只选出前n 个使个使f为为True的的元素元素•Operate[p,f[x]] 算子函数,给出算子函数,给出p[f][x]•Operate[p,f[x],n] 同上,但在函数的第同上,但在函数的第n层应用层应用p。