QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 17329|回复: 7
打印 上一主题 下一主题

maple基础

[复制链接]
字体大小: 正常 放大

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

自我介绍
爱学习
跳转到指定楼层
1#
发表于 2012-6-12 16:53 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
2 i9 C( u& a7 G5 J- K$ B( P
第一章  Maple基础
+ o2 ?- D( L% r& x" Z" `
6 O3 s  X' ^- Z4 u; `6 \; g1 初识计算机代数系统Maple
1 q  Z% {8 d" ^1 _3 C9 w$ g' M" P1.1 Maple简说9 @" V# u  t. H; J, {
1980年9月, 加拿大Waterloo大学的符号计算机研究小组成立, 开始了符号计算在计算机上实现的研究项目, 数学软件Maple是这个项目的产品. 目前, 这仍是一个正在研究的项目. 9 g2 \0 A; F+ B9 R* G
Maple的第一个商业版本是1985年出版的. 随后几经更新, 到1992年, Windows系统下的Maple 2面世后, Maple被广泛地使用, 得到越来越多的用户. 特别是1994年, Maple 3出版后, 兴起了Maple热. 1996年初, Maple 4问世, 1998年初, Maple 5正式发行. 目前广泛流行的是Maple 7以及2002年5月面市的Maple 8. 7 c: A  _& \( p* J+ a$ `
Maple是一个具有强大符号运算能力、数值计算能力、图形处理能力的交互式计算机代数系统(Computer Algebra System). 它可以借助键盘和显示器代替原来的笔和纸进行各种科学计算、数学推理、猜想的证明以及智能化文字处理.
2 a$ L, d; E4 D2 n( [& Y+ rMaple这个超强数学工具不仅适合数学家、物理学家、工程师, 还适合化学家、生物学家和社会学家, 总之, 它适合于所有需要科学计算的人. / b! b$ B8 @3 B" N* f: u
1.2 Maple结构
4 F" M( [' r! D7 K' S  A  o5 GMaple软件主要由三个部分组成: 用户界面(Iris)、代数运算器(Kernel)、外部函数库(External library). 用户界面和代数运算器是用C语言写成的, 只占整个软件的一小部分, 当系统启动时, 即被装入, 主要负责输入命令和算式的初步处理、显示结果、函数图象的显示等. 代数运算器负责输入的编译、基本的代数运算(如有理数运算、初等代数运算等)以及内存的管理. Maple的大部分数学函数和过程是用Maple自身的语言写成的, 存于外部函数库中. 当一个函数被调用时, 在多数情况下, Maple会自动将该函数的过程调入内存, 一些不常用的函数才需要用户自己调入, 如线性代数包、统计包等, 这使得Maple在资源的利用上具有很大的优势, 只有最有用的东西才留驻内存, 这保证了Maple可以在较小内存的计算机上正常运行. 用户可以查看Maple的非内存函数的源程序, 也可以将自己编的函数、过程加到Maple的程序库中, 或建立自己的函数库.
6 c$ ]- ~  q5 q& j6 k1 g+ j, @1.3 Maple输入输出方式+ E+ P: P# c% b! h
为了满足不同用户的需要, Maple可以更换输入输出格式: 从菜单“Options | Input Display和Out Display下可以选择所需的输入输出格式.
# H' f$ G' q0 _( S. `Maple 7有2种输入方式: Maple语言(Maple Notation)和标准数学记法(Standard Math Notation). Maple语言是一种结构良好、方便实用的内建高级语言, 它的语法和Pascal或C有一定程度的相似, 但有很大差别. 它支持多种数据操作命令, 如函数、序列、集合、列表、数组、表, 还包含许多数据操作命令, 如类型检验、选择、组合等. 标准数学记法就是我们常用的数学语言. % P2 [0 ~$ E+ |) p
启动Maple, 会出现新建文档中的“[>”提示符, 这是Maple中可执行块的标志, 在“>”后即可输入命令, 结束用“;”(显示输出结果)或者“:”(不显示输出结果). 但是, 值得注意的是, 并不是说Maple的每一行只能执行一句命令, 而是在一个完整的可执行块中健入回车之后, Maple会执行当前执行块中所有命令(可以是若干条命令或者是一段程序). 如果要输入的命令很长, 不能在一行输完, 可以换行输入, 此时换行命令用“shift+Enter”组合键, 而在最后一行加入结束标志“;”或“:”, 也可在非末行尾加符号“\”完成. . ~* B' }) N2 c; w8 o8 M: k4 c% J
Maple 7有4种输出方式: Maple语言、格式化文本(Character Notation)、固定格式记法(Typeset Notation)、标准数学记法(Standard Math Notation). 通常采用标准数学记法. : H! E" ]7 V. k/ a6 b
Maple会认识一些输入的变量名称, 如希腊字母等. 为了使用方便, 现将希腊字母表罗列如下,输入时只需录入相应的英文,要输入大写希腊字母, 只需把英文首字母大写:   
% K7 w& M1 E9 ^& Q* n+ g8 B
- k& X3 R8 p$ A% B9 D/ p6 _3 m
: B% K* M% r8 Q- N$ j 8 G3 C, T1 n6 c/ h

1 c8 ^/ s/ H# _' T8 W  u% Q
3 U0 v4 D& g0 F" S( I 3 [- ^- Z' `* i" M4 M+ n

3 O( t- o$ A. j% E/ o1 ] & h& _' k$ z3 S2 y) y
" `1 N) I. v% o+ G( a
, k1 I7 ]+ C' b- {0 ^

1 v5 i$ w2 J+ z# F" I3 l% s  P
  g; E, o/ Y6 K/ C. D) m+ F# \
( E8 h: I0 [- P: {7 H5 O; Jalpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
+ z( G4 \8 T5 u( | 4 V3 m' V% w; l7 m0 d; l

! f7 i; E. q" W/ O4 Y* c" g+ q2 N 6 F' p4 i' U9 T
1 x; e3 `4 k$ a

1 F) Y* B1 m  l! b9 B8 ?" C; O9 r . A' A) B1 q  c2 G7 c

/ E$ ], K, h* k! w9 f# T 6 X) i1 g0 g& L+ A
" d, x( n+ i6 |

5 K8 X0 I( T. O, ]9 O ; p- p, u! d) s  r' r
9 M9 D! W  r% v3 z; K

6 }" M2 F  d5 B" a; [nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega  ]7 C6 H* p6 Q+ I7 P
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
% q% s; e  Z" h# }8 q> for i to 10 do & m. O, a8 f  K4 {; E
printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
4 `& H3 F( F& m+ r( M* ]od;
' ?) W* l9 c( h& u- v8 Xi=+1 and i^(1/2)=+1.000i=+2 and i^(1/2)=+1.414i=+3 and i^(1/2)=+1.732i=+4 and i^(1/2)=+2.000i=+5 and i^(1/2)=+2.236i=+6 and i^(1/2)=+2.449i=+7 and i^(1/2)=+2.646i=+8 and i^(1/2)=+2.828i=+9 and i^(1/2)=+3.000i=+10 and i^(1/2)=+3.1624 n) @! B5 }: Q& W7 ~7 M( T
+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:+ I4 z* n6 S* q6 {% u! b8 b
> for i to 10 do 2 _# {3 r  ]7 a
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));
) D- k: e( k" U7 i, l! z; Qod;4 b2 a* y' o, `# l
i=+1 and i^(1/2)=+1.000
, [. i8 m4 D; E/ _8 ji=+2 and i^(1/2)=+1.414( }& R' c' U( D  v3 u+ m
i=+3 and i^(1/2)=+1.732) X! E' O  k; ]+ Y5 Y- k& k
i=+4 and i^(1/2)=+2.000
- }9 K; V: E. z, o! c" _1 n2 ~. |i=+5 and i^(1/2)=+2.236" c% S$ e9 H, U4 n! J
i=+6 and i^(1/2)=+2.449
. ?* h7 v. P1 u2 r& Z7 y2 Wi=+7 and i^(1/2)=+2.646
) M. m5 d) I- j9 U5 i  Vi=+8 and i^(1/2)=+2.828  p/ ], Q7 ^3 `
i=+9 and i^(1/2)=+3.000
% Z" h9 Q: Q& ^* \i=+10 and i^(1/2)=+3.1624 {# `+ j( M# h7 y) d3 ]: h
再看下例:将输入的两个数字用特殊形式打印:
  H. f" |& X* }' Y8 s> niceP:=proc(x,y)' }6 i) U* ~! X. t
printf("value of x=%6.4f, value of y=%6.4f",x,y);9 M7 c# b4 h6 I' x. J! b% D; ^
end proc;, L! X# D4 ]! j( p$ C1 r
1 t" m0 f) z% k4 _
> niceP(2.4,2002.204);1 X- e; M* @7 n& ?$ H- P" y
value of x=2.4000, value of y=2002.2040
7 `" W$ A0 s( E0 M+ w1.4 Maple联机帮助5 F9 M, d/ l# H# g4 k& `* P
学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用.
! B% O; O" @' ]# U在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可. * N# Y1 e( C& M# R/ P; u
2  Maple的基本运算
, w2 T; u/ M: U5 s% [" {, _2.1 数值计算问题2 J0 z1 T! P3 [6 l
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”. $ m; |. ?. F7 a; G0 }8 {
在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
  `5 v/ L" Q" ?5 x0 h2 x) yMaple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算.
, r7 V1 a) _. O0 ?* N1 H但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明. / V( d: q- S6 d2 W' Z  A4 B. B" g. K
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   5 C. {& R3 A' q0 e  J: @2 m" N/ r
> 3!!!;
8 I( ^' _+ v8 V6 f2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/ Z9 w& B- y0 Y4 ^& \7 @3 h
上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
$ |7 w. t; X7 |0 b( a为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式
. y, ^: S% u3 e* i2 m% N
/ N; |9 R6 j" `可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   $ R5 o6 r, d4 S; s

1 k3 Z  _3 h: j0 n$ V这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. 7 o2 Y8 W8 ~' S3 s& G& Y0 _
另一个例子则想说明Maple计算的局限性:   
( A; g2 z6 F/ j9 y' Y$ S, Y5 r  0 J, t: l! n5 M* a2 N
Maple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   
* X3 I' p5 \6 X  @3 i/ A
3 S# e1 x: k) j  h显然这是错误的. 这一点可以从代数的角度予以分析. ) [9 J- n2 s  j, \
不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果.
" j' D! d+ X% i( S另一方面, 设 , 则 , 即:
! ]7 w& ]2 o& J
1 {8 p5 j, v! ]显然 有6个结果, -2、2是其实数结果.
0 X  S5 B) U4 l- v7 W* B这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性. 6 _' M% O7 y7 a
尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.
, {! c2 q+ C! a# j0 ]2.1.1 有理数运算! @. h* |; ?; g$ [
作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). : \' {+ Y, X; {& t( x# |; g
> 12!+(7*8^2)-12345/125;' y" W( E1 z3 y
* f# L, r* m6 k. q. w. _
> 123456789/987654321;
7 ^6 Q4 k9 j- V% Q. Z% a$ V* V
( `* \' {( y, o- ~( D4 q* S> evalf(%);4 r* \0 h2 f6 o3 h) n! Q

9 F1 J# i/ @. V( a, T: i9 M6 m# h  U> 10!; 100*100+1000+10+1; (100+100)*100-9;! @2 a6 U/ X2 D; }' G. k( j

. E! v2 I; j7 f+ B( ^8 ] ) n; _  H- v  m* T# B( g

5 N1 w: n( I, |8 s> big_number:=3^(3^3);' p& p* p- \" M$ L  T% F
1 X3 Z: c+ }  E" z
> length(%);( i% |* V' H( ~- r; v4 i1 [1 B7 y" r

' u0 f) A' y- ~6 w8 B' m/ e上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   
0 M5 r" g/ K/ C& b2 s    1)整数的余(irem)/商(iquo)' v& O* _; s& c; i& W9 J
命令格式:   , U  @8 M$ i8 o/ y+ w5 y
irem(m,n);        #求m除以n的余数
$ F% V  r1 k7 s1 o  qirem(m,n,'q');    #求m除以n的余数, 并将商赋给q
, h7 D8 j+ n" x$ Y+ i* hiquo(m,n);        #求m除以n的商数4 s5 ]4 J# @( q8 j' b" k6 |
iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r" u, S- v2 H9 ~# a, V
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值.
3 L/ v: Y; F8 Q> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q$ e, @" G* |2 m4 ~! `3 @& ~4 Y

4 m: b, o7 u2 N5 G> q; #显示q
  E! t: m3 D! N. O) A, U2 } : x& j5 `3 U) Z* L3 N; l% U$ n& l( N
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r+ t# n  d9 v/ R( O/ S2 b( A  J
5 a" j: A' f8 q
> r; #显示r: v: h: B" V. f) C

% M5 u4 Q! G" S> irem(x,3);! n9 J" V6 q7 H5 e% t- e! _
$ G" P# Z" z2 o3 d' S$ {- S# @4 k
2)素数判别(isprime)
6 w1 `0 D' a% `( z, j3 B  w7 b素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); ! T# j' h, V- k6 Z" H% z
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数.
0 o" G" U3 @, Z. S8 l> isprime(2^(2^4)+1);5 `4 h8 O# T4 g: y6 @
2 g1 S# F2 K+ u% }" O
> isprime(2^(2^5)+1);
6 A0 M/ o) f8 z. C; M$ _ ; u  o8 N, P/ p+ N2 f0 l. z
上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多.
; r* `/ [" K' t3) 确定第i个素数(ithprime)
% @' C" N7 s2 Z  Y6 F1 s若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
* U; p9 K% F6 h" Q' L> ithprime(2002);
$ A0 `& p+ b1 m  j2 ]9 d ( g4 a2 _5 o! k, U" ~1 R
> ithprime(10000);
1 R  T/ a, |2 J+ R/ j( t  I& P0 H ' F) [) b1 W3 e5 U0 ~2 V1 T
4) 确定下一个较大(nextprime)/较小(prevprime)素数& o  n- x* U/ ?9 }) H+ z1 O/ e, i
当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
  h6 B! P, O4 Pnextprime(n);  ) z+ |9 W! G; E' k% x! V
prevprime(n);
' E/ d7 i2 Y3 |' Y> nextprime(2002);
9 ^& ]+ P6 Y6 U/ T* C 1 S, {  E+ l) I8 q( N5 A
> prevprime(2002);$ y$ K6 M* ]; J8 p
) n6 t- F- y4 A7 }) e
5) 一组数的最大值(max)/最小值(min)
; \! ^8 q* `# X; [$ ~命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值
2 O! e' V: F# h! P3 c             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
# |1 L: A* k" L! s8 m5 w: F> max(1/5,ln(3),9/17,-infinity);/ u0 Y8 K. @9 d6 q- H. M' K) e

' t: a+ S" J* q" K0 Y> min(x+1,x+2,y);
1 r" r/ X1 T' F9 K& u$ x  n
5 @! G4 i7 I0 V# E* c2 h6)模运算(mod/modp/mods)8 _1 F7 F+ P+ ^: F- D- U* j
命令格式:  e mod m;    # 表达式e对m的整数的模运算% [7 G" u6 i4 `8 g( X
modp(e,m);  # e对正数m的模运算+ M$ v3 D8 q8 [. S( I& o# y4 |
mods(e,m);  # e对m负对称数(即 -m)的模运算/ b# ?( @, I. W2 E- M- Z
`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价
, k+ D% P' H" g值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. ' q9 y. k: G7 w! V0 O, M
> 2002 mod 101;
" _: n1 {4 A4 T4 i+ l1 b
9 Y( g$ Z) @0 s; ?> modp(2002,101);5 h3 a+ J' S+ r
- {9 }: ^" C& d$ S1 g
> mods(49,100);4 d. Q& f: q; d  y, k

9 Q4 U4 S# L8 V# [4 r/ k9 ~> mods(51,100);
$ A. z5 a0 W/ |. m/ n5 ^6 @2 T ' A: w" x; @+ K& U, T
> 2^101 mod 2002;  # 同 2 &^101 mod 2002;
, }2 F- n( w9 }* v & \7 Q/ S6 Y6 s; w' ~
7)随机数生成器(rand)' D- D$ P. k( J* m' |2 U
命令格式:     F+ C  E' j4 Z1 ]3 b
rand( );    #随机返回一个12位数字的非负整数$ y1 s5 A4 f# g- p
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
: f) r1 Q% l2 R> rand();
$ h6 R" L, |% n  T" c. d8 w
; F2 o' D, ^4 S. r7 o2 R( c2 [> myproc:=rand(1..2002):- ?0 c! M- f& t6 N; n2 H
> myproc();3 s1 f) e+ `# T2 ]  V( c$ z7 n, j

- Z: t' c8 P* |> myproc();
4 `0 C, f7 t9 E6 p 5 V+ T' I- T& ^: A
    注意, rand(n)是rand(0..n-1)的简写形式.
! [$ m* m  @6 p+ P! s2.1.2 复数运算
4 P$ |* L7 V/ M; `( o复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   " Y8 y1 N8 H/ Z/ w+ n7 U+ @
> complex_number:=(1+2*I)*(3+4*I);" U, s) s; D/ J2 Q" Z

( V" o9 a5 U# h8 K- c, F- I> Re(%);Im(%%);conjugate(%%%);argument(complex_number);+ X, ]3 D" Z  C# F/ I+ y& ]
$ o1 ]  H9 k' Y

& I: c4 J3 ?- ], p2 a! ]
" a3 j, ]0 _; O- l: o5 P% D( N4 C: y
, u3 Y4 v- ~  t5 ^& b值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.
1 P. G/ s+ K/ `0 g" L( ]5 U7 i. b为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   ; ~8 W% B1 ^* d; v& T  @) X
1) 绝对值函数6 W4 N/ [! }1 ]  r' k. {( X7 P. `
命令格式: abs(expr);  - K2 @; O8 s# n+ ?5 _
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.* y+ q- W* z! S) z6 Z) U1 Q
> abs(-2002);    #常数的绝对值
5 I- ?" Z1 I! e; G/ ^8 Z
. K$ `* s$ _$ M8 ]0 \3 c> abs(1+2*I);   #复数的模
5 T7 B4 n; H1 l' o( q/ O  a( U. C) f( s 0 v% |  B, e3 @
> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值8 d, q/ V( M# g. l6 d

! q6 ?2 W* q' A8 ]% I& U$ i) _> abs(2*x-5);   #函数表达式的绝对值
" ?5 I0 {: w# @2 C " C8 d1 ~% X5 \+ s6 `8 b
2)复数的幅角函数( Y" e! c/ E$ F3 ]& K( \/ `
命令格式:   argument(x);  #返回复数x的幅角的主值
$ f* y$ R5 _* |8 ]* g) H> argument(6+11*I);2 d" k0 e$ P) {7 H2 h7 f

4 x! _6 r% z. `# V1 N9 Q3 F> argument(exp(4*Pi/3*I));
. U2 `  z6 S; K! w# R , l, j$ N" r$ T
3)共轭复数
5 {% `. f6 K: V; n命令格式:   conjugate(x);  #返回x的共轭复数
* s6 w# N" H$ `! S) e2 o' ~> conjugate(6+8*I);
' s$ s0 _# ]" X0 y3 [: V( s 1 K  I" S# F+ k2 M
> conjugate(exp(4*Pi/3*I));! |- }7 M, I$ D% I

