QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

5 W0 L* Z$ ~0 ^3 _2 u# w  x
3 D. d' @% ^8 i8 A% F % p/ K. x$ E' P; N$ U

9 n+ P4 F  w5 f, H, K& z ' ]& b- D3 s- T5 o- L- P- X* e9 S

- g8 I' R5 L- g, s : R2 y5 h! ~6 s  X  n5 W  r

) e; h0 g0 l$ Q; M8 ^
" p$ Z; I- {, M# H! a; O ! u2 n/ z7 N% E6 d% i9 @
3 g9 o$ U8 X& U7 }$ c
5 \: o1 W  y. t& n1 a8 Y
alpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu
, k+ `' Q# M$ c3 z. _
" A+ f3 y6 Y0 o  P ! m+ Z2 b0 R2 b6 R3 X
9 R, X% s9 l) m2 r7 b. h
  G. `* M. U1 c4 `3 H( t' [

2 z* c7 R! U2 m9 ?3 F8 Z; c( | - W: |9 }1 F$ M

  @+ K2 t9 ]& M# [$ X4 K# k ; ^5 R1 W* r, D5 V7 \
$ K8 V$ y7 `: R0 x9 p9 Y" e- a
3 g5 f+ f8 y, ?
3 s+ q, q) L. d5 W: \

& J$ C/ L% g' M- d! T1 n2 Q5 k
2 S  I/ i: D3 f4 E% K$ Vnu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega5 ^' y1 Z3 x. E; M: \6 J7 \% i
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:: L4 B' t" v, K  I# s
> for i to 10 do 7 C4 T- C0 z" Q- z2 Q1 e* P
printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));7 ~6 @  Z' q% O. l: [# @
od;
7 p: E6 `6 u5 ^6 q& C. M+ z1 }i=+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
- n, ^( k5 J; Z  Z. q+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:
6 z4 J: F& C! u( S7 O> for i to 10 do
% N& v+ ^; h2 L$ Dprintf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));/ @/ J. M, X8 s. b8 O2 l; W) u
od;
8 K6 r5 D- E( h! r) g4 l" {6 p0 si=+1 and i^(1/2)=+1.0004 x; d4 F: Y( a# I6 C) F1 s
i=+2 and i^(1/2)=+1.414
9 J8 o- n: y8 R( i3 Wi=+3 and i^(1/2)=+1.732
( U% k4 A' Q* `3 p3 q: ~8 |i=+4 and i^(1/2)=+2.000
2 O+ G; d  i) B! _* ~6 ui=+5 and i^(1/2)=+2.236. t. A4 L; Q3 S8 h1 Q7 }- B0 q
i=+6 and i^(1/2)=+2.449
# i5 p9 A6 C2 r) z4 v- D1 }i=+7 and i^(1/2)=+2.646
& @# X; Z  e$ A' ~i=+8 and i^(1/2)=+2.828
3 _+ ^2 r+ G  {7 @" z+ li=+9 and i^(1/2)=+3.000$ K/ {( s' U  J- W
i=+10 and i^(1/2)=+3.162
  k9 N3 g6 n) C1 O; F! R4 o再看下例:将输入的两个数字用特殊形式打印:9 H7 f0 t/ w" g3 _
> niceP:=proc(x,y); q  v' H9 {" H
printf("value of x=%6.4f, value of y=%6.4f",x,y);
& }( M# f, t9 l" ?2 m1 Xend proc;) i# |( A/ x6 u4 N

8 W2 q, K7 b% Z' Y# N# {> niceP(2.4,2002.204);
- p" H. m, W/ l  J# H8 pvalue of x=2.4000, value of y=2002.2040
4 r& _. n0 z' A' X: x& r1 k$ e+ c1.4 Maple联机帮助
$ G( T; B& f) p6 U: w/ X- B学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用.
, u1 u$ z1 U; E  o5 `# G- ?在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可. & O& L. l5 m% P9 Z, Y! }" a! r' I
2  Maple的基本运算; W6 i% M4 _7 D; @) D) d8 X1 E
2.1 数值计算问题
* C" X$ Z  M  w# j8 V( N算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”.
8 `* \. a# ^3 G8 A! s1 L' R在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数. # ?( ^: u  e8 x. n  B$ @3 U7 ]6 @6 f, }
Maple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算.
- b! {/ C, K, H5 u- A但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明. 9 ]. w# a1 I, {; l- a
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   
& [- b5 N# h- D9 n> 3!!!;4 I- I) w$ N1 n8 d
2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
; T2 \+ C7 w; T) m上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?
5 s" d/ G- |. T8 z- G为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式
$ {$ C% x* X0 a1 n2 U: L$ I8 t, X ' w5 a! H$ y7 `, b% n- E# R
可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   2 C2 I9 N8 v3 ]3 G0 e

7 h# t5 K0 _5 m' W) ?6 Q* S这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性.
" I% K8 y0 `+ `, l+ r* o另一个例子则想说明Maple计算的局限性:   . R3 d' m; ^7 J/ }: M, Z$ e) [
  
! n% ?" |/ c' L9 i5 kMaple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   
- M- _' D( y  z- |7 ?
! v6 }0 R; `: a4 c显然这是错误的. 这一点可以从代数的角度予以分析. ; G' i1 T9 P. S2 u, t( M9 S
不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. . H5 T/ r( I$ c9 Q: K" g& \6 t
另一方面, 设 , 则 , 即:
  p" h6 ]! L  j/ ~) {9 ?0 m1 P
& k6 [. [4 {3 ]# S( ]3 V! u显然 有6个结果, -2、2是其实数结果. ' ?1 ?3 b/ F8 ~' k5 s
这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性.
1 ^, ^! n8 I4 {3 D* z尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的. : c+ D4 C! w+ n
2.1.1 有理数运算! Z. B9 C6 ^: z" G9 z7 g
作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). , Z  [  q; @5 @: `4 M' Q
> 12!+(7*8^2)-12345/125;
8 _5 J8 }$ _2 q1 r 6 [7 X* S# s9 b+ S! h
> 123456789/987654321;
# D/ [2 z& T% s& y6 W" ~  W- o * |# k) a: s) ?- O& N% K
> evalf(%);6 w/ S8 J) I& H+ _( h
' _0 Z: W8 R% g# @' ^( q
> 10!; 100*100+1000+10+1; (100+100)*100-9;1 f1 E- K2 b: _9 i. q- p

1 P# ?" U/ h, @- M1 u4 ^8 `' R
7 L* h7 Y$ I$ m
) @4 A) N% e7 G+ P  O> big_number:=3^(3^3);
( t' ^- _" {3 U) l 9 j$ T& ^+ {1 S# Q4 T( W8 j
> length(%);+ D% k: U. D$ n) C7 M
" o# V# q8 G: k% T9 j- H" T  L
上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   
* I2 a; \$ q+ Q! p1 [7 A, L    1)整数的余(irem)/商(iquo)
0 Q0 {. j, `0 u; ?" J命令格式:     x# e- n0 R, n5 l  |
irem(m,n);        #求m除以n的余数7 J# l% L, l0 X1 L3 f
irem(m,n,'q');    #求m除以n的余数, 并将商赋给q
* X3 @$ N5 Z) giquo(m,n);        #求m除以n的商数
) W% B8 G' y2 R9 i. M8 ~iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r: a: ^3 e* `8 O& n4 i3 R
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值.
  q9 y& C, ^2 L4 o! v/ _1 r) b> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q
* C2 ]1 H) [5 s& u  z  h8 i% ]: J: g
; i: R- f0 V4 L0 X% m& j> q; #显示q0 L; ?! p; N1 N4 O/ B- ?
# b  q: p5 D0 a3 y* V" D
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
, j8 a. ]2 N. C- u ; _4 ?4 w+ @8 t5 `1 @2 E' ?0 i0 B: S
> r; #显示r0 K9 Q+ X/ B: y( n7 s0 W; t

3 `1 V$ d' W% T2 ^  L> irem(x,3);
4 \4 S! O3 \5 |3 ^! v% P: [ 9 C* ~& [) L. i1 `$ V. a. N, i! Y
2)素数判别(isprime)/ l/ F$ ~! k5 g' |4 Y' {( A% X8 b
素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); ! m. D& j1 l7 I# ~* L
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数. 7 m2 X" T4 D- L/ I' C, a2 Z
> isprime(2^(2^4)+1);; Y/ g! ]: h/ t  L# f$ Y1 T- O

6 i* L8 R" P: P: _$ F> isprime(2^(2^5)+1);
# n! i! Q( N( U' U4 P# A
) n9 {# \1 [* d; r2 _上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多. ( B" H* q8 H4 o0 r
3) 确定第i个素数(ithprime)
3 y& Z, r1 ?4 X5 _& F4 b若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);    # U$ `4 {6 ]) o+ f1 Y4 a
> ithprime(2002);2 A" W# I0 C+ O+ A

5 L9 l1 z! D9 C0 ~# C: Y> ithprime(10000);6 ^* K& n3 R2 T

