QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

自我介绍
爱学习
跳转到指定楼层
1#
发表于 2012-6-12 16:53 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

- n- P( x7 U; k& X第一章  Maple基础
9 P- _* @# ]8 b: Q, Y5 u1 @* N7 c) O9 d. P
1 初识计算机代数系统Maple* T6 N( l  M+ U
1.1 Maple简说
- W8 L# B: D, |7 @. p1980年9月, 加拿大Waterloo大学的符号计算机研究小组成立, 开始了符号计算在计算机上实现的研究项目, 数学软件Maple是这个项目的产品. 目前, 这仍是一个正在研究的项目.
/ H! k* T$ [1 A' w! u5 G( z3 hMaple的第一个商业版本是1985年出版的. 随后几经更新, 到1992年, Windows系统下的Maple 2面世后, Maple被广泛地使用, 得到越来越多的用户. 特别是1994年, Maple 3出版后, 兴起了Maple热. 1996年初, Maple 4问世, 1998年初, Maple 5正式发行. 目前广泛流行的是Maple 7以及2002年5月面市的Maple 8.
' |& @. T) h( J) q; E/ A5 mMaple是一个具有强大符号运算能力、数值计算能力、图形处理能力的交互式计算机代数系统(Computer Algebra System). 它可以借助键盘和显示器代替原来的笔和纸进行各种科学计算、数学推理、猜想的证明以及智能化文字处理. " n9 ~* q+ Y7 S0 P+ o1 g+ {2 b
Maple这个超强数学工具不仅适合数学家、物理学家、工程师, 还适合化学家、生物学家和社会学家, 总之, 它适合于所有需要科学计算的人. / d& K. T7 |, `$ C& L+ B5 E
1.2 Maple结构$ ]% _2 G- r" q0 G' k! ^
Maple软件主要由三个部分组成: 用户界面(Iris)、代数运算器(Kernel)、外部函数库(External library). 用户界面和代数运算器是用C语言写成的, 只占整个软件的一小部分, 当系统启动时, 即被装入, 主要负责输入命令和算式的初步处理、显示结果、函数图象的显示等. 代数运算器负责输入的编译、基本的代数运算(如有理数运算、初等代数运算等)以及内存的管理. Maple的大部分数学函数和过程是用Maple自身的语言写成的, 存于外部函数库中. 当一个函数被调用时, 在多数情况下, Maple会自动将该函数的过程调入内存, 一些不常用的函数才需要用户自己调入, 如线性代数包、统计包等, 这使得Maple在资源的利用上具有很大的优势, 只有最有用的东西才留驻内存, 这保证了Maple可以在较小内存的计算机上正常运行. 用户可以查看Maple的非内存函数的源程序, 也可以将自己编的函数、过程加到Maple的程序库中, 或建立自己的函数库. 9 j! K7 M# G! K- t
1.3 Maple输入输出方式
& x) U- I/ y  b% m( z, k为了满足不同用户的需要, Maple可以更换输入输出格式: 从菜单“Options | Input Display和Out Display下可以选择所需的输入输出格式. 7 X" V  i  n* B& p
Maple 7有2种输入方式: Maple语言(Maple Notation)和标准数学记法(Standard Math Notation). Maple语言是一种结构良好、方便实用的内建高级语言, 它的语法和Pascal或C有一定程度的相似, 但有很大差别. 它支持多种数据操作命令, 如函数、序列、集合、列表、数组、表, 还包含许多数据操作命令, 如类型检验、选择、组合等. 标准数学记法就是我们常用的数学语言.
, Z* E! U! E; t" L* k/ ^启动Maple, 会出现新建文档中的“[>”提示符, 这是Maple中可执行块的标志, 在“>”后即可输入命令, 结束用“;”(显示输出结果)或者“:”(不显示输出结果). 但是, 值得注意的是, 并不是说Maple的每一行只能执行一句命令, 而是在一个完整的可执行块中健入回车之后, Maple会执行当前执行块中所有命令(可以是若干条命令或者是一段程序). 如果要输入的命令很长, 不能在一行输完, 可以换行输入, 此时换行命令用“shift+Enter”组合键, 而在最后一行加入结束标志“;”或“:”, 也可在非末行尾加符号“\”完成. * y1 R: g0 ]7 m0 M
Maple 7有4种输出方式: Maple语言、格式化文本(Character Notation)、固定格式记法(Typeset Notation)、标准数学记法(Standard Math Notation). 通常采用标准数学记法.
0 }/ H7 w" B' V1 g! N# t* p1 ~5 JMaple会认识一些输入的变量名称, 如希腊字母等. 为了使用方便, 现将希腊字母表罗列如下,输入时只需录入相应的英文,要输入大写希腊字母, 只需把英文首字母大写:   " ~+ d5 P! [: n% `
0 U0 Z2 b1 Y% Z6 f

( K) C6 F( |4 ]4 P
" w+ q" [' D2 i; g2 U7 _
8 ?6 n1 u. t" ]  n5 g# ?$ z: b' c
" Z' W7 g( d/ k! T: y " r& d1 s, P0 S; k$ q. `
" E2 z! u2 C0 D- a
3 k1 k" e4 _9 J2 ?! e) E4 J

- B0 [' j) I2 H 8 H6 |' I5 y# i; E# {- {
0 e: Q; z4 U% S$ W# K" Y( G5 Q. Q6 F
6 B# E* y) T% ?+ v# V, l5 I
$ A9 K' q* d/ R6 I4 i. U) ~7 ~
alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
' j" a! r7 p, }
# [1 }) c0 o8 V8 o: N1 d/ z! W
6 m& r& L, {# w3 |4 U
% [  p: }* @: q" g+ r0 H- j' _4 Z
; n3 J5 Y5 d% M: K 9 T; O. J" ^3 y) S* [% f$ D
' v. E/ ]- v7 T( L5 J6 A

  b" K; ^; {5 c+ ^* I% Z* R& m( f* d% R) I 7 \1 m' k, p& Z
1 U% [* o" }& l' d5 }& ^

0 f/ P6 C  V, W$ P5 H* [1 z
: _2 X. ]+ p( s8 v ' V& z- L3 s0 u+ b2 a

  P/ ~- N6 E! x7 ^7 Cnu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega2 Q& G0 k4 y* Q* o( b
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
/ d9 \1 r/ U+ a- ?> for i to 10 do 6 e* s& l( U% c+ R: r
printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));1 o2 Z1 X0 i5 Q/ A$ e4 d" _
od;
; N! e% V4 c3 f3 W+ n, A6 Ai=+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.162
7 B5 m! v% `' O; g% l+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:& w7 v5 f4 O% w: a2 V. ?$ F
> for i to 10 do . |+ K; r2 \+ c1 L  [
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));
- q: ^& ~- E7 ~  ?) B1 Rod;
7 @$ W% E) b% Ri=+1 and i^(1/2)=+1.0005 ]( z0 D6 G* a$ J& e9 ~) X
i=+2 and i^(1/2)=+1.4143 n! d9 j% K# D+ x2 C! L; ?9 z" N0 N
i=+3 and i^(1/2)=+1.732
1 i8 k2 X4 n& ~! y% |; Ri=+4 and i^(1/2)=+2.000
! m7 R* c6 k, R' X7 Z( U) ~i=+5 and i^(1/2)=+2.236
$ _4 y% F# B2 ^/ [( _' g8 \i=+6 and i^(1/2)=+2.449  D4 q9 ^& T( b* W$ v3 Y
i=+7 and i^(1/2)=+2.646
( _; C  I- h& ]  O" K5 u5 s+ Wi=+8 and i^(1/2)=+2.828
* I2 j4 F) `  Yi=+9 and i^(1/2)=+3.0008 c& E- k# x! {- x) L
i=+10 and i^(1/2)=+3.162; Q( c. e1 H9 U5 }
再看下例:将输入的两个数字用特殊形式打印:; d& y, |- z" [  t0 X
> niceP:=proc(x,y)5 ?& O" D. ~* ~" @6 ^
printf("value of x=%6.4f, value of y=%6.4f",x,y);
  }, H" f7 \/ m0 }; h  i. [end proc;8 t7 [! {% n% d; \! G

1 \. r5 S8 n  c9 X> niceP(2.4,2002.204);
9 d" A8 j) }- [9 V+ p5 M# _8 ovalue of x=2.4000, value of y=2002.2040
9 W* [1 ]) E$ @, V$ d8 o- d/ Z3 F* [( _1.4 Maple联机帮助4 Q2 L! @0 x* q: b
学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用.
2 Y0 P4 m, z- P# U6 C0 D在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可.
- `" @+ M. e% l) J! L# q8 i2  Maple的基本运算* S/ t0 V0 h; _) d
2.1 数值计算问题
3 }. a& \1 s) U% {+ p. e# ]& ?+ _4 e算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”. ! f5 z, ~/ q1 I+ w$ T4 f1 u  \
在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数. 7 N4 E! Q6 b- D" Z" ^
Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算.
/ o/ s9 O, U6 O. D+ \但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明.
# u, n# P0 f6 \第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   & A* V6 a% _. I/ W' i& ]
> 3!!!;0 X5 p3 F1 |6 O) ~9 u- S
2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000$ g1 f2 N* L  `* k+ _
上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
: p% E: X4 {5 A为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式
6 d& c  |: R( x! r, [# G, C# W% l
, }/ j/ W" e+ D% U3 C可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   
: C' X4 c+ S0 u' l' F) x
1 E5 @4 q# x% H& P' J$ }这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. ! c6 e" u& b/ M
另一个例子则想说明Maple计算的局限性:   ( I+ Z4 O& G7 @3 G0 T
  
6 s! q' r# E/ jMaple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:     b( S: [: y( P
4 b1 k; [+ f* n- z5 J- G' `
显然这是错误的. 这一点可以从代数的角度予以分析. : A' s: X/ ^. B) `& L
不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. $ j$ Z  c9 b6 z+ K
另一方面, 设 , 则 , 即:
/ N9 s0 q* p$ \" \( B$ L
/ t9 O; n. i( {' l9 b- I显然 有6个结果, -2、2是其实数结果.
2 B" m& q; _$ m  Q4 Y$ c9 }& ?2 N这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性.
" o' n! u+ h3 ]7 N+ z尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.
& g/ ?$ ^; i$ ^. r2.1.1 有理数运算
( C& C% D. A$ x) j作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). 2 f; R& {+ _3 A3 ?) @( N1 Y
> 12!+(7*8^2)-12345/125;* q+ w# l  o5 v

) ^6 h5 \0 I+ z% J. u4 p# `> 123456789/987654321;
$ L6 }) X6 z4 G. t
# W% K" M" h; m2 a> evalf(%);/ c; C1 Q, L, z5 z6 ~

