学习第二阶段教程09mathematica程序设计_第1页
学习第二阶段教程09mathematica程序设计_第2页
学习第二阶段教程09mathematica程序设计_第3页
学习第二阶段教程09mathematica程序设计_第4页
学习第二阶段教程09mathematica程序设计_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Mathematica程序设计顺序结构条件结构循环结构迭代函数程序跳转控制输入输出函数模块块程序与编程顺序结构在Mathematica中的顺序结构就是复合表达式,即一串用分号隔开的表达式.x=2;y=4;z=6

?x

?y

?z说明:In[1]就是一个复合表达式,由3个表达式组成,其中最后一个表达式不带分号,输出只显示最后一个表达式的执行结果。再通过查看变量得知,3个表达式都被执行了。在In[5]中,最后一个表达式也带分号,这时没有结果被显示。条件结构If型结构If型结构是最为常用的条件结构,具体格式如下:If[test,then]当条件test成立时执行表达式then,当条件不成立时返回Null(没有结果显示)。If[test,then,else]当条件test成立时执行表达式then,当条件不成立时执行表达式else。If[test,then,else,unknown]当条件test成立时执行表达式then,当条件不成立时执行表达式else,不能判定条件是否成立时执行表达式unknown注意:允许条件判定失败的情况出现,这时执行表达式unknown,没有表达式unknown时Mathematica将整个条件结构作为结果返回,其中被执行的表达式,在简单的例子中只是一个数学表达式.其实,也可以由多个表达式复合组成,允许有复杂的结构.被执行表达式的执行结果将作为If结构的结果返回,可以将结果赋值给其他变量.复杂的情况将在后面的综合应用中介绍,这里先举几个简单的例子.利用If结构定义分段函数f[x_]:=If[x>0,x,-x];f[2];f[-5];f[0]说明:In[1]中使用If型结构定义了一个分段函数,当

x>

0时函数值等于x,否则函数值等于一x,实际就

是求x的绝对值。具有这种类型定义式的函数再进

行其他运算时可能失败,例如不能继续求不定积分,但可以求定积分、导函数(分段点除外),也可以用

于绘图。If型结构可以嵌套f[x_]

=

If[x

>

0,

1,

If[x

==

0,

0,

-1]];f[0];

f[-3]x

=

2;f[x_]

:=

If[x

>

0,

1,

If[x

==

0,

0,

-1]];?f说明:利用嵌套能定义有多个表达式的分段函数,但这种函数不能求定积分了,不过还可以求导和绘图.定义这类函数时应使用“:=”,本例有意改用"="是想说明以下一些问题.In[1]用"="定义时,等号右边的表达式被立即执行,因为x无值无法判定条件是否成立,按约定将整个If结构保留作为求值结果赋给f[x],这样定义与使用":="效果相同.这里定义的是符号函数但是,在In[4]已经键入x=2后,再用"="定义函数时,If结构立即被执行,得到求值结果为1给f[x],In[6]查看f后知道f[x]恒等于1,显然出错了.Which型结构Which[test1,value1,test2,value2,...]当条件test1成立时执行表达式value1,当条件test1不成立但条件test2成立时,执行表达式value2依此类推.被执行表达式的执行结果将作为Which结构的结果返回,可以赋值给其他变量。如果遇到有一个条件无法判定时,则将整个条件结构作为结果返回。最后一个条件可以使用True,使最后一个表达式成为缺省的表达式。当所有条件都不成立时,返回Null作为结果。说明:In[1]中x无值,无法判定条件是否成立,整句作为结果输出。In[2]赋值x=0,但是In[3]中的条件都不成立,返回Null,没有结果显示。In[4]使用了缺省值,因为x=0时,两个测试条件都不成立,于是返回缺省位0.使用这种结构定义分段函数比If结构方便.利用Which型结构定义分段函数求导输出结果作为导函数表达式只在分段点处不正确求积分则失败Switch型结构Switch[expr,form1,value1,form2,value2,…]首先对判别expr求值,首次遇到可匹配的"formk",则执行