3 @5 b, U2 A- W/ r6 l: u% M8 j4) 确定下一个较大(nextprime)/较小(prevprime)素数
( b( {; i! `0 r+ U4 v当n为整数时,判断比n稍大或稍小的素数的命令格式为:   6 _6 W  [2 M1 S
nextprime(n);  / X# ~8 ]( b9 U7 l. V, i
prevprime(n); / _' q3 ?! [- ^9 Z+ D
> nextprime(2002);
# K6 w5 C. i8 q& U4 O: F2 G$ J
, D6 i2 r! A8 ~5 |- v/ A! Y! Q> prevprime(2002);
5 I5 L: G7 }" l' s3 | 0 n. b/ y4 V- N! ?, V3 {
5) 一组数的最大值(max)/最小值(min)( _5 l1 z) u2 G4 g$ h9 _  V3 F  ^
命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值8 b$ c( l6 q0 h  s
             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
9 O# V' t) a* p9 M' N& d4 w> max(1/5,ln(3),9/17,-infinity);3 Q9 G% b9 Y9 R0 S
+ {# h% w1 ?  G; _) f8 ?5 k9 L7 m
> min(x+1,x+2,y);* @+ E; d- Q' {  B: S4 H2 T8 T

- k2 {( h! u( v5 t6)模运算(mod/modp/mods)
+ |! L% x* ~2 r' f命令格式:  e mod m;    # 表达式e对m的整数的模运算( b% y& q) p! v& L7 s
modp(e,m);  # e对正数m的模运算( C& i9 g/ B" S- }* v* ^; `
mods(e,m);  # e对m负对称数(即 -m)的模运算
/ c  z! o* N0 b; m`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价1 @' e% z9 d8 t$ o5 \  {6 t3 w$ q
值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. ; g0 W4 A4 C$ F& ^
> 2002 mod 101;. @* f3 g! J2 q! ?
/ E0 @5 X3 w! c' }0 p$ J1 k
> modp(2002,101);! f2 \: d) y7 d5 l' }
% a1 t% e) ~# I) W$ C
> mods(49,100);
& n# }0 r- A# C6 f' R0 i5 Z$ E1 W! X$ S
$ A) w; A: p6 B8 ]; n% {> mods(51,100);
4 L# l6 Y0 z2 V+ K. j   S1 U$ c* Z3 T3 @* K
> 2^101 mod 2002;  # 同 2 &^101 mod 2002;% \( r' Z6 g% O

$ u9 J9 F* Y/ z/ C7)随机数生成器(rand)  M" x* M3 Y0 x' H
命令格式:   
% t  G& o. t3 _8 M; j, wrand( );    #随机返回一个12位数字的非负整数4 k/ S5 q. k+ `9 H( W* X
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数% m4 K- l( C) n% [4 d) ^" f
> rand();
! x% o8 j4 u& w( L- d6 ` , t  [$ }" Q) ^+ t& n8 a
> myproc:=rand(1..2002):
$ c( u. o  x5 E/ n! w% q. y' I> myproc();% a9 Y' Y- R. {

+ [3 w+ @- F8 E; B/ u> myproc();# W) o4 y$ @& x
9 Y; U& w. q  G- e) N1 h8 R4 O) [
    注意, rand(n)是rand(0..n-1)的简写形式.( i8 G# P; Z# ~
2.1.2 复数运算  l. l$ Q5 K+ @3 Y" f$ E
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   $ Y: w8 `3 u) [* H7 u& Q2 F, R  L
> complex_number:=(1+2*I)*(3+4*I);% j: M8 [$ N" X, B2 T! U6 T3 O9 i
- ^5 e' V: |7 A3 L& e
> Re(%);Im(%%);conjugate(%%%);argument(complex_number);
. W2 O* h0 L2 D6 F ! `1 k. c# R* u- {- o  p

# S4 s  N8 i8 R; D2 A1 v, n - m4 r" B4 J9 U5 t9 v. t- A: m

% _3 a- m2 c( B+ c值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%. + H! b, ?1 J: x% r' d7 e
为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   2 j; y" I: V1 A
1) 绝对值函数1 E9 |% N2 P. M
命令格式: abs(expr);  ) A. n6 x! Q2 f# \9 `6 F8 p
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.
' a' s& c9 |! i> abs(-2002);    #常数的绝对值
( R* o6 L! E$ I0 a# {8 M ) L& E' H+ K3 h4 v& e
> abs(1+2*I);   #复数的模) r7 i# L. Y) K: s
$ v( f" E2 p5 ~; ?
> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值
# i, B# d' C% h( d7 d
- j& U7 Q# P4 y> abs(2*x-5);   #函数表达式的绝对值
9 E% E$ c7 o1 I; ?1 H: m 1 u( {/ ^3 c# f% g: G$ t5 n8 N
2)复数的幅角函数
# {" ]2 \8 F# s( j( M/ G/ s命令格式:   argument(x);  #返回复数x的幅角的主值
& E1 I- r  Z0 S" N" k. I! |> argument(6+11*I);0 e; q* o- o- ?6 e8 w
/ D2 m" W, s+ S/ z) |
> argument(exp(4*Pi/3*I));; ?" r5 j3 J3 \# w7 s, G" f
# W+ K% G) m/ ]8 S/ h! w
3)共轭复数; F  ]9 N# P$ z0 v& O' {. e5 |
命令格式:   conjugate(x);  #返回x的共轭复数
3 U- W" S) I& O- h. d> conjugate(6+8*I);" ]% k8 b2 x4 i/ b. o- q
: }  c( u/ u; J) _
> conjugate(exp(4*Pi/3*I));$ h9 E6 _/ I  l3 `+ Y
8 l( f3 I: K" J, ]
2.1.3 数的进制转换
. ?/ r5 N. }. H6 h2 V! g数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可.
# J) k$ k3 A: A命令格式:   convert(expr, form, arg3, ...);   
' x" O, y: w; L" b$ o3 o, I其中, expr为任意表达式, form为一名称, arg3, ... 可选项. " F2 z% x7 `' t' Q8 C: `4 h
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述. * T2 E' u# Q  G5 t6 {9 m7 [
    1)基数之间的转换
! v$ q# L0 K: }. a* c命令格式:   : O1 _1 r4 g( h7 p: n$ h0 g& s
convert(n, base, beta);      #将基数为10的数n转换为基数为beta的数
; ?, D, ?! u3 ]. m9 R    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数2 A4 f& W! b4 b6 C
> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7" R/ j1 S) O$ ~
0 W0 D' `% Q# b7 W- Y6 S
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数
8 B! W) a/ _- K! y, l  }
% K- J. F& Y/ n+ K3 @2 ~2 K/ w+ p) e> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)8 ?; N" D; N5 T* @2 z
' U1 K7 T# I, o% W/ h
    2)转换为二进制形式
9 o: o+ g% a. V. n命令格式: convert(n, binary);
* c3 _! m6 F9 q6 k其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂.
4 o' K( Y7 f2 b> convert(2002,binary);   
: s3 y. q. b6 S5 K3 P. T 2 Y; l% h8 L: f
> convert(-1999,binary);
) K# \* p7 T, i0 {
7 W' x& |( K& f! U> convert(1999.7,binary);
4 @& L& d/ |: a( R7 l7 n) i
  g# k( M4 H. y0 c7 T+ v9 f3)转换为十进制形式
8 C4 o4 B3 M+ z- a- S其它数值转换为十进制的命令格式为:   
: ?$ H' q9 v( |& Z: _convert(n, decimal, binary);   #将一个2进制数n转换为10进制数
5 V/ r( u. Q% E) a/ ]+ U; q8 |    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数  l  w+ j6 @$ G: X
    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数
; D# U/ I& x% L5 ^> convert(11111010010, decimal, binary);    ' C. L5 t( r0 q" n, J5 _

$ i) [* o9 P* ]3 K> convert(-1234, decimal, octal);           
5 j7 L" }6 }/ H) \- ] + J. w% ]5 G, O9 e$ O3 a  {, g
> convert("2A.C", decimal, hex);         
6 ?; P/ K6 m* o+ }
* m6 S" z" }/ _% v4) 转换为16进制数
5 r3 U  S" B; i# T$ P* n将自然数n转换为16进制数的命令格式为: convert(n, hex);   / }, |' s- O/ D+ Q; ~
> convert(2002,hex);  convert(1999,hex);, q* N, P# d% Y" A6 O, u
! Z% f$ I+ Q" H6 g

% B$ X5 Z) p% `9 d3 Z6 L4 s- e5)转换为浮点数
" e5 J+ F$ K4 G4 t1 }6 R8 k! s0 i! V2 [$ u命令格式: convert(expr, float);
8 e3 T9 Z  I% O5 G% l注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. - J  x5 F: U; Y5 Q' A* a
> convert(1999/2002,float);5 _6 T- a* P/ S( @! c0 p$ ?5 h/ a- x

" A  B. f( l6 n& D) t! N" U> convert(Pi,float);
5 X" z% d) d$ H
9 O8 z$ Q# o, e6 v" ]" a/ }. P$ r2.2 初等数学6 c) _: M/ A5 F1 D6 k
    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识.
2 w0 U- l) J- R) b  {2.2.1 常用函数
. C6 r0 m7 M6 z( d; X; f作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   
' B8 z. y0 [7 ~# Z0 n: `指数函数: exp
& d; A4 B& L" s4 G0 o一般对数: log[a]( E* [7 \$ a: a' [9 d
自然函数: ln
1 Q0 W2 r/ q  z8 K) t常用对数: log10
' C" T& h6 M9 S" z4 N5 M平方根: sqrt
" L+ n7 l% _4 O1 M6 b4 D0 B2 a绝对值: abs
" x2 g" ]% k$ V- Y三角函数: sin、cos、tan、sec、csc、cot2 ^8 M' i' Y& O. c4 J$ ?7 e% g
反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot
4 B9 C. O. o( ^8 }8 P2 F+ K# c; s双曲函数: sinh、cosh、tanh、sech、csch、coth! e1 @6 [9 Q- M/ F! H/ f
反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth
; C# x# n2 K7 D# c) F9 H贝赛尔函数: BesselI、BesselJ、BesselK、BesselY
* b1 f/ w, V3 S/ ?) a, WGamma函数: GAMMA
. ]8 o! p; U: P误差函数: erf
6 t$ F* w8 u% i! V" c& a函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. & K1 b  \5 K; \2 B. N
1) 确定乘积和不确定乘积7 b5 f$ w2 n) k1 N' W. |
命令格式: product(f,k);  & Y* b- ~$ w1 w- [6 ]
product(f,k=m..n);  
4 D. s0 q+ v" l; j; K5 B( ~9 Q7 yproduct(f,k=alpha); + ?9 ^0 C9 J/ E& s! a% R
product(f,k=expr);
) f" t% b) a* i) l' ^/ S9 |其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式. ! K( \& X9 h! m
> product(k^2,k=1..10);   #计算 关于1..10的连乘3 T) B8 t/ f1 e1 c' g2 h5 w