6 {' _9 I5 H  a2 ?  D( L1 F) G> 10!; 100*100+1000+10+1; (100+100)*100-9;
: g( [6 l  W; Z' Z; O6 N0 W0 J
& h* p- G! |5 M1 g, N 8 |* Y& U( f$ Y

9 K/ E) r" U1 Y) b> big_number:=3^(3^3);
2 B' x/ c! M6 _) b( ~- @; {( D # @  J9 A& U! b" _- G8 a' |' y
> length(%);
* `6 C) w4 ]7 W: q# i1 a - P* h0 M9 R7 F' i7 D  c
上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   " p* s' D( Y0 R9 C
    1)整数的余(irem)/商(iquo)
9 s3 d, P5 R8 @命令格式:   $ Y# s" U# ]$ O# M4 m
irem(m,n);        #求m除以n的余数
5 r. a5 \( s$ s! @$ S# X" i; Nirem(m,n,'q');    #求m除以n的余数, 并将商赋给q
& Y  [9 ^0 c  p& f) _& p' Niquo(m,n);        #求m除以n的商数) {2 E' F( T3 \- e. l* p$ v1 A
iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r3 C4 g) Z3 p9 `- f
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. & [  g1 R3 f- P! X  _
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q6 Q5 D, A" R( c3 V$ G% N9 K2 z
; l* |: C9 n9 k+ @; Z0 K
> q; #显示q
$ d9 Z$ @' [; u0 P; }( ^, ` " q. i2 W, [5 O2 u$ T: {' r
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
/ p* h( [% Z& @2 z6 m7 p 9 b! W( z# R" _  z3 D5 [' i
> r; #显示r
8 {5 p2 M) y7 E0 W' t 6 p4 U6 o, i7 q6 }- N/ S1 p8 l* |
> irem(x,3);
" Q! x; ?* d8 B" N  u( N& v + z0 T  d5 z4 T  \% \" _
2)素数判别(isprime)! i) T9 m# F* l
素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); - O* b9 X9 E) V- P+ v
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数. " a) H2 L7 R( U# ]( k; `$ N2 v
> isprime(2^(2^4)+1);6 v8 t- j7 u7 R

6 h: l7 Y# t) U/ R0 o> isprime(2^(2^5)+1);( }8 u- M' {# |7 \( c
" I) i5 W) O: A+ M. ?/ Y' A
上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. ; O) Q' o1 D7 f/ g9 Y! V
3) 确定第i个素数(ithprime)
) p! w# h" z' i5 }" c" E' U  i$ V若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
; I- ?* c, e3 T5 W- `/ H> ithprime(2002);) f6 b# W" o7 D% M
$ {/ V  J9 v: j% r
> ithprime(10000);& Y) q3 @  ?% x/ a# V
* P2 h, Z& e% Q5 O
4) 确定下一个较大(nextprime)/较小(prevprime)素数
9 n* }# k4 Q2 L  f当n为整数时,判断比n稍大或稍小的素数的命令格式为:   8 O5 H/ p! B) e/ [
nextprime(n);  ) f. h3 X3 J4 I( M' f8 b! C
prevprime(n);
: x9 B+ t3 b& ?> nextprime(2002);
. a9 v/ e$ P, c1 r* I$ V: e ) @# J6 M/ U7 l) q
> prevprime(2002);
& {* S. V+ ~5 \5 g' G5 P5 W/ m
+ [4 Q+ P4 U2 r0 e, |5) 一组数的最大值(max)/最小值(min)
8 z" A4 e- h9 O; P9 D  H命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值
7 ~+ a* Q5 }$ v$ m9 f$ u             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值* D3 C' t: n, f3 ^0 A8 B( f2 _; Q
> max(1/5,ln(3),9/17,-infinity);1 F. y/ M0 I4 @5 ~

* F8 q; A, y' m. r> min(x+1,x+2,y);
" K8 ]& s' o6 h1 I8 r& a7 g5 q$ v 4 |" q1 T4 n0 }0 b* n
6)模运算(mod/modp/mods)
5 M/ Q) W: k. t! x' P3 _* y命令格式:  e mod m;    # 表达式e对m的整数的模运算  M9 \- O+ ?1 M8 u
modp(e,m);  # e对正数m的模运算
$ T% a, r$ o# l8 Z/ z6 ]& omods(e,m);  # e对m负对称数(即 -m)的模运算
) T. W, L' c  K3 Z; j`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价
/ A; G! O) s& {6 U# W9 {1 m值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. 9 x0 H% d" G) @: s" {1 h
> 2002 mod 101;
) c4 \* R$ g& k6 h0 c. I $ S/ C2 F# g/ u9 n
> modp(2002,101);. l6 [4 S9 f6 T6 G% h

  p( b9 b9 s( w" g> mods(49,100);4 V4 t2 o! m$ {( @( \; Y

9 E' W" J$ [8 u4 U  O! ~> mods(51,100);% `! c0 J4 q" \0 x1 Y# p
" ~0 p* ~0 p$ I/ [' Z7 S  X/ O
> 2^101 mod 2002;  # 同 2 &^101 mod 2002;
7 O" c( o( L, z
& j* B' s2 f/ U/ e$ G0 J7)随机数生成器(rand)
0 m& X+ M( c2 R: r命令格式:   ) \7 ?, X. M- r; q
rand( );    #随机返回一个12位数字的非负整数: `3 J: L/ }' \- m% k+ u
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
% k. z+ ]; v" e# a, _> rand();* a, T2 V* b6 b

( x6 ?! D8 l' m0 D8 T> myproc:=rand(1..2002):6 u+ A$ p+ K+ V' a+ k# L! |$ O5 U
> myproc();  a7 ?. z! [3 `, z  ~

: y3 ?/ _7 d# x8 F- i> myproc();- J! X+ \; z3 g* c! x1 J1 U' e
/ E- w# Z9 y- V  @8 v6 H( R# v
    注意, rand(n)是rand(0..n-1)的简写形式.! q. j5 K' u" Q' L: {1 w* F* L5 E
2.1.2 复数运算; T) R7 K/ E" X# t7 M3 B0 o1 m' \
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   
: c( n7 z9 b* o' P. J> complex_number:=(1+2*I)*(3+4*I);
5 l7 b) }, T& `7 K   n* X# I5 [# h9 X, _3 u" ^! I
> Re(%);Im(%%);conjugate(%%%);argument(complex_number);4 E: }7 d" y6 k$ n
$ O6 ^" S$ w2 I8 m

  q$ a. ~1 C! b1 o# O3 z
; y- ^2 t+ j1 D* V# A, X5 C
% O/ n9 i+ C7 D; C值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%. # Z" L: l, d. {5 E9 j+ k, i
为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   
) ^  e9 v9 F# ?1) 绝对值函数+ @' D2 P) m1 p" N( M
命令格式: abs(expr);  
) v4 V" }5 W4 Q' M当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.
3 o$ J" ?. z, e! ^9 V& d" ]& d> abs(-2002);    #常数的绝对值
+ H+ p# |9 K( ?3 A+ G. y
0 T0 t& ^: K  _9 G1 ^( d> abs(1+2*I);   #复数的模) Z' K& K0 Z, O/ N2 Y; B

* x' l( V. b; V) h> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值- k1 W1 `- y- X" b9 e5 F6 V* T

$ @. ?; \1 C% a# Y2 h* K0 I> abs(2*x-5);   #函数表达式的绝对值8 r" y4 F: R0 W: P" L" C: D, O4 t: k

' f6 v, {6 d5 q# S2)复数的幅角函数$ [5 G7 c- x8 F
命令格式:   argument(x);  #返回复数x的幅角的主值
& u4 f& l. e! q# n; L> argument(6+11*I);0 v% b6 U4 r/ b1 H
4 A- X7 ?4 |  t" ~6 z
> argument(exp(4*Pi/3*I));8 T* k1 x6 G& Q3 j) x# N# ]