4 M8 I' r) h3 Q, i& S$ p7 Y4 p2.1.3 数的进制转换( Q! A% D) s5 V0 y4 V
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可.
) G0 X, O+ j; A) U命令格式:   convert(expr, form, arg3, ...);   
# c0 K1 {* t3 ~- L) L6 j其中, expr为任意表达式, form为一名称, arg3, ... 可选项. & M$ R1 i# k% Q3 n" q! Q
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述.
: G' w+ o! [7 t/ ?3 X% i' J( L    1)基数之间的转换
6 }/ `8 s7 _2 @' A" o; {: d命令格式:   3 [6 k' F- Q# q
convert(n, base, beta);      #将基数为10的数n转换为基数为beta的数( ?7 k% z- \4 r3 L
    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数
: B7 K# Z# I% w& i> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7  Z2 }: r5 g2 y4 c5 t# G8 a
% c6 j8 m. o  a, W
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数& ]  Y9 O5 i& Y: w5 G7 i0 @

5 o  ?1 m# g. t( B2 `* w> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)2 x: }" P/ P' R! C2 i  ~$ _. S" x

' s3 M- r, Q' i) s* M* |7 J    2)转换为二进制形式
3 J/ D# S) M: O$ O9 p/ n8 N: h命令格式: convert(n, binary);. p$ x2 Z% ^, X6 M, K
其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. & K0 ~/ x* Z- b3 b" t
> convert(2002,binary);   * e8 r( U/ A6 l; }) q4 `
0 H/ |3 V( _8 I4 c
> convert(-1999,binary); 3 Y2 j( Y7 H( R# D( A

! r! R; v0 W) r! J8 z' _> convert(1999.7,binary);
' Q& y$ [( Y- x% a$ B 2 m0 c! N, Q- y$ z0 Y3 p
3)转换为十进制形式
* K7 V  s$ [! F0 s- I8 u/ m其它数值转换为十进制的命令格式为:   ' b% U9 i7 L" |$ O
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数/ W# r# l# e( v9 m
    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数
5 Y- ~# a& W3 u! y4 i    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数, k% m# j  ?4 b7 N  o
> convert(11111010010, decimal, binary);    : }  x& e: y9 ?2 {4 Q) ~% h, Y5 }
2 P. h1 @( `1 M+ r0 q0 @
> convert(-1234, decimal, octal);           
, j( l: D1 J4 I  | 7 S2 t. l$ c7 y2 P5 G
> convert("2A.C", decimal, hex);         
- s3 V8 l2 W' a# g7 t  A8 n " }, v" ^  F$ @4 x
4) 转换为16进制数4 ~+ b% s$ d. M' p- M) O
将自然数n转换为16进制数的命令格式为: convert(n, hex);   
% x" ?; g* ~# F6 i( c> convert(2002,hex);  convert(1999,hex);
# L' p/ J: ]$ x1 W  B
* g1 J  Z  R  V0 t , E- T. O4 a9 a- F5 S
5)转换为浮点数# c. K  G) {; M; \+ Y9 R
命令格式: convert(expr, float);- w' p7 u: u. m
注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. 9 J* i+ R" ^+ q
> convert(1999/2002,float);, R  p% j: `% ]" e# n+ {" k; n8 P0 Y

9 d& e4 |* X, b! E" m6 p' J  P> convert(Pi,float);# Q* k% p; `+ ~9 C( {

/ T8 J7 w$ l/ A; h2.2 初等数学
8 i0 z7 m) t) G% I7 r    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识. . _2 Q9 l& b/ u- y+ B: B
2.2.1 常用函数
. J* J; e$ A4 ~" o6 S' ]作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   / y( b7 w/ w3 u
指数函数: exp
2 C$ v7 B1 d: T4 G一般对数: log[a]: _' j0 a( C1 X( ^3 o! D
自然函数: ln
& \1 A1 O+ i1 [6 r常用对数: log10
/ v$ `! S) M( ^7 {平方根: sqrt
& k4 b5 Z3 ~1 |7 Z$ ?0 a" g- V3 t绝对值: abs2 H3 |3 b* G8 \: j7 E2 x
三角函数: sin、cos、tan、sec、csc、cot
& ]! r: m0 o6 W8 j反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot+ [& o% d: r% W! @7 W6 B+ m. _+ P
双曲函数: sinh、cosh、tanh、sech、csch、coth
. N% M4 ?  H1 P3 K反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth" K& R; ?; M/ \" p5 o
贝赛尔函数: BesselI、BesselJ、BesselK、BesselY5 i, T# x- x2 [, C8 C
Gamma函数: GAMMA9 {8 O; o/ ?: j
误差函数: erf! Z& R1 T; `% H1 m' }7 N2 [
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. # ]+ x. l. H6 `: R+ d$ t
1) 确定乘积和不确定乘积! f$ W2 z* T: H! V+ y& Q1 x. Y
命令格式: product(f,k);  
! r9 z* |* ~: Vproduct(f,k=m..n);  0 g" H8 x4 R/ g% Z0 K7 e
product(f,k=alpha);
2 Q- I+ R, A8 J% H1 aproduct(f,k=expr);
0 k# e- z3 o  P0 n+ E4 M& {$ v其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
* I: ~* n$ J% z6 Y, e9 U: K+ s0 u3 U> product(k^2,k=1..10);   #计算 关于1..10的连乘
% y! {1 n6 q$ [. X6 x" ] : D+ C  {! C7 a5 d% m3 {* Y- i: d
> product(k^2,k);         #计算 的不确定乘积& H+ e6 ?: x( y( B" V* F$ R+ S( i

( w6 @* d4 ?. X2 d6 S> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘2 Y& O( [5 V$ M, D: z4 R; b
) C0 O3 g2 Q& o& `! _
> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘
1 q$ j2 A2 O& b- K3 O
9 }% J' h& T8 K  m' C> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式
/ k0 `6 ?) S: X- p& c
" B% k- k' p9 ?' `: x* w: {# t> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积8 z" U" b$ C* X+ q' t8 a% s
, r# R, M) }) ^. m3 Y, W
    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
/ G. M2 r+ {- g* c0 s7 U> product(x+k,k=0..n-1);
1 `! J' r: ~6 S6 S# F
8 D9 ?/ \6 x9 |" }9 b0 B  i- s, \+ F如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
/ O! _- e1 }4 G7 R: X) Q8 y> mul(x+k,k=0..3);3 M6 X5 y2 p- g& T2 ^

* T1 b  o9 O+ N4 Y2)指数函数
0 J% J2 P5 R3 `. O3 c计算指数函数exp关于x的表达式的命令格式为: exp(x); 4 t- E& n& h0 ^
> exp(1);
( w5 ^3 Z* N/ ?8 O) |4 z) y  A 0 X% E% n6 Z, c) ?/ W' `6 j; F! _+ R
> evalf(%);! t3 m; f( L# ^0 u

9 U/ T7 J/ |( h4 F> exp(1.29+2*I);
- O  n! h. ], `: C- {+ y. R7 Z) b2 O   O* H8 U; e. I! S' e! F. v
> evalc(exp(x+I*y));
, @4 g" w2 o) i
5 B+ O) d1 n+ k3)确定求和与不确定求和sum
9 @& W4 X- n# I) G( p- y命令格式: sum(f,k);  : ?  f# F$ Z" K1 v" N$ u% g$ V+ k
sum(f,k=m..n);  
. e& e# r) W+ wsum(f,k=alpha); ) y- ?+ E5 y  d2 a$ V+ p5 ]
sum(f,k=expr);0 R) ^0 }4 f8 R5 {9 e! q8 {
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式. $ u1 f6 e2 k# g4 h
> Sum(k^2,k=1..n)=sum(k^2,k=1..n);. R1 P7 i( {" w  v! ^; Z
9 }* _: X* u. z! w' x* N; O$ Z1 e8 {  b+ A
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);4 w7 `  G, ]/ S) J5 C. i3 x
: W: j, N6 W# ^3 @
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);! J# K4 F2 Z% |* V. k
8 T% {' c) g, U( m; [2 j. j
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);& m, @2 ?( W5 N/ W

% I9 n/ W5 K1 _7 q0 i, N. b> sum(a[k]*x[k],k=0..n);0 O( V& W6 \6 f

* _6 z4 N; P4 I8 U7 T> Sum(k/(k+1),k)=sum(k/(k+1),k);) Q/ v4 n6 G7 n+ x8 Y$ p. C7 {
, z% H6 O+ H1 {+ h" T
> sum(k/(k+1),k=RootOf(x^2-3));
4 |4 ?% T! N- z* _: z& M
0 U, z$ ]. Q" H  Asum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的.
& k0 g4 j0 O8 v> Sum('k','k'=0..n)=sum('k','k'=0..n);
2 D+ ~$ `+ V2 F! K; m2 J
/ G& {8 t0 ?+ E" D! E+ M如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
  n' O6 O4 e" u. K> add(k,k=1..100);
* N" x7 t8 v* l% [. ?( h3 x
" U1 C3 ?% v% T2 e+ G! D尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. 8 I# `6 J5 [; j, c4 F
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
5 x9 C8 U0 f0 N) H0 D3)三角函数/双曲函数
# \8 |' o6 H, ?. X6 E命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);+ O7 {$ ?7 O9 ]. m- i- G$ N
          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);