" B' K# {& S0 b2 T6 P% n2 y> product(k^2,k);         #计算 的不确定乘积
6 O$ O; c1 J6 ^% l7 H" m
$ R6 @) ]3 d8 ?& f- u; c> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘
9 P7 X( X6 Y8 T& Y * B' |9 t) }" x/ O! R$ i
> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘
" Y. L. }, d7 g
- ?1 \  S6 c/ R/ ^5 r8 x" E> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式* F7 J( {% v, i) o* ~" C4 Z
- r! M5 |$ ], p9 k3 F* g+ m
> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积
1 s' u# H6 X* b. E- V  K  l
! m8 h. j0 s$ w! V# E    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
9 P0 y% D3 b4 n% W0 Q> product(x+k,k=0..n-1);
8 H* y% |' \/ w+ u$ E# a4 ~
% d7 U: c$ ?2 h) F! [" @如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   3 k4 D0 G, G7 F9 A
> mul(x+k,k=0..3);
) d7 b/ h& r4 X+ A( f; D / M- d' L" s0 L
2)指数函数: l# i0 J( r& ]- M" e$ y. A
计算指数函数exp关于x的表达式的命令格式为: exp(x);
" ^$ u1 Q+ F1 o9 ~1 l# z> exp(1);
( G* B7 q/ t# f  P ( j7 K; H, C( y0 K* e8 o
> evalf(%);
) T. ]0 D5 w2 T
" Y7 P6 r% j4 ^: A0 @9 o( Z> exp(1.29+2*I);0 }+ r8 s/ x$ [8 b) |

$ }; a. p3 x* r( V4 H1 e> evalc(exp(x+I*y));
  e+ L0 T3 G6 A  ]9 ~3 p  h, L0 g