2 ?, l) I* H. @7 a8 B/ x3)共轭复数
. m  ?8 ]! d3 ]" v$ ]5 k命令格式:   conjugate(x);  #返回x的共轭复数
6 d/ G& E8 Q- D> conjugate(6+8*I);
( T$ v* n1 i1 S: c+ Z$ W9 q) l8 Q ! I3 S' m0 [( E" b1 l8 L
> conjugate(exp(4*Pi/3*I));
7 S4 o* \4 \% ^5 h: @1 J
/ v1 ^( n" N# D1 [6 {8 G- K$ P! A4 `2.1.3 数的进制转换
+ p: l4 G  z* F. _0 y1 Q' y' I数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可.
; @% _& q: e7 I( p2 b" n命令格式:   convert(expr, form, arg3, ...);   
6 F" R. e; Y' N7 v* Z& X# `其中, expr为任意表达式, form为一名称, arg3, ... 可选项.
. a3 f! x" l' R. O下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述.
$ I0 t. k2 a) y9 \% I" `    1)基数之间的转换( l2 |$ ?% l' T6 @! m6 F
命令格式:   
8 c1 s/ U( y* E5 j% Z/ o0 F% Mconvert(n, base, beta);      #将基数为10的数n转换为基数为beta的数) m. z- k- A; `0 O3 U2 r
    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数
: ]/ J  I: [6 `' E! R/ I> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7
+ z" b6 F7 B* f; q 7 _/ [, M4 h! C$ r- b; e! n
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数! h7 r4 I* m& S6 X) E  c+ T

; m4 e& I8 d( F2 C/ G6 j8 S> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)
4 x3 @/ }) W, h5 ]: O! H ) w7 m. g8 z! [3 i" z
    2)转换为二进制形式; W5 g1 X# T/ X- E+ N6 ]
命令格式: convert(n, binary);
& W' P( ?# q* @$ ~! u" o% ~其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂.
  N8 W9 z1 f4 U' O9 m. e8 l> convert(2002,binary);   
) U2 A9 i. ]9 S' u 7 Y2 ~3 n* d% q1 M
> convert(-1999,binary);
) O9 f5 P4 x2 ]" v8 _! \ ; E0 N, i3 g4 c: N' A
> convert(1999.7,binary); & Q+ L. l9 k0 J" E
- M5 }/ E+ i; j5 G( S9 t
3)转换为十进制形式3 R* C% V' F! n, k
其它数值转换为十进制的命令格式为:   ( F, X/ v/ W/ t: ~$ N+ |
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数8 |6 a5 P" H7 s2 }+ h
    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数
- _6 m# x# I% \9 t/ q    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数
+ |& ]5 z: [% k+ A5 O> convert(11111010010, decimal, binary);   
; f5 Y+ H6 g+ h# J) g  _* | ' |: g+ V6 j* _- y
> convert(-1234, decimal, octal);           , {# {% s% E+ V3 L8 r
# }7 U3 p; M. r* T
> convert("2A.C", decimal, hex);         
+ E" K7 w* R& R/ g2 t7 s7 M * `' Y& }& \. _9 ?- `9 T
4) 转换为16进制数+ T1 R9 c( z$ J- j" k+ V+ g
将自然数n转换为16进制数的命令格式为: convert(n, hex);   
  U9 \8 u, H' e1 x6 T9 b> convert(2002,hex);  convert(1999,hex);1 D" P4 W+ W, }7 i( M  V7 K

3 U/ U/ W7 m% u
1 ?+ k* c2 \3 c4 L* _5)转换为浮点数7 ~: [/ A- S2 A/ X0 W
命令格式: convert(expr, float);
# S. |$ q# C. R& h# [注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用.
* v, R  q% j4 t5 C2 A; U7 c> convert(1999/2002,float);
' D; m$ ~% X7 L) z
: s* I& ^  Z: f3 b> convert(Pi,float);
* ?. d6 y) @  ]0 |: u
5 H' D, z( n, {. x2 s- J2.2 初等数学
$ }7 ~) M( m; ], Q: {2 z4 U) D    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识.
- S1 Y3 g/ F4 Y3 F2.2.1 常用函数- U5 _* Z6 F; B- w. H, j
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   9 o3 R3 V% d1 O  s$ u" D- J
指数函数: exp
6 p5 a# T8 r; C& {/ w! q' t一般对数: log[a]
6 m4 U2 M$ \( }9 N/ b自然函数: ln
7 z# t* `/ o1 e2 _常用对数: log10
4 t. U/ H0 I% i  l9 a平方根: sqrt. T9 D0 w1 \. r3 g& `
绝对值: abs' ]9 [7 e8 o1 S, O
三角函数: sin、cos、tan、sec、csc、cot" U. v) R: D5 ~' |+ ^: J5 ~
反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot
! Q  ^" Z3 ]) g% z; ?( l' Z双曲函数: sinh、cosh、tanh、sech、csch、coth
0 ~6 M3 `" B. N$ ]! B反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth, ^& b) f7 X2 [7 M) C
贝赛尔函数: BesselI、BesselJ、BesselK、BesselY
5 m1 t/ g& S0 n+ S9 T/ j5 nGamma函数: GAMMA
: D( r8 ]( V* c9 t2 u误差函数: erf
' L; D# {3 Z% `4 h/ ?% J函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. 6 I  o' N1 _8 O2 ^: I# l
1) 确定乘积和不确定乘积2 A5 K3 z( s9 @  Z# Z+ |% E
命令格式: product(f,k);  
7 x) o- `; Z. D  a" S; u/ Xproduct(f,k=m..n);  2 e( F7 q/ h+ z/ W+ o3 Y2 [2 r0 @* _$ Q
product(f,k=alpha);
2 ]5 E$ S9 ?! I  y; f3 z, Cproduct(f,k=expr);
( ?. @3 O) S/ U/ X$ v其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式. * r3 @9 D. Y$ h/ P; Z
> product(k^2,k=1..10);   #计算 关于1..10的连乘
+ e' D+ M$ G, d$ a8 }, l 0 Q1 Q- a9 g7 G) p
> product(k^2,k);         #计算 的不确定乘积
6 r' [' m5 r1 h: N
1 J5 q8 B, t- g" A> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘
1 w$ v1 w2 h2 n) V   I8 s& A' `. q6 o% \
> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘& F& @1 d" I/ @& E, g& D

3 ~" }& F6 X, {5 B> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式
: ~$ x- J$ [. z: W" R: M1 L + P; ], x2 a9 [: |; j  o
> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积
! a. t7 \1 Y$ {4 Y" D
) T( f& v0 V: }: A6 ?- V) }    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
+ `! }4 h% r! i# f7 B> product(x+k,k=0..n-1);
7 \; X8 i  l( P- f" O $ |, B/ ?' z8 f/ W) K" K
如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
$ H& Q; e9 z+ v! \3 G5 t> mul(x+k,k=0..3);: u. c/ e/ j3 H5 l+ G* F3 Z
. ]. N1 P' D1 J( n4 i3 C* I& S
2)指数函数6 l3 [9 a  @' V  y8 M
计算指数函数exp关于x的表达式的命令格式为: exp(x); 4 Q* {' u1 o6 D; T
> exp(1);
* V& J; m- r# \
, i; ^7 E9 u( _) C9 `# ]% g  W% w+ |> evalf(%);" D7 q1 @* k( p2 }! `, @0 r3 K2 E' ?6 _

$ V0 g' `* G* j> exp(1.29+2*I);
# |) C  T" J0 y; i  n( R9 x  ? + C* j( B, l; p  b2 L
> evalc(exp(x+I*y));
! [) y$ M% ?" j( k
1 m3 @) d: J( }" }& j$ S3)确定求和与不确定求和sum
7 J( p' h+ c: u7 q命令格式: sum(f,k);  
8 N' l( A  A+ Q; Z* y/ _sum(f,k=m..n);  % a4 U" t6 e6 x" W$ x2 g
sum(f,k=alpha); / Q( c# p4 I& e! ~- s( \
sum(f,k=expr);' V! ]8 O5 H) p5 f  u
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
3 G4 F5 S0 e! b( _) x9 s4 l5 j. j' C> Sum(k^2,k=1..n)=sum(k^2,k=1..n);
0 H, c' ~; ]1 d0 X& R8 H3 D5 Y, }
- i" C5 [% H) O$ U> Sum(k^3,k=1..n)=sum(k^3,k=1..n);  k( C2 s+ Z" m- M* ^5 ^
3 j2 [: H" B: r5 O' P' V- S
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);6 G4 v, |8 Z9 h  E5 C
' ^: R+ ]+ |% r8 H' n8 w# \' y3 |
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);/ k4 w; a: X' c1 ~" X2 x

$ h  s/ Y; w# i% [> sum(a[k]*x[k],k=0..n);: w% O; s, [* {& m+ F: W

1 m) g; Z/ d8 C, M$ ]: y5 B: ], ~> Sum(k/(k+1),k)=sum(k/(k+1),k);
  K9 E( f! n) d. l- W# k& z# U
5 n8 m) C7 T0 S0 g> sum(k/(k+1),k=RootOf(x^2-3));
1 N; T, v! I: k- q 5 C$ a( s5 u2 }' j3 D. ]; T
sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的.
1 D' M6 M4 M; J! ]& K> Sum('k','k'=0..n)=sum('k','k'=0..n);* M! v( t, p6 ?
( r7 K1 i0 Q( _  N* ]
如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   , z0 V3 h. }4 _+ A* ?
> add(k,k=1..100);% E6 ]% {- J  k( E$ Y6 K, h+ X

  i* K: `8 e$ {: X+ {3 j尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令.
% E! X8 Y" r3 Q6 ?/ g6 `另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
$ m& B0 M8 w' o, C& i1 A3)三角函数/双曲函数8 B/ V) y4 F7 v
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);3 m- N3 V+ k; q
          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);
