QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

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

( E9 w' u5 e, K! V2 d
1 `% D1 U. I( s( \8 C
$ t: ]7 [5 ]; j/ O: m0 r! N : d; a* Y2 s* v" e& n& F  [9 R" ^

" M* x: q' J! x, z/ E! u 0 C3 {8 S* X9 F0 O2 p; [

. i) z5 ?' j& B; [- U
; ?6 w* W6 u1 J+ Y) l   c; S- }& |1 F7 E, C& N) N

- \: p- [! r5 }+ N3 z5 m% \
$ \4 t7 c* t3 H3 L; e7 D
( k8 _# `% b: b' Calpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu1 z$ E3 F( Q: S2 C

  `0 l0 ]4 ?4 [+ ^' c " B7 }* q  D- A5 [- ~: E8 h7 V6 ?

9 Z+ L0 q" Q# p% {6 N8 R% y7 g 9 f) F" j0 i2 }; s4 h( Z. q6 Y7 Z

) B/ X( V* a+ q1 E  h : f3 c( F6 D. ~7 x3 Z5 o" Y. b

( A6 ]  `" Y  r% R) D
/ U' J5 Q9 h+ B, l- s0 {
8 A  H8 [4 r& i% ~* F7 v
7 t  H; v; [/ J 9 V5 ~' l. S! ~/ d5 ^" l3 n+ A
/ d  l8 {$ }" U! |5 q6 G% i$ K
5 n1 j8 I; q9 {, e/ j3 n/ c
nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega" |/ p* {  k8 Q2 g0 Q
有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:; [- R* J4 v: \- u0 P2 X' z2 K1 V' X
> for i to 10 do ( ^' t9 e& P+ \) g+ J# _* m
printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
& t. k! R! e5 H. [od;  A8 \3 H0 i8 m! A; u0 b8 b
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
; F# u* w3 C/ M' p  X+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:5 g! U) O2 b% N7 {) r7 T: p5 y
> for i to 10 do / h6 O, g) o3 {! t
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));2 P7 X9 J* A& Q2 l+ N  }' L
od;1 @& h8 ~+ w: K2 f) c
i=+1 and i^(1/2)=+1.000; @( N1 @8 P0 h, B/ o' `: z
i=+2 and i^(1/2)=+1.414! R: ?6 x8 }- J' Y1 R; p4 b. B" N
i=+3 and i^(1/2)=+1.732
5 g4 @& }6 s- ^- b; F9 m, ~9 wi=+4 and i^(1/2)=+2.000
# y& P1 v  o/ J! U! O+ x$ k& mi=+5 and i^(1/2)=+2.236' F2 V  l' @- z6 F) X3 {7 W1 _
i=+6 and i^(1/2)=+2.449
& K" i- Y) _$ v: d% `/ zi=+7 and i^(1/2)=+2.6466 V- O7 h: W4 f0 i- w
i=+8 and i^(1/2)=+2.828* A7 a2 T5 A6 V4 Y
i=+9 and i^(1/2)=+3.000
7 s7 M8 T7 @4 C) f! W' ui=+10 and i^(1/2)=+3.162
- ^& M+ I& K! O$ ?7 o3 h再看下例:将输入的两个数字用特殊形式打印:
( f* U# L6 j* @> niceP:=proc(x,y)
4 v& z7 [6 B; W( J# S0 c0 I& H; ?  v; oprintf("value of x=%6.4f, value of y=%6.4f",x,y);( a+ E) V; v: B) b9 w
end proc;) O. ~* P7 V# r

# V) z# w9 D) R( j  G- w7 Q> niceP(2.4,2002.204);
! d& P/ b8 Z* p: l( f" evalue of x=2.4000, value of y=2002.2040, {  g- \/ p3 Q: o% Z1 O3 U
1.4 Maple联机帮助- ?! t2 N/ O4 [! b# P7 C$ [
学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个非常好的联机帮助系统, 它包含了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的目录表, 跟有…的词条说明其后还有子目录, 点击这样的词条后子目录就会出现(也可以用Tab键和up, down选定). 可以从底栏中看到函数命令全称, 例如, 我们选graphics…, 出现该条的子目录, 从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们可以将实例中的命令部分拷贝到作业面进行计算、演示, 由此可了解该命令的作用.
# O9 Q$ L/ G- F* U7 C4 h1 a4 \在使用过程中, 如果对一个命令把握不准, 可用键盘命令对某个命令进行查询. 例如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的任何位置再点击菜单中的“Help”即可. ; U8 _/ T% u% L( z
2  Maple的基本运算9 r- v. @; o- V1 A
2.1 数值计算问题* H6 U; U5 d4 y; Q+ |
算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包括自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 只需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”.
! l& k- L3 }" N6 O& E% {' x0 b8 H在Maple中, 主要的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂,或记为**), 算术运算符与数字或字母一起组成任意表达式, 但其中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式只能有两个操作数, 换言之,  是错误的, 而“+”或“*”的任意表达式可以有两个或者两个以上的操作数.
/ b6 ?, ~8 w4 E5 l1 PMaple有能力精确计算任意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和任意精度的浮点数甚至于矩阵的计算等等. 总之, Maple可以进行任意数值计算. ) [' H2 z; _, Z
但是, 任何软件或程序毕竟只是人们进行科学研究的一种必要的辅助, 即便它有很多优点, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 下面通过两个简单例子予以说明. $ `1 \8 s, U( X# q9 _$ |- v- k  C
第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:   # f0 n7 U3 z9 r4 {
> 3!!!;
! f" D  d; i& u26012189435657951002049032270810436111915218750169457857275418378508356311569473822406785779581304570826199205758922472595366415651620520158737919845877408325291052446903888118841237643411919510455053466586162432719401971139098455367272785370993456298555867193697740700037004307837589974206767840169672078462806292290321071616698672605489884455142571939854994489395944960640451323621402659861930732493697704776060676806701764916694030348199618814556251955925669188308255149429475965372748456246288242345265977897377408964665539924359287862125159674832209760295056966999272846705637471375330192483135870761254126834158601294475660114554207495899525635430682886346310849656506827715529962567908452357025521862223581300167008345234432368219357931847019565107297818043541738905607274280485839959197290217266122912984205160675790362323376994539641914751755675576953922338030568253085999774416757843528159134613403946049012695420288383471013637338244845066600933484844407119312925376946573543373757247722301815340326471775319845373414786743270484579837866187032574059389242157096959946305575210632032634932092207383209233563099232675044017017605720260108292880423356066430898887102973807975780130560495763428386830571906622052911748225105366977566030295740433879834715185526028053338663571391010463364197690973974322859942198370469791099563033896046758898657957111765666700391567481531159439800436253993997312030664906013253113047190288984918562037666691644687911252491937544258458950003115616829743046411425380748972817233759553806617198014046779356147936352662656833395097600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009 @  f+ g* S6 e/ N2 L0 x
上述运算结果在IBM PC机(1G, 128M)上计算只需要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?" ]# S$ i2 a0 o* ^' {
为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式
# P( j6 C% s$ M! F9 J5 A* _# ]
; p# Z! g# c3 y4 l& x- D0 {可得:  , 前三位数字与Maple输出结果相同, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:   
9 F  q9 u, o( y) c- u; i
' |7 S, A, Z' D7 O( Y9 x$ K这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性.
0 \1 k" j. ^+ a& i! |, g8 n3 ]& ?4 A另一个例子则想说明Maple计算的局限性:   + o9 Y8 O3 w! P5 s( ~2 m3 _* w( X
  
3 b" _+ V. I2 a" _. |& Q1 K% o$ GMaple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:   
3 Y2 r4 H; t2 ]" i. L3 B 4 W* Z8 P0 o$ v/ ]; X
显然这是错误的. 这一点可以从代数的角度予以分析. 7 `  k4 S& F1 O" Q+ W$ s& G* e
不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果. - |2 v7 w! Q$ {( ~# _3 S
另一方面, 设 , 则 , 即:
/ j( f* a2 K: Q0 s. G + E" e# V! D# y, g- k
显然 有6个结果, -2、2是其实数结果.
! L1 ^9 S. `3 x! \* t% Q: W这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性.
1 m- L/ Y8 N' f( t* ~# M尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的. 1 m" j, x) m6 ?( n# p0 a6 z
2.1.1 有理数运算
5 Y2 Q* c( Y0 J& D7 f作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20). . I1 k" M! ?; j/ q8 A: K
> 12!+(7*8^2)-12345/125;# R( c: n0 s8 e; T- c4 D( |0 r

* r; H9 B* k: n8 `% b+ H0 t> 123456789/987654321;
- D  }1 M; P: U+ J  X! T4 G) \! C, a & ~0 _3 t& E/ M& M
> evalf(%);4 E4 U* L; m  V3 z0 C+ a) ^
, D" \1 a6 w! C8 t
> 10!; 100*100+1000+10+1; (100+100)*100-9;
: e& o1 o. |$ S7 f" ~
/ `, B6 F4 d' f$ j6 W1 E7 o % O& m7 J8 H$ l! O

0 n) f7 Z, @' ^2 T% f* w/ E> big_number:=3^(3^3);
; z9 u8 z, q: c6 [7 m
( i, n' I/ L7 M+ V0 G4 H> length(%);
4 H1 Z- t; p) B
2 D5 `, q9 h# d* ^; y( Q上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   6 y8 }: J* o) c, J$ x
    1)整数的余(irem)/商(iquo)5 g8 e: N7 L7 C% W/ Q
命令格式:   
  I. q  p: t& ^% D( c, W0 W6 Cirem(m,n);        #求m除以n的余数, N8 `/ c' `" |7 ~! n0 ~
irem(m,n,'q');    #求m除以n的余数, 并将商赋给q' R7 ]' _- Y7 T8 L* [
iquo(m,n);        #求m除以n的商数3 z) {$ D$ J0 d) a# l  N
iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r! p; Z8 \; D$ E
其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. & z' [1 f: i* I% c
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q
2 O6 r, U' r6 u! F: m . _9 Q( h  i5 h; V& Q
> q; #显示q1 r# g7 S* W0 G4 C+ F7 q  B* n
& ]- S" b! k  W6 f9 a
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
: S7 f6 g- v' \% C  `: w + H* H, G+ Z% T0 n) c- s8 I
> r; #显示r
% B# X$ j; L3 G' v5 i1 ? 8 g, p& m' G4 o7 w- `4 i4 \2 S0 x
> irem(x,3);
+ O$ N: E8 v: J% o$ ?5 w4 T
* K6 k& J: B% N2)素数判别(isprime)
: b7 J- p$ h$ X# z8 I  h6 q素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n);
; y% G9 \: g8 j: a0 l  P    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数.
' x( T  |  ^" s$ x" d. @> isprime(2^(2^4)+1);
2 h$ W1 T- H' k1 M5 W2 u
; m1 E5 V% U/ X0 t6 ?> isprime(2^(2^5)+1);6 Q; \9 g2 O: V# r( e& y. }7 M# r

& T8 M9 I" M) K: B( w上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多.
9 s8 l0 w. R6 o( H9 \' s( |3) 确定第i个素数(ithprime)% d+ z4 k) S# k- w7 C$ l7 N# G
若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);   
( n. D8 z( a4 z; E9 x3 r: f9 t> ithprime(2002);$ T" H( M7 q% l  G; W

* I" t9 G! h$ w0 H: X' _> ithprime(10000);! u- e9 t( t, I) y- _* t+ R
- p! p% y8 a4 K  o- J! n; n
4) 确定下一个较大(nextprime)/较小(prevprime)素数
; }' }/ n/ L/ }+ E5 A. ^0 ]当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
4 ]0 P3 K4 |' J' O/ j  Znextprime(n);  * ^6 S( R1 |( J3 \8 l
prevprime(n); $ `, H6 i# R  N; `5 ^7 r
> nextprime(2002);
* \9 c; Z% l6 `  ^. f ) h9 g5 e: t2 x1 t; g2 M
> prevprime(2002);* V1 n) L0 p& T
+ p  q: n3 f$ U" }. ]! z. v
5) 一组数的最大值(max)/最小值(min)
9 u3 ^% C& r$ L9 L命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值! m. T! ]" p  h; A7 f: N1 v3 ^
             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值5 K3 N3 K# ^7 t: X3 p
> max(1/5,ln(3),9/17,-infinity);
6 s9 k/ R; Q0 p3 f6 l) G1 J % ~- K1 l$ U; Q
> min(x+1,x+2,y);7 P- U! E4 u4 e) a& ~. j1 r' g

( ^' ~% p7 Y0 W: [: t  n6)模运算(mod/modp/mods)
6 b8 }4 K! ^. m9 P命令格式:  e mod m;    # 表达式e对m的整数的模运算( i& K5 r, u4 K( Q* f" r
modp(e,m);  # e对正数m的模运算# }( j* l# C: C# e+ v
mods(e,m);  # e对m负对称数(即 -m)的模运算( `5 C) b  D$ y3 s1 S: s8 J
`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价
: x, P# {% f0 o* ~值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. % G) _3 d1 d2 ~3 [  K$ _
> 2002 mod 101;
* @# d+ f) O2 h6 u& O7 c
9 E' }7 ]# V; ?2 r2 K> modp(2002,101);1 k2 {4 u& N7 |8 B

+ m, M: k) i. f- |9 o; E, w& }> mods(49,100);$ D6 M$ ^" }- r0 r

, c* w! S1 W+ R. l1 Z! }- U> mods(51,100);
7 r4 n& m+ ]# j; D, ~4 L0 P2 M 9 c7 A1 R% }1 o+ A- {+ r+ p
> 2^101 mod 2002;  # 同 2 &^101 mod 2002;
4 A. |3 ]1 P' m( G3 x
! I  U& z# H3 }2 }: D) k! S7)随机数生成器(rand)" O/ m5 j: {) [) ~* s& G
命令格式:   2 u9 U8 q) M% o2 M5 A0 l5 z
rand( );    #随机返回一个12位数字的非负整数* c* p/ i( N0 S0 M# q/ A
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数6 P! M& e  J7 f, V
> rand();
: D' Z8 N" p1 L# Y* f. L2 h
. z3 l8 n' P2 s% ?/ o2 y> myproc:=rand(1..2002):, w1 X1 w' E; S0 K; r
> myproc();+ J* E' u$ p* ~' w. o
. Q2 V& n+ S  \* e6 h
> myproc();
" x' v) A6 B" d" a
. \- A* S$ O4 i. N    注意, rand(n)是rand(0..n-1)的简写形式.
7 T; J0 {' H/ R: T2 s2.1.2 复数运算9 O* B( V1 l6 b5 e  x
复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   
8 P9 d2 W5 o$ m! Y> complex_number:=(1+2*I)*(3+4*I);# Y$ Z; s2 v+ i. S: u

! \3 `. O5 J1 J> Re(%);Im(%%);conjugate(%%%);argument(complex_number);
& @/ _! B$ v/ h" a0 Z: w# r% v$ u , p% j6 ]: F% h
1 q8 Z+ w7 R1 D% E+ I
- D7 O& d' G; B" ]1 A/ b9 @; U( y

. M" E2 I8 A; U值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.
0 L% Y2 }2 w) V2 W0 j7 y为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   1 w3 n+ v0 y. a* m: M+ b
1) 绝对值函数& y! p+ X3 h- ~5 E% z: C
命令格式: abs(expr);  $ W+ k5 r2 L* Y$ s+ m% u# y
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.! N. u6 o& O) w' C4 Z: Y& J
> abs(-2002);    #常数的绝对值
4 D* R% S: |- m0 ]. g" O! X0 s  U
- u2 L- Q: A) r> abs(1+2*I);   #复数的模
$ e' {) f+ g4 V4 e: [( M$ G( d ' m  N) }% k. _- f! E' C; p
> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值
) D% p8 D& J- c9 G. y / J4 B; ^' ^, j: @6 t! E, s2 Q/ O
> abs(2*x-5);   #函数表达式的绝对值
: i. d( t4 M4 D( l ' N/ ?9 X" B0 Q1 _9 {
2)复数的幅角函数, r) \& p5 i2 _6 N1 b
命令格式:   argument(x);  #返回复数x的幅角的主值* g7 ]. J. e! j6 V6 a
> argument(6+11*I);7 _$ @# v7 r) V. E. `( {6 v