/ M7 B; I* i; `# P) L3)确定求和与不确定求和sum, ?3 p) M/ C8 w1 |3 k
命令格式: sum(f,k);  2 d: v  E/ {1 a5 O3 I0 F
sum(f,k=m..n);  & h4 M/ h3 B. m
sum(f,k=alpha); : F1 H" E, R8 {+ y0 r
sum(f,k=expr);
) G  C' F$ {+ b. g2 b* w: P其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
/ P" Q& A0 a) r# k9 i> Sum(k^2,k=1..n)=sum(k^2,k=1..n);
; Q  d0 c5 |! \% J; x/ D 9 L1 U# @: v$ I& H! W1 v
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);
" y. w/ Z: P% Z" R0 H- F4 U 8 P; C& S5 D& P1 e
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);6 n( S8 G  L+ ~: i  P) t- g

( H( b- y( Q6 p# i7 E" b5 Z) |9 N) U> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);
+ t% {& A7 P' Y
! \4 S0 c/ n1 P  w: m> sum(a[k]*x[k],k=0..n);% h. T) [5 O& F: V' a
8 D+ Q' U2 [- O& e5 P
> Sum(k/(k+1),k)=sum(k/(k+1),k);
: [+ Q0 D' {+ I/ F, | . v/ W% G2 j0 K5 r3 f
> sum(k/(k+1),k=RootOf(x^2-3));
; c4 A  S( g3 n/ d+ ] . w# S" e" G4 F1 V  I
sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的. ( Y) N& h7 l( ?# ?1 s
> Sum('k','k'=0..n)=sum('k','k'=0..n);5 Q9 f$ E4 W% Q& D

# y& A8 X9 w# q( W) _$ p. K- s如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
8 E+ ^! ]3 \7 D> add(k,k=1..100);" ~- g8 V+ Q+ E5 C# ?# Y: G6 H
5 Y3 ^+ _' \* n! |( T
尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令.
- u1 `; Q( X- Z3 ^另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
: P3 Z% q! A) [: W6 s0 Z3)三角函数/双曲函数
+ y  {8 E6 D6 j2 \, l3 Y4 k命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);
& R, @6 ~9 g6 @9 ?6 y. @          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);: z/ x4 `' m' p2 S' J( p! i4 ?
其中, x为任意表达式. 7 T4 @6 }1 i# z1 k9 g
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.
- ]# S! l* ^2 h; X" z  D> Sin(Pi)=sin(Pi);
) j7 c, n  ~) _, V; Q
8 E& a9 g8 A) [, y) g+ ?> coth(1.9+2.1*I);
6 x; J) {* z6 h4 a8 y 4 z" h, E2 [% ]
> expand(sin(x+y));     #展开表达式: C) g  N) C2 d8 {6 @* o- V
- {3 X5 |1 S+ K  l
> combine(%);        #合并表达式
4 c1 t3 U* z. k6 H/ i- w
6 I4 L- Y, C- ^0 T> convert(sin(7*Pi/60),'radical');# c, V  Q3 g$ F: u: G2 r5 @$ R5 Y

* j& q0 \0 Y( O4 T  g, ]* }> evalf(%);
, N3 y" M* ~1 l
/ ~* B2 j) ^. |) @7 K但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.) k' v$ G" d: F1 T5 Z
4)反三角函数/反双曲函数& K$ S0 a  F0 g$ r
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);" ^7 U4 g" {7 g
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   
2 M, p* E% ~8 }0 p: z; H0 narctan(y,x);3 T3 H- N! M. H
其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算.
! k! O9 g: y5 n' l; d9 N算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.; q8 ]" s. |3 O* c: F* h9 T1 d
> arcsinh(1);
$ {( H3 c% ?' `; H0 M
4 X& f2 D0 c. R> cos(arcsin(x));# U1 a  U6 e3 S& Q2 @7 }

) y4 d3 X) H3 L4 X- f9 U> arcsin(1.9+2.1*I);; ]) j4 F) c& v7 Z! @( Y
8 M/ t: a2 s* H' B1 z  z2 t
5)对数函数
& m1 W. I/ K. e. j命令格式: ln(x);           #自然对数
) N& p: x, Q6 P9 B6 {" i4 W. ^log[a](x);        #一般对数
! j3 I& L: a, R- c  Jlog10(x);        #常用对数
7 B; j. J( K8 W1 N" R, u一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   
) W; c; Q$ g- {9 r3 z0 r, a- K3 D  (其中,  )9 R5 a1 m5 L5 e0 B$ z
> ln(2002.0);' D* T3 q, l. e) i

3 F6 a" F8 Q, Y2 m( b- y3 M> ln(3+4*I);4 k, M- s0 I. \0 ~: \' X5 B$ O% X

: `- U6 y  U* f# M: a> evalc(%);    # 求出上式的实部、虚部2 o* u2 Y/ v8 b% R: }" w3 d( L

/ x% C% P: X3 j* H( Q5 t7 o> log10(1000000);
3 S) Z' L. B: z( o# X
1 I- q8 T2 M0 R, [> simplify(%);   #化简上式9 a1 y+ L  W2 J6 N) ?" W

3 q6 l4 f% r+ y" v5 K6 _) W2.2.2 函数的定义
7 f) j: D) O: _/ {) t1 G" x# w: RMaple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   
8 w) X; u2 e% G1 f  n> f(x):=a*x^2+b*x+c;
* L7 o0 S5 T: X: ^- P 3 \6 E7 \) g( Q3 `$ ^$ v. @( h
可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   
) [, e* c. ?/ m. t3 b> f(x),f(0),f(1/a);) ]+ y/ t/ U& h! y& S

* w, v/ _" Z* l- s3 i% d由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   
' y0 S7 y# d8 @* |7 L" t" W8 ^> print(f);
4 ?" W& o9 g% H/ A$ _: P( @
: B+ y, S9 G, W$ O) M% Y事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. & b3 o+ b  I5 F9 g# Q
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   9 B9 _  ^6 x. s5 `. `" v9 y
> f:=x->a*x^2+b*x+c;2 B/ M8 ?2 O- x% R7 {" T; e( R9 q
3 e- ^% r. n& B
> f(x),f(0),f(1/a);* d$ S% q; ]  H+ [2 c

5 x/ L+ o$ z: j! e多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”). 4 o- e0 |- D6 r$ _1 d
> f:=(x,y)->x^2+y^2;+ ~# r% B( ~+ _) y
( j: r2 D5 R5 S. C. W# @
> f(1,2);
) A0 n3 Y$ U9 P& ~
; T: `! }. }( B7 j> f:=(x,y)->a*x*y*exp(x^2+y^2);/ c7 J7 r, j+ x, M& W
& A% q" r# c' H
综上所述, 箭头操作符定义函数的方式一般为:   
  G6 [$ _( [* m: l3 O: R9 |  o( C. v1 b一元函数: 参数->函数表达式
4 n# P: ]# i9 p8 R' h) u( b2 l, l, X! K多多函数: (参数序列)->函数表达式- ~4 {3 ^/ x# {7 O+ |0 E& A
无参数函数也许不好理解, 但可以用来定义常函数:   1 S0 Z8 N+ }2 [
> E:=()->exp(1);
2 n% b) G8 r& u/ t$ J& [ 7 `. Q( A6 G  m5 A3 ?
> E();, [% O' h% m' A6 ^& E# _5 t
3 X$ X( Y/ o7 s1 n5 m# Y
> E(x);
7 f' H: {/ q7 P/ E0 m: ?$ l6 C% [ 5 z& P  }2 D/ ?: _* ?. E" c2 M
另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数. ! J0 }9 o" D5 z" v; f9 j. M+ j4 i8 F
定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);          0 A( |6 g4 U; a# o
定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     + M9 s" u' Y- K4 i9 a1 s/ |
> f:=unapply(x^4+x^3+x^2+x+1,x);
. D7 d- o) X. {# L3 d+ w # Q; l; X" [/ b( }$ ~* d3 I# g) {
> f(4);
/ n; h5 v1 }$ q' ?  n9 j ( I5 a, r% g! ^0 K5 }
> f:=unapply(x*y/(x^2+y^2),x,y);
- Y, D0 \7 T8 S" A7 c, N
5 g- ]; i( |: D8 D, j> f(1,1);
) g" m+ A  t5 D1 H  m! ?! Y3 S2 ` " j0 j- U( Z3 l. z* O
借助函数piecewise可以生成简单分段函数:
' e+ c/ c* W( S! l3 q/ ]+ U> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);0 |1 U$ X' L+ F9 P. @4 S+ r

" B9 N' I& ]5 z1 N$ a' R/ ]清除函数的定义用命令unassign.
5 {# `' k+ W+ l9 j> unassign(f);$ g, m2 \. J3 k/ p
> f(1,1);
7 S7 a; D7 U' i" e3 y. b; l# w# ~
+ e( n$ S6 U" }! T3 C4 K除此之外, 还可以通过程序设计方式定义函数(参见第6章).
. Q. k; g8 x5 b& ?- X( r' M0 q定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:
& O# Z, j" Z" f  Z. F4 ^  e5 _4 a9 B- nop(expr);          " `9 @5 z( X. N! K& O  z' \% d0 _3 A+ R
op(i, expr);         
- w  A' @% I5 l1 Lop(i .. j, expr);      , O. s3 H+ B. \6 q
nops(expr);/ h4 U5 z" X6 U
如果函数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的类型. - ?, R1 d$ Q; b  T/ F4 f
命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.
5 s+ t2 x: z8 c# A命令op(expr); 等价于op(1..nops(expr), expr); & V) D7 D4 @* Z
特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...));
4 m1 `  I% k+ }1 f# r而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
& n) M8 _: K7 F, j5 N8 t6 N3 P3 \> expr:=6+cos(x)+sin(x)*cos(x)^2;
( }+ k+ c& e/ ]9 V" H7 _+ a% {* G
9 d; c4 y$ h5 N3 @1 k7 Z> op(expr);
# B5 v0 [( \6 t
" `( W# t- |8 G* {0 L4 G6 L$ K> nops(expr);
! h" M' B- J7 U" c- X; ]' M; N * f; |) Q. O+ ^$ Y6 Y
> p:=x^2*y+3*x^3*z+2;
# F9 [( `( a* H! s5 ?+ {/ g1 l
/ N, J, c! F& w' _' \0 M$ Z( t> op(1,p);: K2 T7 y; x( O! `& m7 r
9 m+ t, @0 r- x/ M; {4 D
> op(1..nops(p),p);
: X: l6 {- R& Q7 n. ^
: C: [8 `. i8 E% J> op(op(2,p));
& `. O2 k# z6 \! o: S) E8 Z - o# K* Q: X4 A) D+ M" t
> u:=[1,4,9];
/ t6 T9 l" q5 `% c6 A+ W: v
* o: ?. Q, E6 F- }- G! \0 E; F> op(0,u);# a: M4 {& V% C% D8 q7 M' m

) D! z2 S8 w! J9 i> s:=series(sin(x),x=1,3);
! ]8 n) ^  v% m2 }
* F( z9 i6 p( P) Z5 G> op(0,s);
* x6 z( i( X8 Z. i6 q" D0 A- E/ E         ' K5 x. J7 ^8 c# b5 t! ]' O
> nops(s);+ t- p( o$ g1 o9 X$ L" H
: o! J$ ?9 d! ^: ?- f# v
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:, K) S- N; O) ]6 N% p" M  a
> op(x*y*z);
! {: c' j: H* Y8 R
' T( X0 S; P4 b+ P* c* V. d, m/ }" v> op(x*y*z+1);( C; d2 e$ R" E0 d* X# d/ e! v! V
" B$ z% x3 Y- k* k" @% ?
2.2.3 Maple中的常量与变量名
5 k( `5 O0 ~& f" @" \/ r2 I' }为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   # o8 G. y  A2 i: o1 b# @* b. q! M* Z
> constants;
# ?- x. Y* z2 T7 v + Z( \  n/ G1 \9 y/ P9 A. n* ]/ d
为了方便使用, 现将上述常数的具体含义列示如下:   
0 ?' A3 m9 S( Y常    数        名 称        近似值1 d5 l; X, G) o. O* I
圆周率 * F4 d+ k. J: n% Z
Pi        3.1415926535
0 v- _7 e0 H& eCatalan常数
! r# m* `# m  i1 n! G- _Catalan        0.9159655942
" ]) W* y4 ^3 }! R* pEuler-Mascheroni常数 ) q% |" i6 b  a
gamma        0.5772156649# L8 w0 ^2 l% B$ }0 t
6 _+ ]0 \- r- V8 @& y
infinity       
/ l  P/ M7 h' K/ q& J/ a, G0 _
1 w3 G$ j2 B( p  L8 }  J& x需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取. % p" p6 W7 T8 A7 M) V
在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
0 H8 W* q+ x7 v$ |) T9 l) c值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名.   x* F0 ]6 P6 c2 a( E
在Maple中有一些保留字不可以被用作变量名:   
% k/ a0 a& R! T& |* o4 gby      do      done     elif     else     end        fi        for      
. y$ v% k; a4 L: y4 u2 t" s8 M7 c! Tfrom    if       in       local     od     option    options     proc         
+ S+ P9 z; A" v5 I) |quit    read     save     stop     then     to        while      D
0 D7 r) N- w4 c) p0 TMaple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名.
3 Q+ d% s6 S. b) T+ q另外一个值得注意的是在Maple中三种类型引号的不同作用:   3 o+ P+ _) r( b6 d" r- E
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;    0 B0 p3 b5 E( J
'  ':   界定一个暂时不求值的表达式;    9 _4 K! V1 S/ r+ B
"  ":   界定一个字符串, 它不能被赋值. # `5 a; V1 g4 A% [: A- a
2.2.4 函数类型转换           
: J, y+ Y$ P% G8 D& f函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  9 N& K0 x  a7 k* p
    convert(expr, form);        #把数学式expr转换成form的形式
" H4 K6 p5 c1 g) q! b: Q7 ?) H7 jconvert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos
3 _. }3 {& ^" f! f8 \# H. K) n* Z: `7 Oconvert指令所提供的三角函数、指数与函数的转换共有exp等7种:   
3 z1 r+ w. I' F(1) exp: 将三角函数转换成指数
9 [1 j  J5 B7 Y(2) expln: 把数学式转换成指数与对数
$ G, B( D& f1 a: b0 k(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式5 n# V& }3 _1 Q; r* t* [
(4) ln: 将反三角函数转换成对数
- B" L) t5 A) e! g9 [3 T(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式! t" z, h& E4 w) h' K
(6) tan: 将三角函数转换成tan的形式
0 L4 Y, ]- ?% V' c2 {- e0 l(7) trig: 将指数函数转换成三角函数与对数函数1 W" }& i( @, ?4 ?
> convert(sinh(x),exp);   #将sinh(x)转换成exp类型2 J  H# G- X9 c% {& z* E2 x1 Q8 g

/ T2 j9 B. B8 b( P6 O! H> convert(cos(x)*sinh(y),exp);
0 e8 ~& W5 F: _$ s: b6 M$ Z) h  @
; s6 P4 [% L  a> convert(cos(x)*sinh(y),exp,y);
7 b1 y9 L4 g+ m. d2 d
/ p" C: h- q( k" |> convert(exp(x)*exp(x^(-2)),trig);5 F% u6 }0 U5 s' L
, S& `  ]' S& l; h; D
> convert(arcsinh(x)*cos(x),expln);
) r* z4 k6 b" h1 y; C8 ^
% |2 E, y0 R) G3 s- `' ^& H> convert(cot(x)+sinh(x),expsincos);
+ O1 ~. `1 K9 P6 k0 c+ \5 [: n
) q- E$ l& Z# K6 L& b4 G9 s. d/ p> convert(arctanh(x),ln);
) O, Y' h5 k0 Z/ L
4 `0 i5 E6 ?# Z$ W* x4 U" j7 k7 Jconvert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   
) W. H  e) y3 P' i$ v* E- g0 P> with(codegen):
: [* U7 E" j3 R" r9 _/ O6 y( {> p:=4*x^4+3*x^3+2*x^2-x;
9 Q& A5 ]3 A5 P( I" W$ g+ W& `7 ^
9 P; X9 x+ b: G> cost(p);" g4 R! R+ C- m8 {1 ~

5 E* }; S  Y6 r% o/ M> convert(p,'horner');  #将展开的表达式转换成嵌套形式
( l: G9 q# T& p4 f5 p
" {1 G7 A7 w1 y5 a> cost(%);
; Z) R4 C* M/ f: Z" P" e; k
7 ~2 j, d( l6 q3 p同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量. - e: x% W$ |/ j+ o. b
> (1+x+x^2+x^3)/p;
, R- i3 g5 t, z0 H' G# G
3 T: o' ]& o, _: [> cost(%);- W3 N; D! i* K4 J$ K
5 \4 f$ T% F" m; V2 [" J' H4 o
> convert(%%,'confrac',x);
8 l, {3 `; p8 @  |. e - E  n, H/ ?1 y$ B
> cost(%);/ w7 v1 Y% M) k9 i$ k0 Z

/ u3 a6 @9 g: b- R6 j' ~  u在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式. & s8 l  i0 o; R
> convert(%%, 'parfrac',x);
4 Y: y2 \0 u5 F  z+ S8 `1 V) W " O1 C7 x7 N2 L& N5 E" K& _$ R  Z
> cost(%);4 L) j5 r  V' T9 `( e3 w; x6 T

, E! c& P9 g; c0 o5 n而把分数转换成连分数的方法为:" l# R5 m" l& U0 q
> with(numtheory):6 J# S# s, S2 F* ?
> cfrac(339/284);
- K& s$ y' {8 \% _& _$ A, {/ o + c2 q) l5 h. C' H* Q
2.2.5 函数的映射—map指令
9 n4 m* z* f4 ~( _- l% w在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:
# F6 `3 U& L: Y1 bmap(f, expr);      #将函数f映射到expr的每个操作数6 r, p3 Q3 N1 W5 Y8 h( h' h/ U
map(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量% D/ F7 f2 f; k( ]* c8 d  T% l' v  m
map(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量+ {- n6 z4 E3 H6 a
map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为3 ~% n+ e- t7 p3 k  }$ I
第3个自变量…, an为第n+1个自变量来映射函数f
# |/ [8 k; m: [: D> map(f,x1+x2+x3+x4,a1,a2,a3,a4);
8 {8 l) R$ \, }; [ ) h# L! b0 M) E+ F/ L& E
> f:=x->sqrt(x)+x^2;
6 k. s2 o* g' X + q7 q! V# M  b4 e
> map(f,[a,b,c]);
$ d0 n3 P  L+ y/ Q # M: c# u, ~  C/ i4 O( {2 N
> map(h, [a,b,c],x,y);
* T5 x5 ^; o: N 1 R8 y. {. X. l, R* \7 B8 v" d! r& p
> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);
- ~1 `3 n% V" \( f' S; u
' l. {6 i; E* i) y> map(x->convert(x,exp),[sin(x),cos(x)]);
* Y* q7 `, u  @5 H! Z 3 A" b5 c' @8 [5 Y9 L: W2 p8 ^
上式的映射关系可通过下式理解:
0 W* b  l% B- x( i5 r: S5 W> [convert(sin(x),exp),convert(cos(x),exp)];7 G0 l0 q* m. }/ R" }+ D) O( z

' T; D% J- P$ E3 C* c0 \> restart:
5 I8 Z6 f. o: W' u9 ^) ~: X, s. z: gmap2(f,a1,x1+x2+x3+x4,a2,a3,a4);
* q: O- h$ l% J. p- s " ?# C- p, m, [5 V- C
> map2(max,k,[a,b,c,d]);
7 x" w5 K) g& b. x: m7 Q; C) a1 J
9 w% W) ]$ D. {# ]! S0 T0 O1 _再看下面示例:   8 T0 T% g" X' w: ?, P% p
> L:=[seq(i,i=1..10)];  \2 ^+ b8 M( T' K, [3 f0 x3 l! b
7 `3 d; Y) V* Y  K& Z+ I2 Z9 a
> nops(L);3 E: ?7 B1 S/ r+ i7 B
1 n  }8 p6 P2 ^
> sqr:=(x)->x^2;# K* o# c( w  x  m
5 M+ v0 f9 e, v6 S( u. e4 \
> map(sqr,L);" \1 \0 `4 S- w8 x
/ z( y5 y; n& ?& @* h9 b) n
> map((x)->x+1,L);
9 q& X: R0 l4 t( r2 m * o$ s0 Z7 y; S& ?: e" A$ Q
> map(f,L);+ G: Z; P6 I# [/ b; p
6 J* E) {. w0 R
> map(f,{a,b,c});
3 p6 ?: T$ w0 z  H
/ b; I- t& a1 _> map(sqr,x+y*z);0 ~" t5 j7 l9 g* r- k: a) d) \! _
4 Q* ]7 l! u; t2 k1 w1 ^
> M:=linalg[matrix](3,3,(i,j)->i+j);+ ~! \- R: G7 D6 \7 U, y# ?1 I

! W- n$ I% U+ p: x6 P> map((x)->1/x,M);
* T7 p! N3 y, h  v 2 o' o% r* `( M& v! k( m/ t9 V# L% H3 }
3 求 值
9 b5 N" V, v* J' C4 H3.1 赋值: {  w" A+ G) K8 a4 u
在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子.
4 ]  U5 j% x1 v> p:=9*x^3-37*x^2+47*x-19;
3 }2 S, Y0 V/ u; F3 K( p . y7 B$ D) L; m/ ]0 K: f
> roots(p);
. X: Q7 Q- c% T$ O
% U# {5 A- B. I, D8 g3 S6 N> subs(x=19/9,p);
9 D* I7 P8 e8 t5 m* j
% L9 c. g: M. n4 W在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证.
5 N9 t  ]7 R% `* P" Z8 d3.2 变量代换
* w, W6 P+ Q6 q1 o$ l/ R* \, B在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   1 x3 b& ]3 [, S( X8 M  x/ d
subs ( var = repacedment, expression);
8 k, A. |1 ]2 I/ Z0 O$ S调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement. 4 G2 d7 a9 P; I7 a
> f:=x^2+exp(x^3)-8;
; ?- r7 z+ d% I7 P2 L* |# F $ T4 U. F$ k9 M) o3 H7 |8 Y. T
> subs(x=1,f);
8 {/ a# l3 ^3 W% a: N
, M8 Z' \$ Z8 \( k> subs(x=0,cos(x)*(sin(x)+x^2+5));
& h9 m) E0 A* E$ E
+ `' U- L6 v5 H7 e1 e$ D$ E    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   
3 S, {3 Z/ b( T9 p/ ~( G; M  b8 {  U> evalf(%);
: M" \. c) X$ D& u8 k
& ~2 ]; A1 F. C6 W: i变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   
$ S8 c' _5 J0 \$ ~0 r6 b2 v  W* ssubs (var1 = repacedment1, var2 = repacedment2, expression)
+ `  z$ s/ `+ D! x) t. O' Q调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   1 P; v0 L# t6 r$ Y
subs ( {var1 = repacedment1, var2 = repacedment2 }, expression)  L% O* }( I, p& ?
下面通过例子说明这几种形式的替换. 4 P0 _* G9 [" ~4 n- H
> subs(x=y,y=z,x^2*y);              (顺序替换)8 p) E- y$ n3 l3 j3 v# {3 b
  d  I6 k' i$ F
> subs({x=y,y=z},x^2*y);            (同步替换)+ B  B, `8 d/ a, H" `' R
4 E+ O0 S, L8 }! K
> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)
) w7 ^7 h' G$ I/ L* V, \) n
! n( _- H/ j  _: q+ G: o1 O3 L> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)" `4 h/ O' A$ e2 p% W5 G  ~