1 l- r! x+ p5 z4 r其中, x为任意表达式. * j- t! G1 D# p* T
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.
* i; f& y) [8 R1 P4 t9 h6 Z4 {" J> Sin(Pi)=sin(Pi);
2 l; S7 l1 O  {9 K3 `+ @ 0 r0 F4 b- t+ F* i8 N/ R
> coth(1.9+2.1*I);
9 x& Y) h5 ^2 J. U" Y% }' H7 `. Y
, ?! z6 T; o) h; G- ]. G$ P) r0 c  f/ [3 n> expand(sin(x+y));     #展开表达式
' E. T. N& T: g9 M: R/ y! G ( l; H" v% E7 S' |7 w# K) [
> combine(%);        #合并表达式
' N3 l) `$ L, S% a6 z
. P$ P) O% r. z2 ]> convert(sin(7*Pi/60),'radical');
8 {6 J6 K) `: Q4 o - H9 J; L( w; n9 x% {' o
> evalf(%);5 k5 }8 p* F! h3 J' X
9 d/ k, S2 ^9 p+ V" i
但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.
8 r5 y! J: f9 r; R4)反三角函数/反双曲函数( R9 C7 M6 [0 |
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);8 Q  f: i: X' b# w9 B
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   + g8 s3 |, U5 z, v' U; h. `+ U
arctan(y,x);
, ^: a4 ]$ i1 [* z+ I' e其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算.
% F1 O' C" c4 P' p3 a; ^6 x算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.
; r  z, \0 |1 w# r( {! `2 W8 g8 b> arcsinh(1);
; t: q: G0 Z$ o! n5 J ( A- _! B0 b% Q4 u2 \+ Z, `
> cos(arcsin(x));
2 u5 u6 e4 N( ?4 Q ! T% q) o& \5 i' q
> arcsin(1.9+2.1*I);
  i7 `1 t! v  J" q- @& A& e, a* \ ; t3 }1 L7 X: X5 v; [
5)对数函数
" r2 W2 l% I4 c$ l) Z命令格式: ln(x);           #自然对数
  Q! o9 c. M! f9 K4 z' Zlog[a](x);        #一般对数
4 Y& k! |/ [4 W4 B4 s2 O/ o/ T/ @log10(x);        #常用对数
! H5 c1 q! q1 S9 `4 n) b  W" [6 i一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   5 G  Q4 Y! X0 M* l! C
  (其中,  )& e; [. n% t1 Q4 z
> ln(2002.0);/ k  W0 l0 q/ F9 d6 W7 O- x7 @

, l3 r+ |8 `3 a" q> ln(3+4*I);
3 t" h. l4 `5 I: s# }$ ]% L7 K* n7 C * E) X( m6 {) ~& k: F  Z
> evalc(%);    # 求出上式的实部、虚部, X2 I$ i. ^0 ~% R- D+ A
9 w3 D  k* {2 f% z; t, L- [$ t
> log10(1000000);9 O) z; \, [& F* E( A
  Z% B  x+ o7 ^& M
> simplify(%);   #化简上式
: I# R8 ]8 X  f8 J+ s0 |6 c: ?' C# G * h3 }9 S& T  q0 P
2.2.2 函数的定义
# J) }/ B' H: l0 T6 ?  C1 O1 ]Maple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   
1 I$ O* E/ _& O% m) H7 Q* k> f(x):=a*x^2+b*x+c;
$ Y( O4 k7 O6 t, o2 {" y
# P/ M9 O+ P7 V0 E/ ]6 V7 ~可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   
6 j9 u3 e5 B7 \> f(x),f(0),f(1/a);* c4 ~7 r& V6 o+ l: K! F) Z) m

3 P2 x6 h9 u. F* ^- S+ H% C由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   
# h- i. k) @. S% p# c/ f> print(f);
: B$ H7 P" r" \, I( `" }
8 ~9 q# C5 k1 T7 s; A$ w4 j( ~事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. ! K1 L2 Y/ q0 @" E2 I9 h4 X. G. [
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   
- P. l; ~* ?4 d9 z> f:=x->a*x^2+b*x+c;& X- K* \0 G; L& u2 }( g
5 R" N- S% t) \( F, F
> f(x),f(0),f(1/a);
" e8 G  P: f- ` 4 g" e1 v9 j; V, R
多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). 0 Q. |$ V9 [5 P2 u
> f:=(x,y)->x^2+y^2;1 J3 H  Y4 A/ x, t

0 x7 f) n- `8 W5 n> f(1,2);
, o( h; B0 h( K/ U1 k5 s3 V, }
8 a7 j" }! D6 Y9 ^! j6 W! E: \/ C- I> f:=(x,y)->a*x*y*exp(x^2+y^2);
9 ?5 H* s0 E8 L/ B$ V1 H% \9 v- X ' B  g3 q" h+ T4 \, k
综上所述, 箭头操作符定义函数的方式一般为:   
; X# }* M8 a$ s一元函数: 参数->函数表达式, {! {0 ^. e1 b
多多函数: (参数序列)->函数表达式' B3 X: d' N" m& O4 |
无参数函数也许不好理解, 但可以用来定义常函数:   
1 ^$ ]  Q( c# R) E/ ~> E:=()->exp(1);
9 C* {" C2 ]5 j4 v# `
( g- V2 u3 J! B- g, y> E();- l! F+ _% E1 v1 n0 m" n# c- C

- E' w! T) n% f4 a> E(x);
/ Y" j( ^% T" D& t8 z9 m
* S0 o: B8 I: T) d+ S* C另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数. / x. i# r0 ~" r  \" R1 T
定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);          0 F  Y* x' b! M4 o
定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     
* u+ |- D8 J% \/ E> f:=unapply(x^4+x^3+x^2+x+1,x);
8 H1 x$ `( a; Z. D0 I, P) S/ \6 ] 7 ~0 b( z) v" T' d: M
> f(4);
6 G$ b' d& c5 l
7 ^% A- l$ P8 e. Y> f:=unapply(x*y/(x^2+y^2),x,y);
; R/ L6 K/ {' I" f, e 2 c( Q; G/ z# a
> f(1,1);
* r1 p# X4 ?  Z3 J3 B3 [! p5 u" B, T 4 N$ D; N# t  |: l
借助函数piecewise可以生成简单分段函数:
# X3 M. P4 J3 l; P  k' Q- r> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);* y9 d  u2 n7 V( _6 T

- S: m7 l" V1 C8 G' J清除函数的定义用命令unassign. 4 j& {2 e! l" M" D
> unassign(f);% S8 z( |2 h; I; [% j/ P
> f(1,1);
+ e; O% ]* Q  p1 I / w. S7 R) e- \  _! F
除此之外, 还可以通过程序设计方式定义函数(参见第6章).
- Q( ~- c' T% j! W1 O* ?/ C定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:1 w1 Y  P+ V$ w' r0 Y+ z
op(expr);         
* Q! P  n0 y1 Pop(i, expr);         
, Q, z; w# M0 S( N5 _+ E$ y8 fop(i .. j, expr);      
) p7 ~6 P  t. Y+ _; e! Dnops(expr);
- B3 w, W0 S7 c8 ^如果函数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的类型.
2 n) k# F( {' t$ e" i& m命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.5 D: I4 {* y$ N) ^+ O9 y! c
命令op(expr); 等价于op(1..nops(expr), expr);
- Q; L2 g1 E+ U+ F0 ~特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...)); " @, E! J6 z7 ^6 _0 e* X( i9 m
而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
! H& x7 {7 \: x* u- Y% @> expr:=6+cos(x)+sin(x)*cos(x)^2;/ W0 p- v3 c9 [
! [. D% l1 N; `% B8 n
> op(expr);
# h- q2 i' T) }9 v2 ~; Y( Y5 k ! p5 T5 I. k! ?
> nops(expr);1 [+ L# Y& [! p2 x! c* l5 F0 r4 z

' m$ t. C/ V2 {* n/ H2 N> p:=x^2*y+3*x^3*z+2;
: ]" H5 `: t& G7 L& I 1 O, @. i$ _! ~" B3 E0 U/ t
> op(1,p);
7 Y7 n3 I; P  C1 u3 ?
9 i2 _  f2 A' Y( _2 X5 Q' w. h> op(1..nops(p),p);
% k% y+ U$ K& P5 f8 F! z
0 g& e; x' z; Z( O: a0 R> op(op(2,p));
2 f& F7 t6 {5 f* G! y0 k9 J2 @ 8 [, i- I* O+ T: ?
> u:=[1,4,9];
4 u6 C7 @; B  N
  J4 e9 W4 A8 `> op(0,u);- z5 W2 Z4 m; {5 F

2 }& w9 s; V$ H: Q7 {> s:=series(sin(x),x=1,3);( N- Q3 ~: O" q9 [* c5 m+ p0 P
6 o! i+ x+ ]* R0 A( u/ {6 N
> op(0,s);$ j# p6 J' m; A) o
        $ O1 C# [3 l. f  k) V
> nops(s);
% I0 p$ y2 q: q1 O# N' ?. i / G2 m  ~3 {3 e. S6 P
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
8 J0 I% h; V4 u/ w- {9 I5 F> op(x*y*z);- y# J8 ^4 A# Z# Y
0 w5 ?( q  S6 i0 g( T
> op(x*y*z+1);5 h/ V* M4 I( u+ @; G# |
$ w5 q# g" d* z: J; ^) {
2.2.3 Maple中的常量与变量名
$ l5 s# }% Q' M% P为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
' r* C: l! L/ g> constants;1 H) t# E7 W8 n: w% d2 ], R
0 N& N, E( v; s! C
为了方便使用, 现将上述常数的具体含义列示如下:   
$ [" Q, ^. d, C" O6 l2 Q常    数        名 称        近似值8 F- K5 z" h% O
圆周率 " j) f' D) u; X
Pi        3.1415926535
# r$ a5 u$ S0 ^' R* `- S5 KCatalan常数 0 `$ u4 b: w  M" m; r0 s, T
Catalan        0.9159655942
% k  u- \0 H, e0 y% R0 q2 ~7 C% s' IEuler-Mascheroni常数
3 v8 L" p& O# P0 qgamma        0.5772156649
3 W7 y! [$ N6 f4 }7 s; @3 G  d
+ C# y7 j0 h9 }0 ], Rinfinity        ; D; ^. y% B8 V3 h6 P' B: Y1 @
6 r' l; J8 K7 ]* M1 u5 @* r5 q! Y& u4 q
需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取.
( o5 H% W7 M0 @) a- C在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
1 o4 ?2 q5 k+ b- S值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名. + L2 m# `8 u! S* ]
在Maple中有一些保留字不可以被用作变量名:   & Y$ N0 F- n" i
by      do      done     elif     else     end        fi        for      2 c/ ~5 `. f& z9 p, J1 ~
from    if       in       local     od     option    options     proc         
8 b% |. O3 S( a/ bquit    read     save     stop     then     to        while      D  d" y7 M, ?0 r* C
Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名. / m& q( C( L1 n+ P7 t
另外一个值得注意的是在Maple中三种类型引号的不同作用:   4 S) d, {. ?# W0 Z) @! x
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;    ' W$ o1 w: h  S! h2 j
'  ':   界定一个暂时不求值的表达式;    / e5 G! m3 P. _3 n; c# X
"  ":   界定一个字符串, 它不能被赋值. 3 h+ r! j9 D  f1 p7 i, N
2.2.4 函数类型转换           
  G5 l7 F4 b+ a0 Z3 g函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  2 s9 S" C% H7 Q" N
    convert(expr, form);        #把数学式expr转换成form的形式: Y  H: z6 V# z1 y! N& V9 S
convert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos7 c2 G" w3 b3 [: O9 \
convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   ; S4 @" g& {' u( }: ?3 S& `
(1) exp: 将三角函数转换成指数0 _- O5 ]1 a% G0 V! K0 v( l4 x9 }$ I( |
(2) expln: 把数学式转换成指数与对数: f3 P8 O# J6 t0 K) q
(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式
4 ~. `3 @# n9 w0 ]3 M. J7 h(4) ln: 将反三角函数转换成对数& O' A4 ?8 E; g+ a4 D" Z4 }
(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式
  T" r# T( p& y$ ^, H2 z(6) tan: 将三角函数转换成tan的形式
1 i" @) E! u# [# a(7) trig: 将指数函数转换成三角函数与对数函数
: ?# h6 z& B  A' S% D; M$ F> convert(sinh(x),exp);   #将sinh(x)转换成exp类型# H, V% Z' C8 ?' B
. i: v! z; q" @
> convert(cos(x)*sinh(y),exp);8 D7 T( v9 ^; T6 T7 P3 o# B2 y

, \, |. B7 s+ N+ ?5 a> convert(cos(x)*sinh(y),exp,y);
4 e9 e- ]& S. g' W. e2 z* q+ v
$ k' i6 G; O. o6 _$ [> convert(exp(x)*exp(x^(-2)),trig);0 d) D* a4 X# A# F* ]

$ u3 c5 k4 G; H' Q5 n> convert(arcsinh(x)*cos(x),expln);
# N# _# A8 Q3 ?' X% A6 {3 i 2 @6 p& K/ m& X( A9 R
> convert(cot(x)+sinh(x),expsincos);
6 P( S' F* z0 b1 U8 `; i2 f 4 B2 [( L& V/ N- O: v1 x
> convert(arctanh(x),ln);* H6 S, Z2 e' L9 j; ^6 F: [5 E1 q
, M# Q, O' W" r9 H' E
convert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   # u; [3 F* \, g; i; k) ~' a8 ?( ^1 ^
> with(codegen):1 f+ Y8 U1 F* f& ]! T0 i% w
> p:=4*x^4+3*x^3+2*x^2-x;& f6 j8 `! d# Y& N
2 l+ t# Y1 v9 l6 ]
> cost(p);
9 V9 W( Q+ Z4 K- Y+ K& N5 E9 O
6 l0 m, P/ g/ D0 E5 D8 {> convert(p,'horner');  #将展开的表达式转换成嵌套形式
( O; ]3 D) z) P+ \( O ; F3 i, E6 I% @* M
> cost(%);. G5 W5 x( R# l$ V2 h! Q
/ K! o+ ?  A! o# s, X4 l
同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量.
3 e, y; k8 s$ L& d4 B4 P> (1+x+x^2+x^3)/p;
4 ^; W8 m& h" z
+ w; C' M# F- S( m4 Q9 g> cost(%);
8 G/ ~7 g: o  B' K; [
: R, @( b& x+ }8 _% q> convert(%%,'confrac',x);
6 O. o, V( Y6 l- L7 Z $ w6 J" g3 C( E0 m
> cost(%);
8 P9 h+ ~/ x* N) d, v# k2 ? + H0 ^/ ?0 ?' @5 M, J6 W
在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式.
# U5 r% T( M7 E5 v> convert(%%, 'parfrac',x);
4 Z. E2 b. w# Q2 R; p  C1 r& j3 A) T . m! D3 V* c6 W9 E# N
> cost(%);
& U. P# V; C- T( a2 q * b* L4 A. R7 _1 r
而把分数转换成连分数的方法为:
0 _4 \0 A. {. v0 {( u6 n: y> with(numtheory):
3 y, j7 q' i  |% F. x$ ]2 X* ?> cfrac(339/284);
  y+ b$ o. I0 w% V' K : K1 o; H* o& d0 m
2.2.5 函数的映射—map指令
: U" E0 ~) H; w# L  U, X9 a/ b在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:$ `+ ~' O1 d. i1 {: x6 `6 K
map(f, expr);      #将函数f映射到expr的每个操作数
; f) }1 E2 z9 e( Xmap(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量
' n. F0 J3 J+ w9 `) Cmap(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量% N& q; _$ T9 O$ _3 ^
map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为3 A# i7 P$ [) e! q* ~6 D
第3个自变量…, an为第n+1个自变量来映射函数f  }, W0 ]& W. m7 J) o
> map(f,x1+x2+x3+x4,a1,a2,a3,a4);
% ]$ i% E, S" u( u; y: a2 O + h% P$ o) j3 b9 C1 I
> f:=x->sqrt(x)+x^2;
2 S: a+ x! Z) y) c+ P% ~
8 [+ F1 l# @& S; ?' c% R( U4 u4 Q> map(f,[a,b,c]);
9 }6 V2 L' ]$ z
5 C6 M/ u: S) b( G& D1 s: B> map(h, [a,b,c],x,y); ; b3 i! L, d8 i& D+ x' W
) F0 f0 l' t" K$ e$ ]% q3 q
> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);3 w0 m; J/ h+ e2 D% v7 x" G# z5 L% ^
& C, t, l+ k  j5 O' X; O
> map(x->convert(x,exp),[sin(x),cos(x)]);' [' k8 |3 w7 L  \2 a( F. J
: x) `$ M( t# b9 I  g8 n
上式的映射关系可通过下式理解:
- s" L8 y7 I4 Q  F3 D: b& Z, i> [convert(sin(x),exp),convert(cos(x),exp)];1 M! u% {0 J5 ?# o0 `
7 d9 ]7 g2 p" W: V6 K
> restart:
1 r: k) r  m- Mmap2(f,a1,x1+x2+x3+x4,a2,a3,a4);1 t& m# Z' m% I/ |3 K6 M
! `) p, C6 d$ ]+ U7 k
> map2(max,k,[a,b,c,d]);
( J/ E; P( V# S/ }8 o ( j, ^7 h% o" ]! S$ y4 ?) Q3 F
再看下面示例:   
3 k# E0 G/ @/ N> L:=[seq(i,i=1..10)];1 D( E6 z- }- h* q- ~

  d* k1 n) w: x, k2 @* r> nops(L);
# c  L+ e# S  i 4 W7 I9 X3 F) r
> sqr:=(x)->x^2;: {7 @) p, k  M; `7 U4 g* U
, U3 b7 Y& T3 r: {
> map(sqr,L);; {- f, M+ @) }( w' o9 O- r6 a

( \8 L+ ~* I3 F& r> map((x)->x+1,L);7 g2 O1 J; x+ P+ V
6 x7 u, W' [% P# q& g7 V( v
> map(f,L);
* h* G! ]$ r) }; u0 q( V2 U
4 }+ {/ Y) n0 S" i8 t) `$ E> map(f,{a,b,c});- E  B/ O! m) Y7 Z  G4 Y
8 G3 @0 ^' @) _' U$ y" ?' }
> map(sqr,x+y*z);
- P, T: \5 e! v. I
- k+ D7 X) k& U& D9 w' n> M:=linalg[matrix](3,3,(i,j)->i+j);
# Y9 f5 Y% v# @2 c$ g+ @0 F6 R* V
( h2 V* P6 @3 [0 w! ?> map((x)->1/x,M);
7 c% c2 q# L! J
9 H+ }  d4 P& \- h, I- d. p3 求 值
: W1 B: K& G6 C) b6 I3.1 赋值  n0 X& o1 c" i" }& x+ ?% m* i
在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子.
& E' _; c8 F! j) V) U; t8 ?8 K> p:=9*x^3-37*x^2+47*x-19;
( W% D- a, d; u7 l
; M$ U8 D6 W6 Z7 @- O; G9 U7 h* n; w> roots(p);
6 \+ ^7 z2 @6 V. K8 J  d( K   V0 I4 o4 X$ p7 M* @/ K2 I
> subs(x=19/9,p);
" Z. X) v- J. o, {! r$ \
. y0 O- J( c) T) z在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证. $ v& K) O6 t# _* k
3.2 变量代换
2 I$ V. B/ r2 b+ R  v1 O& p在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   
  m; Z1 p; i% Q/ [6 }subs ( var = repacedment, expression);; o2 U/ f( [2 n8 n6 _: s* F* O
调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement. 0 E( [  P8 Q4 U; W
> f:=x^2+exp(x^3)-8;6 m# G2 k7 q3 Z5 o& b5 h

1 \; R6 q8 B6 q' ~! o0 p. n> subs(x=1,f);! I9 M" c; {9 }! ]5 r/ A
/ g. U9 L$ i/ D" i" U$ i
> subs(x=0,cos(x)*(sin(x)+x^2+5));
" ^9 t+ ]+ O9 r5 q, @/ e) @ 9 i8 j+ P' q0 g6 B" S" w
    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   ; K/ {/ B% W) e
> evalf(%);
; Y% `7 D; M+ c  c! | # C( I+ i  L" [" ]8 L) ]* \
变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   
5 Y1 q1 P* k3 o: x7 `subs (var1 = repacedment1, var2 = repacedment2, expression)1 N5 [( [' N9 e% o- B
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   
# g$ J* v  F. L  W& Gsubs ( {var1 = repacedment1, var2 = repacedment2 }, expression)
- e% ?& b9 b8 q# K0 q( k  u下面通过例子说明这几种形式的替换. # |7 n. d0 F4 n
> subs(x=y,y=z,x^2*y);              (顺序替换)# W$ _3 f, J) R+ @" U/ ^

+ f5 t4 e1 B5 |) U0 f. _> subs({x=y,y=z},x^2*y);            (同步替换)
6 p9 T- G  \) y; R1 D# L( v- z  I& h. j5 @
. _' _5 A7 N# t7 `, ]9 n! V8 S> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)% P& P: ^( C8 l5 H/ ]2 k
6 _/ ]* f' A! B7 R) d& H4 F
> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)1 e2 j$ z7 w1 r# B1 m1 \' K5 q  K
2 R/ h1 X; R/ a. \) g" G2 |( X
> subs({p=q,q=p},f(p,q));             (互  换)
# D( [/ D( Y) N2 `) P- F1 ]; D+ J
- K/ U3 r; F2 J6 e( v3.3 假设机制
# x- }( A4 G6 U0 LMaple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点. 6 M/ K; R) t4 ?
在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);* a+ r- [4 t2 |9 r/ e5 W8 t
函数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);”也不会产生矛盾.
, M3 _+ w8 e8 i! U& g8 _% @: \> Int(exp(-s*t),t=0..infinity);7 H# I- Z: j2 w) N  h
6 c. N  {% s" C% M9 n& `& Z- j: f3 h
> value(%);
; r3 D) Z$ ?% T9 [* n% h3 |- CDefinite integration: Can't determine if the integral is convergent.
3 R) [7 M# X9 W3 s! I% _% q5 _Need to know the sign of --> s$ A) m2 Y- n" u
Will now try indefinite integration and then take limits.4 m! C' Y0 ~3 y; O; J1 n+ Q* K2 @% N8 S: p
/ w7 J+ ~9 X. S
> assume(s>0);
7 L5 `7 Z: j3 _> Int(exp(-s*t),t=0..infinity);$ `4 }" y* W  ^" F5 M6 x+ |
0 x. [& ]/ |" [5 i' u: a' r0 T
> value(%);
0 g  l0 a9 r, L9 i * z; e7 x" n  q
3.4 求值规则9 P" ]6 F7 p+ P0 u
在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   1 ]  w* `  v3 b3 H* Q  l
> x:=y;( F8 v- N9 ?" w

  T# R, s# l# v$ X) @" f> y:=z;, w" Y! s& a5 o" s- R

0 X+ y6 C0 ?5 o& C/ p( x* N% }" a8 i> z:=3;- f7 Z9 T" }. ~
# q8 n8 k1 l+ q7 k/ k
> x;
3 @& w* j3 B  v
2 j: B4 u; ~! `5 _8 s1 e> y;
4 ~1 W+ f; M. y9 w/ t9 T, L
* l0 ^* Z' \* G9 J> x:='x';+ q2 h4 e! n1 R8 ?$ n8 O3 }

' M1 G* y+ U2 @, L4 Y8 H7 ^> x;
- S+ C# @" }& p7 p1 i  T
% A5 i- e$ p. U% O0 i+ v( i. K> y;
- x1 a4 N0 F+ e$ O+ W" U5 O : C% P6 G6 ^2 d* k& K
对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   ' y) ^2 B5 q* {9 W/ h% C7 r
1) 对表达式求值3 b/ S% t, M  [4 k( {
命令格式: eval(e, x=a);  #求表达式e在x=a处的值9 Y7 _: k1 \* D. L' s) _
             eval(e, eqns); #对方程或方程组eqns求值3 J9 j5 g. T+ ~! p" v
             eval(e);      #表达式e求值到上面两层  o0 H7 j: a# G+ L
             eval(x,n);    #给出求值名称的第n层求值0 U7 O, L8 C: X; K" v5 t& o" v
> p:=x^5+x^4+x^3+x^2+x+73;
" f$ z! k9 J5 G
# ~" I% j& b+ }1 @8 l( ]* p> eval(p,x=7);
0 f5 |* W$ N' {5 z5 k 6 Z/ L) T3 o) Z+ V8 |8 v, z
> P:=exp(y)+x*y+exp(x);- A# f2 z3 I9 R/ w( V% J6 A: i$ Q

- v$ v5 g& ?: b  C3 X% x( W/ y0 f> eval(P,[x=2,y=3]);. T* p, |* }% O" I% w- B

3 {# L; l! ~4 ^    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   $ {- Z& a& Q, W" y: e3 \
> eval(sin(x)/x,x=0);7 y7 F( K! ^3 L
Error, numeric exception: division by zero
  i! G2 m4 z  I4 `1 y7 Q, \+ ^    下面再看使用eval进行全层求值或者对名称几层求值的示例:   # |3 a4 l/ `8 R7 a8 j/ A5 h* H% [
> a:=b: b:=c: c:=x+1:
5 Q* q& N. U% W% J4 S8 w/ H) Q> a;              #默认的全层递归求值. y( U) m" G  }4 c
& D2 c; V, B. b
> eval(a);        #强制全层递归求值# \$ V: h7 I" L  o7 o3 U
6 [2 y, J; P& X; v) J
> eval(a,1);       #对a一层求值  c8 c3 i3 C/ j' ^8 V. H, f+ A4 @# z
2 m: R2 k! h, t4 [
> eval(a,2);       #对a二层求值
2 N7 J6 k0 J1 p; U; z$ a6 G. j
! m4 c  q1 B# h  [# ]- d1 H> eval(a,3);       #对a三层求值
, F1 U9 Y4 g9 h' X; _ 2 H& ]/ k; A9 `4 n. `) |6 [
> eval(a,4);       #对a四层求值# p4 a' W9 r; z& e) H& ]

3 u/ V$ ^, a) K& x* J: ?    2) 在代数数(或者函数)域求值) N' K, I' d/ m1 K) I: }& A
命令格式: evala(expr);       # 对表达式或者未求值函数求值
8 s% A1 ]! M* q9 N* X* v2 Y. Z             evala(expr,opts);   #求值时可加选项(opts)! c4 Q' D% m* M& K0 M& W& Q
所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式.
$ \, S* Z  E% B9 N9 ^; Q& E代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   
" `2 r! @% {% N% Q- `( I> alpha:=RootOf(x^2-3,x);
  J" p* p9 R1 c& r2 C1 w 3 _6 T; d! z8 R
> simplify(alpha^2);
  x2 I* J9 U& R" O
1 Y0 A% O# ?) Q0 w8 X1 V! Q% T在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:
9 o. G2 ~0 n/ J4 P* L3 U) e  ]> alias(alpha=RootOf(x^2-2)):
( F: w6 u! z4 L" j0 m> evala(factor(x^2-2,alpha),lenstra);
* R) Q1 K9 R4 v( i4 q# r) v
' _" W+ n4 g: P  S> evala(quo(x^2-x+3,x-alpha,x,'r'));
; e5 J2 n5 ^1 s3 M7 g* l
5 i2 ^' G  T- }4 |( M> r;
& w2 H, R; F2 M! A2 y0 a: A
( i/ _& f5 q2 {  A- A3 m' [> simplify(%);
# Z; {5 J( [0 l7 j, c + q% y1 C( ~2 d( k
3) 在复数域上符号求值# U% k  {6 I. i1 T4 s
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:
" W. i. j+ e9 k, o5 C3 Pevalc(expr);   2 d: r5 h! j7 }9 Q0 D; y% W) a
evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2.
# M* ~: \9 _* g+ n$ U9 U0 F> evalc(sin(6+8*I));6 T' f, j- k, ^( X# @
0 V1 o- e4 s# M5 ]# R
> evalc(f(exp(alpha+x*I)));- d9 r  q: N9 ~# [0 n% G4 ^

2 i" ]0 Z* w1 v+ }2 b5 w( X> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));
% Q* M5 K0 j% v, x; R# f. E
8 F; B' [  V6 Q6 q7 ]  p* k4) 使用浮点算法求值
; j, w0 J) j9 ~. C* u8 v0 T7 g1 m浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     
6 n1 F1 r' x+ q) m3 C3 Z' S% ?7 t6 }% C> evalf(Pi,50);    * }, C, ^! W5 M2 l' F: s0 v* p: g

