mathematic使用指南
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章Mathematica的启动的运行
Mathematica是美国Wolfram公司生产的一种数学分析型的软件,以符号计算见长,也具有高精度的数值计算功能和强大的图形功能。
目前最新版本是Mathematica4.0,本附录仅介绍Mathematica4.0的一些常用功能,须深入掌握Mathematica的读者可查阅相关书籍。
在Windows环境下安装好Mathematica4.0,用鼠标双击Mathematica图标(刺球状),在显示器上显示如图1-1的工作窗口,这时可以键入你想计算的东西,比如键入1+1,然后同时按下Shift键和Enter键(数字键盘上只要按Enter键),这时Mathematica开始工作,计算出结果后,窗口变为图1-2。
图1-1 Mathematica的工作窗口
Mathematica第一次计算时因为要启动核(kernel),所需时间要长一些,也可以在Mathematica 启动后第一次计算之前,手工启动核,方法是用鼠标点击:Kernel->Start Kernel->Local.这样第一次计算就很快了。
图1-2 完成运算后的Mathematica的窗口
图1-2中的“In[1]:=”表示第一个输入;“Out[1]=”表示第一个输出结果。
接下来可键入第二个输入,按这样的方式可利用Mathematica进行“会话式”计算。
要注意的是:“In[1]:= ”和“Out[1]=”是系统自动添加的,不需用户键入。
Mathematica还提供“批处理”运行方式,即可以将Mathematica作为一种算法语言,编写程序,让计算机执行,这在第七章将会作简要介绍。
第二章 Mathematica的基本运算功能
2.1 算术运算
Mathematica最基本的功能是进行算术运算,包括加(+),减(-),乘(*),除(/),乘方(^),阶乘(!)等。
注意:
1 在Mathematica中,也可用空格代表乘号;数字和字母相乘,乘号可以省去,例如:3*2可写成3 2,2*x可写成2x,但字母和字母相乘,乘号不能省去。
建议大家尽可能不要省去乘号,以免引起混乱。
2 在Mathematica中,表达式中用来表示运算的结合次序的括号只允许是圆括号(无论多少层)。
例如:4*(2+3/(2-5))
3 当输入式子中不含小数点,输出结果是完全精确的。
例如:输入2/3,输出仍然为2/3。
4 为了得到计算结果的近似数或指定有效数字的位数,可以用N[ ]函数。
例如:N[x],N[x,20].前者取x 的默认位数近似值,后者取x的20位有效数字。
5 %表示上一个输出结果,%%表示倒数第二个输出结果,以此类推,%n表示第n个输出结果(而不是倒数第n个结果)。
6 在Mathematica中,如果在输入的表达式末尾加上一个分号“;”,表示不显示计算结果,但你可以调用它的结果。
2.2 常量和变量
在一个过程中保持不变的量称为常量,常量也称为常数,Mathematica提供很多常用的数学常数,如:
Pi :圆周率; Degree :度; Infinity :无穷大;E :自然对数的底; I :虚数单位
在很多计算中可能多次用到同一个数值,这时可将该数值赋给一个变量。
如(为节省篇幅,将输入和输出写在同一行):
In[1]:=x=y=5 Out[1]=5
In[2]:=pi=N[Pi,20] Out[2]=3.14159265358979323846
在后续计算中就可直接把x,y,pi作为常数使用。
如
In[3]:=pi^2 Out[3]=9.8696044010893586188
你所定义的变量值是不会变的,具有永久性,一旦你给变量x赋值后,这一变量值将一直保持不变,直到你重新给它赋值或使用清除命令将它清除:x=. 或者 Clear[x]
在Mathematica中,对于变量名没有长度限制,但变量名不能以数字开头,如x2可以作为变量名,但2x 却是2*x的意思,在输入含有变量的式子时,应注意x y表示x*y,而xy是一变量,x^2y意味着(x^2)*y 而不是x^(2y)。
2.3 函数
2.3.1 系统内建函数
Mathematica提供了很多常用的函数,多达上百种,包括基本初等函数和某些特殊函数,这里仅给出其中较为常用的一些。
Sqrt[x] 平方根函数 Exp[x] 指数函数
Log[x] 自然对数 Log[b,x] 以b为底的对数函数
Abs[x] 绝对值函数 Mod[n,m] n 关于m的模
Round[x] 四舍五入函数 Random[ ] 取0和1之间的随机数
Max[x,y,…] 取最大值函数 Min[x,y,…]取最小值函数
三角函数与反三角函数
Sin[x] Cos[x] Tan[x] Cot[x] Sec[x] Csc[x]
ArcSin[x] ArcCos[x] ArcTan[x] ArcCot[x] ArcSec[x] ArcCsc[x]
双曲函数与反双曲函数
Sinh[x] Cosh[x] Tanh[x] Coth[x] Sech[x] Csch[x]
ArSinh[x] ArcCosh[x] ArcTanh[x] ArcCoth[x] ArcSech[x] ArcCsch[x]
Mathematica提供的函数以及后面介绍的运算符都可从联机帮助文件中查到。
读者可以用它查询到Mathematica提供的所有函数、常数和各种符号及它们的用法。
另外,要提醒大家的是:
(1)Mathematica中,大小写英文字母要严格区分开,函数名字该大写的地方一定要大写,否则会发生语法错误。
(2)函数后面的表达式一定要放在方括号内(不是圆括号)。
(3)当Mathematica无法计算输入的表达式的精确值,而又要求它返回精确值时,将返回原表达式。
如:
In[1]:=Sqrt[2] Out[1]=Sqrt[2]
2.3.2 自定义函数
虽然Mathematica为用户提供了大量的函数,但是在很多时候,为了完成某些特定的运算,用户还需要自己定义一些新的函数,如:
In[1]:=f[x_]:=x^2 ;g[x_,y_]:=(x-y)^2/y;
In[1]分别定义了两个函数和。
注意:左边方括号中的变量后必须紧跟一下划线“_”,而右边表达式中的变量后没有这一符号。
定义了函数f(x)、g(x,y)后,就可对其进行各种算术运算或符号运算。
如:
In[2]:=g(2,3) Out[2]=
In[3]:=D[f[x],x] Out[3]=2x
如果用户一时忘记了前面定义的函数,可以用下列命令查询:
In[4]:=?f Out[4]=Global`f
f[x_]:=x^2
这里的符号“Global”表示定义的函数在其后面的计算中全局有效。
当你需要废除已经定义的函数时,可以使用Clear[f];这样,前面定义的函数不再起作用。
如果一个函数的定义需要多个语句,可将它们放在一对花括号或一对圆括号中,并用分号隔开,如:
In[6]:=f[x_,n_]:=(t=Sin[x]+Cos[x];t^n+2t);
In[6]定义了一个二元函数,它先计算
t=Sin[x]+Cos[x],,然后计算t^n+2t,最终得到f(x,n)。
要定义一个分段函数,一般要用到条件控制语句If、Which和Switch语句。
下面列出Mathematica的一些条件结构:
lhs:=rhs/;test 当test为True时使用定义
If[test,then,else] 当test为True时计算then,否则计算else
Which[test1,value1,test2,value2,...] 给出第一个test i为True时的value i
Switch[expr,form1,value1,form2,value2,...,def] 给出第一个与expr相匹配的form i对应
的
valuei值,若都不成立,结果为默认值def
下面举例介绍分段函数的定义:
定义一个阶跃函数,可使用If语句:
In[1]:=s[x_]:=If[x>=0,1,-1]
也可用/;test形式来分别定义它的两个部分:
In[2]:=ss[x_]:=1/;x>=0;ss[x_]:=-1/;x<0
If函数允许指定条件既不是True 也不是 False时的值。
例如:
In[3]:=sl[x_,y_]:=If[x>y,a,b,c];若输入sl[2,1+I],则输出c。
在上例中,只有当x,y都是实数时才可比较它们大小,而1+I为一复数,不能与2比较大小,因而输出第三种结果c.
当条件多于两个时,可以用If的嵌套方式来处理,但更方便的方法是用Which函数,例如
In[4]:=hh[x_]:=Which[x<0,x^2,x<=5,0,x>5,x^3],定义了以下函数
2.4 集合
在进行计算时,把许多元素放在一起并作为一个整体来处理是很方便的,在Mathematica中,集合是收集元素的一种方法,是一种非常重要而又极其普遍的结构。
Mathematica中的集合实际上是一个数组,即它的元素具有有序性,而且可以重复。
In[1]:=s={3,5,1} Out[1]={3,5,1}
In[2]:=t={-1,3,7} Out[2]={-1,3,7}
以下命令把集合中的每个元素平方加1。
In[3]:=s^2+1 Out[3]={10,26,2}
也可求两个集合对应元素的和差积商等,例如:
In[4]:=s+t-2^s+s*t+t^s/t Out[4]={-8,72,14}
在大多数情况下,Mathematica是把集合作为一个整体来处理,但有时也需要对集合中的某个元素进行处理。
这里给出处理集合元素的一些常用函数:
{a,b,c,…} 一个集合
Part[list,i] 或 list[[i]] 取集合list中的第i个元素
Part[list{i,j,…}] 或 list[[{i,j,…}]] 由集合list的第i,j,…元素组成的集合
Part[list,i]=value 或 list[[i]]=value 给集合list的第i个元素重新赋值
例如:
In[5]:={1,2,5,6,8,9}[[4]] Out[5]=6
In[6]:=Part[s,{2,3,1,1,2,3}] Out[6]={5,1,3,3,5,1}
In[7]:=t[[2]]=5 Out[7]=5
In[8]:=t Out[8]={-1,5,7}
第三章 Mathematica的图形输出
Mathematica允许用各种图形、曲线输出计算结果,甚至输出动画,因此可以实现计算的可视化。
图形的输出方式很多,此处只介绍其中的一小部分。
3.1 一元函数曲线的输出
如果希望看到一个函数的几何图形,可以简单地输入
In[1]:=Plot[Sin[x],{x,0,2Pi}]
它代表绘制sin(x)的曲线,0<x<2Pi.(为节省篇幅,图形略去)
还可以给这个图形的坐标轴加以说明,可使用:
In[2]:=Plot[Sin[x],{x,0,2Pi},AxesLable->{“x”,”sin(x)”}] 或者
In[2]:=Show[%,AxesLable->{“x”,”sin(x)”}]
其中Show表示把上面的图形显示出来。
还可以为整个图形加一个标题,可用
In[3]:=Show[%,PlotLabel->”sin(x)~x”]
上面几个输入语句中的AxesLable->{“x”,”sin(x)”}和PlotLabel->”sin(x)~x”称为图形输出语句的特别说明部分,图形输出有很多的可能的说明部分,下面我们将给出其中的一部分。
画图中的特别说明部分
如果我们希望把几条曲线重合在一起加以比较,可按以下方式操作。
先画两条曲线,并给它们一个名字。
In[4]:=p1=Plot[Sin[x],{x,-2Pi,2Pi},PlotStyle->{RGBColor[1,0,0]}]
In[5]:=p2=Plot[Cos[x],{x,-2Pi,2Pi},PlotStyle->{RGBColor[0,1,0]}]
然后使用Show[{p1,p2}]就能将两条曲线合在一起。
在上面的例子中,PlotStyle又是一个特别说明项,它规定所画图形的风格特征,如所画图形的颜色、线条、点的类别等。
其命令格式为:
PlotStyle->{{Style1},{Style2},…},其中Style i是由一些图形指令构成的集合,可循环使用。
Style 常使用的图形指令有
AbsolutePointSize[d] 规定点的大小为d个绝对单位(1/72英寸)
AbsoluteThickness[d] 规定线宽为d 个绝对单位(1/72英寸)
AbsoluteDashing[{d1,d2,…}] 规定直线为以d1,d2,…长度排列的虚线
RGBColor[red,green,blue] 通过红绿蓝规定颜色(其值在0~1之间)
GrayLevel[level] 规定图形目标的对比度(其值在0~1之间)
把几条曲线画在一起出可使用以下方法,如:
In[6]:=g1=Normal[Series[Sin[x],{x,0,3}]];
In[7]:=g2=Normal[Series[Sin[x],{x,0,5}]];
上面两条命令分别把sin(x)在x=0处展开成x的级数到三次幂和五次幂并舍去余项,
得到了两个不同的多项式。
下面的命令能将它们画在同一张图上。
In[8]:=Plot[{Sin[x],g1,g2},{x,0,2Pi},PlotRange->{1,1},PlotStyle->
{{RGBColor[1.,0.1,0 .1]},{RGBColor[0.1,0.1,1.]},{RGBColor[0.1,1,0.1]}}]
Mathematica也可绘制参数形式或极坐标形式给出的曲线,如:
In[9]:=r[t_ ]:=(3Cos[t]^2-1)/2;ParametricPlot[{r[t]*Cos[t],r[t]*Sin[t]},{t,0,2Pi}]
在Mathematica下画散点图用以下命令
In[10]:=ListPlot[{{1,1},{1.25,1.5},{1.5,1.35},{1.75,2.1}}, Prolog->AbsolutePointSize[8]]
其中Prolog->AbsolutePointSize[8]]是在画图之前先确定点的大小。
以下命令默认点的横坐标依次为整数1,2,…
In[11]:=ListPlot[{1,2,3,5,7,11,13,17,19,23},Prolog->AbsolutePointSize[4]]
3.2 三维图形的绘制
Mathematica可以绘制三维图形,例如:In[1]:=Plot3D[Sin[x*y],{x,0,Pi},{y,0,Pi}]绘制一幅z=sin(xy)的图形.
和绘制二维曲线图一样,Plot3D[ ]也可以带很多说明,现将常用的一些列入下表:
下面再举例对特别说明加以解释,例如:
In[2]:=g=Plot3D[-Sqrt[x^2+y^2]/10,{x,-5,5},{y,-5,5},PlotPoints->50]画出一个锥面,而
In[3]:=Show[g,Mesh->False,Boxed->False,Axes->False]去掉了图g中的网格,外框和坐标
轴;In[4]:=Show[g,Shading->False]把图g 中的阴影去掉。
另外有很多涉及色彩,阴影,多光源效应的特别说明项,此处从略.
Mathematica 也能画出一些特殊类型的图形,如:参数图,等高线图,密度图等.下面列出较常用的一些. ParametricPlot[{fx,fy},{t,tmin,tmax}] 平面曲线的参数图
ParametricPlot3D[{fx,fy,fz},{t,tmin,tmax}] 空间曲线的参数图
ParametricPlot3D[{fx,fy,fz},{t,tmin,tmax},{u,umin,umax}] 空间曲面的参数图
ContourPlot[f,{x,xmin,xmax},{y,ymin,ymax}] 函数f(x,y)的等高线图
DensityPlot[f,{x,xmin,xmax},{y,ymin,ymax}] 函数f(x,y)的密度图
第四章代数运算
4.1 多项式符号运算
Mathematica能进行多项式的加(+),减(-),乘(*),除(/),乘方(^)等运算,不仅如此, Mathematica还提供了许多关于多项式运算的函数,现列出较常用的一些:
Coefficient[poly,expr] 提取多项式poly中 expr的系数
Expand[poly] 展开多项式ploy
Factor[poly] 对多项式ploy进行因式分解
FactorTerm[poly] 提取多项式ploy中的数字公因子
PolynomialGCD[ploy1,poly2,…] 计算多项式ploy1, ploy2,…的最大公约式
PolynomialLCM[ploy1,poly2,…] 计算多项式ploy1, ploy2,…的最小公倍式
Exponent[expr,form] 计算expr中form的最高指数
Part[expr,n]或expr[[n]] expr中的第n项
Collect[poly,x] 以x的幂的形式重排多项式
Collect[poly,{x,y,…}] 以x,y,…的幂的形式重排多项式
PolynomialQuotient[p,q,x] 计算多项式p/q 的商,略去余式
PloynomialRemainder[p,q,x] 计算多项式p/q的余项
上面最后两个运算方括号中的x代表把多项式的变元定义为x,以区别于多项式中可能包含的其它变量,举例如下(输出略去):
In[1]:=(x-1)^2*(x^3+1)
In[2]:=t=Expand[%]
In[3]:=Factor[t]
In[4]:=Expand[(1+2x+3y)^3]
In[5]:=PolynomialQuotient[%,x^2+2x-3,x]
In[6]:=PloynomialRemainder[%4,x^2+2x-3,x]
可以使用如下命令求符号表达式的值:
expr/.x->value 在表达式expr中用value 来替换x
expr/.{x->xval,y,->yval,…} 进行一系列替换
例如:
In[7]:=1+2x/.x->3
In[8]:=1+2x+x^2/.x->2-y
In[9]:=(x+y)(x-y)^2/.{x->3,y->1-a}
In[10]:=t=1=x^2;t-3x/.x->Pi//N
4.2 有理分式运算
Mathematica也可对有理分式进行处理和化简,现列出常用的一些有理分式运算如下,请读者自己做一些实验.
Apart[expr] 把表达式写成若干项的和,每项有最简分母
Cancel[expr] 消去分子,分母中的公因子
Denominator[expr] 取出表达式的分母
Numerator[expr] 取出表达式的分子
ExpandDenominator[expr] 展开表达式的分母
ExpandNumerator[expr] 展开表达式的分子
Expand[expr] 展开表达式的分子,逐项被分母除
ExpandAll[expr] 展开表达式的分母,分子
Factor[expr] 首先通分.然后对分子,分母分解因式
Simplify[expr] 把表达式尽可能简化
Together[expr] 对有理式进行通分
4.3 逻辑与关系运算
Mathematica有以下逻辑与关系算子:==(相等,注意是用两个等号),!=(不相等),<(小于),<=(不大于),>(大于),>=(不小于),!(否),&&(与),||(或)等。
通过它们能进行一些逻辑关系运算,关系运算的结果为False(假)或True(真).例如:
In[1]:=10<7 Out[1]=False
In[2]:=3!==2! Out[2]=False
In[3]:=7>4&&2!=3 Out[3]=True
如果Mathematica不知道关系的结果是对还是错,则按原样输出,如:
In[4]:=x>y Out[4]=x>y
4.4 解方程
Mathematica中方程的两边必须用等号算子“= =”而不是“=”连接,如:
In[1]:=x^2+2x-7= =0 Out[1]=-= =0
可以用下列命令求它的两个根
In[2]:=Solve[%,x] Out[2]=
以上结果的形式称为解的变换法则形式,可将它代入含有x的任何表达式求其值,如:
In[3]:=Simplify[x^2+2x+5/.%2] Out[3]={12,12}
我们也可通过替换符来解出x,用集合规则得到解的集合
In[4]:=x/.%2 Out[4]={ , }
对于不高于四次的多项式方程,Solve总能给出其精确解,对高于四次的多项式方程不可能有公式解,尽管如此, Mathematica仍尽可能用因式分解及其它方法求解多项式,将高次方程改写成低次多项式方程或多项式方程组,结果Solve能求出许多高次多项式方程的显式代数解。
例如:
In[5]:=p=3+3x-7x^2-x^3+2x^4+3x^7-3x^8-x^9+x^10;Solve[p= =0,x]
Out[5]={{x->1},{x->-Sqrt[3]},{x->sqrt[3]}},ToRules[Roots[2x+x^7= =-1,x]]}
在上例中,Mathematica只求出了其中的一些解,其它解写成了ToRules表示的符号形式,使用N将给出数值解:
In[6]:=N[%] Out[6]= (略)
如果最终只须写数值解,可使用NSolve求解,如使用命令In[7]:=NSolve[p= =0,x],得到的Out[7]与Out[6]完全一样,此处从略。
Mathematica能直接给出更复杂的超越方程的数值解。
In[8]:=FindRoot[x*Sin[x]-1/2= =0,{x,1}] Out[8]={x->0.740841}
上例中,{x,1}表示求方程x*Sin[x]-1/2= =0在1附近的解。
也可利用Mathematica求解方程组,命令为
Solve[{equ1,equ2,…equn},{x1,x2,…xn},如:
In[9]:=Solve[{a*x+b*y= =1,x-y= =2},{x,y}]
Out[9]=
如果想得到a=0.1234,b=0.2时的数值解,可以输入:
In[10]:=%/.a->0.1234/.b->0.2 Out[10]={{x->4.329,y->2.329}}
注意:如果需要对表达式中多个变量赋值,可连续使用“x->expr1”,”y->expr2”,…它们之间必须用“/.”分开。
若对方程所含的全部变量求解,可略去输入语句中表示求解变量{ }的内容。
如:
In[11]:=Solve[{x^2+y^2= =1,x+y= =2}]
Out[11]:=(略)
在求解方程(组)时,可以把一个方程看作你要处理的主要方程,而其它方程作为必须满足的辅助条件,你会发现这样处理将很方便。
要做的第一件事是命名辅助条件组,然后用名字把辅助条件包含在你要用Solve 求解的方程组中。
例如:SinCos被定义为方程:sin[x]^2+Cos[x]^2= =1;
In[14]:=sinCos= Sin[x]^2+Cos[x]^2= =1;
在辅助条件sinx^2+cosx^2=1下,求解方程sinx+2cosx=1
In[15]:=Solve[{Sin[x]+2Cos[x]= =1,SinCos},{Sin[x],Cos[x]}]
Out[15]={{Sin[x]->-(3/5),Cos[x]->4/5},{Sin[x]->1,Cos[x]->0}},
在同样条件下,求解另一个方程:
In[16]:=Solve[{Sin[x]= =Cos[x],SinCos},{Sin[x],Cos[x]}]
Out[16]=(略)
第五章微积分运算
5.1 极限
Mathematica可以求函数和序列的极限.也可有洛必达法则求函数的不确定型极限,例如
In[1]:=Limit[Sin[x]/x,x->0] Out[1]=1
In[2]:=Limit[(1+1/n)^n,n->Infinity] Out[2]=E
In[3]:=Limit[x*Log[x],x->0] Out[3]=0
In[4]:=Limit[(1+2x)^(1/x),x->0] Out[4]=E^2
Mathematica也可求左,右极限
In[5]:=Limit[x/Sqrt[1-Cos[x]],x->0,Direction->1 ] Out[5]=-Sqrt[2] 求左极限
In[5]:=Limit[x/Sqrt[1-Cos[x]],x->0,Direction->-1 ] Out[5]=Sqrt[2] 求右极限
5.2 导数与微分
在Mathematicak ,可以很方便地完成各种微分运算,命令格式为:
D[f,x] 求f 关于x的偏导数
D[f,{x,n}] 求f 关于x的n阶偏导数
In[1]:=D[x^n,x] Out[1]=
In[2]:=D[Log[x],{x,2}] Out[2]=
In[3]:=D[x^2+y^2,x] Out[3]=
以上是假定y 独立于x,若y 是x的函数,可按下述方法处理:
In[4]:=D[x^2+y[x]^2,x] Out[4]=2x+2y[x]y’[x]
也可不给出显示函数y[x]而用命令NonConstants->{y}直接暗示D:y 是x的函数,
下例中,D[y,x,NonConstants->{y}]表示 .
In[5]:=D[x^2+y^2,NonConstants->{y}] Out[5]=2x+2yD[y,x,NonConstants->{y}]
我们也可用D命令求混合偏导数
In[6]:=D[x*Exp[y*x]+Sin[x*y*z],x,y,x]
In[7]=D[Sin[x*y*z^2],x,y,NonConstants->{z}]
如果输入的表达式不是一个具体函数,则得到微分后的一般形式。
如:
In[8]:=D[x*f [x^2],x] Out[8]=
在Mathematica中还可求函数的全微分,命令格式为:
Dt[f] 求全微分df Dt[f,x] 求全导数
Dt[f,x,Constants->{c1,c2 …}] 求全导数,其中ci为常数
In[11]:=Dt[x^2+y^2] Out[11]=2xDt[x]+2yDt[y]
In[12]:=Dt[x^2+y^2,x] Out[12]=2x+2yDt[y,x]
In[13]:=Dt[x^2+y^2,x,Constants->{y}] Out[13]=2x
In[14]:=SetAttributes[{c,d},Constant]; Dt[c*y^2*x^2+d*y^2,x,y]
Out[15]=(略)
在上例中,SetAttributes[{c,d},Constant]表示在所有情形下把c,d都定义为常数。
用命令ClearAttributse[{c,d},Constant]可清除这种设置。
5.3 不定积分与定积分
Mathematica可以求不定积分,定积分,重积分等各种积分运算。
例如:
In[1]:=Integrate[1/(x^2-1),x] Out[1]=
当被积分函数包含符号不确定的参数时,积分结果可能与参数的符号有关,如果不事先加以说
明,Mathematica总是假设该参数为正值.如:
In[2]:=Integrate[1/(x^2+a),x] Out[2]=
我们知道,许多不定积分不能用初等函数表示出来,有些根本没有封闭形式.Mathematica有很多特殊函数可以表示一些积分结果.如:
In[3]:=Integrate[Log[Log[x]],x] Out[3]=xLog[Log[x]]-LogIntegral[x]
上面的特殊函数LogIntegal[x]是特殊积分函数——对数积分函数。
如果不定积分没有封闭形式,用户也没有事先约定,在这种情况下,Mathematica把输入的公式原样输出。
Mathematica可以用牛顿——莱布尼兹公式完成符号形式的定积分,如果输入:
In[4]:=Integrate[3x^2+2x,{x,a,b}] Out[4]=
也可计算二重积分,它的输入方法是:
In[5]:=Integrate[3x^2+3y^2,{x,0,a},{y,0,b}] 计算
In[6]:=Integrate[6x^2+6y^2,{x,-a,a},{y,-Sqrt[a^2-x^2],Sqrt[a^2-x^2]}]
Out[6]=3Pi
无论微分还是积分,最后结果可能是一个非常复杂的表达式,建议大家使用Simplify或FullSimplify简化它,常常可以得到十分简明的结果。
5.4 和与积
Mathematica提供了专门的求和运算(Sum[ ])和求积运算(Product[ ]),可求有限多项的和与积的精确结果,还可求可列无穷多项的和与积的数字结果(简单情形时也能求出精确结果)。
In[1]:=Sum[k^2,{k,1,15}] Out[1]=14400
上例中,求出了和式的值,这里默认的步长为1,也可任意指定步长,例如:
In[2]:=Sum[x^k/k^2,{k,1,8,2}] Out[2]=
In[3]:=Sum[1/k^2,{k,1,Infinity}]//N Out[3]=1.64493(精确值为)
Sum也可计算多重求和。
例如:
In[4]:=Sum[x^i*y^j,{i,1,5,2},{j,1,i,2}] Out[4]=(略)
积的运算与和的运算一样。
In[5]:=Product[k,{k,1,12,3}] Out[5]=280
In[6]:=Product[x+i-j,{i,1,4},{j,1,i-1} Out[6]= (略)
5.5 级数展开与运算
Mathematica可以完成幂级数的展开的运算。
例如:
In[1]:=Series[Exp[x],{x,0,4}]
上例把函数在x=0点展开成幂级数直至x的四次幂,Mathematica还可以进行更一般形式的幂级数展开,如:
In[2]:=Series[f[x],{x,1,3}]
Out[2]= (略)
Mathematica也可对多元函数进行幂级数展开,命令格式为:
Series[expr,{x,x0,n},{y,y0,m},表示先对x而后y进行展开。
In[3]:=Series[f[x,y],{x,0,3},{y,0,2}]
In[4]:=Series[Exp[x*y],{x,0,3},{y,0,2}]
幂级数可参加各种运算,例如:
In[6]:=D[%1,x]
Series展开结果带有余项,后面所有的计算结果都只能展开到指定的阶,例如:
In[7]:=Series[1/(1-x),{x,0,3}]
In[8]:=%^2
由于In[7]中指定展开到x的三次幂,所以Out[8]也只能给出该级数平方后截断到x三次幂的结果,如果你想得到更高阶的结果,就得首先把展开式改变形式,舍去余项,然后再计算,如下面的例子:
Normal[%%]
Expand[%^2]
第六章数据处理与数值分析
6.1 数据的最小二乘拟合与插值
Mathematica 能对各种数据进行最小二乘拟合,命令格式为:Fit[data,funs,vars].下面先产生前20个素数的数据表,然后用二次,三次多项式对它们进行最小二乘拟合。
In[1]:=fp=Table[Prime[x],{x,20}] Out[1]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,6 1,67,71}
In[2]:=fl[x_]:=Fit[fp,{1,x},x] Out[2]=-7.67368+3.77368x
In[3]:=f2[x_]:=Fit[fp,{1,x,x^2},x] Out[3]=-1.92368+2.2055x+0.0746753x^2
注意,在上例中,fp中的数据对应着x从1到20,这是默认值,你也可指定x的变化范围,如下例中产生的数据是由函数sin(x) 的值构成,其中x在区间[0,1.5]上取值,两个x之间的距离为0.1.
In[4]:=ff=Table[Sin[x],{x,0,1.5,0.1}];Fit[ff,{1,x,x^2,x^3},x]
Out[4]=-0.103795+0.102963x-0.000254029x^2-0.00011779x^3
拟合曲线也不限于多项式,可以是任意给定的函数族,如:
In[5]:=f=Table[{x,Sin[x]},{x,0,1.5,0.1}];Fit[ff,{1,x,Sin[x]},x]
Out[5]=-1.81577 10-8.12718 10+1.Sin[x]
上例中先产生一个数组,其元素由{x,sinx}构成,两个x之间的间距为0.1,然后用函数族1,x和sinx拟合,输出的结果实际上是sinx本身,这当然在情理之中,如果拟合函数族是{1,x,x^2,...,x^n}输入可以简化为Fit[ff,Table[x^i,{i,0,n},x].
Mathematica也可进行多元函数的拟合,如下例:
In[6]:=d=Flatten[Table[x,y,1+5x-x*y,{x,0,1,0.2},{y,0,1,0.2}],1];
Fit[d,{1,x,y,x*y},{x,y}]
In[7]:=Chop[%] Out[7]=1.+5.x-1.xy
其中Flatten是去出除序列嵌套的特殊运算,命令格式为:
Flatten[List]去除序列的嵌套,Flatten[List,n]将嵌套去除到层次n..
除最小二乘拟合之外,Mathematica还可完成拉格朗日插值,命令格式为:
InterpolatingPolynomial[{x0,y0,{x1,y1},...{xn,yn}},x]表示以{xi,yi}(i=1,2,...,n)为节点的n插值多项式.例如:
In[8]:=InterpolatingPolynomial[{{0.1,0.3},{0.3,0.9},x}]
Out[8]=0.3+3.(-0.1+x)
6.2 微分方程数值解
Mathematica可以解线性和非线性的常微分方程(组),例如:
In[1]:=DSolve[y ‘[x]= =x+y[x],y,x]
也可用替换符号让以上结果参与各种运算,如:
In[2]:=y’[x]-y[x]/.% Out[2]={x}
我们知道,对大多数微分方程,其精确解是不能用初等函数表示出来的,这时,可用Mathematica求其数值解,例如:
In[3]:=NDSolve[{y’[x]= =x^2+y[x]^2,y[0]= =0},y,{x,0,1}]
Out[3]={{y->InterpolatingFunction[{0.,1.},<>]}}
上例求出了微分方程初值问题在0<x<1范围内的数值解,结果以插值函数InterpolatingFunction的形式给出.Mathematica描述了InterpolatingFunction的目标函数的近似值.这些目标是这样一些函数,当对应于特定的x值时,在这一点上y (x)的近似值与之对应.实际上InterpolatingFunction备有一个y(xi)值的表格,因此添改该表,就可求得在用户所要求的特殊点x处的近似值y(x).例如我们可用以下命令求上例中解函数y(x)在x=0.5处的值.
In[4]:=y[0.5]/.% Out[4]={0.0417976}
Dsolve和NDsolve也可用于求解常微分方程组,例如:
In[5]:=DSolve[{y’[x]= =z[x],z’[x]= =-y[x],y[0]= =0,z[0]= =1},{y,z},x]
In[6]:=NDSlove[{y’[x]= =z[x],z’[x]= =-y[x],y[0]= =0,z[0]= =1},{y,z},{x,0,Pi}]
Out[6]={{y->InterpolatingFunction[{0.,3.14159},<>],
z->InterpolatingFunction[{0.,3.14159},<>]}}
In[7]:={y[2.],z[2.]}/.% Out[7]={{0.909292,-0.416147}}
与其精确解{Sin[2.],Cos[2.]}的值相比较,其差别不是太大.
In[8]:={Sin[2.],Cos[2.]} Out[8]={0.909297,-0.416147}
6.3 数值积分、数值求和与求积
在Mathematica中,象Integrate这样的函数总是试图找到精确的运算结果,当它们不能得到精确结果时,
它们一般就不能运算了,例如:
In[1]:=Integrate[Sin[Sin[x]],{x,1,2}] Out[1]=Integrate[Sin[Sin[x]],{x,1,2}]
Mathematica不能得到这个积分的精确结果,因而它只能退出不算,若要得到其数值结果,可用以下命令.
In[2]:=N[%] Out[2]=0.81645
当然,上面的两个命令也可合写成一个命令.
In[3]:=Integrate[Sin[Sin[x]],{x,1,2}]//N Out[4]=0.81645
另外,我们也可从一开始就进行数值积分,命令为:
In[4]:=NIntegrate[Sin[Sin[x]],{x,1,2}]] Out[4]=0.81645
与Integrate一样,NIntegrate也可进行重积分的运算,例如:
In[5]:=NIntegrate[Sin[x*y],{x,0,1},{y,0,x}] Out[5]=0.119906
与积分运算一样,当Mathematica不能得到求和与求积运算的精确结果时,我们也可求其数值结果,命令为: NSum[f,{i,imin,imax}] 求和
NSum[f,{i,imin,imax,d 在求和中使用步长为d
NProduct[f,{i,imin,imax}] 求积
NProduct[f,{i,imin,imax,d}] 在求积中使用步长为d
例如:
In[6]:=NSum[1/i^2,{i,1,Infinity}] Out[6]:=1.64493
In[7]:=NProduct[i^2/(i^2+1),{i,1,1001,2}] Out[7]:=0.398736
6.4 线性和非线性优化
Mathematica用来解线性和非线性优化问题的命令有以下几个:
LinearProgamming[c,M,b] 求满足M.x b,x0且Min cx的x
ConstrainedMin[cx,{inequs},{x,y,...}] 求满足不等式组{inequs}且Min cx的x和目标函数值ConstrainedMax[c.x,{inequs},{x,y,...}] 求满足不等式组{inequs}且Max cx的x和目标函数值FindMinimum[f,{x,x0}] 求f在x0附近的局部极小值
FindMinimum[f,{x,x0},{y,y0},...] 求在点(x0,y0,...)附近的局部极小值.
应用举例:
In[1]:=c={2,3};M={{-1,-1},{1,-1},{1,0}};b={-10,2,1}
In[2]:=LinearProgramming[c,M,b] Out[2]={6,4}
In[3]:=ConstrainedMin[2x-3y,{x+y<10,x-y>2,x>1},{x,y}]
Out[3]={0,{x->6,y->4}}
In[2]和In[3]都表示求解同一线性规划问题,不同之处在于In[2]只求出了极小值点,而In[3]还求出目标函数的极小值.
下面的例子表示求非线性函数Sin(x)+x/5在x=1附近的极小值和极小值点.
In[4]:=FindMinimum[Sin[x]+x/5,{x,1}] Out[4]={-1.33423,{x->-1.77215}}
同样,我们也可求多元函数的局部极小值和极小值点.如下例:
FindMinimum[x^4+3x^2y+5y^2+x+y,{x,0.1},{y,0.2}]
Out[5]={-0.832579,{x->-0.886326,y->-0.335672}}
第七章 Mathematica程序设计
Mathematica程序的执行包括对一系列Mathematica表达式的计算.对于简单程序,表达式的计算可用分号”;”来隔开,然后一个接一个地进行计算.然而有时你需要对同一表达式计算多次,即循环执
行.Mathematica用于循环结构的语句有和For,While和Do.它们的命令格式为:
Do[expr,{i,imax}] 计算expr,i=1,...imax步长为1
Do[expr,{i,imin,imax,d}] 计算expr,i=imin...imax步长为d
Do[expr,{n}] 计算expr,,重复n次
While[test,body] 重复执行body,直到test不为True
For[start,test,incr,body] 运行start,,然后重复执行body和incr,直到test不为True
应用举例:
打印1~3的阶乘
In[1]:=Do[Print[i!],{i,3}]
此问题也可用下述语句实现
In[2]:=Table[i!,{i,3}]
如果在上述各种循环与重复命令中没有象Print这类专门的输出语句,Mathematica只进行相应的计算,但却不输出结果,如:
In[3]:=t=1;Do[t=1/(1+t),{100};t
在In[3]的Do循环中,由于没有专门的输出语句,因而没有任何输出结果,但它还是完成了对t的运算.
Mathematica的While和For语句与C语言的while和for用法基本相同,然而也应注意到它们之间有很多地方不同,例如,在Mathematica中,For循环中的逗号及分号的作用与C语言中刚好相反,例如:
In[5]:=For[i=1;t=x,i^2<10,i++,t=t^2+i;Print[t]]
In[6]:=n=7;While[(n=Floor[n/2])!=0.Print[n]]
Mathematica也为用户提供了一些中断循环过程的函数,常用的有
Break[] 退出最里面的一层循环
Continue[ ] 转入当前循环的下一步
Return[expr] 退出函数中的所有过程及循环,并返回expr的值.
In[7]:=t=1;Do[t*=k;Print[t],If[t>3,Break[]],{l,10}]
在上例中,当t=6>3时,执行Break[ ]语句,退出Do循环.
In[8]:=t=1;Do[t*;Print[t];If[k<3,Continue[ ];t+=2],{k,4}]
在上例中,当k<3时,Continue[ ]继续执行循环,但不执行后面t+=2的语句.
In[9]:=f[x_]:=(If[x>5,Return[big];t=x^3;Return[t-7]]
In[10]:={f[3],f[6]},Out[10]={20,big}
In[9]定义了一个函数,当x>5时,退出后面的函数过程并返回字符串big;当x<=5时,返回的函数值为
x^3-7,In[10]验证了这一点.
用Mathematica编写程序时,还不可避免地要用到分支结构,有关分支结构的语句可查阅自定义函数章节有关内容。
第八章 Mathematica的文件系统和资源的合理使用
为了方便用户,Mathematica建立了文件管理系统和资源管理系统,设计了十分灵活多变的输出格式,也提供了与其它算法语言通讯的手段,这里只介绍其中的一小部分.
1.文件系统
从前面的学习中,我们已了解到,Mathematica的主要工作方式为会话式,即一问一答式,当你完成一些计算后不得不中断,但又希望再次开始时继续以前的计算,这时你可以按以下步骤进行操作:
(1)在Windows下退出Mathematica时系统会问你是否保存计算结果,回答”是”,然后系统要求你指定文件名,你可以任意给定一个文件名,比如说abc.nb,确认后系统就将文件存在相应的目录下.
(2)再次进入Mathematica后,先打开该文件,然后用鼠标激活Action菜单,再选Ecaluate Notebook一栏,按动鼠标后就可继续上次的计算.
有时需要把Mathematica用到的定义,表达式保存起来以便别人使用,这时可以用表达式>>文件名.m例如,In[1]:=a/b>>tmp.m这个语句把a/b保存在文件tmp.m中,如果想把表达式c/d添加到该文件中,可以用In[2]=c/d>>>tmp.m;使用In[3]:=!!tmp.m可以查看文件tmp.m的内容,这时输出是a/b c/d
如果你在Mathematica计算中,要用到保存在一个文件里的内容时,可用<<文件名.m将保存在文件中的内容读到现场.
如果要保存Mathematica中定义的多个变量,函数,可用命令
Save[“文件名”,f1,f2,...]把f1,f2,...存到一个文件中.例如:
In[4]:=a=2-x^2;
In[5]:=f[x_]:=x^3+6
In[6]:=Save[“file1.m”,a,f]。