4 c$ d/ [  X/ o: l+ P> subs({p=q,q=p},f(p,q));             (互  换)
' R9 I' N6 l+ h  h+ Q) Y" V
7 P2 I7 e3 i1 a2 h  ^0 A3.3 假设机制
( B6 V& Z. b+ a0 F. bMaple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点. ) @* |, z3 {) q$ a  x
在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);: v( w' Q, m2 Y% @+ H. Q
函数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);”也不会产生矛盾. , {' N" g0 H) v4 M! n
> Int(exp(-s*t),t=0..infinity);
' d0 V0 {# U# `0 o
7 d5 q" m* S+ M6 a/ A% D1 a> value(%);! |7 _, k; ?% K$ \, k) D" M* M
Definite integration: Can't determine if the integral is convergent.6 V  c; a$ A' Q% H" Z) G
Need to know the sign of --> s1 r. q8 z0 h- q
Will now try indefinite integration and then take limits.. ~' J' m+ L& G2 a" E, J9 ^

3 I) y# U! o* A+ `1 t8 }> assume(s>0);
5 D3 e. D  v+ B% h> Int(exp(-s*t),t=0..infinity);
2 G* @; d# ]9 w, o; z) y- Q
0 G4 o& v) J. ~/ K6 c> value(%);5 M6 y9 N! e6 \! \! `
1 O% l9 H# i2 S1 D" L- |4 G9 Z
3.4 求值规则
, g7 h/ J% g& F# {, ?: ^, \6 t在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
" t8 ~: H3 v$ f# m> x:=y;
7 F0 K0 h. V4 J5 P+ p
/ X& h+ F& V4 U' }" h> y:=z;
3 S* R7 ~+ G" H; f3 |% I: H. X& \ 2 h+ ?4 [- Q: R+ K  _
> z:=3;; r2 m+ }  T7 g7 P" r- y. O

: j+ `) ^) Q3 n$ D/ b5 s# X> x;
  o# [' {& [* Q ( r; X* L3 }& o# y" W. C' g