“valuek".

被执行表达式的执行结果将作为Switch结构的结果返回,可以赋值给其他变量。如果所有的匹配尝试都失败,则将整个Switch结构作为结果输出,但可能与原结构式不同,因为“表达式”变成了它的“值”。如果最后一个匹配式为“_”,则最后一个表达式成为缺省的表达式。f[x_]:=Switch[x,1,Plot[t^2,{t,0,1}],2,Plot[t^3,{t,-1,1}]];f[2]

f[0]说明:In[1]中利用Switch结构定义了一个绘图函数,求f[2]的结果是执行Switch结构,表达式x被求值为

2,与formi匹配,执行valuei是绘图,结果得到如图所示的图形.再求f[0],不能匹配,结果输出整个结构式,但是表达式x被用0替换。

注意:如果在Plot表达式中变量t仍用x,则求f[2]会失败,读者可以自行验证并弄清原因。在Switch型结构中使用缺省表达式sqrt0[x_?Positive]:=Switch[Sqrt[x],_Integer,Print["Integer",Sqrt[x]],_Rational,Print["Rational",Sqrt[x]],_,Print["other",Sqrt[x]]]sqrt0[4]sqrt0[4/9]sqrt0[3]sqrt0[0.25]sqrt0[-4]In[1]定义了一个正数开平方的函数sqrt0,输出结果分成

3类:整数,分数,其他的数.其中“Integer”表示能与任何整数匹配,“Rational”表示能与任何分数(不包括整数)匹配.最后的匹配式为“_”能与任何表达式匹配,因此最后的表达式是缺省的表达式,当求值结果不是整数和分数时,最后的表达式肯定被执行.函数Print[expr1,expr2,...]用于向屏幕输出一系列表达式,两个表达式之间不留空格(空格可用字符串产生),输出的字符串用双引号括起来.这种输出显示是由程序编制者

控制的(Print函数的输出),不是Mathematica的自动输出

Print函数返回结果为Null),改变了用户的被动地位,可以用这种方法显示用户想要的某些中间结果.由于定义函

数时限定自变量为正数,因此最后求sqrt0[-4]失败.条件判别式的基本组成部分(1)一般逻辑运算符>=大于等于(也可使用基本输入模板输入≥)<

小于<=小于等于(也可使用基本输入模板输入≤)

==等于(也可使用基本输入模板输入==)!=不等于(也可使用基本输入模板输入≠)&&

逻辑与||逻辑或!逻辑非与C语言略有不同,允许使用诸如a≤x≤y<b型判别式,但是True与False不能用1与0代替(2)两种逻辑等号Mathematica还引入了逻辑等号“===”和与之对应的不等号“=!="现在介绍“==="与“==”的区别。"==="的等价形式是:SameQ[exprl,expr2]。而“==”的等价形式是:Equal[exprl,expr2]。

两者的区别首先在于,凡是最后一个字母为“Q”的函数只能返回True或False,但是Equal还可能返回判定失败作为第三种结果。除此之外,还有其他不同。以下通过例子说明。说明:In[1]中判定“x==y”,Mathematica不能肯定也不否定,认为判定失败,因此Out[1]将原句作为结果输出.In[2]使用“x===y”,因不能判定其相等,就认为不等,因此返回结果False.In[3]中用“==”,认为2=2.0成立.In[4]中,使用“===”则认为2=2.0不成立.In[5]中先求左边的函数值再判定,即判定2=2.0.In[6]