( M2 e" I5 w8 t> argument(exp(4*Pi/3*I));) c/ L6 A. ]+ V; n

) }/ m, }, v! O: K5 W/ G  J5 ^, P3)共轭复数
' k5 U. y8 W8 V: H+ v. Y命令格式:   conjugate(x);  #返回x的共轭复数) F) J) ~+ C1 e
> conjugate(6+8*I);* G* h% c( r/ e5 T, b; T& l
3 p' B6 y. c0 v' ]' [* \
> conjugate(exp(4*Pi/3*I));
  m  z# @- s2 h' h8 [ : W) |$ X$ ~; l' Y
2.1.3 数的进制转换  X& D2 S9 t( y# }) y$ Y
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可.
4 O) S6 q& ~+ b% [& K, X0 ]命令格式:   convert(expr, form, arg3, ...);    3 x; H1 K$ _5 K) Q0 T2 F
其中, expr为任意表达式, form为一名称, arg3, ... 可选项. $ i1 b" L' y# |" b' V( t
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述. * v- C) t2 @- b% b+ y+ l
    1)基数之间的转换5 h* W5 r( h5 ?  w4 J  [. G8 r* R; D
命令格式:   ! j$ j3 B" u' w
convert(n, base, beta);      #将基数为10的数n转换为基数为beta的数6 \8 f0 n1 E. @% z8 j# V
    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数3 S+ _' q4 M7 l7 Q4 F5 P7 u8 B
> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7
! n. D( |' V+ F1 g7 p1 a% W9 ?
0 @2 {  w. W# F* u; N9 J3 `0 I> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数) |4 n7 `' E( F3 ^! J& ]9 j( Q

& F$ Y" q$ ]8 u> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)* R8 e+ \; f$ m
' o$ O2 e' p( K$ J' Q
    2)转换为二进制形式
( N: ^3 D7 g2 R; a7 h( s命令格式: convert(n, binary);+ \! C1 K! n. u( Z7 j
其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂. ! f( j# h9 R/ }* H; i
> convert(2002,binary);   8 l5 W2 d8 I* c, H1 i4 c! z
9 C* n8 S( N( ~& \) `
> convert(-1999,binary);
5 r# L% M1 l7 w $ T$ ]- h% h, ]! a  s
> convert(1999.7,binary);
0 z' F% u, M4 J, @ - s" `8 @; n" I3 q
3)转换为十进制形式
: M8 j( e7 y0 ~! j3 ]% s8 `其它数值转换为十进制的命令格式为:   " T/ o( s7 _% z8 g& h
convert(n, decimal, binary);   #将一个2进制数n转换为10进制数
. o: x" P5 v* [1 [7 l3 _    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数
7 h# N# @4 J7 Q3 N  z0 d    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数  Y( ]; o! O' q( x
> convert(11111010010, decimal, binary);   
) I" x$ @6 o2 a3 r
' d% c* }, P9 x7 R7 o> convert(-1234, decimal, octal);           $ {& u3 [7 w- [8 \; A5 L

+ I2 ~8 A; y8 Z2 x6 L> convert("2A.C", decimal, hex);          2 t  K: U, s) v- d; d, ?% h% @
' q, x; E4 u/ V# b
4) 转换为16进制数
: J/ A6 _' x& C* Y6 s* G/ N将自然数n转换为16进制数的命令格式为: convert(n, hex);   # g6 J; o$ b% _: \# f4 Y
> convert(2002,hex);  convert(1999,hex);
  R" y5 _0 Y, S/ t/ i& K$ B) b- ^1 }
. k4 ]- B# W3 Y8 o, U5 T! j7 p! A 3 R+ W7 i+ S3 c
5)转换为浮点数
8 I  {- b( N' |6 Q6 y7 K& s命令格式: convert(expr, float);5 X/ d1 V' u' L; F& p
注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. 6 G5 _# A; n6 _5 @( [+ x2 ]
> convert(1999/2002,float);, p7 e1 z1 \$ `& Z2 {
" V/ r# U/ @/ g  y: `1 O
> convert(Pi,float);
" f  r  ]  O. G& h. d3 ? & r9 U& z5 U. e
2.2 初等数学
: o9 Y0 d0 J3 K3 O: W6 L    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识. 8 |% ]+ S/ B! G. q# a
2.2.1 常用函数* }* ?6 Z6 P( d/ J1 k" M% M) [) `7 t
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   # F1 |! ~. K% K2 J$ e& l2 m: F
指数函数: exp
7 `! L/ H2 [) @: n) y- i$ U' q一般对数: log[a]
' }2 ?4 c- `# q  x$ T8 s7 Q自然函数: ln3 J& V; d) ^: t
常用对数: log10
, D4 z# Y3 P7 k9 Z1 b* p6 Z平方根: sqrt3 n6 c8 H% I- x% m/ n4 O, d
绝对值: abs
; f1 t6 t* z% L: D& @1 J三角函数: sin、cos、tan、sec、csc、cot) \' s/ ]( V9 Z* R6 T
反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot; v7 G- F" C' P# f+ u, `) g
双曲函数: sinh、cosh、tanh、sech、csch、coth
2 b5 n9 G$ ?" p$ R7 c6 |6 `  Z反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth
5 N' b# Y  K5 t% O: D9 c贝赛尔函数: BesselI、BesselJ、BesselK、BesselY
% L' w: ~2 f& u6 P. U: ^Gamma函数: GAMMA( F) `* W- H# u3 N7 w7 U( g
误差函数: erf
+ D% }/ k* ^8 n函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能.
& f; T8 W8 c! a( N% Z0 z1) 确定乘积和不确定乘积
  h- w6 B/ J4 d6 ]' Z命令格式: product(f,k);  6 f! \4 g7 `* F5 c/ ~( ]3 o& d
product(f,k=m..n);  ) _  x- [, J. b5 u) `
product(f,k=alpha);
8 U' K6 ^( X7 tproduct(f,k=expr);0 ]" E# s3 d/ E2 T$ J+ V! N, c
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式. ! j; j! P3 b! G+ _
> product(k^2,k=1..10);   #计算 关于1..10的连乘: k: _8 q+ k' a: a9 p: O" y
+ Z' C$ F" ^' G1 ^4 D
> product(k^2,k);         #计算 的不确定乘积
7 [3 {, {: _+ \$ u6 M
& p9 U( H" s0 u" E0 O4 r> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘
: P. y0 @6 T$ E8 I9 [& q
  R5 }& s- t' N, d3 I* S! O> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘! Z0 t1 D: N" E2 C3 h! }4 B; p
* p. i! d3 H- v1 V3 B
> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式
% u' j6 y, p2 U% V, F0 _ $ @. X4 y! {' h# Z
> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积
& g3 y5 L. ]1 w ' b, E. y/ ]& T
    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   
* a# @! u, B& F* p' |; n/ x> product(x+k,k=0..n-1);
' O) q, ^: A! S8 @
6 g; [' o( J+ y4 r如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
& |  N- }! f& V" \> mul(x+k,k=0..3);  \; q  P4 [2 j  i, d! j1 I
% C: m5 t) r- {& ~: E
2)指数函数4 r- ^& H6 n! l! c% K8 M
计算指数函数exp关于x的表达式的命令格式为: exp(x);
- h' L% }$ V: D- v3 `8 a> exp(1);
1 E6 ]& ^9 r1 W. N- h- v # t9 F2 V4 v$ P% G+ X8 p6 ~
> evalf(%);
, N" K# E/ O* @" W
; Z7 U. R4 a, T/ C/ k$ U1 M: x> exp(1.29+2*I);9 R  j3 l, U/ s4 V

; v2 S* ^  ]& E$ Y% G) ]% {> evalc(exp(x+I*y));
% `& K7 ^' C7 e0 d  [ 1 [$ I& b; l' s, s7 @! w) @. P7 z
3)确定求和与不确定求和sum
2 E! w5 `1 U& I7 V7 T. g6 U5 K/ r' u命令格式: sum(f,k);  
( h! N& l& z- H3 vsum(f,k=m..n);  0 n" W) _* C, @: O0 Q
sum(f,k=alpha); " A: z/ c( F, M# [
sum(f,k=expr);5 t+ ^: @: E2 X) F" D$ n& }2 u, G
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式. 6 @0 W$ }( ]7 x4 J& J
> Sum(k^2,k=1..n)=sum(k^2,k=1..n);
" c% L) X% k; Y1 T# D2 d  W! } & q( t* Q& l$ g, v, K* U; G4 x( C
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);! p8 j1 w2 {7 X
) `0 C2 I. l! z% n
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);' j" v* U. O( ^" k3 ?) P+ V

, F: N" }% c$ q; `1 |> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);( x1 B. @% W7 P2 j/ m, z1 \

0 x( M0 ^( ?/ g' V6 l$ `6 k1 Z> sum(a[k]*x[k],k=0..n);# a2 I* ]+ U3 v! a# q

/ z% H6 m( X7 W5 |3 {> Sum(k/(k+1),k)=sum(k/(k+1),k);
- R: Z; S7 _0 y6 C+ t" h6 d) ? * L' w. l; V  {5 j& J+ C
> sum(k/(k+1),k=RootOf(x^2-3));
  C. V$ R9 P4 W5 ? ) q/ O# _4 N" r
sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的. ) U( V; O& f- u. ~
> Sum('k','k'=0..n)=sum('k','k'=0..n);6 I  u  D5 n+ n2 k, f8 \6 w& D
, S  g# a- Y- E$ V9 b
如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   
' i* l8 X  j! a> add(k,k=1..100);
5 p% o1 D7 \# {' ~
  M3 B, i6 X  K! [6 L2 z, M0 G尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令.
# h1 x( _9 T) @3 m: ?6 d2 w另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性.
( t# }  G3 E& S1 U" W; @( q3)三角函数/双曲函数. D$ L" [9 R4 u3 n) X; P( K
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);" ~1 z9 j/ O5 E$ L+ S5 w
          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);4 g% L' M( s. C: T# O8 i- ^$ e+ u
其中, x为任意表达式. + N6 x1 b! I- P, D6 \2 I
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert." X7 g7 S, L- F0 H
> Sin(Pi)=sin(Pi);
: f9 \4 B. e7 @6 i* X& m1 C 0 [; H' B9 X& `* e
> coth(1.9+2.1*I);
9 U* `. B1 H$ Y1 U+ I  n+ c
* {# K0 r! m+ P; F> expand(sin(x+y));     #展开表达式* E# g+ b8 F- F- \+ [
9 h0 i) a2 y1 p4 \- D/ b
> combine(%);        #合并表达式1 A5 H1 }6 ?+ _$ o2 ~

9 Y6 c6 v3 z8 q) ?7 o2 {> convert(sin(7*Pi/60),'radical');
0 L+ q: T5 o' {3 Y  ?
- n& \; U; e  ]3 s0 m> evalf(%);
" ~" P) i5 c5 O9 T" _2 O2 W/ c
( M9 b6 L& m& P5 E( B5 A但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.: N) x7 `& Y: U; w
4)反三角函数/反双曲函数0 W$ {2 A2 \) _; a7 |2 ?
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);$ B& [9 H" F/ f
     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   
; O' Z8 n! g7 ^! q4 I3 R) m( darctan(y,x);. [! C% i7 P  }! N1 F! g$ a
其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算.
, u1 Y8 r9 i7 ]* M2 C1 C算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.
8 Q# g; e9 b6 j5 o$ {> arcsinh(1);
& M- `4 P' Z( g
- {0 l' e: Z9 j> cos(arcsin(x));2 I% e" ^2 b# U4 }" `7 ^

$ s/ W# o, A2 T3 C# u1 u> arcsin(1.9+2.1*I);
: w9 d9 `9 g8 t# X5 b9 Q ! w& _- n- K& o
5)对数函数# ?' D# S8 G3 G& ]6 {
命令格式: ln(x);           #自然对数# _7 c8 @# L2 e" c# w
log[a](x);        #一般对数
( g( A2 A' B% P" n% O  w' dlog10(x);        #常用对数/ T+ d2 A) z/ i! c3 o6 A# M' y( X
一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   - C2 t* y" {& Y+ [; u
  (其中,  )
6 W- Y8 |5 o6 Q# X( k, o' O( f> ln(2002.0);
7 ]; O% K. o# v! S0 |$ Q- K
* @$ F9 x8 Q3 y; M0 b> ln(3+4*I);8 H" n' p& m* B8 y: p
/ u! d" \9 J9 y  M' o% {
> evalc(%);    # 求出上式的实部、虚部# \7 N/ K9 _# y0 h- H. x+ _

5 ~' I9 q4 G% z( ]& \9 d> log10(1000000);8 w' f5 @1 i5 C' K4 A9 ^0 Q
& l5 U  n, j( r* W9 |2 U9 b- l1 c
> simplify(%);   #化简上式
" W) o: M+ ]! M$ \- Q  b4 t 6 P! v; Y6 G8 I* z) a/ t: F
2.2.2 函数的定义+ _+ w& f6 ?* j9 T0 D& ~: [
Maple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   
0 l! o. h- x4 Q; Z4 C8 g4 t> f(x):=a*x^2+b*x+c;3 b$ y6 S$ K) E: q6 z) ^
. |( E: \2 d4 j9 c" B
可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   . k) `* [- @% }7 h) B
> f(x),f(0),f(1/a);
. T5 Y3 {# D5 d, v$ C6 l / b3 J/ f. o! y* y+ Q2 b7 t: `9 {
由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   
3 [; N* b$ i# J! U: K5 Y4 z$ z> print(f);
: Z0 A4 o. i. E% X: b: Q- k
$ @' Q' z9 Q; x  P6 |事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. 6 [/ ~' O3 L! F8 N; j( u
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   3 [$ v. N1 Z: }+ g: w
> f:=x->a*x^2+b*x+c;5 ?; X2 n$ o  N' u8 C. Y- k" w6 ]: f
- \+ t1 p# j. A7 C$ p) t
> f(x),f(0),f(1/a);
  y2 a' R" q5 r! {, x 5 _8 f, u5 W, O2 Q2 Y8 U
多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”).
* B/ c) U: }) W$ G9 |1 O3 y> f:=(x,y)->x^2+y^2;( i6 Q# Y$ W. }
1 a& R% T" h+ Q& o: M. T
> f(1,2);
) b5 b1 L( [. [9 T: L) h : Y9 h3 T" O: t/ O# f7 S
> f:=(x,y)->a*x*y*exp(x^2+y^2);, |) x8 D8 J3 G* g: H1 ?: t

  j' {, A, p2 _+ S综上所述, 箭头操作符定义函数的方式一般为:   
/ u2 U1 m9 f+ b2 X/ ]+ i' _* z一元函数: 参数->函数表达式3 m9 v! s) C3 Q  W! b
多多函数: (参数序列)->函数表达式
) Q, L  q. V8 a3 J无参数函数也许不好理解, 但可以用来定义常函数:   # h1 f/ M. ]7 ?
> E:=()->exp(1);
$ c* h' ]3 }1 g9 P
1 ]& a8 R" T4 P( N> E();
8 e$ B1 t" e9 E6 \2 H
' g) J' ~) h+ t: v> E(x);
( F1 g) V5 j" }' C( f1 Q) f, c
+ [9 J( o9 a9 B9 P. I另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数. % Y7 |! K. q" O
定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);          * c) a* C# |5 l1 l7 l: I
定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     
8 P0 d0 l! ^, Q+ Z, Z> f:=unapply(x^4+x^3+x^2+x+1,x);
2 o( w4 t' L# | & H' z. Z) S% z0 x9 @. d. [) O
> f(4);
; g+ |. w% s" q, G  g7 b# e
. @# S9 j7 N' `$ _> f:=unapply(x*y/(x^2+y^2),x,y);
  I) ~$ O  |7 ^ : g' P7 v3 j0 @' Q# p7 ]