> y;% Q2 P. O6 g2 P7 K( f
* P& B; Q& h( z
> x:='x';
6 |# F& I: ~9 V
% ?4 H, t: j3 G/ z$ w+ s5 h: Y> x;7 ~7 ?% ]4 A* e2 _1 q
. @9 ?. f9 w! ]4 l7 \
> y;# I, R% R9 W9 C0 F, g$ H
' k6 n+ i( Y2 Q7 U  }
对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   : a# ]  `( R6 Z8 l. _
1) 对表达式求值
. b% f- p. e, Q" E+ C命令格式: eval(e, x=a);  #求表达式e在x=a处的值+ s6 \: @! M8 _2 j! W. Z) }
             eval(e, eqns); #对方程或方程组eqns求值
* s2 A/ |& O6 G             eval(e);      #表达式e求值到上面两层7 a0 Z# |( p; M0 }$ S* s. ?" ~
             eval(x,n);    #给出求值名称的第n层求值
! C" l' V3 T" m> p:=x^5+x^4+x^3+x^2+x+73;: b! [8 j1 I1 \  M
. `1 j7 y- s7 s' ^' x9 O5 \
> eval(p,x=7);
0 u$ R7 C7 E/ C3 q! M3 w+ k! t. j - M* V; _2 I- ^' i7 f+ F3 U! O+ \
> P:=exp(y)+x*y+exp(x);$ `' y4 f. x) m" h- b# E7 t

: F6 T- m9 T0 F- k$ B9 k1 i> eval(P,[x=2,y=3]);! s$ ~% z" ~6 V: y+ `6 j( W8 b
+ X) p; n( b/ Y2 R, h. p
    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   # }8 L. V) R$ y: N! c2 h
> eval(sin(x)/x,x=0);9 Z7 I8 \* G" j* H5 }
Error, numeric exception: division by zero
/ V9 U7 o1 v0 l+ E/ Q' s3 \: G    下面再看使用eval进行全层求值或者对名称几层求值的示例:   
) t* l/ O: F% n) f1 {! W0 M> a:=b: b:=c: c:=x+1:
' N. c+ H1 b/ Q1 _! U8 g> a;              #默认的全层递归求值  ]# Q# Z- P/ k4 I& i7 w& U: O
, k& s7 u5 u" f/ u
> eval(a);        #强制全层递归求值
1 X/ x8 j* _0 y/ z1 l4 K5 g
. C3 ^1 S/ R( z: o/ u> eval(a,1);       #对a一层求值
# J# ]) ^: C! R" B
) }  D; V8 r$ g* w) |. |, |> eval(a,2);       #对a二层求值
: y. |! A' H8 J0 Q . P- d4 R+ Z! ^" m; J" b8 U
> eval(a,3);       #对a三层求值
$ _% s$ E4 S. }4 e5 E : p) M" w3 s; N
> eval(a,4);       #对a四层求值
- [' |" P; G+ H: K$ f6 @4 |
, l# f; _1 j+ s) \5 v    2) 在代数数(或者函数)域求值: c3 f/ K5 ~2 v5 ]! _( y1 X
命令格式: evala(expr);       # 对表达式或者未求值函数求值
  G5 _6 @5 ]5 i+ S  S5 e$ ~             evala(expr,opts);   #求值时可加选项(opts); j7 x5 M+ E- o* R. m
所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式. & j/ \- \( i+ x7 a, i! c2 x
代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   6 n; c  d( S9 O! m9 ~
> alpha:=RootOf(x^2-3,x);
) L1 L; K3 d- N$ O0 L: L4 S
( r0 r) P: J$ H3 w" Q4 J4 O% m. K, l> simplify(alpha^2);6 [0 H+ W" f; P! l1 h( _8 U7 p. \
- L8 j9 Y" G6 ^# I
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:
9 T2 F8 B! F9 ^" K( }> alias(alpha=RootOf(x^2-2)):2 u- b; M0 s. e2 O6 E: a' F3 ]
> evala(factor(x^2-2,alpha),lenstra);
) P( m( f/ j4 P3 n
) g  k$ y) z6 f2 K6 o" ~* v> evala(quo(x^2-x+3,x-alpha,x,'r')); 6 C* X8 F; z( m' }

* d: L- }& I& d0 {> r;
; ]- U8 i: S6 D% j8 e" M- T , x! C/ g) N& e! y1 E0 d6 g7 Z. B
> simplify(%);
: o) v! q& E: C+ f
9 z6 C9 A$ `* E) ^& G+ X3) 在复数域上符号求值
7 \, ^# w# I% o0 V" b+ r操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:
5 ]0 i3 }' D( T+ O3 Y, I8 y5 }evalc(expr);   
  ?/ `! Z' \4 w3 k, revalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2.
% [3 l. \+ d( x5 i8 z  d& a3 L0 k, U> evalc(sin(6+8*I));
. B8 {, e2 U, I1 L 1 F7 A4 `1 t3 c) f# O( S
> evalc(f(exp(alpha+x*I)));" g& A, _7 D! _
8 F: z& G* L" {1 H+ b6 g# A
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));; u! p8 W8 X" c' d5 H2 r! y
9 G  H2 g* e! D; ?6 {4 r/ h
4) 使用浮点算法求值5 Q$ W. f9 J! I# u& @
浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     0 x6 G2 [, X( u* B) L6 a
> evalf(Pi,50);    8 U4 d, _9 X4 i
. ~) R  X7 P" ]7 U! D* r) X
> evalf(sin(3+4*I));   
# t- ?$ k5 r: v3 l" E
$ f# L! y+ N7 Y0 \' s- y7 N" Y/ i6 L> evalf(int(sin(x)/x,x=0..1),20);4 S, P- g9 x- n/ Z7 R1 W7 Y, i! g
. _# C  F" Y, E. P6 S& a$ W
5) 对惰性函数求值0 s" a' R( K) b; t! n% z
把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   
" |: P/ l1 o  D$ w& w* q> F:=Int(exp(x),x);: N  m2 |* v  y

; N# |; ?& V' P$ @6 W: O> value(%);
$ b% Y7 ?* R. [! c) x
) h8 U5 K6 j$ N! ^4 b8 p: U9 w> f:=Limit(sin(x)/x,x=0);. N- S9 D9 o  Q; o. ?& S

3 P( F, `. C; s8 P" ^" q. Y> value(%);; [" Y' {; f& P* C) {

2 s, }9 f2 e2 d# a1 R* f. R另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   6 I4 U8 R+ X' L' k( a& ]
> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
. w# R! P% G5 A( S' b" f/ ^
; x- s8 D0 L6 W! C1 |& D' q3 [4 数据结构
- M0 s4 l  r6 E& p! W8 J# _) QMaple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表.
+ a- S" z% V5 D+ S4.1 数据类型查询
5 d1 y0 a* M# G, W7 a7 Y在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:   N/ G( I* @5 ]: L$ Y* \; F
whattype(expr)        # 查询expr的数据类型
2 F" F+ D8 u4 X& Q. [type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false1 n; o4 z8 k; R! \
> whattype(12);" w+ u0 Y/ N# O. R" p( w) }" c

0 d7 j3 @% c7 I- p' K> whattype(Pi);
& D. y* ?2 W1 l: ?- e9 S
% i0 o" S. v# x3 a> type(1.1,fraction);
3 @" f- E' u3 B3 r0 ^ 2 o) x' M4 A/ v" J  ]% }' L" ]
> whattype(1.1);6 `% i5 R& Q8 l/ _) ], v4 D
9 N/ r/ y8 J  \( I7 o! G
4.2 序列, 列表和集合
% _# A6 x$ }, t; \$ c! M4.2.1 序列
  Z6 H; y; P" ?! r# r6 M  W所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
/ ~, ~" r9 ?  g" t/ {% G> s:=1,4,9,16,25;
9 [7 f: \6 K2 X# Z( D 8 q' }0 Z( i4 O) R5 F* _7 B
> t:=sin,com,tan,cot;, L$ A% T1 V% t" r  D* n6 A
1 ^6 ^8 U2 y5 B7 o: N
一个序列也可以由若干个序列复合而成, 如:   ! y3 B" x% [: ]
> s:=1,(4,9,16),25;
7 Q# X: @( N3 p. r# S9 j) Z, R
+ m6 \, ^% h4 P' Z7 m8 ]> s,s;
3 f- G, H6 o; U4 e: Z
% K) S7 A5 l" p7 Q- p而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   8 j9 H7 ~' X. q9 f$ H- ~. s* _
> max(s);2 W6 u2 \: g) U+ i
) j$ A0 T, t# x
> min(s,0,s);
  u9 ~9 F# \' W5 A8 G/ I
' Z( K# y4 V& ]2 A值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中.
) b8 q7 e5 z$ X( @> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;
5 G* i9 b4 H! M: b
9 @2 X$ I+ L4 S8 [8 @, v> op(s);! m- D- `- A8 d) l
Error, wrong number (or type) of parameters in function op0 z! L+ G/ z' I
> nops(s);
) U# R* X7 }1 f, e/ ?$ `9 Z  ZError, wrong number (or type) of parameters in function nops7 a0 p' t. T5 a7 p& B8 W
> op([s]);
8 M) A2 W7 s! e& y, x! N 1 p: }& M, a" Y7 t/ g( R
> nops([stuff]);
) R) X5 Y* p) u) E
9 t6 m/ y) O4 y3 H% c9 [函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   
" _( N3 K3 S+ \) Vseq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)
- j7 z1 `; y# ?seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列
4 g& ]. K$ R  b# p' t! jseq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列
1 g% {  c0 F! o, N  x. u> seq(i^2,i=1..10);
5 h  Q! Z0 w& h4 n, B$ c 9 P# |( Z5 V$ ?
> seq(ithprime(i),i=1..20);
5 {0 C. i7 I. `  E 9 J' l7 _  R: N4 M
> seq(i^3,i=x+y+z);
2 f' @0 C/ z; q; \  v7 S8 a
% L% e8 H) a! w; A4 Y3 U0 r> seq(D(f),f=[sin,cos,tan,cot]);
5 U' J0 N6 z. O- }$ H" B2 Y
: L2 E8 ~, ~) ~' t> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));
8 ]" F: n8 k2 w! [! W; _, ~6 } + ^& s9 m. {/ I( u' c# t
获得一个序列中的特定元素选用操作符[  ], 如:   7 b# {6 g/ Z  s
> seq(ithprime(i),i=1..20);
) U/ E# v6 L- Y( Y$ R* c% h7 n 5 }+ O; A3 z4 p9 E
> %[6],%[17];- Q& c# @! \8 O. ?6 K
  s4 c; X$ }3 ^$ G6 j0 w# K1 p3 }