* j4 F0 q9 Y; A3 O4 A5 g其中, x为任意表达式. , b( q, y% Q, R) q  t7 X) l
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.
5 }" M3 v( `( `+ O+ o8 J9 J> Sin(Pi)=sin(Pi);
* Q8 I: h% j$ @# O! H1 ?
5 M# ]# Q7 K4 _( E9 O# R, f1 z& {> coth(1.9+2.1*I);
0 A6 P1 B+ l: P
! O" b! H! t$ p# C/ ~> expand(sin(x+y));     #展开表达式
! m: M  `, x  f2 i9 t 2 f' B1 i0 V; A1 Y
> combine(%);        #合并表达式
% W. x* k# U+ T/ k9 Z) \
% z+ G" P' J$ K3 a4 J> convert(sin(7*Pi/60),'radical');
( `/ w3 Z0 }( {; o7 c) E
  z% L( P8 N9 x! c5 x1 z, ~3 O> evalf(%);
' I' g$ h0 _9 {! y
5 R# U3 r- A8 M; _% J* G% ?但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.
9 ]1 E7 T* @0 c  q4)反三角函数/反双曲函数! K3 B% i# M5 R; z' S
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);/ @) A& c/ z1 w
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   8 E$ {9 ]3 a9 t9 w( |
arctan(y,x);9 @" g+ @. v/ |( ^) K+ ~! P5 i
其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算. $ ?2 I! Y# {6 I3 Y0 i8 C
算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.( @0 E6 r8 f- V, ^( ^' U: `! g
> arcsinh(1);
$ L: e1 w+ X4 ]/ T ; ~5 c0 v3 V# O9 ~$ U" A/ C
> cos(arcsin(x));; z: Q! Q, M1 f7 ?  D

) j% D& m, p" L+ x6 p> arcsin(1.9+2.1*I);
0 R% G6 t& ]! ~4 U1 f( }7 X# f 1 F4 c8 C5 D% S6 I% W
5)对数函数
& ?$ y0 v9 m) F7 `命令格式: ln(x);           #自然对数7 K& q4 C% A0 R( ~. Z, o
log[a](x);        #一般对数
/ E$ R+ t3 b% Elog10(x);        #常用对数
( d! `; o1 t8 x# s6 O一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   9 o/ z1 v' c6 e5 _+ G8 K
  (其中,  )& Y; U8 [! t; H: F
> ln(2002.0);
/ S$ Z4 [( K- m9 B6 G9 l% Y
3 l0 z4 w4 j" T& u> ln(3+4*I);1 Q; V7 d, X7 E8 I9 F
. C5 l+ Z: g2 O1 G, u7 h# r8 G
> evalc(%);    # 求出上式的实部、虚部+ f8 x4 D/ N+ |# N( S; r: ^1 M

+ W. p( d; _3 G; S> log10(1000000);
3 y5 p% n2 |# l. Y: j2 p
% i' \3 L7 u, ~> simplify(%);   #化简上式
% A  K. ?- M5 j ) S4 s0 F7 U" S) @7 B; w$ D
2.2.2 函数的定义
3 A& b1 R" m( [' [# o& [Maple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   , L! `$ j3 ~& G9 m% _1 ]+ V% u
> f(x):=a*x^2+b*x+c;& Z6 z: t  B& _- ], r

% g3 x( [% Z! y可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   " I8 g% [# `) a' {: H" U  X' }2 m; y
> f(x),f(0),f(1/a);
7 Y2 K+ M3 p( a! D$ V
3 ?' B* F. g& Z' Z由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   , e, E2 }4 f1 m9 J
> print(f);
$ D9 X$ T2 v; J. C
) z9 F, s, s$ p: m3 K( ~3 ~* E. b+ j事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式.
: o4 M  Z6 n$ m, g+ G: Y在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   " O! ~) h+ O* P
> f:=x->a*x^2+b*x+c;
6 ?1 f# {, B0 B0 i& x$ K
: D6 H% W# o. G9 O, J7 `> f(x),f(0),f(1/a);' `$ ?5 o* `0 F! q* b

# w1 ]0 A1 m9 D. d7 K6 ^; m6 X( P- o. v多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). 3 H, o( p6 |1 v
> f:=(x,y)->x^2+y^2;3 l  Q3 y3 A) Z3 {( `/ k
' J: x# V" y" G
> f(1,2);
; O5 |( K7 I, N* x
& z- G" H# n, _- i- }> f:=(x,y)->a*x*y*exp(x^2+y^2);1 ~' ~: C, \1 I: [
- g& h% w& Q0 E3 M- f' q$ E# h
综上所述, 箭头操作符定义函数的方式一般为:   " c3 i& @2 Q0 X+ l% I* L0 H
一元函数: 参数->函数表达式  t) X5 [2 K; _9 ^# C* {% V
多多函数: (参数序列)->函数表达式
$ o2 ]& x6 \- s0 J无参数函数也许不好理解, 但可以用来定义常函数:   : J- F& P8 E; m/ ^
> E:=()->exp(1);. f: m& p# g" x* `7 H

2 `( l8 g: G& k" R# H> E();
- \% ?9 w+ y7 a5 Y
( h6 x# l( }7 L7 W; ^- X) F% S+ b> E(x);
0 U/ L, U9 m1 L* F: G/ G
$ `9 |, a+ U; k( J) q另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数.
! m# x/ s% Q5 B定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);         
0 E+ c1 \- z5 S3 [2 g定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     6 i& h8 \6 K1 p7 L" C
> f:=unapply(x^4+x^3+x^2+x+1,x);- e, `) ?, y# I) P7 ]9 v; N
$ `; m, C# C2 }* Q7 h" s1 S4 {9 f( h
> f(4);
) X$ H+ Y5 x5 V
' b, C+ z$ o, m% a% t; \! B0 Z  Y> f:=unapply(x*y/(x^2+y^2),x,y);6 H$ s: ~5 @6 y+ }- N

+ f5 I) N# k5 a# ~) K> f(1,1);1 \8 W' N" ]( c0 A  M& L6 O& F

- a- d+ W' w" R9 _* j借助函数piecewise可以生成简单分段函数:8 \. g/ e/ r8 |
> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);# N  t) L; ]/ C8 K" x9 ~/ L
6 K$ W( n2 ~5 k* I  t+ b
清除函数的定义用命令unassign.
6 `) \  T# n9 V. u: n9 o> unassign(f);
4 S- z6 k  ^$ x- y> f(1,1);# @5 p) H3 F" W- \
" O- j( @4 ~% p5 ]. |2 z0 ~1 w
除此之外, 还可以通过程序设计方式定义函数(参见第6章). 8 s, E7 s/ }) e/ N- m- c
定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:( o1 ]6 M/ a) u& J$ j: `; ?( I$ r
op(expr);          * H$ _) l8 h1 t
op(i, expr);         ; j; p8 b3 v! b, c" [- }, X
op(i .. j, expr);      0 N% A8 l+ F0 f6 a9 r
nops(expr);
4 H: K' j, ]* b* H: G5 g: n如果函数op中的参数i是正整数,则op取出expr里第i个操作数, 如果i是负整数, 则其结果为op(nops(expr)+i+1, expr); 而i=0的情形较为复杂, 当expr为函数时, op(0, expr)返回函数名, 当expr为级数时, 返回级数的展开点(x-x0), 其它数据类型, op(0, expr)返回expr的类型. & K8 _8 c/ l2 V2 t, r  x* O
命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.: U$ z8 n* B9 j1 l% }) J* W/ ]
命令op(expr); 等价于op(1..nops(expr), expr); ( s$ s2 n1 V' N" k8 |2 ~
特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...));
2 C& }4 N6 `4 I% T6 [, t( C而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和. : N+ X2 s8 X" j. U# J
> expr:=6+cos(x)+sin(x)*cos(x)^2;
; K$ k) y1 V; s( J
' a4 V& N  f+ k% |> op(expr);: h/ w6 ~' o  Z4 K+ S

+ L4 `' |1 m  q3 P2 b> nops(expr);
! Q: C' e. v4 |" c- g! P: i4 }4 L 3 e( y8 x5 v; A7 a
> p:=x^2*y+3*x^3*z+2;' ^8 d$ I9 a4 x7 A