> f(1,1);( [' s8 ^* s6 a3 I! p- f% O2 A' u

) ^6 p  _5 W( v( t* B; C( w借助函数piecewise可以生成简单分段函数:( R/ t( b& V+ D$ g) _$ ^
> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);
+ l5 g: D: h& J- Y; r
' A" k9 `* L2 h. Q7 z7 N清除函数的定义用命令unassign.
5 s3 y$ R: P+ M+ k, b0 T( k8 V> unassign(f);; s2 A" P4 T* `! w/ \- ]
> f(1,1);+ O, C9 d0 a- m% }: M  Y; b

: W4 N7 I, ~- ~! p除此之外, 还可以通过程序设计方式定义函数(参见第6章).
$ L4 {: c% X" R; K5 ^( ^2 E8 B定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:
& x' d  z( }$ u9 Fop(expr);          : O. B- g: E! g7 S  M
op(i, expr);         + @7 Z4 G5 ], ~: B, F
op(i .. j, expr);      
$ x5 U: R; F/ N/ i" unops(expr);
, e1 C6 X, @9 J如果函数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的类型.
" J9 _0 `' o, d- g: T4 \  @命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.1 m+ z/ @. A4 U' ?% a& U
命令op(expr); 等价于op(1..nops(expr), expr); 6 O; i- H. T0 h) R0 k
特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...)); 2 E$ |0 s  d) J# Q/ v# v4 y
而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
% ^1 L% }( m. x( q& v! V& F0 O> expr:=6+cos(x)+sin(x)*cos(x)^2;, S! ?4 K! n* d' _) l: Y5 V) i
6 O- b; G& ?7 x8 m: ^
> op(expr);
. r# F# B9 b) N4 S/ `' Y( M - A5 u3 Y/ u* q6 `* |0 m4 v$ l
> nops(expr);2 a7 g4 |6 r* m7 P4 S* a

- [7 `& R2 F" X0 p9 d> p:=x^2*y+3*x^3*z+2;9 O! E* }/ t3 T$ U9 N1 n! k
1 M& z! L( y# I" Z9 B6 d$ x
> op(1,p);
) z& V9 Q  T$ S  R1 z* W! o
: M+ O) U( o- I. ^7 D> op(1..nops(p),p);
7 O7 E$ `* y9 |' Y! T% h( M
6 w1 B% c; E+ T0 `0 {# N5 d+ @> op(op(2,p));
( j0 k7 G  h( W. w$ U  a
# C+ j5 T. M* h0 }> u:=[1,4,9];
+ ~7 @  q1 t- s4 ` 0 ]3 w) H' L9 ^
> op(0,u);
1 n  s4 S' \5 c- v+ V2 P $ L' \* ~* m$ c+ _: e
> s:=series(sin(x),x=1,3);+ q# B- l& O. U: Y' [& `( f2 y
( s. g* p6 O  k. {: p8 c
> op(0,s);. V, ~; {& ]( r: |
        2 v8 z( ]* N; ^& Z
> nops(s);3 w5 f* H0 ?7 K7 G+ A8 x. m
; B9 Z/ {* c& Y
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:6 L. W" J1 K/ ~0 `0 A/ i6 @/ ^. d
> op(x*y*z);
+ W1 M$ i9 d5 ^" l5 F+ @$ [3 N- y& { " Z# ~8 a6 z( i  y* X
> op(x*y*z+1);
* f6 q4 T; N" e) o8 V* ^ 2 _5 Z0 y( u  _+ }
2.2.3 Maple中的常量与变量名1 X8 |' L5 @" ^# |; z
为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   3 @  {# r5 P) L* _
> constants;7 w  B: }* q5 Y, E9 [2 b
0 ^% @3 G4 t; |& N) B
为了方便使用, 现将上述常数的具体含义列示如下:   
( E* F7 q% H% |7 P* a常    数        名 称        近似值
# u9 s8 L/ u7 f, P+ D圆周率
% p2 x7 z+ j8 u- jPi        3.1415926535
  b# j1 U+ Z! Q% n! ~# ?Catalan常数
+ \3 [! o3 L2 y: s  {5 n: `Catalan        0.9159655942
6 O% M3 f' w8 n3 S. F4 fEuler-Mascheroni常数 . b, S' \6 N8 C, m% \; l4 c
gamma        0.57721566496 C* q5 P  x  q

4 H2 D& b7 i' |( P5 M* @7 Minfinity        ' ]6 d4 x/ W9 r: l
" j% w3 y( ~: {. ?9 j6 h
需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取.
- u* e. A2 q2 v" F在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
3 A$ ^& c0 r) f; u. w值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名.
  l/ u* _' Z) x! O. Q在Maple中有一些保留字不可以被用作变量名:   ! t& t- r# P$ W& ^
by      do      done     elif     else     end        fi        for      
- _3 T& X  i, G: [0 Mfrom    if       in       local     od     option    options     proc         , }0 \0 K7 C9 A8 n# R
quit    read     save     stop     then     to        while      D
# k3 F! d1 c% t8 r) k& u8 EMaple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名. , \3 |' X. J/ a1 p' I
另外一个值得注意的是在Maple中三种类型引号的不同作用:   2 c, g0 R6 Q0 K4 c! U5 {
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;    + M2 g: y  J2 U- C! Y  Z6 _$ G# {* q4 m
'  ':   界定一个暂时不求值的表达式;   
/ V$ P. n, d6 R3 M  U  X"  ":   界定一个字符串, 它不能被赋值. ; r2 d6 C) W: A: h) }% ^1 ]: D! _
2.2.4 函数类型转换           
) m$ ^7 d* B* d5 t函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  " ]. ^# P. a, o- P3 I1 \4 q
    convert(expr, form);        #把数学式expr转换成form的形式
. X' [$ r: G1 O+ D8 q" M2 V2 gconvert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos1 e$ A' U% |: X1 n5 F; W: E
convert指令所提供的三角函数、指数与函数的转换共有exp等7种:   . Y7 S- q' t5 u, g
(1) exp: 将三角函数转换成指数
$ X  g9 E6 r8 B& X7 x% r; V(2) expln: 把数学式转换成指数与对数; a8 w# c  y' I$ _  d3 q
(3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式
! S8 d6 |2 R& u0 E$ s* ^, \(4) ln: 将反三角函数转换成对数
7 U6 _# M4 ?0 O$ g+ d(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式
( O" f9 q+ O! l- K(6) tan: 将三角函数转换成tan的形式, }5 @3 Q* ?+ v. f
(7) trig: 将指数函数转换成三角函数与对数函数
% H9 H  D3 Q+ S  Y! X> convert(sinh(x),exp);   #将sinh(x)转换成exp类型' m0 h6 x: `: ?7 X! j3 m
( N3 H, f1 O, _" a
> convert(cos(x)*sinh(y),exp);0 ?# ~' X' a& }* k6 p

2 \. |5 l1 z8 ~> convert(cos(x)*sinh(y),exp,y);. f1 C, V* P! z6 [7 ?" o: k
: `- K3 I, v0 J' B; T: X
> convert(exp(x)*exp(x^(-2)),trig);9 d6 ?$ u- e2 z# G0 M

1 T/ g3 u( P4 R- M8 {- `> convert(arcsinh(x)*cos(x),expln);1 ^0 P3 f* g% a) h3 v- t# p

  T. M: C! N7 F% t6 K& S4 W2 O> convert(cot(x)+sinh(x),expsincos);
6 m7 I& l0 g" q( o' e9 H3 x
5 y" O$ Q) S& l2 b/ u: w* C. E> convert(arctanh(x),ln);" i& @( ?5 R8 i9 K& o% w- R9 T* W
9 t& l! ~3 s6 E$ H2 t, v
convert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:     a. g; z/ x- Q0 w, G& c
> with(codegen):
) @' D: X5 u9 s1 f8 I> p:=4*x^4+3*x^3+2*x^2-x;; b5 l- s% {# s# f8 Z

6 h) V4 s' D5 G% t$ U- a> cost(p);% O8 `+ S  S% {$ }, J6 [
# S- V. T+ v/ L6 |; C0 h% g& d
> convert(p,'horner');  #将展开的表达式转换成嵌套形式
% b+ }8 J/ P) ^7 i* d# ]6 d $ j) o, f8 n! R; O  M* [% r7 ?
> cost(%);
+ h8 h+ r  T( I3 h/ U5 j" n3 C ( Q# Y: d* |  V
同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量. + \0 d; ?  _4 K4 y3 }( k9 ~
> (1+x+x^2+x^3)/p;
* _* @# h& s4 ?& P
* X  g' T4 u1 q+ J> cost(%);
. y* D$ p. d! I+ r  W
: [' ~+ |' V) T> convert(%%,'confrac',x);& A9 z: _: z$ P" i5 k

; P8 D% N! Q- Y$ q/ x0 o> cost(%);
: {: h# K5 r3 ~3 k " y- M7 g7 X- S0 m/ o8 m  K5 W5 b& I
在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式. # V) W: z4 D9 s0 `
> convert(%%, 'parfrac',x);* Y2 b& @/ Q8 I' z2 o/ U
% F- Q/ ?+ a5 L
> cost(%);
" r5 f9 f) c" r5 ^1 N/ _0 P
3 x! u  @6 [, N/ q3 q* [$ |而把分数转换成连分数的方法为:
* H% P9 L. ]* |( r> with(numtheory):
9 S3 ^" p$ n2 r! p" b( F> cfrac(339/284);/ x9 I3 z/ A. ?* Q0 V) r8 N7 z, g

, c. {  _$ P# C# o% k2.2.5 函数的映射—map指令
! O* L1 U9 H) l3 [6 m在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:
. K9 t* f: V! A; V2 nmap(f, expr);      #将函数f映射到expr的每个操作数2 \+ F2 K& d7 C0 T+ c5 {7 `2 Y+ f0 }
map(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量
: g* P( T$ r( w' x5 t7 R% Amap(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量1 a. M, Z) g% W5 r& W: h
map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为. g; u! `* @4 U$ R) l# X0 r, K$ e
第3个自变量…, an为第n+1个自变量来映射函数f
2 g! l* D7 }' T8 `> map(f,x1+x2+x3+x4,a1,a2,a3,a4);' |4 m1 f6 s4 g0 n% `5 n  W. {$ z& r: r) D

+ N, q9 _% J9 i) \! ?& y> f:=x->sqrt(x)+x^2;) P* Z( T# m1 x

6 o7 M: O2 j$ q> map(f,[a,b,c]);
( w1 U0 k; n4 e! |( n0 t4 d
, r$ r$ f# [1 X5 p; R) b> map(h, [a,b,c],x,y); # |" q3 e8 O" p1 r5 O* t

1 c$ X  q" K! h0 ]/ [# s& G> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);
3 o7 W" U+ _9 \ ( S: W1 s- ^% _# F1 h. H& z
> map(x->convert(x,exp),[sin(x),cos(x)]);/ T. R; ?( A0 X, P- J+ V

3 U: p  `$ t8 V上式的映射关系可通过下式理解:$ a% q$ V, Z9 v6 x
> [convert(sin(x),exp),convert(cos(x),exp)];
5 m% }* C) y$ r; c, }( Z 9 C8 W- K: I0 ~4 d7 `( P6 z; @' F
> restart: % K# J4 x' o, P" E2 }
map2(f,a1,x1+x2+x3+x4,a2,a3,a4);
1 J1 P+ j' B% f4 i7 f! J( R . }6 \, a& t. K) v4 I- V6 w6 N2 W' `
> map2(max,k,[a,b,c,d]); 6 e: R! R4 W, n+ M) _
' [1 w: _7 _( h
再看下面示例:   
- i4 R9 s& o8 M# D> L:=[seq(i,i=1..10)];* N! a* h0 m' z  L& m: s% Y
! a# K) b) G, a& S
> nops(L);
. Y$ W4 D8 X* h; F# g' {
0 k. ]+ C4 R! F9 p* s  Z% r> sqr:=(x)->x^2;
! {( z' s" X  _2 g0 F
; a7 b$ B6 J) Z" M> map(sqr,L);) L5 K9 S, w2 S# m4 D
0 Q+ B  F5 _8 c
> map((x)->x+1,L);5 \5 \  d# P2 @4 u

& J+ F4 A- r+ s/ f) H" N; [! b; ?( l# M> map(f,L);' s+ ^: n& A7 _0 t4 ?2 Z

% Y. {% N! y8 @8 T- h  E( P> map(f,{a,b,c});& E9 m! |8 j4 ?+ e! }
! J; I7 M; y( L) T7 {
> map(sqr,x+y*z);0 J! c2 G0 |' \3 {! w+ {1 z" B. {, C. S
1 u7 g2 U- y. u3 I
> M:=linalg[matrix](3,3,(i,j)->i+j);
. _' K$ V! F  f" u) d
) F9 q# v2 u. V" [8 M% m> map((x)->1/x,M);
8 ]7 [: \' Y  s) f( g* b 6 e! [! E$ h  k+ W4 U, T1 G5 }
3 求 值
0 Y5 O' h6 p% A7 ]3.1 赋值7 m9 ]  e% [' k
在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子.
  ~" ^+ G! ~( [. d> p:=9*x^3-37*x^2+47*x-19;
. X* N0 h4 {# h* g8 `6 d8 U
3 g; M8 K$ i# x4 S( N" k> roots(p);
1 `- d4 j" C# U; Q# x: }" B% ]9 _) ]
& X! U$ |5 u* I& q  s: [$ E> subs(x=19/9,p);
( d! c/ b: K9 S0 k+ V
( c  \+ B1 v3 D# ]* q. K% @9 s" u在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证.
: [0 _" Y3 e: ?5 Z! d  x3 Z$ d# W3.2 变量代换
! V7 A" t: I* c0 j8 x+ c% _在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   
1 Q& ]. T% @- y" b, H- J8 {7 R! qsubs ( var = repacedment, expression);
, ^! D/ {. s, T) {) R7 o4 b$ X调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement.
1 |" ]  O0 |0 \3 [0 d2 h> f:=x^2+exp(x^3)-8;
' j8 d8 y; x, i$ F4 c6 H $ e8 H  R/ N- Q  ~  L" c8 O4 f; ^1 T
> subs(x=1,f);
+ A% R$ Y4 ]* ]7 N: b
5 G& w+ Z8 X; L; v# ]7 [> subs(x=0,cos(x)*(sin(x)+x^2+5));
7 X( k3 f  {" R; [/ p$ s4 i) \8 ]
. j9 K4 G4 h/ h/ ~    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   
4 V" _' b& P% k1 \> evalf(%);
% c. H2 I7 B4 V/ K8 t7 | : V, M$ m9 T# q1 q% v
变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   
2 `# {  b( V0 Nsubs (var1 = repacedment1, var2 = repacedment2, expression); {2 U, s+ X) T$ E
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:   7 ]/ y. r  O9 Q, s
subs ( {var1 = repacedment1, var2 = repacedment2 }, expression)+ G3 ]' K' |/ W- A# b& I
下面通过例子说明这几种形式的替换. 3 V( O# p6 m# j3 P. _  |
> subs(x=y,y=z,x^2*y);              (顺序替换)( Z6 v) A" n  q( q
5 [; o* ^5 f; W, @( L8 f5 ~
> subs({x=y,y=z},x^2*y);            (同步替换)& j! f: p3 i8 F

4 x2 l; M1 q% i; ^9 G$ C> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)0 A: J: _$ ^$ |6 W) P0 K, V" `$ D0 t9 e( K

- ^2 m; o9 d) V8 T. j) ]0 _, K> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)8 h# ]& V' p  H- b: }3 \, V
; B" h/ V; ^5 w! {" @
> subs({p=q,q=p},f(p,q));             (互  换)- J. [1 }! i1 Z: q5 y8 K
  C! d) {5 x# @, R/ [! h
3.3 假设机制
: A4 |( I1 k% ]1 r8 R/ `+ Q% TMaple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点. ; z! l( ?; b3 Y& n$ w
在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);
5 X3 J; F$ D/ w2 ?7 n: [4 |, p  w函数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);”也不会产生矛盾. ( {* |8 o1 {6 M+ u4 h  z
> Int(exp(-s*t),t=0..infinity);0 v8 I( ?& N- E6 Z/ x. P
* i6 `/ V" t8 o- @3 l
> value(%);
6 |" `. [8 {" k( u- N; G/ V7 dDefinite integration: Can't determine if the integral is convergent.
5 H( s" J; U. S( I/ R% yNeed to know the sign of --> s0 j# P* i! z" Z( D( W! m
Will now try indefinite integration and then take limits.* E% A3 \* i5 m8 Z

; }4 ]4 h) K$ T  t9 N> assume(s>0);" v% f) w! P) [2 ~3 r
> Int(exp(-s*t),t=0..infinity);$ X* k# i- P' i
2 l. L9 T9 b1 q* _7 }! [  ^) U1 o
> value(%);0 I* k- x& k+ H. D
6 E! V" \$ Y7 u7 N
3.4 求值规则, {" w8 @2 G" w) S/ b( S9 s1 T6 x
在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
% @% Q$ G* z$ o& F- M" b! Y" d/ a> x:=y;
; {" e  ^7 x& c/ T, R: c" [# L* k 9 Q# d8 d! x! b8 }& t) [) l  B3 w
> y:=z;3 {  z* Y& f: d" X

7 `1 e* y7 ~* m3 L> z:=3;; P2 z: w7 h7 m% q  @7 ^

- i( p# ]1 O! r4 X8 s6 e> x;
  _+ ~. K- X$ q
! q7 j; [: w+ ]$ D> y;
* D, e+ w% J9 B  ^) d) v& b . H5 K% i" q2 o5 d
> x:='x';
1 G, e8 o% v( l7 m/ q) ?2 i. K
7 t! P& L. B" q" e> x;8 I; b: U. O/ x1 J8 D

* i8 @0 V6 T" `0 a1 Q$ C' W> y;! S# v0 [6 f) p$ E- O2 A* O5 o+ L

8 [" v1 m3 c: |. Z& x- C4 K对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   9 W/ D$ {: N7 C+ R' K4 S
1) 对表达式求值' J: _1 `5 D) a
命令格式: eval(e, x=a);  #求表达式e在x=a处的值( p0 ^/ _8 H# O) R
             eval(e, eqns); #对方程或方程组eqns求值! _. o- s1 d) |; Y" E# k: `0 u
             eval(e);      #表达式e求值到上面两层' {; Y3 l" h: E3 ^- b/ a& e  l
             eval(x,n);    #给出求值名称的第n层求值
3 Q. V/ Q5 W/ Y- V> p:=x^5+x^4+x^3+x^2+x+73;" H( _+ K; s% |/ }0 z- N' A( N
( I1 B! K7 b) Z6 _4 V8 z
> eval(p,x=7);
6 d1 M7 F5 P+ T+ N% Y ; W2 U0 r+ t& X" F3 r% G
> P:=exp(y)+x*y+exp(x);
7 f( m! ?% I8 _6 O   @( `# b4 g! }2 C$ e9 O  r8 k
> eval(P,[x=2,y=3]);
& Z& @. A$ F0 I. I$ t5 z' _. I; M
( Q# D) ~; y& ?& c  N5 R    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   
1 z' I- N0 _( r7 {> eval(sin(x)/x,x=0);# r5 r+ c, ]" |3 s3 Y
Error, numeric exception: division by zero" N( p- d' _# `# J
    下面再看使用eval进行全层求值或者对名称几层求值的示例:   
% {- S* k2 i+ a3 ~9 W# k> a:=b: b:=c: c:=x+1:- U1 G. X  T" i2 n- y& C
> a;              #默认的全层递归求值4 }. @% Q6 f7 M4 k3 q

3 C6 D! L# e3 s( w* ~0 K' P) R  d> eval(a);        #强制全层递归求值
8 c8 H# b: W' k2 }  H
+ y' u9 W2 T3 A% `! L> eval(a,1);       #对a一层求值9 P% o% v' n- @

% \. S! u. S- L> eval(a,2);       #对a二层求值
5 f4 ?# u1 j7 ^ 9 z; U. a% q7 s' ]! v% T4 q! M+ |/ Y
> eval(a,3);       #对a三层求值/ Y0 t7 t0 F0 b' a  `
" J6 M8 N* ~$ Q/ N1 m( c& p
> eval(a,4);       #对a四层求值
8 y/ S5 t2 K( u5 D. P# e ( [: }8 K4 O: W; p* n2 g. t& l+ V
    2) 在代数数(或者函数)域求值
  A) Y* C# R) R* W4 f' v# l命令格式: evala(expr);       # 对表达式或者未求值函数求值( X* f) I& O7 p4 c8 y* ^  L
             evala(expr,opts);   #求值时可加选项(opts)- u; o; Q6 Y4 G6 A0 q; c
所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式.
' P$ c  J9 [' O2 J0 L" C3 y代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   ; i: P* [, `9 P
> alpha:=RootOf(x^2-3,x);! ?  a. O. d1 ^. c3 z
4 T  D! @2 ]9 B% X, q
> simplify(alpha^2);% X% V* f4 T) B$ M* }
* {- N$ U  u2 V/ d: O3 _
在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:
8 H1 b9 D, g# I, M! @8 u> alias(alpha=RootOf(x^2-2)):
) b$ R) h1 }$ i3 W> evala(factor(x^2-2,alpha),lenstra);4 C& A, b$ C9 a3 d) a
! h" t" T9 i; c6 j+ ~/ o
> evala(quo(x^2-x+3,x-alpha,x,'r'));
6 K0 ]. w3 r, q, Q" g$ I
5 D% ]" r8 Z/ v> r;
8 p, u; b4 V7 \/ u2 e4 q % ], u5 Z" u( b! l  v
> simplify(%);
- n2 y# \9 D0 F! ?
5 _" @" c- v. X# q4 F7 G3) 在复数域上符号求值3 c) m1 ?% y0 L5 x9 F) l# z
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:
4 f' N, ^; m% A2 Mevalc(expr);   0 C( {9 Q1 \4 S" I9 P$ t
evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2.
5 z7 ]! N* z/ X4 \: E  i% b$ l) @- g> evalc(sin(6+8*I));
- B% P/ i7 t$ k, j# P
" U7 ^' q  {0 Q* @. W$ J$ a# X: Y> evalc(f(exp(alpha+x*I)));* u4 r4 J) K1 J+ ~( M+ b

: K8 ]4 ?; r9 h. _+ v8 z4 U> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));9 o9 L' W7 E$ Z

6 `% ]7 b8 l% w' o+ l4) 使用浮点算法求值2 r8 n1 X. ]# i/ R
浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     % _  e8 z0 i! Q4 e! E/ N% A7 c$ g
> evalf(Pi,50);    4 t+ e& Z8 l0 g9 d2 h

) k" X% I0 D: ~! N9 S1 ]> evalf(sin(3+4*I));   
4 P* H% b  B% p, ?, k+ |( `
. ^& d3 M8 e, Y2 _% Q1 M  g+ k> evalf(int(sin(x)/x,x=0..1),20);6 J/ H' f' b  L; G  O* X! l0 a  @1 T! ~; r

+ f' G; E# l5 f" Q5) 对惰性函数求值: f. Y& w% i* r6 L8 @, B9 G0 r
把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   
2 ?; f0 A3 D' j8 O% c> F:=Int(exp(x),x);
% `4 P+ D. p: C ! P1 @9 c" S8 x* q
> value(%);" f. V) w' @; P7 Z" n
4 g0 j+ C3 m0 I! s
> f:=Limit(sin(x)/x,x=0);
; s! u, k3 I( i" ~, [ 6 q% g2 i: o0 \; j: I" A
> value(%);
  L" O8 I/ ~) U8 b- A
* R+ r+ q8 d8 D# M. v另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   2 j, [( i# z; [7 V1 p
> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
$ @8 J* x5 K5 H' t7 u5 Z " ^+ I6 e, E0 Y& L$ g# ?( ~4 G
4 数据结构; M% B, X& |# R4 L; e
Maple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表.
! E( b# G- t) U! G! E, N4.1 数据类型查询
# Y2 V. b/ o: L: V% q4 o% x) L) s在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
. A' u* _- Z4 O5 c8 o! X' O, Ewhattype(expr)        # 查询expr的数据类型2 E6 g, x: b% K* a! Y
type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false/ z' Y# o- _5 b  B
> whattype(12);
# X) Y2 L& X/ V2 G7 }3 `  j' G
& A0 q# w" M  v" I" X, Q> whattype(Pi);
5 b3 ^5 o( f. [. b' Q3 m  @; ? 3 l1 v$ Z1 o, U3 B" d; e
> type(1.1,fraction);) U. x& k5 G0 |# N* S

. o0 z5 o# R, B' n& {1 ~5 u> whattype(1.1);
) C( T7 {, p- n * H# j7 y4 g- e' `* I6 \, K
4.2 序列, 列表和集合8 {7 x' d8 e" B+ l
4.2.1 序列
' |6 o' e# V4 N9 Z# f2 _所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   " p. l* D$ d& @$ y1 z% I
> s:=1,4,9,16,25;
! w/ h2 V" l) `; O4 Q' i( N  [
8 Z$ s# I2 R6 n, M" u* O6 i> t:=sin,com,tan,cot;
; D& ~8 Z5 N5 t  Q 4 k! F+ h9 }' u
一个序列也可以由若干个序列复合而成, 如:   
: I' ?! M1 P( F& ?# W  h> s:=1,(4,9,16),25;
/ l+ q$ j( U3 \
) r) Z9 B  m1 L, ]' |> s,s;
& I; ^1 h9 J) X$ r * X' D0 w0 ^% F7 s( R
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   
; ^) r- o0 t: O! b' p- M- G. a> max(s);. N- f- [# }/ D+ L+ I. N, M( u4 C' b* w

5 a7 Y/ e3 U. ~8 X> min(s,0,s);
, g) d; `/ o( A( x+ |; I
, ~9 T! Q' |( ]  d. o. q值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中. ! @; \% {" @! I. y9 v
> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;
6 c5 s$ |- x' c. d' g
- R6 ~2 A: G0 O7 Y> op(s);
7 r0 M! s. p9 Z- {3 r$ bError, wrong number (or type) of parameters in function op
, [8 `$ q+ V: W2 S. \2 a' ~> nops(s);3 G% k1 K: Y4 b8 {! q
Error, wrong number (or type) of parameters in function nops7 ~4 r0 L' ^3 Z, E$ d
> op([s]);
' E+ b- N8 T, g7 _6 ~* ^ & M- z. Y$ ]& J  W- n
> nops([stuff]);
5 _6 |* m7 m" H4 Y& X) V4 ?0 K 5 B9 {& [9 D, U
函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   1 F5 T5 |4 ]0 x/ O* M/ y% O# A
seq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)
, U7 H% O7 }: z& tseq(f(i), i=expr);  # 生成一个f映射expr操作数的序列; r) f7 h; c3 L6 r; \) e
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列' _% S7 o( ?6 h2 w. g
> seq(i^2,i=1..10);- ~( b  q6 d" {1 L4 H' t% }$ j# u
5 c* O6 v' U+ b5 ]
> seq(ithprime(i),i=1..20);
4 N) l$ C. U3 a & z- F" c+ }; Y8 Y; A) e  m
> seq(i^3,i=x+y+z);& B/ F( e+ D- R4 Y
- H/ o5 C' t+ P
> seq(D(f),f=[sin,cos,tan,cot]);
' Q2 b% t) u3 R # H" l( S: z( i5 l; F
> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));
. m9 r( ?6 N4 N3 v. q 1 Z3 H" s$ ?3 N% q( r/ G
获得一个序列中的特定元素选用操作符[  ], 如:   
3 h, j: B; r' r2 `5 P8 ^. [> seq(ithprime(i),i=1..20);5 p3 D8 D# J) z- [

, W. ?9 g0 ]4 H9 a! |> %[6],%[17];4 H% Z1 J* }1 c6 ]( Z

- i7 v7 j+ T0 P4.2.2 列表4 L" `  S, h1 p6 G$ c5 B$ d
列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   % }4 ?& f6 V  p" X9 ^9 M; O
> l:=[x,1,1-z,x];
6 t( F' [6 Y+ A6 B 2 l" l6 {' a; J& I" d' @* O( P
> whattype(%);
9 _1 h- F" y, r3 F" g* X
- ?" R8 o) j! A( W空列表定义为[ ]. ' Q2 b! W( J! J
但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   
) q" X& D# z- U: q  s( K. c# k2 o> L:=[1,2,3,4];
% f8 _' V2 Z' Z
0 r. x. w7 k1 h% z> M:=[2,3,4,1];4 d, l. O2 ^. F9 A. O

