|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
MATHEMATICA讲座第九讲 <BR>表处理函数 <BR> Mathematica的表处理功能非常强大,这成为Mathematica系统的一个显著特点, <BR>在符号处理、矩阵运算等方面具有重要作用,在一般的程序设计中亦是必不可少的。 <BR>1、Table[表达式,循环描述]:按循环描述生成具有表达式所描述的性质的表; <BR>算例: <BR>Table[i2+1,{i,1,5}] <BR>2、(*NestList[函数f,初值x,递推次数n]:求值生成一个由n+1元素的表: <BR> {f(x),f(f(x)),…,f…f(x)} *) <BR>算例: <BR>h[x_]:=x^2; <BR>NestList[h,2,4] <BR>3、Part[表,n](或表[[n]]):取出表的第n个元素; <BR>算例: <BR>Clear[a,b,c,d,e]; <BR>ww={a,b,c,d,e}; <BR>ww[[3]] <BR>Part[ww,2] <BR>4、Take[表,整数n]:取出表的前n个元素做成一个表, <BR>Drop[表,n]的作用正好与Take相反,是取出后表的前n个元素剩余的元素作成的一个 <BR>表; <BR>算例: <BR>Clear[a,b,c]; <BR>Take[{1,3,5,a,b,c},4] <BR>Drop[{1,3,5,a,b,c},2] <BR>5、Count[表,表达式]:求表达式在表的第一层出现的次数; <BR>算例: <BR>Clear[a,b,c,d]; <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[A] <BR>Inverse[A] <BR>15、Intersection[表1,表2,…]:将这些表作为集合求交集; <BR>算例: <BR>Clear[a,b,c,d,e,g]; <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[a,b,c,d,e]; <BR>Complement[{a,b,c,d},{a,c},{a,e}] <BR>17 Map[函数,表达式]:将函数作用到表达式的第一层的每一个元素上,得到由这样作用的结果构成的表达式; <BR>算例: <BR>Clear[a,b,c]; <BR>Map[#Λ2& ,{a,b,c}] <BR>18、Apply[函数,表]:把表作为函数的参数表求值得到的表达式 <BR>算例: <BR>Clear[a,b,c] <BR>ff[x_,y_,z_]:=x+y^2+z^3; <BR>Apply[ff,{a,b,c}] <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[Sin[x],{x,0,9}] <BR>Normal[Series[Sin[x],{x,0,9}]] <BR> <BR>二 自定义函数 <BR>f[x_]:=表达式 <BR>如果输入的自变量是表,则用: <BR>f[x_List]:=表达式 <BR>一般地f[x_patten]:=表达式,patten表示自变量的模式,如: <BR>f[x_Integer]:=表达式,自变量应为整数. <BR>同理f[x_,y_]:=表达式,定义二元函数. <BR>例 <BR>f[x_]:=x^3-x+1 <BR>Plot[f[x],{x,-2,2}] <BR>Print["f(0)=",f[0]] <BR>例 定义一个画半径为r的圆的函数myPlot[r_] <BR>myPlot[r_]:=ParametricPlot[{r*Cos[t],r*Sin[t]},{t,0,2*Pi}, <BR>AspectRatio->Automatic] <BR>myPlot[1] <BR>Map[myPlot,{1,2,3,4,5}] <BR>Show[%] <BR> <BR>三 循环结构 <BR>1 While[条件,表达式] <BR>称为当循环结构。其中“条件”是一个逻辑表达式,先对条件求值,如得到True, <BR>则求值它的表达式部份,然后重复上述过程,直到条件不满足为止,循环结束。 <BR>例 求平方小于100的最大的整数 <BR>clear[x]; <BR>x=0; <BR>While[x^2<=100,x=x+1]; <BR>Print["x=",x-1] <BR>例 用黄金分割法求方程的根 <BR>eps=10^(-6);a=-1.;b=0.; <BR>f[x_]:=x^2+2x+2; <BR>x1=b-0.618(b-a);x2=a+0.618(b-a); <BR>f1=f[x1];f2=f[x2]; <BR>While[x2-x1>eps, <BR>If[f2>f1,b=x2;x2=x1;x1=b-0.618(b-a);f2=f1;f1=f[x1], <BR>a=x1;x1=x1;x2=a+0.618(b-a);f1=f2;f2=f[x2] <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[i=1,i<=10,i++, <BR>L=L+i; <BR>S=S*i; <BR>] <BR>Print["L=",L] <BR>Print["S=",S] <BR>例 计算1+1/3+1/5+...+1/10 <BR>S=0; <BR>For[i=1,i<=10,i+=2, <BR>S=S+1/i; <BR>] <BR>Print["S=",N[S,10]] <BR> <BR>例 求Fibonacci数列的前40项 <BR>fibonacci={1,1}; <BR>For[i=1,i<=38,i++, <BR>fibonacci=Append[fibonacci,fibonacci[]+ <BR>fibonacci[[i+1]]] <BR>] <BR>Print["fibonacci[[40]]=",fibonacci[[40]]] <BR>例 求自然对数的底e的近似值 <BR>e=1;t=1; <BR>For[k=1,k<=10,k++, <BR>t=k*t; <BR>e=e+1/t <BR>]; <BR>N[e,10] <BR>3 Do[表达式,循环描述] <BR>例 将表达式t=t^2+1从t=1执行3次 <BR>Clear[t] <BR>t=1; <BR>Do[t=t^2+1,{3}] <BR>Print["t=",t] <BR>t=26 <BR>例 计算翻倍 <BR>Clear[t] <BR>t=5; <BR>Do[t=2*t,{n,2,5}] <BR>Print["t=",t] <BR>例 <BR>Clear[t] <BR>Do[Print[t^2],{t,4}] <BR>1 <BR>例:牛顿迭代法求方程x-cos(x)=0的实根 <BR>Plot[x-Cos[x],{x,-10,10}] <BR>t=3; <BR>Do[Print[t];t=N[t-(t-Cos[t])/(1+Sin[t])],{20} <BR>] <BR>4 FixedPoint[函数,表达式] <BR>将已给函数一直复合到不动点,如果存在的话。 <BR> <BR>例 求证线性函数0.2*x+5无论从哪一个点出发经过多次迭代都将收敛于同一个数。 <BR>f[x_]:=0.2 x+5; <BR>FixedPoint[f,0] <BR>5 表达式//.替换规则 <BR>例 用t+1代换x^2+2*x-1之中的x直到不变为止。 <BR>Clear[t,x] <BR>x^2+2*x-1//.x->t+1 <BR>6 Nest[函数,表达式,整数n] 将表达式代入函数作用给定的次数。 <BR>例 <BR>f[x_]:=x^2; <BR>Nest[f,x^2+x+1,3] <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[x,y]; <BR>x=10 <BR>If[x!=Integer,y=1,y=2,y=3]; <BR>y <BR>例 <BR>Clear[x,y]; <BR>x=0.4; <BR>If[x!=Integer,y=1,y=2,y=3]; <BR>y <BR>例 <BR>Clear[x,y,tt]; <BR>x=tt; <BR>If[x!=Integer,y=1,y=2,y=3]; <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[i=2,i<=50,i++, <BR>If[Abs[xn-xn1]>10^(-m), <BR>xn1=N[xn,10]; <BR>xn=xn+1/i^2; <BR>Print[i," ",xn1," ",xn," "] <BR>] <BR>] <BR>例 求100以内的素数 <BR>w={}; <BR>For[i=1,i<=100,i++, <BR>If[PrimeQ,w=Append[w,i]] <BR>]; <BR>w <BR>Length[w] (*给出100内的素数个数*) <BR>例 构造一个函数求x以内的所有素数 <BR>Prn[x_]:=Module[{i,w={}}, <BR>For[i=1,i<=x,i++, <BR>If[PrimeQ,AppendTo[w,i]]];w <BR>] <BR>Timing[Prn[1000]] <BR>(*其中Timing[]是显示计算的时间。*) <BR>2 Which[条件1,表达式1,条件2,表达式2,...] <BR>例 用Which定义分段函数 <BR>f[x_]:=Which[x>0,x+1,x<0,exp[x]]; <BR>Print["f[2]=",f[2]] <BR>Print["f[-1]=",f[-1]] <BR>Print["f[0]=",f[0]] <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[Select[data,#<60&]]] <BR>Print["60~69分的人数为",Length[Select[data,#>=60&&#<70&]]] <BR>Print["70~79分的人数为",Length[Select[data,#>=70&&#<80&]]] <BR>Print["80~89分的人数为",Length[Select[data,#>=80&&#<90&]]] <BR>Print["90分以上的人数为",Length[Select[data,#>90&]]] <BR>3 Switch[判别表达式,模式1,表达式1,模式2,表达式2,...] <BR>例 构造一个函数,当x被3整除时,函数值为a,当x关于3的模为1时,函数值为b,当x <BR>关于3的模为2时,函数值为c. <BR>h[x_]:=Switch[Mod[x,3],0,a,1,b,2,c] <BR>h[4] <BR>h[5] <BR>h[6] <BR> <BR>五 转向结构 <BR>Break[] 用于For、While(Do不能使用)语句中,表示结束包含这个break表达式 <BR>的最近循环,且以Null作为该结构的值。 <BR>Continue[] 立即结束包含这个Continue的循环,执行下一次循环。 <BR>Return 从函数的求值过程中退出(例句见十四讲) <BR>Return[] 退出函数的求值,以Null作为当前函数值 <BR>Return[expr] 退出函数的求值,以expr作为当前函数值 <BR>典型的使用结构为: <BR>While(或For)[..., <BR>...,...; <BR>If[...,Continue[]]; <BR>...,...; <BR>If[...,...,Break[]]; <BR>...,... <BR>] <BR> <BR>例: 求20至300之间不能被5整除的所有数 <BR>w={}; <BR>For[i=50,i<=300,i++, <BR>If[Mod[i,5]==0,Continue[]];w=Append[w,i]; <BR>]; <BR>w <BR>例 求20至500之间不能被8整除的第十个数 <BR>w={}; <BR>For[i=50,i<=300,i++, <BR>If[Mod[i,8]!=0,w=Append[w,i]];If[Length[w]==10,Break[]] <BR>]; <BR>i <BR>Goto[标志]和Lable[标志]用于在复合表达式中实现执行的控制转移. <BR>Lable[标志]是一个位置的标识,本身什么也不做。 <BR>Goto[标志]将执行立即转移到具有同一标志的Lable位置去。 <BR>典型使用方式 <BR>Module[..., <BR>......; <BR>Lable[a]; <BR>......; <BR>If[...,Goto[a]]; <BR>......] <BR>例 Goto的作用在于越过某些语句去执行指定的语句 <BR>x=1;y=3; <BR>If[y>x,Goto[aa]]; <BR>y=78; <BR>Label[aa]; <BR>y <BR> |
|