% F! a; q3 a4 b1 F9 V* d) K8 Y> op(1,p);
+ m3 v- H; I' p2 f6 C 8 E' g4 T. C4 u. ~$ |8 K6 V
> op(1..nops(p),p);+ q, l8 ]$ B  G( L6 _0 h0 ~  a" }
8 |/ H+ ~! W2 I& x
> op(op(2,p));
( i% b  w. B) A2 k" u
* A0 E6 \4 v) ?  q3 N1 l> u:=[1,4,9];2 n1 H$ @2 w, X8 P& Z5 S9 e0 M
0 l1 K0 m6 P8 B- s0 _
> op(0,u);
9 f% p- D, f) Z1 P/ K ! Q. P) ^( a7 [1 W0 h& f, `( l% ^1 a
> s:=series(sin(x),x=1,3);
4 E# U6 H9 A( X# l; d# r4 x% X
! H' Q* p% }9 O9 Y/ W0 ]> op(0,s);
' B& E! L6 I1 R        
* z6 |9 O' T0 @2 Q/ T* Y0 H" m> nops(s);; ]* e* z9 P% B
0 S6 P% c# X/ }7 P. t  s4 I
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:* s0 l! F* ^9 n1 l
> op(x*y*z);
* L; o+ O: ^7 P2 a) ^5 S
$ U+ M: }2 C- j8 M4 z> op(x*y*z+1);
- N( u6 c( p+ ~/ o) \: i' ? ! t" [0 @) Y* ^4 y5 e5 k- [+ l' F! }
2.2.3 Maple中的常量与变量名
2 f7 E8 K5 w# P$ S" I为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
0 _- T& H+ u( h$ i- k> constants;
5 f! F" G7 N" T
% B/ C" c) X1 z7 c- R: N2 {8 T为了方便使用, 现将上述常数的具体含义列示如下:   
3 Y" i3 f8 ^& ]" Q- e( M# d9 V* ^常    数        名 称        近似值
' d" ^/ V. ~1 w8 _  m4 d7 ~2 p* o圆周率 8 [' x1 D0 a, t6 d6 ?! I
Pi        3.1415926535
6 i' S$ A/ X' I7 p3 ACatalan常数
) |& |1 l/ q" N$ yCatalan        0.9159655942
% g2 f7 ^+ Z# M( S( a/ dEuler-Mascheroni常数 4 D: n1 p! P2 r/ d
gamma        0.57721566496 O) X; G, ?9 c$ r/ L; U

2 X: U: n6 Y- P3 S2 b5 E. a1 M* l" Pinfinity       
  w4 G' i4 s; K/ D( k6 I' r  K' V& i" b6 j0 l' |1 I
需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取. + Q1 \0 x9 H5 i% Y5 E/ d( \* v
在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
5 a+ X; n- s5 X! ~, Y# |值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. / A: t& x4 F2 M8 m' E- Y. O+ M6 q
在Maple中有一些保留字不可以被用作变量名:   
2 x7 L* \* u+ T7 T1 K0 B9 ^0 tby      do      done     elif     else     end        fi        for      
( |- |/ O1 F: W. X' ~8 t3 S% }' Cfrom    if       in       local     od     option    options     proc         
0 \! t5 O; i5 x' N, o8 o: mquit    read     save     stop     then     to        while      D
$ G/ F- ^. a9 hMaple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.
: p4 h; L" U# B" s另外一个值得注意的是在Maple中三种类型引号的不同作用:   5 Q2 W5 {  y9 A7 K
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;    & M5 y+ F+ K& I1 E
'  ':   界定一个暂时不求值的表达式;    - m- I! I# L' [9 V9 X  E6 `
"  ":   界定一个字符串, 它不能被赋值.
+ ]- o4 I3 b* h: J2.2.4 函数类型转换           
* h9 s3 v5 f) y& T% P: h函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  
3 @, e/ r+ T! |( _2 ~$ @, Q: g+ \' K6 Z8 [4 c    convert(expr, form);        #把数学式expr转换成form的形式! O- X2 s7 W/ x6 ^& B
convert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos
( i% h* H/ S* Uconvert指令所提供的三角函数、指数与函数的转换共有exp等7种:   # T4 Z. U6 V! f4 S5 \
(1) exp: 将三角函数转换成指数
$ A! O6 }2 e/ F  P0 k9 p(2) expln: 把数学式转换成指数与对数
! ]; x% u) q- c3 v3 n9 g0 @. L! v( `(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式+ {+ {; V% P; S$ K* m
(4) ln: 将反三角函数转换成对数$ ~5 K# \% R! r  x( M- V* u
(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式
5 V2 H& M& B" M* ?4 v(6) tan: 将三角函数转换成tan的形式- Y& r8 W, g+ l$ i% S3 b* e3 y" X
(7) trig: 将指数函数转换成三角函数与对数函数
( O9 T. f! J. T( g# I. H' T. L> convert(sinh(x),exp);   #将sinh(x)转换成exp类型
, b3 ~0 }- K5 L) T- c 6 Z# K4 _9 Y( ?
> convert(cos(x)*sinh(y),exp);. U6 L0 R8 O7 i
8 P5 L. R' k* ?" u0 S, P$ f
> convert(cos(x)*sinh(y),exp,y);2 }5 w$ }3 {$ j
- w% w2 i2 q# i2 t: q0 h" p9 S8 D
> convert(exp(x)*exp(x^(-2)),trig);
" e7 k1 t0 G9 v4 F 8 o  s( G- ~4 {) @7 O% r$ S% \9 X3 y
> convert(arcsinh(x)*cos(x),expln);& t0 _  G2 @8 F0 A

% k5 t3 Z6 _/ M6 N; y> convert(cot(x)+sinh(x),expsincos);
( I7 d7 F! ]9 U; H/ K
  w8 K, Y2 }; J) z, l. G> convert(arctanh(x),ln);; C8 {4 x  b# E0 A

" m( E. a/ F# _3 o' {% rconvert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   # c- q/ L" q) @7 t7 n9 Q8 t
> with(codegen):2 `" M/ C) |* E* |. F
> p:=4*x^4+3*x^3+2*x^2-x;
9 ]+ w. V3 F# s" d4 Q. c& Y8 ^   p% x9 v% r3 H, D& P
> cost(p);! A  J) i3 I: n/ q