4 J" s8 p7 k0 G- @+ I2 D! v. w> evalf(sin(3+4*I));   
7 Y- Z8 {4 T5 r, i; `( n
! m1 D. ^0 p. r) e! _  N> evalf(int(sin(x)/x,x=0..1),20);( T9 O: W5 ]; r* B. P

0 I* X& u8 t3 G7 T, a' B$ q1 _% |# [5) 对惰性函数求值
* b- v/ [0 u) t# j把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   
# X- ?6 M! _# X5 V  H> F:=Int(exp(x),x);  S+ n" G/ y% X1 Y& r4 ~
* q5 `! G9 ^" L* L6 Y$ h
> value(%);7 Q( h5 H: h/ E# _/ M0 O' ^
( u8 P7 G0 ]% }# n
> f:=Limit(sin(x)/x,x=0);
+ w5 I* A: J# |& O
0 R" w1 `% _7 o) s2 W> value(%);/ D7 |- s8 ?0 Z7 P

# w  Q- A1 C( I6 E: b. _另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   
' g4 k0 I% Z* g' N> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);; T' e6 i/ q1 C$ A3 F; [

3 l8 v3 |/ I1 B8 `4 数据结构' H, A$ w' M; Q
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表. 2 W, }% n1 d9 u/ m
4.1 数据类型查询' X, z5 n; v' o/ v
在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
. k( s/ e5 h$ n6 \  k8 T; Fwhattype(expr)        # 查询expr的数据类型
+ N: v. z7 p/ `. S7 ~$ L% P4 P, ktype(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false" q3 P! D5 H2 N8 h. W8 t
> whattype(12);
* b. A- E' Q9 d
2 v0 J6 O6 ^% r/ m> whattype(Pi);3 {/ i8 h1 X6 l0 u. \
2 M' ]( t: W1 S6 l! |6 q+ `7 s
> type(1.1,fraction);' o) R+ V' }% K# R* d+ ^

6 S: x7 S- W- O1 e# s) r8 y1 F> whattype(1.1);
# P& n: o, F! r4 [# d: y
7 ^) `1 D; ^# ?: X' v* b' E4.2 序列, 列表和集合: U8 Y) @; {# {1 c- R- C
4.2.1 序列! D, ~- ?( h; n
所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
) [( u" H% S/ I# f# L  K) N2 L> s:=1,4,9,16,25;
* I, w7 M) ~9 k0 \5 \0 E
$ k, l8 x; A$ x0 |" r6 b> t:=sin,com,tan,cot;
$ O  ~6 `9 b4 v* K0 ?
5 s+ [1 @! C8 k5 v' x1 F一个序列也可以由若干个序列复合而成, 如:   ( Z5 r. g$ H" W
> s:=1,(4,9,16),25;  B9 {3 I* G. m! `; d8 n0 ]) N' J

; s  a6 S. G9 u" G> s,s;
$ Y' b# E" R# q6 c; q
: `  h5 A8 a# E5 ]$ ^而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   ; n7 U2 ^% q+ B: }9 P
> max(s);
: l! I# r6 \1 e3 f! C* a3 T
7 ~% w: W2 d  S* X> min(s,0,s);
: U+ E' T# p8 f- t' f/ b: J   c+ @" \5 _. p2 O  {( x3 O" [
值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中. ( V( ^% \& t2 `9 H' k& L
> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;7 K( k2 l* @! R# a9 t7 h
$ u) v0 V$ h" s6 W4 V# U
> op(s);
) C* Z8 X- e% l' F; I1 k# uError, wrong number (or type) of parameters in function op
$ I8 @& _8 O7 q6 x- u> nops(s);
& n1 u- o( E& u# m5 Z0 JError, wrong number (or type) of parameters in function nops
5 \6 n2 n( @1 W, O0 C> op([s]);3 ~# I: p/ \- w
- b( {4 i) Q& B: k7 a, g
> nops([stuff]);4 h3 t+ C& |+ M, Y' `$ ]! b' J

8 ?4 n  i# F" T+ @$ [* R函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
7 V& N$ w# F! cseq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)
/ ?& W1 |1 ?( ?- jseq(f(i), i=expr);  # 生成一个f映射expr操作数的序列( B+ \" @, A' J+ S  ^+ L0 ]5 o( ?
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列; n$ k0 h4 A( }: G, I& Y
> seq(i^2,i=1..10);
, }) t, m$ V" e. J# P1 g/ P 4 p; T% D. g0 @  u+ y7 r9 i
> seq(ithprime(i),i=1..20);
% g& D2 |* F6 m* { 3 p& V! F' E6 ?; Y) h4 E
> seq(i^3,i=x+y+z);% ^- I% ]( O3 @. ^6 ~6 o' K

( W( q" q6 N, n, z/ u7 Y9 n> seq(D(f),f=[sin,cos,tan,cot]);
" M8 b4 n2 o# k" t 0 p- ?; M  X$ E& }& H
> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));8 v) b! d5 \8 f+ ~. D( X, j
* t4 h! N2 ^1 _6 L
获得一个序列中的特定元素选用操作符[  ], 如:   
1 @. O1 w5 w/ @* ~' l> seq(ithprime(i),i=1..20);
- y2 o1 o9 ^8 A" u/ D8 F. g2 l 7 N( z1 \* @" c5 h2 d" u& I
> %[6],%[17];
4 K( J/ l8 c! s; B , ~- t; Y# k" n8 }+ c) ]: S
4.2.2 列表
' Q" @& }7 C3 W- |, a" R( D! Y- m5 ]列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
( y7 s! `) O7 ]# O- X* J* O> l:=[x,1,1-z,x];
+ Z% Y. Z' t9 J2 y! L+ E  g 1 I: I9 a3 Z8 p0 m% \5 h
> whattype(%);
* K9 r7 }1 S7 S0 X# x; [- p
1 ]/ G+ H3 W. L7 U5 y3 L& g. f空列表定义为[ ].
1 U( v: h1 T+ Q6 ~( ^但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   
- |1 D- o% W3 @7 Z! f- }3 H) }& k0 T" Y> L:=[1,2,3,4];
7 L# ?2 g: Q% `! O
( h& A4 j! i/ k> M:=[2,3,4,1];* r/ x! J) n0 ^1 g
, ^/ X5 W8 a' _8 f
4.2.3 集合
4 S( Q" r; l; B( m集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合.
. u0 q" k9 A+ m3 f. B> s:={x,1,1-z,x};# [: y' [& X/ S, W0 L! w

" L! t" f; U9 u* `( I% z/ U2 s> whattype(%);& P9 V0 I" G# ^( v
, n% L+ ^4 [9 W  n& d
空集定义为{ }.
7 O- c; J* ]1 X函数nop返回列表或集合的元素数, 而op则可返回其第I个元素. 6 |8 Z4 e" U2 X+ j1 w( d! [. b
> op(1,s);
& S' B( n# M, q8 B* P7 B1 G 9 P' `% b6 B; {2 ~
> s[1];- g; m: }! ~7 W% V: M
6 o( o7 a7 ]/ \5 K) {8 T- V$ a: M
> op(1..3,s);
4 p0 i4 I6 W* v
, T8 u# v9 p) r$ Q- B1 [( {0 h> s[1..3];
' C0 M. d" m+ v# l ' t( A- p8 d- a& R$ n8 o) |
函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false.
' O9 \# t0 E: h& K; A/ p. {0 {( g> member(1+x,s);5 L& `* L1 [9 z( g' T! H
/ r; w/ w- s: ?: n6 j
可以通过下述方法在列表中增减元素:   9 y3 F6 b: _1 l9 F, R) q
> t:=[op(s),x];, e% X4 i0 H' u5 e3 r
; l# h2 V7 X' y! U2 N5 h# f
> u:=[s[1..5],s[7..nops(s)]];- j3 U  K/ X- L$ l

- u1 Q6 Z, v- R+ j0 ~Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   
0 V1 u, x% I4 A1 f) e> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};9 `7 K# G5 i) s/ Z# v

1 k& I7 }; q( d. R- B# ]- h" i 9 c+ `+ l+ s/ W4 E1 D3 Y6 _6 k
> A intersect B; 3 M2 T! |- n7 ?+ `. R( K7 v
* q/ W3 Z3 t; I5 p
> A union B;
5 B3 P# k4 D0 p4 x0 q
9 B6 }9 N9 _) \- i9 c3 P2 l> A minus B;
1 v9 l( X" O7 k2 \2 m* T# x
- C3 d* B: ?4 M4.3 数组和表9 J$ H% z1 K6 ?; L; s
在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.   v0 X7 F7 `  U9 T* o7 U/ P
    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的. % z; n) _7 h7 V/ S
> A:=array(1..4);
* B! e2 r  X# B" u/ g& [
+ C/ Y1 b# ~* t6 r3 e/ L: N+ [( W0 D> for i from 1 to 4 do A[i]:=i: od:
1 I2 G" V, d4 a# l3 q3 @> eval(A);$ u* R, C/ r( g$ U0 u; i

4 o4 |: h" @1 m& p> type(A,array);  {# B8 o" ]/ Y7 q: ?
/ n6 ~# I; a6 |7 m" K9 X9 j2 P
> type(A,list);' f1 Z) q6 y* Z: M7 F0 {

, r9 u' j5 _: T& K> T:=table();2 U/ p  j) N; w" E- ^

& O& |8 [8 @" x3 D5 u> T[1]:= 1;
0 s4 l) u' K. C( ~+ p* _- X
8 c2 f0 Q* I: i> T[5]:= 5;
8 K0 j6 V7 B' }6 F4 \+ P
5 a+ e( j* I; k> T[3]:= 3;* {4 A* s0 ?& ]. N6 f
3 F& S$ c4 _9 o& q
> T[sam]:=sally;6 [1 N8 U/ i) }
3 N  H, e& x2 u2 C+ G
> T[Pi]:=exp(1);
2 j. C6 D( P* _$ e- d& h5 T, @5 q 9 F& J. Q8 z  D) Q, p  O; h
> x:='x';
) z  g& t9 i6 {$ g/ v0 n
; W6 w- a. N+ @/ \> T[(1+x+x^3)*sin(x)] := 0;" a! @6 j6 x2 M$ R

, N2 w- S+ W8 ^- O" Y) ]8 K! m> eval(T);
+ i" t$ O2 _* d0 |3 _ # d6 M* w9 O6 t4 O- ]
> T[3]:='T[3]';
8 C; _' \8 h0 q! @
2 t, K) w" m  P3 C, G* R6 k> eval(T);
& F6 \+ }: V. _2 X- ]4 c
  {( ?6 `/ {- `  J4.4 其他数据结构4 F  g  J& o1 v- z7 @
串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来.
! P$ f0 y% N) l; {索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
" Z" C9 t$ p$ |" m' R' Z& E4 g2 F> x:=T[3];1 }3 ]3 A. Y9 U& @) b' Y2 o8 S
, i# H- p) Z3 [; A9 A/ e
> eval(T);
! S, J& @; J; B; ?' G( ? ; T3 e5 u/ g! S( x
> T[5]:=y;1 O: L- h5 X7 g5 {
3 J2 n) o; q1 X; p* J: [0 ~
> eval(T);- A" s1 _& q' J) {9 h9 U7 Q& Z6 U% x

- l2 q* ^" b2 f+ g4 A7 i) g5 ^由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
* v* ~- w( X1 J" ]- ~数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. 0 p) K! t: T: V% ~: a6 m5 O
4.5 数据类型转换和合并5 x7 Z4 U4 R$ B- M# Q4 j: S" n* ~
convert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   
7 P/ _2 J; l3 z% x' {> L:=[1,2,3,4];( j- x1 v4 ~( i
  g; m* g; Q3 X# A% o/ }
> type(L,list);
* r1 z# C: p  s, G! t  P+ C& D  f : [  _- K2 r& w1 E' Z1 H) d
> A:=convert(L,array);5 @/ c* J. \; y0 z% Y  _
- o  `: C0 F, K7 x& [7 n* i
> type(A,list);
5 W! X. }2 D1 s$ h% {
8 @1 Q8 {# Z" y% D" g0 A0 M> type(A,array);! C# F; ^" v: w9 `# B4 @

3 R1 N& A2 M" ~1 P/ q  j& e另一个有用的函数zip则可把两个列表或向量合并:   4 n! Y5 ]) o) P4 X! O4 ^
>L:=[seq(i,i=1..10)];
3 V- o6 [0 \1 N$ d, B( }# C1 I ! ^0 `% O6 L3 I0 T$ v3 m# M
> Sqr:=(x)->x^2;
" `) G& ^- U4 e3 s/ ~ 3 o* J# a# ?/ `  Z7 k2 `
> M:=map(sqr,L);; W6 y2 h9 }! Q" Z5 v

& e# N2 n, ~! ^8 k/ v6 S> LM:=zip((x,y)->[x,y],L,M);
- F7 a- J# F- q
$ C1 j) c& S: l; k2 t7 O> map(op,LM);
. @" l' V/ G+ `9 M: P6 k) B
6 e) f# s0 O$ j5 Maple高级输入与输出操作" Q8 }' S  u8 z/ \3 R
Maple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里.
; w, ?# |( e: M: ^5.1 写入文件  J: e1 ]; G# \, j" ^& c) a% C
5.1.1 将数值数据写入到一个文件* |0 B8 i! K8 u, g4 u2 d, |
如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令. ( i# h8 H1 N  @2 N2 q3 R! U
若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);
2 G) w6 r! g7 A0 n> with(linalg):0 `" @( D, w3 t! G( l  T( ?" S
> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);
1 D) Y" j# r$ K# D/ l3 U ( [, W; M% M! \9 c7 n
> writedata("e:\\filename.txt",M);
2 n9 f4 A& a3 ~% A) H. \% p而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);7 d) ~& a; b( r3 F$ R# f) Y  a
> W:=matrix(2,2,[1,2,3,4]);
- o/ f3 O$ q9 u# r( p, `5 r! D ) i. g: {+ A: t4 m; k
> writedata[APPEND]("e:\\filename.txt",W);1 z! V9 g+ W- s8 b* d. |
需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.
5 x2 C) T, h$ p3 ^6 h# ^- \7 z. ?另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);
2 p: {6 @4 ?" t+ j/ ^7 u> writedata[APPEND]("e:\\filename.txt",W); 2 }- r7 R/ w: G) m, Q) y0 n
> writedata('terminal',M);* X7 s6 h- U  c9 }+ w$ [5 z
1                   2                   3           
: y( d& \4 C' B. r- B1 e9 }4                   5                   6           / s& v+ A( _& T- i9 d
7                   8                   9   
* H, f+ O* t* y, Y8 ~+ S4 w5.1.2 将Maple语句写入一个文件
; ?  c# ]2 r9 X  D0 V如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:* ^6 l; J! H/ w+ Q/ Z
save name, "filename";$ \3 P4 |. x8 G+ T& F+ q% m
save name1, name2, …, "filename";
) Y! J2 }. w- j; V若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
( i/ m/ `# P! y! H> myfunc:=(k,n)->sum(x^k/k!,x=1..n);  s- b, k9 k* ]4 b& P! ]& u

' Q, i8 k& O1 e( M> myresult:=myfunc(6,8);
3 `5 G7 ?& Z1 E2 l# Z % k+ x- G" _' f
> save myfunc,myresult,"e:\\test.m";
: ^( E' T* Q# E& Z& Y调用已存m文件用命令read. 试看下述实验:
2 v$ ?$ a6 [5 I  ?' s$ f> restart:" \9 h7 }6 V8 `5 O7 b) U
> myfunc(6,8);
* \8 E9 z( P) R* x$ ]4 ]
& i7 W2 y; F; J# t* [9 u1 b1 P; H> read "e:\\test.m";
# L, r+ T/ F6 e5 {& M, U> myfunc(6,8);9 A4 f# R8 `9 B7 a, T5 L

5 q& p1 P2 F1 y3 F+ d5 Z. e# N> myresult;
. G; H2 s5 L+ o0 r" k" [
' ?+ u: b/ a0 F) A    而存为txt文件时则将整个语句存为一个文件:7 `4 n8 Z0 H% d7 t9 G: y
> save myfunc,myresult,"e:\\test.txt";: T7 l" ?4 h  Y; j$ L* U2 a
> restart: read"e:\\test.txt";8 f* g- h, P- D1 H5 k
1 ]" B$ I7 }) a
: z1 q1 F8 p% @4 t
5.2 读取文件& Q7 F# Z1 D7 J: c0 L/ D! w! {
在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.% ~& i4 z+ u' L" D+ f3 X9 G
5.2.1 读取数值数据% L& ?, p, R/ O. R
如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.  q( L* h, L/ ?8 o; H
从filename文件里读取n行数据时使用命令: readdata("filename",n);1 Y: M( D1 H. e5 h7 P6 `: m7 \" L
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);
* l" N9 k8 r: |: h! G- {! t. U" u7 V> readdata("e:\\filename.txt",3);- ?' m' l. l# m5 }- _. v
+ @& O; y5 n6 d( E- m* p+ d
    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:
3 }' @- _" \6 _  y5 F) `) |3 c> readdata("e:\\filename.txt",[integer,float,float]);4 t# Y4 ?0 l/ A7 H; f: m0 f" r) c
- B- u! g& c5 |* z' ~, y. m6 Z, b/ J) F
下面再看一个运用大量的实验数据在Maple环境绘图的实验:
+ E; f( x( m0 H2 s> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:
/ J5 P, t/ d* p> writedata("e:\\data.txt",evalf(mypts));
% e6 l& P) `* [: k0 X# D3 l> dots:=readdata("e:\\data.txt",100):
8 o) _# w) S$ M0 I9 i> nops(dots);
5 E% D$ E9 q* _( K: U
" E; K$ D6 ]0 _' d. M> dots[1..4];
3 s4 i: x8 Q: z6 L ( p4 I9 Q6 t+ }: ]4 L
> plot(dots,style=line);* ]  B+ a0 Y, u3 v* ?* L7 W$ T/ _

# p- }  A3 V  a7 E" X+ m! r  J5.2.2 读取Maple的指令
7 \, [& ?  |. S) L5 ^在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:$ Z/ x! |' A. C0 l4 l- F: V5 {
read "filename";
5 g( k4 s/ ?2 M0 a% L& e1 f如下例:
( N; u7 [$ Q$ |: l& ^  R! ~- a> reatart:
9 J7 C5 ~% X1 r" S) w. x> myfunc:=(a::list)->add(i,i=a);% r3 Z/ I, u, A9 _4 S
0 ?" |' h' I$ Y) \
> avg:=(a::list)->myfunc(a)/nops(a);
: V; |& I& V# m% Z0 [; F# \$ v
8 S, F2 q" h4 _7 s" X. `% w/ }& r> save myfunc,avg,"e:\\function.m";( F( Q6 u' V3 u) Z% G) I) _* c0 Z
> restart:
4 r, V% i. W* |( ]$ c> read "e:\\function.m";; F" m* [3 ?" v$ u
> myfunc([1,2,3,4,5,6,7,8,9]);) P& q, C; x  R# v- g9 c$ r
; Y0 \# h, ~( r' R
> avg([1,2,3,4,5,6,7,8,9]);, q1 Z  N4 u5 H" B( ^( b4 P! J1 V

) Z& K7 A* E: L2 z7 @& J5.3 与其它程序语言的连接
  C- [+ X6 _% E: p5.3.1 转换成FORTRAN或C语言( a$ O6 \5 B. a5 M) W. N
调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:
1 @: n# A0 T. a- M; L+ q8 T> with(codegen,fortran):3 w1 C" C+ r9 S$ p, i
f:= 1-2*x+3*x^2-2*x^3+x^4;
6 P+ a: v$ l0 l# c0 ^! Z / \# D8 d6 U3 F' I, ~
> fortran(%);' y, ]2 f# E# G+ p
      t0 = 1-2*x+3*x**2-2*x**3+x**4( _' o+ D6 \1 g5 j+ A
> fortran(f,optimized);
, J! ~1 L: }6 d      t2 = x**2
* B! K9 I2 [( }8 t5 f3 }( H      t6 = t2**2
0 {; a- e. R1 x) q      t7 = 1-2*x+3*t2-2*t2*x+t60 Q# y0 y+ H4 B4 Y4 Y/ y  t
> fortran(convert(f,horner,x));
" G8 n- N+ R  D! N# @      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
6 k7 C! Y0 w0 ]5 |0 g而codegen程序包中的C命令可以把Maple结果转换成C语言格式:) y0 F# s6 a4 l; H1 Z
> with(codegen,C):
- [( F% `9 t. Y$ x# ~f:=1-x/2+3*x^2-x^3+x^4;
* t! e5 v9 O( k ) H' }# N0 _* g
> C(f);2 t  F, t) g, _: ~1 k
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;
8 ~" `! G" {( ?6 q# B> C(f,optimized);. N% b3 M$ d5 H1 \: ]" A
      t2 = x*x;
' e  P+ F! k1 D1 V+ z' M      t5 = t2*t2;
9 f7 W5 F8 v; y! p: I      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;" L$ E5 }% w, N+ v. R
optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.0 y4 }# r4 h- e
5.3.2 生成LATEX  y4 R6 ]6 b4 _$ s- B& r7 w9 w( j
Maple可以把它的表达式转换成LATEX, 使用latex命令即可:6 a+ P$ s* Y# t7 d
> latex(x^2+y^2=z^2);+ z' y. Q/ l$ K) C1 w; t* C
{x}^{2}+{y}^{2}={z}^{2}/ u! B; O/ f% i* ^) C
    还可以将转换结果存为一个文件(LatexFile):4 L' E$ A" ]% Z, K* E$ S/ Y% N
> latex(x^2 + y^2 = z^2, LatexFile);
; k8 b# S( ~5 v1 N0 u    再如下例:, Q! i2 ]7 f& h6 }! h- D  V+ ^
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));* t5 I. N$ a8 T* U, k9 b- |. H
\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)- V4 q4 s" L* O2 C3 [
; C# |) v- X8 u" b
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年!. P- n7 C, ^7 \

    ; k3 I: S! V0 B' a; z; S
    ) `/ M1 O3 M+ i, Q/ [" B% n) S" i3 z
    回复

    使用道具 举报

    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, 2025-11-3 10:38 , Processed in 4.522165 second(s), 97 queries .

    回顶部