4.2.2 列表5 @* A% N  _! H/ Q6 m& W
列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   ; J: V) P! b4 K" h
> l:=[x,1,1-z,x];
5 d- A" Y, Y% }" A* r+ V. O' T
* I$ F3 h1 k! M+ p6 q> whattype(%);8 s5 h' h  {7 t& \
$ w" y! [* L( S* t
空列表定义为[ ]. ' `5 Q" c3 ], ^. K/ r
但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   8 Y  p1 k( t6 r7 E
> L:=[1,2,3,4];9 x5 F1 c+ ~( }3 O
9 u1 `( N4 `. P9 X: x% Z
> M:=[2,3,4,1];
. n' u* d4 R; q
7 ], N, n* ~. v4 r4.2.3 集合5 }, a( c8 E; z& m9 Z
集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合. 9 K% i& X8 n9 ~* }2 {
> s:={x,1,1-z,x};5 a/ P9 |, |- r: g) ^& O
5 g; v" L' l) t! b: w9 D% V+ Z
> whattype(%);
: l3 q& {6 c. G% r
  x% s9 S, H( F) {- o1 a9 Q空集定义为{ }. 5 R/ y5 z4 N2 w  d- J
函数nop返回列表或集合的元素数, 而op则可返回其第I个元素. 3 h! R4 F8 M" e! F- b$ B# M' w
> op(1,s);- ?( j7 G1 P0 R/ W4 _; V

4 `" ?7 y; v5 I2 W' J  n> s[1];
- j$ H  n7 S: b+ ?7 V: y) ~ * E7 F2 W, {; P& u8 M% h6 t/ K
> op(1..3,s);1 Q3 g/ l' U9 R) F- h

5 i- [' y; G6 ]) ?# ?> s[1..3];& S) W. g' _) `+ L0 K7 I$ ]
% z* q3 e3 N8 ^9 b' X: `
函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false. $ [6 k. R- I& I
> member(1+x,s);
5 ~# [, Y8 p% y/ X2 E! j/ B: { % w% }6 Q; v' Z
可以通过下述方法在列表中增减元素:   0 g/ s1 z, D+ b9 Z/ m
> t:=[op(s),x];
9 d8 s' b, _4 N . Y2 G% D$ D6 L8 \4 x: N4 g
> u:=[s[1..5],s[7..nops(s)]];
; y: J$ p  J) f+ P, X + c3 T" S3 B/ s) l- p& s
Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   ) f. Z, A3 r6 Z2 C% U$ g
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};
6 S- H2 W. a) x0 z" Z; l* v8 W 9 q9 j% j/ A& ]( C
: z1 c9 y$ ~1 @6 J7 K6 C1 ]! H) w
> A intersect B; 1 J/ s7 X4 `1 \7 `, [3 h0 f

9 |( S, G2 V7 F' S1 ~) K6 C> A union B; + d0 V! E+ y! }( Y& C

/ [- w- y$ p$ i9 O( h: ~% j  |/ y> A minus B;4 H+ X; s7 s" u
1 @  K! O- w5 j- J4 H$ O' U
4.3 数组和表2 j" V7 @/ b" Y6 m# {2 M  m+ I
在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令. 4 w% P  n9 f3 m0 k& u
    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的.
! J: ^$ s' U- E+ W0 M: H6 V: u9 _) S5 z> A:=array(1..4);
$ G1 ]0 `4 `  `" Q! m# y% H 9 J6 J3 L( v/ K& v# C9 N! F7 u
> for i from 1 to 4 do A[i]:=i: od:3 O: V2 |) h+ U; |9 d
> eval(A);; D) Q1 @, B# X- W0 e0 a0 j
% S  M/ z" y; y. F
> type(A,array);
7 i/ u" Y0 q* r4 t
9 z" \6 F; ]" I; [0 i# k9 y> type(A,list);
; F. K5 p  Z' p" U" g$ {: U- ` ; F) z# t( u0 p: S" D1 W5 X8 {- R
> T:=table();. O; d. f3 B# |# @+ X! F

+ z- U; l+ t- k0 ?4 d. T9 {> T[1]:= 1;
: J0 h% G; q) V' H) T( E , i" T1 `3 M9 {, M, u) a
> T[5]:= 5;
2 \1 L! n% P5 U# l; Z ) x) w. U1 |* V( a; E
> T[3]:= 3;
, a' J2 ]$ ]. g& B# ]; }" |
+ z/ V" y+ x* P> T[sam]:=sally;# P8 B! n" J1 s+ x9 O+ O, v# w

/ U- T7 }( J; M% M> T[Pi]:=exp(1);2 q' b/ L. g  ]
+ m9 K3 f. H% s! R( H
> x:='x';. `5 ^# F1 x5 h: q

; |+ G( ~; y$ `> T[(1+x+x^3)*sin(x)] := 0;
9 l$ e  K1 b" c! N& p' L$ E* K( O, U 9 Y- W: B" V; L5 n1 B  K4 t% u0 v
> eval(T);6 F. z' [( ^1 \  O
- i' H5 V: h# b7 ^$ r
> T[3]:='T[3]';. O1 f" @) @0 d; q2 w

" n. \( L8 X' ^> eval(T);2 E+ ^* p, r2 e1 e, K
) J* m! M( q/ o) P# w) z
4.4 其他数据结构
/ G0 x; W2 q. C串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来.
# E3 X' y( q$ f9 Q3 C5 `) m% S: L" [索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
9 U* M1 x5 D3 s( T2 O* L+ ?, u> x:=T[3];( \5 V4 E4 k% @5 [
- T8 {. J$ e$ v& C* k3 f/ J) f
> eval(T);& l/ \$ A( T/ D/ u  Y: w8 j; ?
8 R$ ~: [1 ^6 P6 e2 Z. X
> T[5]:=y;
& S* I5 N/ d; [
' V- f- x) M0 V$ Q> eval(T);
4 g& e% q) i4 ^& c
- a5 C! X) ]& ?由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
! U0 J2 h9 n$ U( _! T, k9 b数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. . o; A' }) S: K, X* a
4.5 数据类型转换和合并2 Z' K" l) f% z# }- x( h$ J
convert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   
; V, t) U6 |/ K- ?0 w2 L' W1 I> L:=[1,2,3,4];
( r5 l% g0 G; j" A- Q6 M
7 [4 N( t6 ]- v! Y> type(L,list);
1 E6 u0 U! i- S9 X4 o/ s0 P" Q* _, p / A9 C; b  w- Y6 M
> A:=convert(L,array);) \3 _" l7 }: p9 z" F5 m
- l. D" |( E# J& |+ W3 {$ d
> type(A,list);6 Z) \) V" i7 d, v

- ^4 d0 S* ^. M& z> type(A,array);
& w3 K( _8 a1 ~% u9 v
9 W+ [% o8 J" d, |: d另一个有用的函数zip则可把两个列表或向量合并:   / h( u6 O- V  v# B  k
>L:=[seq(i,i=1..10)];
, L- L; y' ?" U3 |3 f3 t* T
& _) P0 i' w! j3 `- z> Sqr:=(x)->x^2;
" o; @  I! n3 k% s6 D, G: x
( y8 ]% @3 p8 E) r9 a( B9 N> M:=map(sqr,L);5 Z, s6 ]$ Q" g9 M2 u, g% s; Z
& w5 F; T0 Z5 C/ P
> LM:=zip((x,y)->[x,y],L,M);6 V- g$ M) ]5 V1 E( T3 A
' d# B0 ^( e* Q$ E6 I
> map(op,LM);
  l4 b' R' P% H4 u# x" Y- K: @
8 a) C+ k( q5 d- f6 D: y' h5 Maple高级输入与输出操作
5 ]0 k! c( k; V% d) c4 g) mMaple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里.   s+ k5 x: L' a9 {5 G
5.1 写入文件
  G7 q  w  u4 O% y8 Y5.1.1 将数值数据写入到一个文件  y4 k6 T" x6 N0 L, y: z4 S
如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令. ; v( ~. I2 H$ S) n, u. ^6 V! X# v
若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);
/ ~  `, \1 h4 ?# m> with(linalg):
0 d6 S3 f) Z( V( A% L0 H> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);5 F$ J0 h2 v: ^  u; M3 r/ {

' l* r1 U, J7 h( ]0 w+ Q8 k, O> writedata("e:\\filename.txt",M);
5 D3 Y+ f7 e+ I( g- i. h0 c而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
+ z4 U- [6 n7 _4 W' Z> W:=matrix(2,2,[1,2,3,4]);
9 D; j$ |& Q, H- K
9 [% F7 q- b# O6 ^> writedata[APPEND]("e:\\filename.txt",W);; H' g, I+ n% W( G1 V. O
需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.3 w- m: @# {$ S" U$ E
另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);9 }% g- }  H& {$ m0 ^
> writedata[APPEND]("e:\\filename.txt",W); 1 a4 S# ^: U. Q: }' v$ A8 W- ?
> writedata('terminal',M);+ |$ K' e/ @: `% l
1                   2                   3           $ ?, g+ a0 B2 }: @9 @1 b
4                   5                   6           / U4 ^% j9 l: |; u% x9 [
7                   8                   9    # a  n% r1 q# _; b/ l
5.1.2 将Maple语句写入一个文件
- L# q' ^$ l! d, z% e# A如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:
' u" ?: |8 B' x/ q' O+ @3 E) g3 jsave name, "filename";
  D1 p9 I( n8 ?. `  b$ lsave name1, name2, …, "filename";
  ]! [5 `3 J4 L# L若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
' a( T1 R2 D& L  ?0 w, n0 Y, l> myfunc:=(k,n)->sum(x^k/k!,x=1..n);
, B+ D( A% K% m" s: I0 B
$ E/ G3 U8 D8 G- |3 h( j> myresult:=myfunc(6,8);
0 h( z+ R6 G0 z# s* s, g. ?$ n ' h4 y9 R  `. B1 @4 d0 ?, W
> save myfunc,myresult,"e:\\test.m";
2 }& |: Q8 t2 p. [4 [3 g% b5 C4 U调用已存m文件用命令read. 试看下述实验:* {$ A) |& G& p) k& Y) M; B: y  l
> restart:5 T; ^* e$ a8 |
> myfunc(6,8);
1 ^; J# D3 G8 \9 L) m& K8 B ' c/ A- G0 }3 G$ ^" c
> read "e:\\test.m";* S, z  R  ?1 ?" O
> myfunc(6,8);
; G& I- A' E1 ]2 P2 V1 b7 m5 w
+ e0 V+ U( m: ]! g) e$ `> myresult;
1 z* t: W9 N6 _0 Z' d1 e
' W% U6 K! P, G; `( I: I    而存为txt文件时则将整个语句存为一个文件:! K, u9 J8 W5 W9 A* ?) I( ~7 _
> save myfunc,myresult,"e:\\test.txt";
0 T8 X+ _  x" \0 [) z> restart: read"e:\\test.txt";
  N) U" P' l2 F6 _/ }  J; Y$ S1 S% u8 Y
' [1 ^+ ^/ T* H6 W8 U. J
. Z$ k. o, h+ r5.2 读取文件
( C6 i- s) |" [6 K+ U在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.; k, L2 a! T( b1 n1 k1 E  _7 l/ r
5.2.1 读取数值数据
( L$ E5 _, B' o/ ?4 J8 ?* Z% O  F7 s如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.
% @6 S9 a1 H2 p2 G$ Z2 m从filename文件里读取n行数据时使用命令: readdata("filename",n);
9 ]! d, v3 t) }7 R9 e以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);2 Q/ c3 o* v# ]1 z
> readdata("e:\\filename.txt",3);, H# c8 P9 i5 o