' p+ @1 ^( @/ v! {. J4.2.3 集合* b+ B8 I) v. T: z; a2 n, o! w% T' q
集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合. . i" P" {0 w: h
> s:={x,1,1-z,x};, ?- R1 a2 J1 w
& ^5 q: H0 B: Z! K
> whattype(%);0 d/ ~+ b, T; q& X2 M0 a

0 ?2 ]% D: ^8 E4 l7 n0 Y空集定义为{ }.
% W# o- `, q3 q% i; ?函数nop返回列表或集合的元素数, 而op则可返回其第I个元素. 7 P$ G" O. P& E" o* u
> op(1,s);8 E# T7 ^- w0 T1 U; g- {  W) r* k

; Y5 F3 X1 S: \3 }' W> s[1];
# U7 L+ ]7 C4 H" y5 @5 C/ Y& E
$ B0 B( Y0 ?* G* C> op(1..3,s);" Z1 W0 y2 R" F$ L; b, ~5 S. o( y

' t, a/ D7 h2 f; G" i/ \- V3 |1 V> s[1..3];* S( ?& \; ]+ s+ c+ m2 P) `; h
  D1 o6 I9 A! y( p  x
函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false. ; O2 G2 h! a# i. V$ c% M4 A7 {& Q
> member(1+x,s);
8 A0 [, g7 |7 g1 q! H ; X7 D- F/ o' `
可以通过下述方法在列表中增减元素:   
! n) G# w6 [& ]7 S> t:=[op(s),x];7 A; C" x" k7 S# L6 s2 }

/ I8 A. a! H) c& Z  s, A> u:=[s[1..5],s[7..nops(s)]];/ |1 e, B3 u3 B+ p; W! ~/ s2 `

: h0 ^0 F6 j! v5 }9 k$ L2 O4 M  lMaple中集合的基本运算有交(intersect)、并(union)、差(minus):   " X' A4 m* D- c/ c& A- Z
> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};4 @; z$ i3 k% r# Z
9 e7 r5 f) e' i
" L3 s4 a- z# s' f2 a: a: ?
> A intersect B;
/ T' {1 b  u7 E8 P$ b0 [ + ^  @2 Q  `1 s, A+ R
> A union B; 6 w+ H: r" j" a3 L  w3 R

: n/ b3 P; W9 g3 q9 d0 u3 O" b+ P> A minus B;
7 Z+ T0 S' o7 f4 @6 w0 b' R! q , H& H: a/ D- m! m% F3 A3 r& Q
4.3 数组和表. O/ g" o8 r$ c
在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令. * ]- I" Y: p5 h8 V9 k; V) l
    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的. # M. F; d0 x3 o
> A:=array(1..4);8 B2 Q& {8 ~7 q8 t8 S( G! P

0 i+ Y% o# U  O: k> for i from 1 to 4 do A[i]:=i: od:) K# {: c, ]  e0 a- f! v/ z
> eval(A);
' V1 U+ l: g$ |5 O# |
4 ~( z; T. k6 y> type(A,array);5 w# A; N8 j* Z# y* `2 w
4 s& T0 @8 B" |! k5 ~
> type(A,list);
1 u) f1 ?  H; D) S1 }; K% z4 N
% w$ T' Y0 u' V& C> T:=table();
1 d, i6 @* p1 @# i4 n+ e % Y* e( M8 c! O+ d' F1 ~
> T[1]:= 1;
0 D4 K) W' {5 ]  A- Y- m: M2 M
+ v% a: r( ]6 \2 H* Z  Y! U> T[5]:= 5;0 T. M8 T* B% Y6 I$ y& W/ W: L
; t2 r$ Q  |$ v7 y; v, X+ q
> T[3]:= 3;3 v/ r% w. ?. F/ A
' J; ?8 z0 y* K! u+ P$ d: J7 O; i
> T[sam]:=sally;
7 z% k( B5 U9 j) D( Z. v
6 L0 ?8 d0 U. Q$ m> T[Pi]:=exp(1);4 P" G' g$ {, Z$ V" G7 `' C# y2 @
$ c( j8 m$ i: ~+ \6 r) ~
> x:='x';( T) C3 l' ]6 t" g$ z
9 F7 _% U* }% D3 u. K
> T[(1+x+x^3)*sin(x)] := 0;7 `' ]" \; }# l4 T! d
$ L" X, D3 a. h2 G, R) M
> eval(T);5 x& Y# w+ y6 r$ n- Q2 H8 r7 s9 z

! f/ ], f" P" }* o- k7 m( X8 Q> T[3]:='T[3]';  Q* i  J9 P- n' v
5 q, E; Y3 _2 l$ z
> eval(T);2 E  K; L& j( A# Q  A: z

6 \# U$ b4 F# f9 k. B2 g8 {9 F4.4 其他数据结构" g  u! S5 Y% l7 O
串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. 9 i( q( w- m% b: r) q5 ^
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
5 j5 x+ k7 r: u, l! T> x:=T[3];
8 n' w0 K7 r* F; e4 O! }  C2 D
8 Q2 K8 J, B. N' K) [) B" D* c; l> eval(T);
' Q% s7 w- j( c' Q
3 V& c6 ^' d- ^, T) C8 T7 ?+ c* X> T[5]:=y;
6 t/ d9 T( a) I7 O9 M8 u: h
) ~! V7 [+ e6 B" |> eval(T);
, q( w: [+ l. t* [
: c7 c) v& K" D( {由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
  k) d" n/ Y0 `, G, F( Q数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. 8 o( q( d+ Y# g! |
4.5 数据类型转换和合并
- {' h, \+ s6 S% Zconvert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   1 w3 I4 V7 u# t. p
> L:=[1,2,3,4];
! ~3 m0 |7 e) V* k) Q! G # ~- Y/ ~/ ?6 O5 [$ P8 ~: A
> type(L,list);
6 @, v3 V9 I1 T- j. a0 P3 h: _, l 0 F/ V8 E$ T$ G* n+ X1 w! `
> A:=convert(L,array);; ]% |% c6 a. V9 ?4 e- {

+ N! d4 n, r9 `1 R7 C- d8 o> type(A,list);
; Q) r9 R9 L. A2 l+ T- L9 u " X/ L6 f* e5 G/ v
> type(A,array);( F+ t. l, E% S8 K

1 D/ x% Z2 _% D" F# l, u; X另一个有用的函数zip则可把两个列表或向量合并:   ) P- A9 r7 W6 o, ]
>L:=[seq(i,i=1..10)];
, H+ ~( c. ]& N4 R
2 t- w4 H4 X# Q5 f> Sqr:=(x)->x^2;( g6 ]# z% s) o& k/ E& ^$ t! G
" ~* Y6 @( t# ~+ y$ Z. G1 e( E" G6 k" Z
> M:=map(sqr,L);/ d3 `/ I  d1 u3 f. t+ i0 V

; l; j  c0 g: r, |2 B4 F3 T( ~> LM:=zip((x,y)->[x,y],L,M);7 J. J* O3 X1 j) E  ~" H! O, o
, K; v6 W, F0 M0 f/ D
> map(op,LM);
" Y# I  U6 {4 i; G9 s  B
2 e" p% ^1 l+ {+ Z" s5 Maple高级输入与输出操作
/ z  C& e% Z1 n7 w( k! {0 V9 OMaple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里.
# ^: Z& G# K# s8 `) A- `2 x5.1 写入文件
1 k/ x; H6 Y8 T4 C5.1.1 将数值数据写入到一个文件" q' y% ], j8 x2 [4 J: i* m
如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
! t) N9 m& W0 s7 o* p; K) M! _+ D2 i若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);! w4 J7 M8 M  Y( a! W
> with(linalg):
/ ?% _5 U2 J. d. G8 n& v: F4 h( N; d) s> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);* D+ w$ t5 K+ ^
3 ^7 b8 `; ~* W$ X
> writedata("e:\\filename.txt",M);9 U7 Y; k% c& Q7 l" ]0 [
而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);& z, ?- k. i% b. G- V: H% Z6 ~
> W:=matrix(2,2,[1,2,3,4]);& o2 j% p" O' k8 H
; k  x* p" }% A8 ~: Q
> writedata[APPEND]("e:\\filename.txt",W);( L6 t! I5 x$ Y. o: V  v# ^
需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果., w4 w: U' R+ x1 g5 ?
另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);
) b9 Y( U) J) }% m8 U( E( g6 r> writedata[APPEND]("e:\\filename.txt",W);
+ x" \: c' L3 D7 Z> writedata('terminal',M);
) a' _9 {5 O) ~* f6 \8 W1                   2                   3           
' ~1 N2 c9 F: I* s% O1 U9 F4                   5                   6           
3 z/ L7 Y- F7 j/ n+ Q2 L7                   8                   9   
6 C( K/ G/ N2 ~2 N- Y3 O5.1.2 将Maple语句写入一个文件+ B' i+ O; V: }* L" v' Z
如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:; Y% w5 f9 c1 }1 D
save name, "filename";' Y3 N# ]( T" U+ d
save name1, name2, …, "filename";
0 z  G( K+ r$ R/ r; H若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.$ p2 Z* N" D+ w6 Z4 I- |8 v2 @$ ]! e
> myfunc:=(k,n)->sum(x^k/k!,x=1..n);9 B2 {! V! O9 @
6 {7 `2 r9 x4 `; u5 p: g
> myresult:=myfunc(6,8);
  Q+ n$ Q* o2 I/ d' x 0 o( Y# X  q8 [1 w% q# n
> save myfunc,myresult,"e:\\test.m";- B8 h2 e9 u. E7 c
调用已存m文件用命令read. 试看下述实验:
# [5 G7 w, U: M; H; I> restart:! m& x/ |1 C0 D$ L0 B+ A/ L
> myfunc(6,8);: r. o* A8 h- W
' G: T3 u6 u6 J' t9 m+ D6 Z
> read "e:\\test.m";3 |$ ?8 ]6 d$ M7 |; f
> myfunc(6,8);
, `( w- t# y( A- s* K  a
* @, ^% P6 R6 `! i) v, y$ U& o1 X! L* ~> myresult;7 c# u8 X& s' i9 }- e7 x/ ~" z
! Z! x& V1 {! \
    而存为txt文件时则将整个语句存为一个文件:+ j9 r  s; D( @/ }- n$ Q
> save myfunc,myresult,"e:\\test.txt";
; C& {8 h8 {1 O> restart: read"e:\\test.txt";8 T: E5 K9 _* r
6 E, T  t4 B, W+ ~+ N5 d/ F8 A4 n
9 R4 U7 M1 |0 s% O4 A2 c1 M
5.2 读取文件
3 ^" E4 P% V5 D' o) w在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令.; H1 }/ H* @/ O/ O* n  L
5.2.1 读取数值数据
. w, O& u! V1 N! x0 z9 R; |如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成.6 J9 N3 E! |; ]" K3 T7 @# G
从filename文件里读取n行数据时使用命令: readdata("filename",n);$ b, P% C" M6 x, c$ Z" _/ l8 D
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);9 e9 z5 s# `% G& S6 b$ A
> readdata("e:\\filename.txt",3);6 P5 O0 F! _) A2 l5 K# b

: ]' z2 D  O1 n  m5 Q6 M1 x    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:$ C" ^% m7 c5 b1 d3 }7 R
> readdata("e:\\filename.txt",[integer,float,float]);
: e( C& p( N1 J- |& |/ E
% p1 j5 u6 @9 I. x8 h" D下面再看一个运用大量的实验数据在Maple环境绘图的实验:
7 i! [. i$ |6 W4 `9 z> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:3 O9 r+ s* D- ?- i8 y( _# W
> writedata("e:\\data.txt",evalf(mypts));
/ W5 Y- P2 N9 u4 ^! I. d1 i3 X> dots:=readdata("e:\\data.txt",100):
6 p7 g, [: R! l+ c, [7 s> nops(dots);
7 V* k% w# @1 D9 O; x9 B" f 8 L  W* V; _$ t% e; n; I
> dots[1..4];
! f# [1 ?" ]% h' O6 H4 O# g4 v, M. g
9 Z$ J5 h( P3 z, u, Q& m( Q> plot(dots,style=line);" A$ c2 c2 k3 X! E, s5 N

/ b4 E6 H" Z5 M# d! ?* }3 R( v2 z5.2.2 读取Maple的指令
* P# `$ b$ q' j- y在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:% u7 d$ \$ a! ]1 r& x' C
read "filename";% i( g4 _1 a/ D
如下例:8 _, D: n9 ]( t# Z1 n8 J2 M
> reatart:; B, I5 {6 I! \  i5 w- n) R) F
> myfunc:=(a::list)->add(i,i=a);# {) S/ C" j5 q: C% i7 n
4 F) @/ D- }  l$ o- z" C
> avg:=(a::list)->myfunc(a)/nops(a);. p! h. `4 ]+ P( T

; C+ J9 I( j8 x$ Z$ G& `> save myfunc,avg,"e:\\function.m";
2 X/ J5 A' U, D> restart:3 `3 |( _: m5 n0 N3 [
> read "e:\\function.m";- R- t. `8 ]: q1 U
> myfunc([1,2,3,4,5,6,7,8,9]);
& W% }2 C8 Q! j7 S' W: P % L2 z0 L+ @- S0 ?( `) ~0 S( f
> avg([1,2,3,4,5,6,7,8,9]);# x: a) K# E' J- u6 v" L4 A& n% g. v7 |

8 Y% p' J) A$ e2 w5.3 与其它程序语言的连接! \7 |* A6 |* _- ~/ i
5.3.1 转换成FORTRAN或C语言- O, Q0 e' y2 l
调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:/ J& b4 k' C" m+ d, R
> with(codegen,fortran):
; i3 S; P8 R7 R6 H+ T  E$ jf:= 1-2*x+3*x^2-2*x^3+x^4;
9 y# Z) D2 D/ V1 f9 u
! I% V( z+ E$ v$ m( b> fortran(%);+ O. |- l4 X3 k5 C! W
      t0 = 1-2*x+3*x**2-2*x**3+x**4- s* W- J' Q, o- D
> fortran(f,optimized);9 P: o  ~  @6 Q% }# l! v
      t2 = x**2: E7 W, P2 m0 l4 G
      t6 = t2**2) P4 ~- V2 f+ Y
      t7 = 1-2*x+3*t2-2*t2*x+t6- ?8 P* S0 B" M7 Q9 `: Y
> fortran(convert(f,horner,x));
9 f; ?7 F- `3 o4 @6 z      t0 = 1+(-2+(3+(-2+x)*x)*x)*x
  c2 B! l1 X% T+ F6 Y0 Y而codegen程序包中的C命令可以把Maple结果转换成C语言格式:  S* b( q/ V2 ?3 u
> with(codegen,C):
: j$ |4 Q+ n% A' p; _5 H8 P+ W( Qf:=1-x/2+3*x^2-x^3+x^4;
8 N7 l* g  T! x5 |" i5 D0 q
: X. f* y# a1 n( \5 Z% G> C(f);
8 j: F" z# Y( ^) Z      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;' p8 a0 M% [+ V" q% u6 f
> C(f,optimized);
  z$ R' @- k( S( m      t2 = x*x;
. m* A3 T5 e8 q# B      t5 = t2*t2;0 P$ w2 y9 z% f
      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
+ T5 W# q( g: m9 r& j$ h( j( h0 _optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.3 L: `; h; U" b" O& c
5.3.2 生成LATEX; ~9 w1 y- ]4 A( A9 S' w& N
Maple可以把它的表达式转换成LATEX, 使用latex命令即可:
5 @/ x! l4 }# h' j2 w9 ?> latex(x^2+y^2=z^2);
8 K! ~" l  b  P& ^0 Q8 {{x}^{2}+{y}^{2}={z}^{2}7 t6 j3 v! a7 p/ j3 I
    还可以将转换结果存为一个文件(LatexFile):
8 C& ^7 y5 `9 n1 y0 x' \> latex(x^2 + y^2 = z^2, LatexFile);" G( I4 O; q9 G( z/ y' ^1 P* i: Y
    再如下例:8 ]3 p2 _5 b9 h2 N0 x' B! n+ d
> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));0 V; y$ `# q) F
\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
% O  t. X& o) G5 C6 A' @+ U, S
7 M* m/ Q: b5 b* K' E3 B% A5 M
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年!6 n2 }, d1 r* h5 u) u* g+ w3 t. L# P/ Y
    % j+ e9 q9 D: C# J0 t0 d1 D  _8 I- }
    6 ^: x+ G; z  V
    回复

    使用道具 举报

    0

    主题

    2

    听众

    19

    积分

    升级  14.74%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    0

    主题

    4

    听众

    181

    积分

    升级  40.5%

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

    [LV.5]常住居民I

    群组学术交流A

    群组学术交流B

    回复

    使用道具 举报

    0

    主题

    13

    听众

    27

    积分

    升级  23.16%

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

    [LV.3]偶尔看看II

    社区QQ达人

    群组国赛讨论

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-20 20:13 , Processed in 7.496507 second(s), 101 queries .

    回顶部