MATHEMATICA讲座(3) ----徐安农教授
MATHEMATICA讲座第九讲<BR>表处理函数<BR> Mathematica的表处理功能非常强大,这成为Mathematica系统的一个显著特点,<BR>在符号处理、矩阵运算等方面具有重要作用,在一般的程序设计中亦是必不可少的。 <BR>1、Table[表达式,循环描述]:按循环描述生成具有表达式所描述的性质的表;<BR>算例:<BR>Table<BR>2、(*NestList[函数f,初值x,递推次数n]:求值生成一个由n+1元素的表:<BR> {f(x),f(f(x)),…,f…f(x)} *)<BR>算例:<BR>h:=x^2;<BR>NestList<BR>3、Part[表,n](或表[]):取出表的第n个元素;<BR>算例:<BR>Clear;<BR>ww={a,b,c,d,e};<BR>ww[]<BR>Part<BR>4、Take[表,整数n]:取出表的前n个元素做成一个表,<BR>Drop[表,n]的作用正好与Take相反,是取出后表的前n个元素剩余的元素作成的一个<BR>表;<BR>算例:<BR>Clear;<BR>Take[{1,3,5,a,b,c},4]<BR>Drop[{1,3,5,a,b,c},2]<BR>5、Count[表,表达式]:求表达式在表的第一层出现的次数;<BR>算例:<BR>Clear;<BR>Count[{a,b,c,a,d,a,{a,c}},a]<BR>6、Position[表,表达式];找出表达式在表中出现的位置;<BR>算例:<BR>Position[{1,b,a,{a,b}},a]]<BR>7、Prepend[表,表达式]:把表达式放在原表所有元素的前面;<BR>Append[表,表达式]:表达式放在原表最后<BR>算例:<BR>Prepend[{a,b,c,s},f]<BR>Append[{a,b,c,d},e]<BR>8、Insert[表,表达式,整数n]:表达式插入原表第n个位置<BR>算例:<BR>Insert[{1,2,3,4},a,3]<BR>9、Join[表1,表2,…]:得到一个由这n个表的元素顺序连接起来构成的表;<BR>Union[表1,表2,…]:与Join类似,只是在作为结果的表里删除了重复元素,并且<BR>将表的元素按一种内定的次序重新排序;<BR>算例:<BR>Join[{a,b,c},{a,b}]<BR>Union[{a,e,f},{a,b,e,f}]<BR>10、Reverse[表]:求出原表反序的表;<BR>算例:<BR>Reverse[{1,2,3,4}]<BR>11、Transpose[表]:这里的表应多于一层,求出原表第一层和第二层元素交换得的表,如果表为矩阵即得矩阵的转置;<BR>算例:<BR>Transpose[{{1,2,3},{4,5,6}}]<BR>12、 Deletecases[表,表达式]:删除表中与表达式相同的元素;<BR>算例:<BR>Deletecases[{10,8,9,7},10]<BR>13、Flatten[表,n]:求出表上面n层抹平后得到的表;<BR>算例:<BR>Flatten[ { { a,b,{c,d,{ e,f } } },g },2 ]<BR>14、 Det[矩阵]:求矩阵的行列式;<BR>Inverse[矩阵]:求矩阵的逆;<BR>算例:<BR>A={{1,2,3},{4,5,6},{7,8,8}};<BR>Det<BR>Inverse<BR>15、Intersection[表1,表2,…]:将这些表作为集合求交集;<BR>算例:<BR>Clear;<BR>Intersection[{a,b,c,d},{a,b,e,g},{b,c,d}]<BR>16、Complement[表1,表2,表3,…]:求表1,表2,表3,…相对于 表1的补集;<BR>算例:<BR>Clear;<BR>Complement[{a,b,c,d},{a,c},{a,e}]<BR>17 Map[函数,表达式]:将函数作用到表达式的第一层的每一个元素上,得到由这样作用的结果构成的表达式;<BR>算例:<BR>Clear;<BR>Map[#Λ2& ,{a,b,c}]<BR>18、Apply[函数,表]:把表作为函数的参数表求值得到的表达式<BR>算例:<BR>Clear<BR>ff:=x+y^2+z^3;<BR>Apply<BR><BR><BR>MATHEMATICA第十讲 <BR>程序设计初步<BR>在这一讲里我们将介绍 Mathematica的程序设计的初步知识。<BR>系统自身定义了几百个函数,这是MATHEMATICA之所以功能强大的缘故,很好的利用这些函数可以完成许多方面的工作,如 Fit Plot等。这里学习一个很有用的指令“?”。<BR><BR>在一个函数前面打 ?可以得到有关这个函数的说明。<BR>例如:<BR>?Plot<BR>在一个字母前加?,系统给出以这个字母开头的所有函数的列表。<BR>?P*<BR>??Plot 给出关于Plot的进一步的信息<BR>函数的复合<BR>利用系统内部函数可以构造出更多更复杂的函数。 <BR>例 先求出SIN(X)的台劳展开式,再截取它的前九项。<BR>Series,{x,0,9}]<BR>Normal,{x,0,9}]]<BR><BR>二 自定义函数<BR>f:=表达式<BR>如果输入的自变量是表,则用:<BR>f:=表达式<BR>一般地f:=表达式,patten表示自变量的模式,如:<BR>f:=表达式,自变量应为整数.<BR>同理f:=表达式,定义二元函数.<BR>例<BR>f:=x^3-x+1<BR>Plot,{x,-2,2}]<BR>Print["f(0)=",f]<BR>例 定义一个画半径为r的圆的函数myPlot<BR>myPlot:=ParametricPlot[{r*Cos,r*Sin},{t,0,2*Pi},<BR>AspectRatio->Automatic]<BR>myPlot<BR>Map<BR>Show[%]<BR><BR>三 循环结构<BR>1 While[条件,表达式]<BR>称为当循环结构。其中“条件”是一个逻辑表达式,先对条件求值,如得到True,<BR>则求值它的表达式部份,然后重复上述过程,直到条件不满足为止,循环结束。<BR>例 求平方小于100的最大的整数<BR>clear;<BR>x=0;<BR>While;<BR>Print["x=",x-1]<BR>例 用黄金分割法求方程的根<BR>eps=10^(-6);a=-1.;b=0.;<BR>f:=x^2+2x+2;<BR>x1=b-0.618(b-a);x2=a+0.618(b-a);<BR>f1=f;f2=f;<BR>While,<BR>a=x1;x1=x1;x2=a+0.618(b-a);f1=f2;f2=f<BR>]<BR>];<BR>Print["最优解x*=",(x1+x2)/2," 最优值f(x*)=",f[(x1+x2)/2]]<BR>2.For[初始表达式,条件,步进表达式,表达式]<BR>步进表达式用于对循环控制变量作步进赋值<BR>n++表示将n的值增加一个单位;<BR>n+=2表示将n的值增加两个单位;<BR>例 求出前10个自然数的和L与前10个自然数的乘积S<BR>L=0;S=1;<BR>For<BR>Print["L=",L]<BR>Print["S=",S]<BR>例 计算1+1/3+1/5+...+1/10<BR>S=0;<BR>For<BR>Print["S=",N]<BR><BR>例 求Fibonacci数列的前40项<BR>fibonacci={1,1};<BR>For]+<BR>fibonacci[]]<BR>]<BR>Print["fibonacci[]=",fibonacci[]]<BR>例 求自然对数的底e的近似值<BR>e=1;t=1;<BR>For;<BR>N<BR>3 Do[表达式,循环描述]<BR>例 将表达式t=t^2+1从t=1执行3次<BR>Clear<BR>t=1;<BR>Do<BR>Print["t=",t]<BR>t=26<BR>例 计算翻倍<BR>Clear<BR>t=5;<BR>Do<BR>Print["t=",t]<BR>例<BR>Clear<BR>Do,{t,4}]<BR>1<BR>例:牛顿迭代法求方程x-cos(x)=0的实根<BR>Plot,{x,-10,10}]<BR>t=3;<BR>Do;t=N)/(1+Sin)],{20}<BR>]<BR>4 FixedPoint[函数,表达式]<BR>将已给函数一直复合到不动点,如果存在的话。<BR><BR>例 求证线性函数0.2*x+5无论从哪一个点出发经过多次迭代都将收敛于同一个数。<BR>f:=0.2 x+5;<BR>FixedPoint<BR>5 表达式//.替换规则<BR>例 用t+1代换x^2+2*x-1之中的x直到不变为止。<BR>Clear<BR>x^2+2*x-1//.x->t+1<BR>6 Nest[函数,表达式,整数n] 将表达式代入函数作用给定的次数。<BR>例<BR>f:=x^2;<BR>Nest<BR><BR>四 分枝结构<BR>1 If [条件,表达式]<BR>当条件为True时,求表达式的值,当条件为False时,返回Null.<BR>If[条件,表达式1,表达式2]<BR>当条件为True时,求表达式1的值,当条件为False时,求表达式2的值。<BR>If[条件,表达式1,表达式2,表达式3]<BR>当条件为True时,求表达式1的值,当条件为False时,求表达式2的值,<BR>当条件表达式求不出True或False时,以表达式3的值作为结果<BR>例<BR>Clear;<BR>x=10<BR>If;<BR>y<BR>例<BR>Clear;<BR>x=0.4;<BR>If;<BR>y<BR>例<BR>Clear;<BR>x=tt;<BR>If;<BR>y<BR>例 观察数列的前50项<BR>求极限 xn=Lim(1+1/2^2+1/3^2+...+1/n^2)<BR>xn1=0;m=4;xn=1.;<BR>For>10^(-m),<BR>xn1=N;<BR>xn=xn+1/i^2;<BR>Print<BR>]<BR>]<BR>例 求100以内的素数<BR>w={};<BR>For,w=Append]<BR>];<BR>w<BR>Length (*给出100内的素数个数*)<BR>例 构造一个函数求x以内的所有素数<BR>Prn:=Module[{i,w={}},<BR>For,AppendTo]];w<BR>]<BR>Timing]<BR>(*其中Timing[]是显示计算的时间。*)<BR>2 Which[条件1,表达式1,条件2,表达式2,...]<BR>例 用Which定义分段函数<BR>f:=Which];<BR>Print["f=",f]<BR>Print["f[-1]=",f[-1]]<BR>Print["f=",f]<BR>例 按分数段统计一个教学班某次考试成绩学生人数<BR>成绩数据<BR>76,58,84,32,91,95,94,88,78,83,82,67,63,<BR>69,74,77,100,78,81,92,95,67,49,90,53,67,<BR>67,87,78,94<BR>data={76,58,84,32,91,95,94,88,78,83,82,67,63,69,74,<BR>77,100,78,81,92,95,67,49,90,53,67,67,87,78,94};<BR>Print["不及格人数为",Length]]<BR>Print["60~69分的人数为",Length]]<BR>Print["70~79分的人数为",Length]]<BR>Print["80~89分的人数为",Length]]<BR>Print["90分以上的人数为",Length]]<BR>3 Switch[判别表达式,模式1,表达式1,模式2,表达式2,...]<BR>例 构造一个函数,当x被3整除时,函数值为a,当x关于3的模为1时,函数值为b,当x<BR>关于3的模为2时,函数值为c.<BR>h:=Switch,0,a,1,b,2,c]<BR>h<BR>h<BR>h<BR><BR>五 转向结构<BR>Break[] 用于For、While(Do不能使用)语句中,表示结束包含这个break表达式<BR>的最近循环,且以Null作为该结构的值。<BR>Continue[] 立即结束包含这个Continue的循环,执行下一次循环。<BR>Return 从函数的求值过程中退出(例句见十四讲)<BR>Return[] 退出函数的求值,以Null作为当前函数值<BR>Return 退出函数的求值,以expr作为当前函数值<BR>典型的使用结构为:<BR>While(或For)[...,<BR>...,...;<BR>If[...,Continue[]];<BR>...,...;<BR>If[...,...,Break[]];<BR>...,...<BR>]<BR><BR>例: 求20至300之间不能被5整除的所有数<BR>w={};<BR>For==0,Continue[]];w=Append;<BR>];<BR>w<BR>例 求20至500之间不能被8整除的第十个数<BR>w={};<BR>For!=0,w=Append];If==10,Break[]]<BR>];<BR>i<BR>Goto[标志]和Lable[标志]用于在复合表达式中实现执行的控制转移.<BR>Lable[标志]是一个位置的标识,本身什么也不做。<BR>Goto[标志]将执行立即转移到具有同一标志的Lable位置去。<BR>典型使用方式<BR>Module[...,<BR>......;<BR>Lable;<BR>......;<BR>If[...,Goto];<BR>......]<BR>例 Goto的作用在于越过某些语句去执行指定的语句<BR>x=1;y=3;<BR>If];<BR>y=78;<BR>Label;<BR>y<BR>
页:
[1]