声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3117|回复: 0

[mathematica] MATHEMATICA讲座(3) ----徐安农教授

[复制链接]
发表于 2006-5-9 15:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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&amp; ,{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-&gt;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&lt;=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&gt;eps,  <BR>If[f2&gt;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&lt;=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&lt;=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&lt;=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&lt;=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-&gt;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&lt;=50,i++,  <BR>If[Abs[xn-xn1]&gt;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&lt;=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&lt;=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&gt;0,x+1,x&lt;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,#&lt;60&amp;]]]  <BR>Print["60~69分的人数为",Length[Select[data,#&gt;=60&amp;&amp;#&lt;70&amp;]]]  <BR>Print["70~79分的人数为",Length[Select[data,#&gt;=70&amp;&amp;#&lt;80&amp;]]]  <BR>Print["80~89分的人数为",Length[Select[data,#&gt;=80&amp;&amp;#&lt;90&amp;]]]  <BR>Print["90分以上的人数为",Length[Select[data,#&gt;90&amp;]]]  <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&lt;=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&lt;=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&gt;x,Goto[aa]];  <BR>y=78;  <BR>Label[aa];  <BR>y  <BR>
回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-25 07:49 , Processed in 0.053338 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表