先计算两边表达式再判定,两种等号都能成立.注意最后的In[7]Mathematica不能判定它们相等,这就说明,有时又未必与常规理解一致,弄不清时可以通过试验确定总之,使用"==="时判定更为严格,而"=="允许出现判定失败的情况.(3)常用的判别函数除了以上常用的运算符外,Mathematica还提供了许多判别函数,最常用的介绍如下。FreeQ[expr,form]判定在表达式expr中没有子表达式与form匹配MermberQ[expr,form]判定在表达式expr中有第1层元素与form匹配。MemberQ[expr,form,levelspec]判定在表达式expr的由层号levelspec指定的层中有元素与form匹配。NumericQ[expr]判定表达式expr是一个数量NumberQ[expr]判定表达式expr是一个数IntegerQ[expr]判定表达式expr是一个整数EvenQ[expr]

判定表达式expr是一个偶数Odd[expr]

判定表达式expr是一个奇数PrimeQ[expr]

判定表达式expr是一个素数NumberQ[-3]NumberQ[2/3]NumberQ[1.2]NumberQ[2-3I]NumberQ[Sqrt[2]]NumberQ[Sin[2]]注意:函数NumberQ只能识别头为:Integer,Rational,Real,Complex的4类数,不能识别所有的数。但函数

NumericQ除了能识别以上4类数外还能识别Pi,e,Sqrt[2],Sin[2]等,能识别具有属性NumericFunction的函数当自变量是数时的函数值。循环结构For型结构For[start,test,incr,body]首先执行给循环变量赋初值的表达式start,然后测试循环结束的条件test,test为真时执行循环体body然后执行表达式incr改变循环变量的值,再跳转到测试test,如此循环执行,当test为假时结束。C语言中的++,--,+=等运算符也可以使用。注意:For型结构执行结束后总是返回结果为Null,因此没有Out[n]型输出显示,这与If型结构不同。说明:In[1]先建立一个4维向量A,如果省略这一句直接执行第二句则失败,表必须先建立才能使用.In[2]是一个For型结构执行过程是:先得到i=1,测试i<5成立,执行循环体得到a[1]=2,然后执行i++使i=2;再测试i<5成立,继续执行循环体得到a[2]=4,然后执行i++使i=3;如此继续循环,直到i=5时结束循环,而不再执行循环体.注意In[2]执行结束后不输出任何结果.In[3]查看向量才能看到

In[2]的运行结果.In[4]中使用了复合表达式作为循环体,各表达式之间用分号分隔.In[4]中还说明了2个问题:①经常使用Print函数显示想要查看的内容②i++可以不放在标准位置表达式start可以是复合表达式,表达式incr和test的形式可以很灵活.For[x=c;i=3,i>0,i--,Print[i+x]]For[i=1,i^2<20,i=i+2,Print[i]]For[i=8,!PrimeQ[i],Print[i];i=i+1]说明:In[1]表明,在start中除了给循环变量赋初值外,还允许有其他表达式.In[2]和In[3]表明条件表达式test可以是各种与循环变量有关的逻辑判别式,In[3]中的条件含义是:i不是素数。表达式incr也允许是各种能使循环变量的值变化的式子,In[1]中的i--表示将i减1,i++与i--都是用了C语言中的符号For型结构允许嵌套,使用嵌套的循环结构常用于给矩阵赋值.A=Array[a,{2,3}]For[i=1,i£2,i++,For[j=1,j£3,j++,a[i,j]=x^i

y^j]]A//MatrixFormWhile型结构While[test,body]首先判定条件,当条件成立时执行循环体一次,重复这个过程,直到条件不成立时结束。

While型结构执行结束后总是返回结果为Null。使用时要注意条件表达式的正确使用,以防出现死循环。n=0;While[n=n+1;n<10,If[PrimeQ[n],Print[n]]]本例用于显示出小于10的素数,并说明循环结构中的条件表达式可以是复合表达式.例中的复合表达式还能简化成(n=n+1)<10,也是合法的.Do型结构Do[body,{n}]

将循环体执行n次。Do[body,{i,n}]以步长为1,i从1增加到n,将循环体执行n次Do[body,{i,m,n,di}]