" ^4 ?+ f# Y. t: f  G> convert(p,'horner');  #将展开的表达式转换成嵌套形式
( f; F4 r( I8 K8 K" F0 H2 T9 t
! I& o# ~( @* N7 L: k6 O> cost(%);  O8 U; m0 e2 k) O" F* c

$ ?/ J5 U% N- d2 _9 \% S同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量.
' @5 a. ?% u# \. N5 Q& F# }> (1+x+x^2+x^3)/p;
( ^3 a& ~* |, C$ P & W( @, K2 v" p5 Q
> cost(%);
& x' B7 u+ y3 a" ~1 E  J
8 p6 m3 Y. W5 U8 p! i/ q; \> convert(%%,'confrac',x);
( K4 {: @, t# d7 v6 V" Q# ^
! P4 B; e' P6 W$ u> cost(%);
& J# C, @3 Z1 q( x / O: [4 r' r/ c$ o( @( T" p0 C
在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式. & |/ M, B) N2 C6 {! j
> convert(%%, 'parfrac',x);+ v4 S' _3 n+ n5 K/ I, A1 F; E

1 b- H0 I! m' |2 F: f$ F5 `* p3 o> cost(%);
4 _3 |6 t' F6 S8 }: W8 c$ G
+ j& Q* l( V3 D而把分数转换成连分数的方法为:) L2 ?4 U/ s+ a, [  T) R
> with(numtheory):
- }' i3 K" F: o" A7 V6 C> cfrac(339/284);
$ Y6 j; w; b' ?   ]! y8 ^$ |. D( P  W; p: _$ ]7 M
2.2.5 函数的映射—map指令
/ ]3 B! C& J2 T/ F4 ^% p1 v# j在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:7 [& f3 v" m, I( e& x
map(f, expr);      #将函数f映射到expr的每个操作数& a. ]0 Z  i6 h3 ]1 i6 Y
map(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量: h2 e, \% P2 y! {4 A
map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量
, Z+ W. U7 L6 |2 {8 Hmap2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为
$ u. z( F3 @' B! A6 G第3个自变量…, an为第n+1个自变量来映射函数f$ w# x- q3 i9 H1 }# h
> map(f,x1+x2+x3+x4,a1,a2,a3,a4);# ?+ H9 o- V: y/ G& z( @* w2 A

0 Y$ u: Q( M! H" u, R; J, h( x2 s  z> f:=x->sqrt(x)+x^2;' j- w" ^/ H$ A; N0 z
( W  t; f2 l0 K/ l+ B2 \
> map(f,[a,b,c]);5 n8 \( n. Y$ p3 b

" A2 T5 v# L! L! ^( \* p> map(h, [a,b,c],x,y); & A$ j# c: Q+ q3 D* R

3 G) u- F0 H/ P0 W! n8 Z> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);
9 B! t9 {, ^: J9 J4 ^ 8 ^6 l* h# b# ]0 g/ `! _4 A
> map(x->convert(x,exp),[sin(x),cos(x)]);/ u& Y! z3 [) T8 k; Y
( T( k. f! z, \) [+ Y$ W4 Y
上式的映射关系可通过下式理解:
2 g$ W% z) ]4 s- r8 K> [convert(sin(x),exp),convert(cos(x),exp)];
2 G& f# g: F7 N) S0 n7 d . B3 }: Y# Y7 y# O4 [5 C
> restart:
8 r# `4 w/ X& C7 h' pmap2(f,a1,x1+x2+x3+x4,a2,a3,a4);
4 [0 _/ ~5 w2 g4 v3 D% H7 d" E
" P4 B# r: \% L. Z$ g1 O5 N" Y> map2(max,k,[a,b,c,d]);
3 j0 j: G( P# M- F7 t; t$ _2 \
/ a; ~$ b5 W+ Y, X再看下面示例:   
; z$ a! L( A& v$ D' s> L:=[seq(i,i=1..10)];
; {+ F# Y" s$ u2 h* A8 O. v) d: M
  w4 ^" d) B) T1 }> nops(L);
2 [7 r# Q/ z3 ?7 }& k( O : h* V7 b; P! r# v
> sqr:=(x)->x^2;- N5 S) z* t# \* [& I

+ p! V- ^- z8 _, q8 p> map(sqr,L);, {) M) t# a1 s! ?
2 O2 \% }" d3 N( k5 l+ V
> map((x)->x+1,L);7 D$ U7 l- W6 {' R

% I, C4 o) Y+ R! d> map(f,L);$ ~) K( ]5 ?! s5 i! o
, w, Q$ o# V3 O0 y- ]. ?7 g" \
> map(f,{a,b,c});
6 a7 r+ `, N  R/ V$ ^ : B, e7 x1 p0 \, v8 K; o, d4 T
> map(sqr,x+y*z);$ I, l2 @9 l* m5 c) r$ _( r: G
  y/ F! n/ v! r% H: D
> M:=linalg[matrix](3,3,(i,j)->i+j);( E$ `8 h$ w1 q
- p* n8 c3 a4 G3 ]/ r9 f6 R
> map((x)->1/x,M);1 n+ h0 G9 a) ]7 G' }) g
& R( B, E2 y% W1 y" [
3 求 值
2 a. a: k/ ^+ U7 E) x/ P1 d3.1 赋值9 |. ]+ d/ Q. `% t% l; ]2 i
在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子.
! w- Y! }$ M1 H( l9 G' R> p:=9*x^3-37*x^2+47*x-19;0 M1 l' J$ M8 ~0 @/ k

. r$ Q3 \+ N) H5 {* [> roots(p);
2 S) T5 X- q: ?) F
$ g& _6 H: F4 R$ B  h. T> subs(x=19/9,p);4 B- m) ~  Z* r3 N
  |. ?/ H* A$ X$ c7 p
在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量p和多项式9x3-37x2+47x-19相关联, 在此之后, 每当Maple遇到变量p时就取与之唯一关联的“值”, 比如随后的语句roots(p)就被理解为roots(9x3-37x2+47x-19)了, 而变量x还没被赋值, 只有符号“x”, 通过subs语句得到将p所关联的多项式中的所有x都替换成19/9后的结果, 这正是我们在数学中常用的方法—变量替换, 但此时无论x还是p的值仍未改变, 通过“> x; p;”这样的简单语句即可验证.
3 n7 j0 v& j* D% X, _0 N& m# S6 J3.2 变量代换
8 F  W5 W* l- r2 y$ Y2 r  {在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   6 m7 i) Q: h; ?  @/ I. i
subs ( var = repacedment, expression);: w. v6 A; Z4 q9 C) O1 }5 ~
调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement. 2 @0 M7 \8 R" U0 @  j$ G5 X: H% A4 b9 G" q
> f:=x^2+exp(x^3)-8;9 i4 d/ ~( ~2 ?; p% [
. y0 b+ k! @$ m7 }9 ~
> subs(x=1,f);! I3 m* p1 v$ }* u
6 m  X7 E7 o  O& E, V
> subs(x=0,cos(x)*(sin(x)+x^2+5));. n& g9 y0 a: i( \
& P; b, s( A, D) ]# U3 S
    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   
4 Q" a1 N. b7 ^- b  m' t% {> evalf(%);
, S5 {2 C: l, C: @& y/ I& x+ M ) `! Q, Z: [& A- }
变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   " j( Y6 L' j- ^; f! b+ m
subs (var1 = repacedment1, var2 = repacedment2, expression)9 }. T) ?0 M1 p, n0 P. J( X2 }( n
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   3 I9 F, [% V* v7 \! ~" V( O
subs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
% B( z9 m5 a) b1 R$ C下面通过例子说明这几种形式的替换. - k2 _: t  S3 q# m
> subs(x=y,y=z,x^2*y);              (顺序替换)" O6 ?2 m' `- `& G

* y$ w# s$ U& I" G. n  i; B+ N> subs({x=y,y=z},x^2*y);            (同步替换)
; T" U  P: _: m) y $ L$ z3 s4 j* Y$ E( G# e3 S
> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)
' C+ }1 G" v/ l/ @: R8 q2 i
6 Y( M4 |5 j1 T, X0 _7 N> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)
; i+ r5 s& l! R# ]3 r$ X: ? 8 X" W; o/ u3 y' i5 C. V9 h
> subs({p=q,q=p},f(p,q));             (互  换)/ ]. M3 z/ E) g; K/ {- s  B

7 o6 u* `6 U9 x2 R7 P3.3 假设机制1 a2 }" u9 \0 W% T- [
Maple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点.
2 }9 W( Z% G9 E$ i在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);' L+ v- h5 h$ }
函数assume界定了变量与变量之间的关系式属性. assume最普遍的用法是assume(a>0), 该语句假设符号a为一个正实常数; 若假定某一符号c为常数,使用命令assume(c,constant); 另一方面, assume可以带多对参数或多个关系式. 当给定多个参数时, 所有假定均同时生效. 例如, 要定义a<b<c, 可以用assume(a<b, b<c); 同样地, 要定义0<x<1, 可以用assume(0<x,x<1). 当assume对x作出假定时, 以前所有对x的假定都将被删除. 这就允许在Maple中先写“assume(x>0);”后再写“assume(x<0);”也不会产生矛盾.
, K2 M; ], n6 N* C> Int(exp(-s*t),t=0..infinity);
2 p$ t" t5 ]: Z% N" B% }' j% G+ T  V
+ P( Z7 U, v& ?! S( p6 L> value(%);
7 k* m7 e9 Z( K$ _! [Definite integration: Can't determine if the integral is convergent.- ~, y, Q( _- X: b1 w. c2 v. w
Need to know the sign of --> s. V: s% b: h) Z- s+ F7 b
Will now try indefinite integration and then take limits.
6 e- f% o' h* a/ G' | 1 M! t" @( v5 ^1 P+ c
> assume(s>0);
, s. U! z; }( ^+ x. Y, t6 n  B> Int(exp(-s*t),t=0..infinity);
- Z3 |( I# E& |
5 P! k8 o# V5 v7 R8 Q8 h> value(%);
/ C+ }; {3 z3 k& k* z: g8 L6 `- W" |
: e* P* I2 Q# l. m3.4 求值规则
0 k( |5 R6 F# S在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   , g8 w2 t3 _3 w4 S: u
> x:=y;
0 c; f' F' x, m' ~' O+ E- J" W 5 v& r. C$ v( D
> y:=z;
6 Z6 }, R$ @& r6 z/ r+ Z7 K* Q " Y0 y9 T# _; _5 p# D/ p5 {! @
> z:=3;
" d2 y, m! b: c) V9 L+ N3 F
. Z" A( @- }: h- J& C- z  {: c> x;/ @) S- A4 ?9 f* x6 w9 c

1 A# i) A5 G2 ^& Z/ ?! B+ u> y;
- p& Q7 h8 T' F' o$ ^8 `9 _ . b  J7 o& _7 K& e( `/ N9 o/ f7 [
> x:='x';
: r, i2 D9 L. h" Z# X9 g; u ) x, {: [7 e# Z- \. q
> x;$ z! N" i; j3 q1 l0 O$ \6 X$ x
7 v/ Y8 ]: F$ g6 b* `5 ?
> y;
/ h. E& V: K% R9 ?1 o ( S( A- F8 v; I- a- ~2 o4 B
对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   0 E9 f; ~+ D9 l: v$ h8 u
1) 对表达式求值
( h% z& K7 x( _8 o3 e7 K; c, I命令格式: eval(e, x=a);  #求表达式e在x=a处的值3 u2 H: J! }! }5 Y! W
             eval(e, eqns); #对方程或方程组eqns求值
' \0 X8 A0 @. m             eval(e);      #表达式e求值到上面两层
3 t, ]5 B2 I. s% G             eval(x,n);    #给出求值名称的第n层求值# V& ?) P- y4 a
> p:=x^5+x^4+x^3+x^2+x+73;) L# a1 r$ P  A$ w: |
" ~/ Q/ c9 d9 t
> eval(p,x=7);8 H% b) z% G0 @5 c
) E4 m9 \9 @- k5 ]( s5 O
> P:=exp(y)+x*y+exp(x);& \% O" i, V9 k$ }* M( r

! ^* V* A- h' f( k! D! m7 L> eval(P,[x=2,y=3]);
0 H* o4 b6 g( {7 _8 L$ o% u " T$ p( ~: z7 u# L/ O: |
    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   0 a7 ]# l$ T) `  a
> eval(sin(x)/x,x=0);
$ R# m- |9 @" j" r4 G4 UError, numeric exception: division by zero0 p$ o3 \. Y3 g( H
    下面再看使用eval进行全层求值或者对名称几层求值的示例:   
/ d2 v% m% ^) J> a:=b: b:=c: c:=x+1:
! \: S8 x4 t: h9 k( e> a;              #默认的全层递归求值
- ~2 G, b5 K( V8 q
1 }; U% k& h8 i> eval(a);        #强制全层递归求值( N# f: M' D) B8 O9 _; Q6 R

0 O$ d4 `( G+ I% |9 P, ?# g> eval(a,1);       #对a一层求值
' f, [0 M- N4 z# G3 `- p* l
% G, V, G3 {2 f7 Z+ a> eval(a,2);       #对a二层求值
' n4 W7 P; ^; f3 ~ 9 a9 x5 E/ p, c( k1 A& r
> eval(a,3);       #对a三层求值+ c' A  B, l$ v2 C3 L
8 z8 W( u8 k2 G$ ?2 l6 @0 D" `
> eval(a,4);       #对a四层求值  G& \' G2 ~0 |9 F% X$ v
+ A6 c4 l  a  u9 q: U
    2) 在代数数(或者函数)域求值
5 ^. n3 O+ o, L8 X" E  N* u! E命令格式: evala(expr);       # 对表达式或者未求值函数求值
7 D+ H" L: M0 \% S2 _2 Y             evala(expr,opts);   #求值时可加选项(opts)  k" r6 ^$ @5 ~6 M4 ?0 [4 {
所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式. " e+ \$ V9 k  N/ e6 F0 G. R/ I
代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   
7 z6 C) _1 I& |3 i( d3 e* Z> alpha:=RootOf(x^2-3,x);
+ c3 H, c! k) Y" s- t3 B+ E( }
& ]* W2 E5 C$ n# G1 J; n8 H  A& i> simplify(alpha^2);
4 O: ^6 d& Z; T0 ~% V
/ A! f0 d9 }$ n" ~- @! B3 h5 C7 F在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:) ?% D: A: t5 E, k# R
> alias(alpha=RootOf(x^2-2)):
% ~& X$ H4 k" K5 {9 Q& }> evala(factor(x^2-2,alpha),lenstra);
- P0 f4 Y% L9 s9 z: m  G
( `& v  U; c' l/ O/ l) R> evala(quo(x^2-x+3,x-alpha,x,'r')); 3 K+ D1 C: d5 g, D. O2 |
% o' H0 m9 @! R: \( t
> r;4 I5 m/ e6 P+ `3 U! B
' h6 \2 w; Z9 U$ C* M
> simplify(%);! i/ z  M0 e) H
6 F5 g2 c) J; r: v4 [
3) 在复数域上符号求值
: A3 q8 H* B. |3 i: }操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:
# ~* W+ ^, d  K6 f: E, w- m3 {* Ievalc(expr);   
: _+ Y2 U0 J' v6 W9 ~1 ~: yevalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2. 1 Z) V9 o5 |: _& r9 J" W- F" q
> evalc(sin(6+8*I));* b! K: o9 a: O6 @3 f. t
6 a% h, o9 v7 Y  ~
> evalc(f(exp(alpha+x*I)));- g$ Y9 s* f$ Z8 z( a
& G5 V. Z) d1 Z; X, ?; l, J
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));% a) a7 T  c+ ^1 G9 H2 a4 T