1 s! O% a4 x' b) |    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:& t! {. S, E% `$ W
> readdata("e:\\filename.txt",[integer,float,float]);' R' q1 P6 W5 f$ L2 f) K: o
$ y+ q2 E% t# t' a8 N% v$ I
下面再看一个运用大量的实验数据在Maple环境绘图的实验:
$ b+ r' [2 Q2 h/ C. m! B% k> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:
0 }0 l% T4 D/ o& G) V$ }. g: J: N> writedata("e:\\data.txt",evalf(mypts));" y" @. {- m9 Z& h/ m0 e
> dots:=readdata("e:\\data.txt",100):
, n; m9 H, P0 q: |+ k4 L' S> nops(dots);
5 l/ O9 S8 `- I& x! q
* `% `% y, [% e. y- V6 O> dots[1..4];
2 {$ n8 j5 x3 `3 j  R- d . w& H6 r  D& I2 C! \+ F1 \9 h
> plot(dots,style=line);
6 u( n& \$ N( S) J' U8 c& z * }! c' b% u+ _3 z: P6 M
5.2.2 读取Maple的指令
) L" H- O! [  ?6 i% N- j在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:
5 s+ n: ^* w4 I; H# jread "filename";
7 X' |' h1 D8 t7 K: A! W! ^如下例:
) q0 t1 w. g0 K" s> reatart:4 n6 g2 r% a9 o* |( U; H: P
> myfunc:=(a::list)->add(i,i=a);
" r) d& [* h2 M7 b& k1 D 4 ?9 ^4 s1 ]  T# v; h
> avg:=(a::list)->myfunc(a)/nops(a);6 y7 }6 R0 |0 \" G1 W
2 `  c1 _0 A* F4 H$ \
> save myfunc,avg,"e:\\function.m";! F! k* k! i5 x3 u2 {7 E8 K7 G
> restart:
% w: m; O. p; b) S> read "e:\\function.m";
9 ]0 g" ]4 M6 d> myfunc([1,2,3,4,5,6,7,8,9]);" D3 q8 k0 v5 J4 ?8 t, l
7 w) N6 v1 v9 _7 c6 `' T
> avg([1,2,3,4,5,6,7,8,9]);
. K. y7 k3 p, u9 O* ]2 G' v + F' P8 o) K! {9 {
5.3 与其它程序语言的连接
' O; i1 m/ w  A, }4 G5.3.1 转换成FORTRAN或C语言9 }, {: z& H" b; b4 U6 D6 ?
调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:6 J! u4 T5 D8 b
> with(codegen,fortran):
8 ^9 L" _0 e% @& `6 Yf:= 1-2*x+3*x^2-2*x^3+x^4;% _/ }/ ?( J4 ^5 Z4 j
6 W$ W7 r6 F6 Y9 m
> fortran(%);3 a- r2 [& a: f% j
      t0 = 1-2*x+3*x**2-2*x**3+x**4* C# A; w; P, p1 r: b
> fortran(f,optimized);) t) }: J; v8 K
      t2 = x**2
2 \4 D/ q+ [' _! A- j8 Z      t6 = t2**2$ e, x2 ~4 L' c! H
      t7 = 1-2*x+3*t2-2*t2*x+t6
0 q- j8 f. Z* f9 T9 B" F# r> fortran(convert(f,horner,x));
; V. t' u8 J' @: w" l( g      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
! {( [: W6 {& }2 d% O, A# E而codegen程序包中的C命令可以把Maple结果转换成C语言格式:
9 t8 s# M; Z* N# Y7 R, g! ^> with(codegen,C):$ G: ]8 }6 r9 I0 u; J5 H) L9 h: A9 k
f:=1-x/2+3*x^2-x^3+x^4;
/ K; h7 t2 b3 @1 E& i) b# f
7 ^6 u8 }+ [( ~> C(f);
& y. ?$ t4 r) b6 R1 v      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;" ?# [( O# E6 V; ~& r
> C(f,optimized);( ~4 A! g6 }+ I/ A2 V6 Y
      t2 = x*x;
2 k' u+ d. v6 l4 [7 ^1 v      t5 = t2*t2;
/ ?; C4 H8 s& \8 R) l7 L      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
5 g2 v. Q% \* V8 {optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.
+ X3 x- }4 i! Y0 Y5.3.2 生成LATEX6 s- n0 {$ C5 O! A8 F; g2 ]; Y
Maple可以把它的表达式转换成LATEX, 使用latex命令即可:! F3 ~/ Q, l0 G! ]
> latex(x^2+y^2=z^2);! P8 D) F3 L! ^8 x3 z2 Z5 u: R" P* |
{x}^{2}+{y}^{2}={z}^{2}5 J- j- g2 B6 l! k) R7 ?
    还可以将转换结果存为一个文件(LatexFile):9 W& h" y/ w. L
> latex(x^2 + y^2 = z^2, LatexFile);+ W7 D1 O$ Y# L7 q, ^( k8 y
    再如下例:
. Z! b% }% ^. C, l+ M  [: d4 U> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));
" K0 }' H1 G  x8 c\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)& ]" }4 W  E$ ^
$ P3 T: Y6 H" u4 A8 r5 `
zan
已有 1 人评分体力 收起 理由
darker50 + 2 用word发不是很好吗?呵呵!

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

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

0

主题

13

听众

27

积分

升级  23.16%

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

    [LV.3]偶尔看看II

    社区QQ达人

    群组国赛讨论

    回复

    使用道具 举报

    0

    主题

    4

    听众

    181

    积分

    升级  40.5%

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

    [LV.5]常住居民I

    群组学术交流A

    群组学术交流B

    回复

    使用道具 举报

    0

    主题

    2

    听众

    19

    积分

    升级  14.74%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    46

    主题

    3

    听众

    1967

    积分

    升级  96.7%

  • TA的每日心情

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

    [LV.2]偶尔看看I

    社区QQ达人 新人进步奖

    群组数学建模

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

    群组LINGO

    听说女人如衣服,兄弟如手足。回想起来,我竟然七手八脚的裸奔了20年!2 j6 W0 \+ z% |) ]6 p

      U: Q! O6 j1 c7 K( V4 t" s+ b* b( u4 I+ U/ ^) B/ C% F* |/ Z
    回复

    使用道具 举报

    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

    回复

    使用道具 举报

    darker50        

    107

    主题

    45

    听众

    1万

    积分

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

    [LV.5]常住居民I

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

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

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-6-13 15:04 , Processed in 0.487107 second(s), 101 queries .

    回顶部