以步长为di,i从初值m变到终值nDo[body,{i,imin,imax},{j,jmin,jmax},…]随i,j,...多重循环这种循环结构简单明了,其中步长di可以是负数,Do型结构执行结束后总是返回结果为Null.对于简单的多重循环,使用Do显然比使用For简便.A=Array[a,{2,3}]Do[a[i,j]=x^i

y^j,{i,1,2},{j,1,3}];A//MatrixForm使用Do型循环比用For时少键入一些字符,效果却一样.由于For型结构里允许使用更复杂的终止条件,因此Do是特殊类型。迭代函数Nest[f,expr,n]

求f[...f[f[expr]]...],共复合n次NestList[f,expr,n]返回一个有n+1项的表{expr,f[expr],f[f[expr]],...}FixedPoint[f,expr]反复迭代直到不再变化为止,返回最终结果注意:这些函数不是必需的,可由For或While型结构替代f[x_]:=1/(1+x)Nest[f,t,3]Nest[f,1,3]NestList[f,t,3]注意其中f表示函数名,不要使用f[x].迭代法求微分方程y'=x+y^2满足初值条件y(0)=0的第三次近似解说明:在例中初始取y=0为第0次近似解,函数NestList迭代3次,Out[4]输出一个表,该表的4个元素依次是第

0-3次近似解。本例是常微分方程教科书中的一道习题.FixedPoint用于求函数的不动点f(a)=a,下面构造了一个简单的例子.f[x_]:=If[x>0,x-1,0]FixedPoint[f,10]注意:使用FixedPoint很容易遇到死循环的情况,应当小心。为此允许添加第3个可选参数n,限定迭代至多进行n次程序跳转控制ReturnReturn是编程时经常使用的函数,具体调用格式如下:Return[expr]中断一个函数的求值过程,以表达式

expr作为该过程的执行结果返回。Return[]返回结果为Null.f[x_]:=(If[x>5,Return[Big]];t=x^3;Return[t-7])f[3]f[6]In[1]中定义一个复杂函数的方法,使用圆括号!求值过程是执行圆括号中的全部程序.如果不使用

Return,表达式顺序执行.当最后一表达式末尾没有分号时,返回的只能是该表达式的求值结果,否则返回

Null.Return的实用价值很大,在For, While,Switch,Do型结构中都可以使用Return.本例的自定义函数的执行过程是:如果x>5则执行Return[Big],不再执行后面的表达式,返回big作为函数f的值;如果x<=5,则继续执行If型结构后面的表达式,最后返回,t-7作为函数f的值.其实,表达式Return[t-7]改成t-7也可以,为了显示前者的功能而故意使用前者。Goto函数Goto用于实现一个复合表达式内部的跳转,调用格式为Goto[tag]由Goto[tag]处跳转到Label[tag]处再向后执行.其中Label[tag]仅用于标出复合表达式的一个位置,而tag是仅用于配对的标识符。(q=2;Label[a];Print[q];q+=1;If[q<6,Goto[a]])说明:上例中IF型结构的作用是:当q<6时执行Goto[a],跳转到Print

[q]继续执行。圆括号不可少Break与ContinueBreak与Continue经常用于非正常结束循环,它们的调用格式如下:Break[]用于退出本层的循环。Continue[]跳转到下一次循环。这两个函数在For,While,Do型循环结构中都可以使用.t

=

1;Do[t

=

t

k;

Print[t];

If[t

>

10,

Break[]],

{k,

10}]说明:例中If型结构的作用是:当t>10时,执行Break[]中止循环。t

=

1;

Do[t

=

t

k;

Print[t];

If[k

<

3,

Continue[]];

t

=

t+

2,

{k,

5}]说明:If型结构的作用是:当k<3时执行Continue[]立即进入下一次循环,并不执行t=t+2:从k=3起不执行