8 [. _* ?6 W$ S2 d6 l: [6 F4) 使用浮点算法求值
6 {* I, J7 Q  A- Z浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     3 O& q9 c! {1 p- y% Q# N9 s  a' Z
> evalf(Pi,50);   
5 y9 [$ b1 y+ v; ^0 |- [ 2 D8 a' R  T; W& K+ Y+ D; W. B
> evalf(sin(3+4*I));   
1 m; t; _) V  r$ a& q6 _ ( ?% o7 b/ \2 |7 P- q- b4 Y: u; w4 X
> evalf(int(sin(x)/x,x=0..1),20);
0 x, i3 o3 Z9 j+ l$ S9 `! [. c
3 B, u+ e) m: Z3 P( t4 z7 O5) 对惰性函数求值
" X, k3 t. T5 H, u5 [5 v把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   
; u3 A: d0 v) i" j* @$ e5 A> F:=Int(exp(x),x);9 _) N8 _8 I* E2 M! ?& g* G+ l3 U
; [) g% f( L' d$ u! n! F
> value(%);
. h2 A1 E7 F1 }% H0 V/ Z7 x. k* S
/ X% j; Z5 |& p) \! g) O> f:=Limit(sin(x)/x,x=0);
( {6 i3 I5 W# U9 f7 K; r 8 i( b* N2 B1 y% p- z# ^: p2 M
> value(%);2 W3 q% n3 s" q+ C* |  r+ s
6 ?* o6 L8 Z* b6 j, k0 [6 m
另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   9 h5 j6 `: r. r# A, Z& ~
> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);% Q+ ]; q( Q! G2 W) A

& @6 Q1 u' F$ @9 [& ]! p: d4 数据结构, {; s! a; N* ?' b8 h' u6 w
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表.
  }! {  b& L! C7 D3 c4.1 数据类型查询- p1 ~% ~9 u4 D2 @4 h; u
在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
+ {- D* R3 @* H, ^whattype(expr)        # 查询expr的数据类型
$ L! c3 I* b- N  n! g! n9 q; O2 Itype(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false) F% Y3 B$ x* O6 F' D. F( k! r0 D
> whattype(12);
6 `, y* G0 m* Y0 s, l( B + a" G) M3 h+ o- b& C
> whattype(Pi);
7 O$ M) c2 }1 B$ {9 F 0 Y2 s2 w5 c; j/ A
> type(1.1,fraction);
# `5 g+ a( |6 Y$ `, Z
9 c8 K! f! F: |* v9 ]> whattype(1.1);
, K0 m, K8 r$ G; |" i5 F ' d% R, R/ F: h  ]/ Z- Z2 U  S
4.2 序列, 列表和集合
8 g& D' }) l' A  {* k4.2.1 序列
1 l7 P2 Q$ l! G3 d所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
3 E4 d1 A  t  r  d7 a# f> s:=1,4,9,16,25;
7 @: b) [0 e! P* w  ^: }3 | # v/ T- F% I* ^$ T# w8 b: E4 d' u; S
> t:=sin,com,tan,cot;2 d$ V( i. \2 }
* v& E* a0 B: ~; h3 t5 }
一个序列也可以由若干个序列复合而成, 如:   
) S0 v3 l3 }% Q( T" u: _> s:=1,(4,9,16),25;
7 e' K5 A, N, E( I& A4 g: N8 M + x! k$ J' X8 t! m' ^% K
> s,s;! b8 `5 K, m2 ^- v5 T5 V
9 {$ a7 l+ J8 B
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   
# r- g1 y3 k# O2 f# S/ h> max(s);0 f& @& f% c, L  {

8 |& h% w) A; ]8 M) n5 {; L/ Q7 @& Y> min(s,0,s);
/ S/ p9 ?* T( j: I- _
4 V7 t0 U& I5 m# n+ R( _值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中.
, \# ^! o+ W  r. \- i> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;& e3 [! n' K' z, h9 f) R' [

4 o  u0 K2 R; c( B; `> op(s);* K4 b$ D; g- S
Error, wrong number (or type) of parameters in function op3 T$ V1 i1 ]7 n9 b. D
> nops(s);$ ^" V' v8 }3 s- m
Error, wrong number (or type) of parameters in function nops
+ W: E2 K7 q9 ]: R( a$ q> op([s]);; _% ^9 v3 N/ ]8 \3 k0 d$ T

1 ~% D# ~5 S$ n2 T- l> nops([stuff]);) s/ \" p0 M$ M. }$ v; h$ l

  E3 u; J$ b# M* I函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
$ ]) W9 o0 V) b! E9 d8 h5 Jseq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)9 g6 t) p9 h9 _$ [8 Y% I' O8 X
seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列
" G, D# h" W% \3 \" U! |( tseq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列+ |% [6 ]/ g" j  K* a: b
> seq(i^2,i=1..10);
. d$ ^' y* }( d  W
$ l. T- a* i3 X> seq(ithprime(i),i=1..20);
" i2 X: K% `/ Y: j ( O: W' W( s' {) [. m
> seq(i^3,i=x+y+z);+ |* R; N5 ?$ G

& G" H: F- h  `> seq(D(f),f=[sin,cos,tan,cot]);4 r, t0 A& J2 w

% X9 |& S8 g4 R$ V  u> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));: N6 v6 X2 O7 l9 _- a
, K9 r4 @( Y# E5 r% O9 {
获得一个序列中的特定元素选用操作符[  ], 如:   3 f( c. H( F7 p  b1 H
> seq(ithprime(i),i=1..20);* L; U. b. i" Z! y( {7 ?  O
  R# H  l) P. z6 M
> %[6],%[17];( F2 t! K' Y5 @9 Y( P
2 f9 S) O9 z) m% U6 }1 g
4.2.2 列表
2 }5 @! K3 C6 q* l' N列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
5 j8 m7 H4 F; p3 f> l:=[x,1,1-z,x];
$ H4 S2 [1 R' ?; l9 D0 w# x$ R
) g1 l- k- Y$ I> whattype(%);+ q' L0 \9 K: ?5 b3 j2 v
5 P, s& R% n4 J( z2 N- d" l6 A; Z9 C
空列表定义为[ ]. , b* I/ X  ?% k2 H: U9 T
但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   
' J6 s" ?& a2 z" `2 X, }( i> L:=[1,2,3,4];- m. G$ E0 i0 X, w# T) y
7 q' D: ^5 ?8 }* Z; \/ g7 [. ^
> M:=[2,3,4,1];+ p/ }. I8 |$ M0 A

; H! {4 p- D; _+ H4.2.3 集合
9 t2 H( E( w! i/ c) q1 `集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合.
; V& e4 Q1 w2 F> s:={x,1,1-z,x};
( h. f4 F) s. [1 h # u; S. _5 v: \( m6 N' U3 U
> whattype(%);
0 e8 R# }# @( R; Y7 V 0 z2 r% D1 j1 |% K7 L+ C
空集定义为{ }. ; z* X% Z9 l' {% U5 _" M, L
函数nop返回列表或集合的元素数, 而op则可返回其第I个元素.
: V; q4 X  l$ A, R& ]) y> op(1,s);+ e8 _2 x. V9 q

- q- B, y7 f5 [, f1 z+ n> s[1];
5 T* v) \- j( l5 Q( p8 ~
& m( b! S$ C2 q! s0 t& `> op(1..3,s);9 k1 J) T& e3 z' \+ [+ j  g. U: W

; X* t  `! U2 z; v) L$ |8 k, _> s[1..3];' Q& }! p. J: D: C! {

% P2 o' E- Q& R# o8 z函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
4 L, F, l6 H, v; ~$ U0 f> member(1+x,s);: T1 C- W* g& [2 M
4 A7 h2 u* a( {4 X% }+ ?. [7 G
可以通过下述方法在列表中增减元素:   
1 g& C/ L9 q% d4 b8 y% e7 ~( r  N2 N> t:=[op(s),x];6 `7 k9 k0 Q& W) h. z

$ I4 M5 M# g0 I! e$ C0 j0 [' t/ ]> u:=[s[1..5],s[7..nops(s)]];
6 r& w$ @: E/ }, i
' a$ K: z& K$ M2 g) Y; |0 ]Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   3 c/ G9 K, q5 [: C+ d1 M* M
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};
4 |7 M1 H4 B) L4 {8 E$ `; N 3 Y: \, H0 x$ `  i# w

2 U% n2 A3 z; p- O/ P0 K; q> A intersect B;
6 X5 u& H6 z% L2 s8 m' c
/ t: |1 g* D  h% c. B> A union B; / u, Y7 D& O0 g) Z3 n3 p8 i

: q% e; Q* h- l3 j  V* T1 e. n- Z> A minus B;
- `" D8 _& H1 A
1 h" b8 a( i5 A8 ~4.3 数组和表
9 R0 \* I, {. o在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
9 ?! `# S" n: f! ~, g+ [    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的. ' X9 |1 m$ [$ l, g% X. K0 {! r
> A:=array(1..4);' S; K3 u( V2 M' [. I7 N

3 m" F) @  O, T6 R0 q! E: ~. g> for i from 1 to 4 do A[i]:=i: od:
! _# z6 E4 P. n4 s" N2 j> eval(A);! A- I" v/ t& k4 f& i

+ h0 g9 Q/ ]. n+ @5 Y( ?: G" A8 R> type(A,array);
) T! K- N; J. X+ n8 v) v( K: b+ K . B5 M6 I" R. ?! b1 K4 d
> type(A,list);
  r3 [- R' ~" b
- l: r6 A2 l& a+ t. N> T:=table();
9 w) M, y3 o6 Z ) p. b7 T. m" K! S$ y
> T[1]:= 1;
- Y: n. L$ f% m; Z' k3 \* Q' s : z1 E' A. \9 E8 x: U- H
> T[5]:= 5;
( |# O, G8 A0 R4 d7 B 5 e8 M. U- y, C: z+ l8 {3 a
> T[3]:= 3;: K7 S" n: W! i% p6 J0 o! ]% e

( h  I2 q+ R; G1 ~% B7 F> T[sam]:=sally;
& A" r6 S( o4 t2 ~2 G9 Z
2 ~( V2 R9 w( S0 p; G) `> T[Pi]:=exp(1);  X1 m  T! J) A

) o. M- k' i3 {; B> x:='x';
1 B; q. [' K: S% u& \6 M
& `! k; I# j+ {2 j$ p" `> T[(1+x+x^3)*sin(x)] := 0;7 ]( c0 G0 F& F$ F! T) E

1 [$ V" P" U8 {9 P9 A> eval(T);
; C; d' T8 x2 y- P/ B/ ? " T* @4 }8 I* W, ?& n; V0 K
> T[3]:='T[3]';
) S0 z6 t% o' ~- ? ; g6 M& c+ O, Y3 S, f) ?
> eval(T);
. |% T% j$ D2 Q% m& `' r
1 r4 y7 _( M" D4.4 其他数据结构
2 F8 c/ U+ I4 F- G5 E0 m串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. " l2 Y" K0 {4 H1 s5 P# A
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立. % b% R  \& b& k% {; a( V% m% [
> x:=T[3];
- o3 S' N- i% \1 H 9 R0 P$ q8 M  a0 K) H; }' m
> eval(T);
8 s  ]2 ?) y" q# I) w; m' q9 y' f
8 X7 @/ L# _4 {+ h7 D3 A> T[5]:=y;8 G9 \" A& g5 I: O( S: k
$ q+ k! U4 T+ d# O( {- w
> eval(T);% J8 v( |, B" W* J; C

. o4 q* X1 U4 e: \5 ?由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
! e$ b- C4 D3 ]) l' x+ p7 @# P" e+ }' X数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数.
. e& i( N! r% _* p! k; |0 t6 I4.5 数据类型转换和合并
1 L" ?5 ^* T3 i7 ^+ G) _- a% M( Uconvert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   * {7 q" k# i/ M
> L:=[1,2,3,4];# g, r( z9 O6 e0 V; ^" _

6 L" R8 u& b, F2 B> type(L,list);
. W% P% g, z8 G: T   t6 M3 V) Y0 V. U' K* }$ w9 Y
> A:=convert(L,array);
6 u# N1 {7 s& A 7 F. T$ N& m$ Y$ W
> type(A,list);* j! z/ S4 _% H% G6 a# ], ?
$ I+ i7 @7 y2 o  J; [4 s! [1 [
> type(A,array);$ h5 v% E8 d& a  F+ q

8 K; l: n) t* I/ S另一个有用的函数zip则可把两个列表或向量合并:   
6 s( T% b& Y* U0 F0 b$ C>L:=[seq(i,i=1..10)];
1 B( o8 z) O% t. S$ g 4 D7 Y5 L% Z$ H- e
> Sqr:=(x)->x^2;  V1 m2 w# u8 N5 O; L% V+ p0 h
8 ~4 X8 r, A: L  N% O/ }
> M:=map(sqr,L);
' E. c  v1 J- m2 f( P# T
; Y& J3 E6 Q' u> LM:=zip((x,y)->[x,y],L,M);9 p* J) x* L. q2 ]* v4 A. _
2 F. E0 V* w6 a0 W
> map(op,LM);1 ]" S8 _( l: ~  i6 J2 r- {
* h1 w. }/ Y5 b. j
5 Maple高级输入与输出操作
. D5 H$ C; f0 v  w+ C+ F9 Y4 @Maple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里.
3 \. F; a' c7 h3 G- H* m5.1 写入文件# ^  L; v, x/ o$ t* z. Y3 C
5.1.1 将数值数据写入到一个文件8 p3 q; `  y6 V7 N/ n
如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
6 |1 G; E* A8 G6 X0 ~$ p, s. A若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);! D5 D: ?. K( _. L% D' Q
> with(linalg):6 M4 D% |6 I- V' K0 S
> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);
6 s7 C2 K" V1 g  ? . `( Y. G! y5 n
> writedata("e:\\filename.txt",M);, C. p7 ^( l7 U0 ?0 |
而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);! i8 p4 L8 [) x& x' b6 b# b) D3 y
> W:=matrix(2,2,[1,2,3,4]);3 V  t+ T5 j/ ~! ?! K
6 }$ s# o0 C* i+ T, u' d2 U8 b. o
> writedata[APPEND]("e:\\filename.txt",W);
& V! c' y: |" K( `8 {/ c- D需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.
" c" l( H3 P$ u2 U0 f3 b另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);, K4 \& H4 K9 f& \) }5 J
> writedata[APPEND]("e:\\filename.txt",W); $ G5 y8 B6 j; @9 R
> writedata('terminal',M);( d5 d$ w( b* o* u: H% G
1                   2                   3           
& N  q1 l( d" x6 w  X4 c3 n# t/ |# x4                   5                   6           
- }% c, i  P# z8 g7                   8                   9    ) X* {! g% O# T$ Z% y
5.1.2 将Maple语句写入一个文件5 D# H+ O; y4 \5 }8 D6 ]4 ~
如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:
" g, G' q! _; U* `* t# n/ qsave name, "filename";8 O; k; X6 Z: h4 r: S5 E6 Q
save name1, name2, …, "filename";
% v% A# A! k* |" x8 h若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
3 d8 o  {" U7 N$ L! d8 }: A> myfunc:=(k,n)->sum(x^k/k!,x=1..n);
9 n0 f9 m! r, e4 d9 p
) o2 B4 u, e% G$ Z, Z> myresult:=myfunc(6,8);* J" r* a4 K9 G  ~4 i4 M

2 T% Q. x& z2 U3 {% X& i> save myfunc,myresult,"e:\\test.m";4 K3 ^* d& b  G  ~. n
调用已存m文件用命令read. 试看下述实验:  Q8 u7 `3 H1 v7 v7 z, Q' y( f, C
> restart:
: L$ B3 V' y# y+ P, o> myfunc(6,8);
, R+ s' V, ^1 H2 p' U
$ H  N7 x& g' I& k% ?5 n2 L> read "e:\\test.m";) R+ a  E0 {4 ]( e5 x* H4 X; {
> myfunc(6,8);5 `: m7 v8 P/ P) K) c1 w! c( c7 p
  S$ M; ]1 N# t9 }
> myresult;
+ P; @9 S+ h: q' p/ n
7 S. I  W5 S6 B7 a    而存为txt文件时则将整个语句存为一个文件:9 H5 R; S* l1 u7 V
> save myfunc,myresult,"e:\\test.txt";2 y% w3 M8 |  I: r% f* ^6 B
> restart: read"e:\\test.txt";
- `' }: d6 [2 \% f$ r( g8 d' l
  F0 q% S" T+ B+ W# K
$ Q& H  q+ U2 ?. r5 m5.2 读取文件$ W6 B2 r, r, T
在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.
! Q' z/ c  P1 c: ~% e; ^- N' M5.2.1 读取数值数据! b  ]0 g! Y" l+ p  s+ v
如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.  b* C: u: }! r% F$ x8 ]
从filename文件里读取n行数据时使用命令: readdata("filename",n);! F: h% b- w; \1 p! t7 l% |3 g1 A" V
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);7 J; Q% Z& ]! k0 T
> readdata("e:\\filename.txt",3);5 G6 ?2 `4 O7 n  U. O! ^  Y6 f
: O; j# Z: N( `$ b0 ?) s+ w5 A
    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:" u4 [5 S$ V3 G+ c0 l
> readdata("e:\\filename.txt",[integer,float,float]);4 f3 {1 ~" A; C. `2 \3 k1 e1 @

% g0 c$ S- }1 @2 S& y  L- X下面再看一个运用大量的实验数据在Maple环境绘图的实验:
( F0 {1 S" G1 X1 {& a' T! H* f2 X' L$ _> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:
2 S( e  A  `2 z% H5 h+ U! ?; G> writedata("e:\\data.txt",evalf(mypts));' S- \6 n8 D4 G; h1 o+ T8 ]5 Q# c
> dots:=readdata("e:\\data.txt",100):
- Z  I5 Z5 M0 r> nops(dots);; E4 V- ~# y% w, c( S$ ^1 J- Z6 q, H) w
3 x& s8 |1 t0 o- t7 p% T& [
> dots[1..4];
+ z5 c8 |$ e8 C5 ]9 w+ ~
+ l" p. Y! y' ?( A3 Z> plot(dots,style=line);
0 l9 G) [/ P+ G ' N. g6 S: D" L, f. `2 b
5.2.2 读取Maple的指令
. n0 O4 Y' s1 M5 b在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:
/ |+ ?2 b* z% _( \: [5 s* r) Kread "filename";
! f2 L! X5 w0 Z如下例:
! i8 F" U; l3 n) B; [> reatart:
/ ?3 a" c: I8 |1 t" E> myfunc:=(a::list)->add(i,i=a);
8 e1 n: }+ U# X0 l
' M3 U% C" P+ s; ]0 O> avg:=(a::list)->myfunc(a)/nops(a);/ A) c1 S. g. `: k6 ^! s

; B8 S' j! S0 \> save myfunc,avg,"e:\\function.m";
+ g% ~, P- [, A2 [1 M6 M) w7 V> restart:
- T4 K; ]: I5 }. a4 }- u> read "e:\\function.m";; L8 i/ d* F0 k7 z
> myfunc([1,2,3,4,5,6,7,8,9]);
9 I& E) o$ p4 m5 d6 Z9 a% ] $ B/ l. P' l$ Q; z
> avg([1,2,3,4,5,6,7,8,9]);% q, `7 y9 Q6 H" s7 y) v' e: {
7 i! K  F# b. d$ [; {# Q
5.3 与其它程序语言的连接* b  m5 q1 ]; O5 F) k5 r8 P' z: n
5.3.1 转换成FORTRAN或C语言
- t3 ?* X! }) H调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:
7 v6 t# |4 L$ _+ X# f% N) \- W> with(codegen,fortran):7 R' X! U: b; V5 D" j/ K
f:= 1-2*x+3*x^2-2*x^3+x^4;
# x# m3 o) J2 s. l6 t: S  j
1 m" T. D! q7 t* M' H5 s4 v/ w> fortran(%);
; r- `% n0 Y6 y+ C      t0 = 1-2*x+3*x**2-2*x**3+x**4/ g, J% O- b) l
> fortran(f,optimized);" G) B7 ]* l) Y/ `
      t2 = x**2
8 Q+ q" _% o; y6 K      t6 = t2**2; O+ C+ [( t( Y' D
      t7 = 1-2*x+3*t2-2*t2*x+t6  }7 k4 v0 _  i4 g4 b0 S4 u
