►Down◙Main自定义函数简单函数的定义复杂情况纯函数函数的属性►Down◄Up◙Main简单函数的定义自定义函数的方法f[x_]:=x^2+yf[2]f[y]f[a-1]在例中,In[1]定义了数学意义上的函数f(x)=x^2+y,自定义函数仍用:函数名[自变量]的形式,其中自变量x用x_表示,而=用:=表示,等号右边的数学表达式按常规形式.这一步执行后,没有输出结果,但Mathernatica记忆了关系式f[x_]:=x^2+y。►Down◄Up◙Main在例中首先定义了自变量是u,v的二元函数f(u,v)=u^2-v^2,在In[3]中以u=1,v=l+x代入得到函数值1-(l+x)^2,在In[4]和In[5]中就是对表达式1-(1+x)^2求导和积分。这说明,对自定义函数仍可按人的意图进行各种符号运算。不过在Mathematica中自定义函数时,格式较为特殊,容易出现错误。►Down◄Up◙Main与x_的区别g[x]:=x^2+y;f[x_]:=x^2+yg[2];f[2]g[y];f[y]f[x_]可以定义函数,g[x]不能定义一个函数Mathematica只记住了符号g[x]表示x^2+y,但g[2]和g[y]等并没有值被求出。Mathematics约定f[x]中的x_表示函数f的自变量,而f[x]表示函数f当自变量取值为x时的函数值。►Down◄Up◙Main“:=”与“=”的差别如果将例中的:=改用=,却一切正常,看不出问题.但它们的差别可由下例说明。两种等号的差别之一:x=2;f[x_]=2x;g[x_]:=2x;?f?gf[3]g[3]在例中因为开始己经定义x=2,当使用“=”定义f(x)时,立即将右边的数学表达式进行求值,将x=2代入得到函数定义式f[x_]=4,Mathematica记忆的是f[x_]=4。而使用“:=”时,Mathematics总是将输入的函数定义式原样记忆。►Down◄Up◙Main如果事先没有定义x=2,则不会出现上述问题,被Mathematica记忆的仍是f[x]=2x.使用表达式f[x_]=2x与使用表达式f[x_]:=2x没有区别,再求f[3]时都是将x=3代入定义式右边的数学表达式,得到6。也就是说,都可以理解成了f(x)=2x了,因此两种等号没有差别。二种等号的差别之二►Down◄Up◙Main在例中前一个函数定义后右边的积分立即被求出,而后一个函数在定义后并不进行积分,再求函数值时才进行积分.使用“?”查看可知,被Mathematica记忆的函数表达式不同。使用“=”时立即对右边的数学表达式进行计算,使用“:=”时右边的数学表达式不变,当求函数值时才进行计算。定义函数时,两种等号都可以使用,应当弄清两者的差别适当选用,不要造成定义函数必须使用“:=”的错觉。►Down◄Up◙Main由多个表达式定义的函数可以使用递推公式定义函数。自定义计算n!的函数。f[0]=1;f[n_]:=nf[n-1];f[10]说明:在例中In[1]定义了函数值f[0],In[2]的函数定义式是递推公式,由此实际上定义了f(n)=n!.但以上定义有缺陷,如果求f[0.5]就会出错,因为Mathematica并不认为n表示非负整数。解决方法是用n_Integer?Positive替代n_,说明n是整数(头为Integer)并且满足是正数的条件,其中问号是后一条件的分隔符.►Down◄Up◙Main参数个数不确定的函数定义一个函数时,允许事先对参数指定默认值,如果使用时不给出参数值,就自动将默认值作为参数值。这样的参数格式如下:x_:v其中冒号后面的v表示参数x的默认值.f[x_,y_:0]:=x^2+y^2;f[3];f[3,4]以上In[1]中定义了第2个参数的默认值为0,这样在求值时允许不给出第2个参数的值。但是如果两个参数都使用默认值,就会出问题,在In[2]中就无法识别所给的一个参数值究竟是赋给哪一个参数的。当只有一个可选参数时,使用以上方法是最方便的。►Down◄Up◙Main复杂情况(1)参数的一般表示法_可以表示任何一个表达式x_代表一个名为x的表达式.x_h代表一个名为x附加有限制性说明h的表达式.__可以代表任何一个或多个表达式x__可以代表名为x的一个或多个表达式.x__h代表名为x附加说明h的一个或多个表达式.___可以代表任何零个或多个表达式x___可以代表名为x的零个或多个表达式.x___h代表名为x附加说明h的零个或多个表达式.►Down◄Up◙Mainf[]:=2a;f[x];f[y+2];f[1,2]说明:上例定义的是一元函数,无论自变量取何值都得到同一函数值,实际上定义了一个常值函数。最后的f[1,2]是不合法的,因为一个下划线只能代表一个参数,Mathematica不能求值。f[__]:=x+y;g[___]:=ab;f[a];f[1,2,s];g[];g[r];g[1,2]说明:上述两个例子演示了单下划线、双下划线、三下划线的区别,一然而它们却没有实用价值,因为它们时函数定义式右边的数学表达式不起作用.真正有实用价值的应用是自定义带有可选参数的函数。►Down◄Up◙MainPlotsin[a_,b_,opt___]:=Plot[Sin[x],{x,a,b},opt];Plotsin[0,2Pi,AxesLabel-{t,r},AxesOrigin-{Pi,0}]可选项可以是任意多个或没有,因而在定义式中使用了三下划线.f[x__]:=0+x;g[x_,y__]:=xy;f[1,2,3,4,5];g[-1,2,3,4,5]说明:这两个自定义函数并不复杂,但会使人感觉到,使用个数不确定的参数,既令人费解又容易出错。以上作为函数参数使用的带有下划线的那些表达式称为模式,模式指明了参数的结构与名称►Down◄Up◙Main设置可选参数默认值的普遍方法如果可选参数较多,可以使用以下两种方法设置默认值:SetOptions[f,option1-value1,...]设置函数f的一个或多个可选参数的默认值。Options[f]={option1-value1,...}设置函数f的全部可选参数的默认值。以上两种设置方法的差别在于,后一个是设置全部可选参数的默认值,而前者可以只设置或改变部分默认值。后一函数还可以用于查阅默认值。►Down◄Up◙MainOptions[f]={a-1,b-2};f[x_,opt___]:ax^b/.{opt}/.Options[f]?f;f[2];f[2,b-3];f[2,a-2];f[2,a-2,b-3]以上函数的定义式的形式为:函数表达式/.输入的可选参数表/.默认的可选参数表。执行过程是:首先将非可选参数的值代入函数表达式,然后将输入的可选参数表中给出的可选参数值代入函数表达式,因为用户给出的可选参数值先进行替换,就不会再用默认值替换了。用户没有给出值的可选参数,最后一律被默认值替换。这里需要注意{opt}的格式,是将所有输入的可选参数表达式放入一个表中,这是操作符“/.”要求的。►Down◄Up◙Main纯函数纯函数的表达式Mathematica还使用一种特殊的函数表示式,能定义一种没有函数名字的函数,称这种函数为纯函数表达式:Function[自变量,函数表达式]表示一个函数。Function[x,x^2];Function[x,x^2][2];Function[x,x^2][3]也可以定义多元纯函数。Function[{x,y},Sin[x]Cos[y]];Function[{x,y},Sin[x]Cos[y]][2,3]►Down◄Up◙Main纯函数表达式的缩写形式以上纯函数表达式比普通函数的表达式还复杂,需要键入更多的字符。然而改用纯函数的缩写形式就方便了,缩写形式是:函数表达式&用&替代Function并省略自变量一项,其中一元自变量用特殊符号#表示,多元时用#n表示第n个自变量。%[2]f=Sin[#1]Cos[#2]&f[2,3]►Down◄Up◙Main说明:在例中In[1]是前例中定义的纯函数的缩写形式,在Out[1]中的#1与#意义相同,都表示自变量。缩写形式使纯函数表示法大大简化、用#字符表示自变量,用&表示纯函数。In[2]中的表达式%[2]即#1^2&[2],表示当#1=2时的函数值.In[3]中将纯函数用f表示,因此In[4]中的f[2,3]也是求纯函数的函数值。引入纯函数,实际上给出了另一种定义函数f(x,y)=sin(x)cos(y)的方法,而且不必考虑自变量使用什么字符表示。还有符号##表示所有自变量,##n表示从第n个起往后的所有自变量。►Down◄Up◙Main函数的属性查看函数的属性函数的属性用于指明函数所具有的某些特殊性质,Mathematica的内部函数大都带有一些属性,也可以给自定义函数添加属性.查看Sin[x]的属性。Attributes[Sin]查看、建立和清除属性的Attributes[f]查看名为f的函数的属性。Attributes[f]={attr1,attr2,...}设置f的属性Attributes[f]={}设置f的无任何属性►Down◄Up◙Main添加和清除属性的函数。SetAttributes[f,{attr1,attr2,...}]添加属性到f的属性表中ClearAttributes[f,{attr1,attr2,...}]清除f的指定属性Clear[f]清除f的定义但不清除属性。ClearAll[f]清除f的定义和属性但不清除符号f。Remove[f]清除符号f.常用的函数属性(1)ProtectedProtected使函数的定义式受到保护,不能重新定义。Mathematica的内部函数都有此属性,以防被用户修改。除了使用上面列出的设置、添加、清除函数外,还有对这一属性的专门操作函数:►Down◄Up◙MainProtect[f]给函数f加上Protected属性.UnProtect[f]清除函数fProtected属性.注意,内部函数也能被解除保护、重新定义和重新加上保护,但重启Mathematica时自动恢复原状。f[x_]:=2xProtect[f]?ff[x_]:=3x(2)ReadProtected属性ReadProtected使函数的定义式不能用“?”查看,但是并不保护这个函数。►Down◄Up◙Main