Continue[],执行t=t+2后再进入下一次循环.还有Catch和Throw组合用于控制更复杂的跳转,由于不是常用的,输入输出函数输入函数常用输入函数有3类:(1)调入一个文件使用“<<文件名”调入一个文件并立即执行.其实,它是函数Get["name"]的简化(这里双引号不能省略),其中文件名前面可以带路径,还有一种形式应该知道:Get["name",Path->{"Pathl","Path2",...}]指明查找路径使用“!!文件名”可以查看文件的内容。(2)从文件读入数据数据文件是由Mathematica或其他程序生成的,或者由文字编辑软件键入的文本文件.Read是从数据文件顺序读取各种数据的函数,其调用格式如下:Read["name"](这里双引号不能省略)从文件的当前位置读取一个数据,当前位置后移.Read["name",type]带有数据类型说明type。Read["name",{typel,type2,...}]按指定类型一次读取多个数据,返回结果是一个表.如果文件尚未打开,Read能打开文件并从头开始读取.当没有数据可读时,返回值为EndOfFile,这个标志可用于判定文件结束。常用的数据类型是:Real浮点数。Number整数或浮点数口String以换行符结尾的字符串。另一个类似的函数是ReadList,其调用格式如下:ReadList["name"]一次读取文件的全部数据返回一个表.ReadList["name",type]带有数据类型说明type。ReadList["name",{typel,type2,...}]按第2个参数的指示将多个数据组成子表。!!

da.txtRead["da.txt"]Read["da.txt",Real]Read["da.txt",Real]Read["da.txt",Real]Read["da.txt",Real]说明:In[1]显示文本文件da.txt中的全部内容,共有6个浮点数.In[2]读取该文件的一个数据,返回的结果令人莫名其妙,Mathematica自动将第一行数据理解成3个数相乘(空格理解为乘号),Out[2]显示的是它们的乘积.In[3]指明数据类型后,正常返回表中的第4个数,In[4]和In[5]顺序读取后面的数据.In[6]已经没有数据可读,返回文件结束标志.因此说明了指定数据类型的必要性.Read["da.txt",{Real,Real,Real}]ReadList["da.txt",{Real,Real,Real}]ReadList["da.txt",Real]说明:In[1]一次读取3个数,In[2]将数据划分成子表。In[3]正常读取了全部数据,如果不指明数据类型也会出问题,读者可以自行试验.此外,还有打开数据文件的函数OpenRead["name"]。(3)等待键盘输入函数Input被执行后弹出一个窗口,等待用户由键盘输入表达式,单击OK按钮后返回键入的内容给Mathematica.函数Input的调用格式如下:Input[]返回用户由键盘输入的表达式。Input["prompt"]在弹出窗口的上半部显示提示字符串.InputString[]限制输入内容为字符串。InputString[“prompt”]带有提示字符串。x=Input["x="]?x(4)函数Import输入函数Import的功能十分强大,可以从文件输入文本,数据,图形,动画,声音,能识别各种格式的文件。函数Import的调用格式如下:Import["name.ext"]从一个文件name.ext中输入该文件的内容,文件必须有标准的扩展名.

若文件没有标准扩展名,可以添加可选参数"format"(必须加双引号)说明文件类型.format的常用值为:Text

文本文件(txt),按原格式读入.List由多行数或字符串组成的文件,每行中各项用空格或Tab分离,读入时以一项作为一个元素组成一个表.Table由多行数或字符串组成的文件(dat),每行中各项用空格或Tab分离,读入时以一行作为一个子表组成一个2层的表,每行中各项是子表的元素.EPS

具有Postscript格式(eps)的图形文件。BMP

位图格式的图形文件(bmp).TIFF TIFF格式的图形文件(tif或tiff)G1F GIF格式的图形或动画文件(gif)JPEG JPEG格式的图形文件(iPg或jPeg)WAV

WAV格式的声音文件(wav)文件名可以带有路径。2.输出函数由于Mathematica在数学表达式与图形方面的输出功能十分强大,因此在输出时应该尽量利用Mathematica自身的功能。从实际需要出发,以下着重强调两点。(1)显示中间结果