> fortran(convert(f,horner,x));) F% s1 Q0 u. z8 k/ ~( x: t. o
      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
+ @- U. J; K- w而codegen程序包中的C命令可以把Maple结果转换成C语言格式:/ O& a4 v; `9 W
> with(codegen,C):
. m8 o3 t7 P% M( H; T8 Z3 ^& Tf:=1-x/2+3*x^2-x^3+x^4;9 g8 X# A, y. g# M# M. y, O: H
% u7 J9 n5 X- G- D6 ^3 \
> C(f);/ q! q% k8 `. X! c; J$ c1 d
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;0 b3 z  Y2 _4 d0 _
> C(f,optimized);! |. q  t0 {# z& ]! U% z! D5 N5 h
      t2 = x*x;
( g% p1 U' f; t' ?* |      t5 = t2*t2;
/ l- f: B+ C' j/ D& _      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;- }4 l9 E; ~3 t* ?1 s, ^( w
optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.8 w" Z; z  {: _2 H- d! Q
5.3.2 生成LATEX
$ |( {0 i4 w+ p8 a9 n! YMaple可以把它的表达式转换成LATEX, 使用latex命令即可:
" r# L5 _* o" i' L/ t> latex(x^2+y^2=z^2);5 b1 n3 e/ G* c9 h
{x}^{2}+{y}^{2}={z}^{2}& r9 u2 M$ X" E4 D0 @4 g# r4 ?  S
    还可以将转换结果存为一个文件(LatexFile):
* p  P( U: ~( r9 r> latex(x^2 + y^2 = z^2, LatexFile);) g; g$ T- q* K0 B& b1 z
    再如下例:
, J9 ^8 C: I4 O/ j$ M* a> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));
  U# V! D, d$ E% ]5 |; q\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)+ V! E* R" F) I3 h

& t7 E1 X* L) R8 m3 Y
zan
已有 1 人评分体力 收起 理由
darker50 + 2 用word发不是很好吗?呵呵!

总评分: 体力 + 2   查看全部评分

转播转播0 分享淘帖0 分享分享0 收藏收藏1 支持支持0 反对反对0 微信微信
darker50        

107

主题

45

听众

1万

积分

  • TA的每日心情
    开心
    2015-4-9 15:42
  • 签到天数: 47 天

    [LV.5]常住居民I

    自我介绍
    开朗,爱各种娱乐的不老男生就是我了,喜欢数学建模,喜欢那种帮助别人的感觉。

    社区QQ达人 助人为乐奖 新人进步奖

    回复

    使用道具 举报

    33

    主题

    10

    听众

    1691

    积分

    升级  69.1%

  • TA的每日心情
    开心
    2014-7-8 08:29
  • 签到天数: 201 天

    [LV.7]常住居民III

    发帖功臣 新人进步奖

    群组PLC和单片机

    群组2012第三期美赛培训

    群组MCM优秀论文解析专题

    群组沈阳理工应用技术学院

    群组学术交流B

    回复

    使用道具 举报

    33

    主题

    10

    听众

    1691

    积分

    升级  69.1%

  • TA的每日心情
    开心
    2014-7-8 08:29
  • 签到天数: 201 天

    [LV.7]常住居民III

    发帖功臣 新人进步奖

    群组PLC和单片机

    群组2012第三期美赛培训

    群组MCM优秀论文解析专题

    群组沈阳理工应用技术学院

    群组学术交流B

    回复

    使用道具 举报

    46

    主题

    3

    听众

    1967

    积分

    升级  96.7%

  • TA的每日心情

    2014-4-15 00:06
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    社区QQ达人 新人进步奖

    群组数学建模

    群组数学趣味、游戏、IQ等

    群组LINGO

    听说女人如衣服,兄弟如手足。回想起来,我竟然七手八脚的裸奔了20年!
    - J. ^9 ]+ F2 B& j2 [  E$ E1 e; x, S# q: S, p3 c5 o9 w$ `" _
    * `  _, E4 M# J+ M
    回复

    使用道具 举报

    0

    主题

    2

    听众

    19

    积分

    升级  14.74%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    0

    主题

    4

    听众

    181

    积分

    升级  40.5%

  • TA的每日心情
    开心
    2012-10-11 12:35
  • 签到天数: 51 天

    [LV.5]常住居民I

    群组学术交流A

    群组学术交流B

    回复

    使用道具 举报

    0

    主题

    13

    听众

    27

    积分

    升级  23.16%

  • TA的每日心情
    奋斗
    2015-9-29 17:01
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    社区QQ达人

    群组国赛讨论

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-10 02:43 , Processed in 2.080071 second(s), 101 queries .

    回顶部