Mathematica的函数都是只返回最终结果,但在教学土更看重过程,辅助教学程序应该能逐步显示中间结果,编写这样的程序应该充分利用Print函数.(2)保存程序和运行结果操作符">>"和">>>"它们的函数形式分别为:Put[expr1,expr2,...,"name"]将表达式expr1,expr2,...保存到文件namePutAppend[expr1,expr2,...,"name"]将表达式expr1,expr2,...添加到文件nameSave["name",f,g,...]添加名为f,g,...的变量或函数到文件nameSave能用于保存一个复杂的自定义函数注意:保存函数的定义式,与其有关的其他定义式也同时被保存.与函数Import配对的输出函数是:Export["name.ext",expr]保存表达式expr到一个名为

name.ext的文件中,文件必须有标准的扩展名.

如果文件名不使用标准的扩展名,可以添加可选参数

"format"(必须加双引号)说明文件类型.format的常用值与Import的相同,还需要说明的是:List将一个表以多行保存,表的每个元素占一行。Table将一个2层表以多行保存,表的每个子表占一行,子表的元素用Tab分隔.t={1,2,3};Export["t.dat",t]!!t.dats={{1.2,-2},{2,3.1}};Export["t.dat",s]!!t.dat注意:例还表明当两次都使用同一文件名保存数据时函数Export会将已经存在的同名文件覆盖,造成原有数据的丢失,而且事先没有警告提示。模块编写Mathematica的程序时,不需要事先声明变量,于是用户所使用的变量都是全局变量,由此隐藏着很大的危险.首先是忘记自己曾经使用过哪些变量,导致错误的出现,这种例子前面一再提及.更可怕的是,如果调用其他人编写的程序,更难弄清己经使用过哪些变量.因此,在编写供他人使用的程序时,在程序内部应当使用局部变量.本节介绍使用局部变量的一种简单方法。Module是一种模块结构,在这种模块的内部可以建立并使用局部变量,其具体格式如下:Module[{x,y,...},boby]其中前面的表用于声明局部变量,后面的body是程序表达式(一般都是复合表达式).Module[{x=x0,y=y0,…},body]建立局部变量时可以赋值.这个结构返回body的运行结果t=10;Module[{t=5},t=t+2]例子说明两个问题,Module结构返回值为body的求值结果,局部变量不改变同名全局变量的值。00.

51-0

.

5-

12015105001

-1

-

0.50

.

5自定义求一元函数极值的函数.先求驻点,再利用二元导数判定驻点是否为极值点.M[f_,x_]:=(*第一个参数是函数表达式,第二个是自变量.*)Module[{df,ddf,s,s1,i,x0,y,y2},df=D[f,x];Print["f'=",df];(*求导函数df并输出到屏幕.*)s=x/.Solve[df==0,x];(*求由所有驻点组成的表s,会出现重根.*)If[s==x,Print["极值不存在或函数是奇异的"];Return[]];(*没有驻点时s=x,输出提示"极值不存在或函数是奇异的

(有导数不存在的点)",然后退出.*)ddf=D[df,x];Print["f'=",ddf];(*求二阶导函数ddf并输出到屏幕.*)s1=Length[s];(*求驻点个数.*)For[i=1,i<=s1,i++,x0=s[[i]];If[i>1&&x0==s[[i-1]],Continue[]];(*跳过重根.*)y=f/.x->x0;y2=ddf/.x->x0;(*求每个驻点的函数值和二阶导数*)If[y2>0,(*判定二阶导数为正.*)Print["min",y,"at",x0],(*在屏幕上显示判定结论.*)If[y2<0,Print["max",y,"at",x0],Print["fail

at",x0]],(*当二阶导数为0时.*)Print["fail

at",x0](*当二阶导数不是数时.*)]]]M[(x

-

1)^2

x^3,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论