QQ登录

只需要一步,快速开始

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

maple基础

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

1

主题

5

听众

4

积分

升级  80%

该用户从未签到

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

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

& U6 U6 C2 B' w: R, F+ Y# R
( F" q7 i% F/ K: h 3 n# q& }( c& w4 Y7 \8 H* C. s$ [

$ d6 u- G# V- i 7 O) A+ }. J& N4 G3 n1 e

9 o0 s! z( B* J1 A4 E) c
6 [6 T6 B! O3 y; M3 M/ e) K6 E
: b2 F- k4 S$ R
$ |/ w- _: g. s- M4 _* D
/ K4 @- e1 y! X2 M0 E1 W# ` * {5 v% _6 x8 A$ I" a

8 ]2 R, m7 M/ n+ \& }) Jalpha        beta        gamma        delta        epsilon        zeta        eta        theta        iota        kappa        lambda        mu- Q1 ]0 M! W, M* U0 L. x

8 E1 V3 p5 B' y7 G8 V) W! Q6 b0 W/ B! i 0 T: I+ Y+ h' T* W0 D1 e6 ]

# n* H  F! @' }- Q2 K * B( L- y  a: S6 i3 D0 ~
+ r$ h' O4 V% a6 u% S' X

* ~- E4 n6 g5 q9 l ! m* z3 n; U' h/ b! D/ E* L

8 {' Q9 c, }" _! b- ?* l, C) W
0 [* y% ^5 D! V  t4 \9 z* i
/ `2 O7 p# p7 ~/ U- Z! Y
9 s6 ~" ?7 s' @4 C+ A$ M
6 P8 W0 `# G; ^& L5 P. D" A, A* Q+ U7 N1 ~2 J8 N7 F/ X0 ~
nu        xi        omicron        pi        rho        sigma        tau        upsilon        phi        chi        psi        omega
2 m) N2 o9 W* i' E# E有时候为了美观或特殊需要,可以采用Maple中的函数或程序设计方式控制其输出方式,如下例:
6 I5 ^' Z# a' G) E5 m% P+ i1 A) i> for i to 10 do
( `! j& s: \4 k2 cprintf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));
4 ^4 ?# n  V4 u0 C4 z  m; E, s+ e3 Lod;& L8 N: Z! W/ E! M5 L1 o
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
' [+ d& i: T% D3 ]% y8 T0 \4 i, p+2d的含义是带符号的十进位整数,域宽为2. 显然,这种输出方式不是我们想要的,为了得到更美观的输出效果,在语句中加入换行控制符“\n”即可:; ]- f; W  I' G# y' ]3 ?8 H4 [
> for i to 10 do * H8 z  T1 h3 l, J5 ]1 s$ e( k
printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));# e& n* j2 B: V+ [2 X
od;
# t0 u* r- V& [$ Ci=+1 and i^(1/2)=+1.0000 x: E. w& T! \. ?+ k2 g
i=+2 and i^(1/2)=+1.414( D/ u5 F4 e3 M0 f& A
i=+3 and i^(1/2)=+1.732
3 c2 i. ~  n4 A, L- bi=+4 and i^(1/2)=+2.000
0 B. z2 k$ \: Y; v! d$ F& Ei=+5 and i^(1/2)=+2.2361 v$ B, Y8 w7 W4 r! g) @& C' V
i=+6 and i^(1/2)=+2.449
2 F2 d4 s' s. l( O  _$ ?2 Bi=+7 and i^(1/2)=+2.6464 _0 z+ c' W9 W7 I: O
i=+8 and i^(1/2)=+2.828/ j) j6 _! Z$ E: L; g& x- o7 u
i=+9 and i^(1/2)=+3.000
* ]6 S5 e$ j3 E2 C: ?# xi=+10 and i^(1/2)=+3.162
% T7 r6 Z6 p  G9 m* x再看下例:将输入的两个数字用特殊形式打印:
9 S; V6 `& B! j. f: f* P> niceP:=proc(x,y)
9 A7 Q) e# E2 v, e3 Oprintf("value of x=%6.4f, value of y=%6.4f",x,y);2 D' k( I2 ]: \: U, F7 ~! t5 c
end proc;- t& z3 g) [" a: M& X

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

% x) o$ ~% H  y$ s4 ^6 R这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 可以相信Maple结果的正确性. $ k8 I$ j5 {; a  t$ ]3 \
另一个例子则想说明Maple计算的局限性:   / Y% ?  E7 {2 Z
  
- l. `9 }0 y9 c7 E7 RMaple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中很容易得到:     S8 N8 B; T) i1 C, h
% C2 L7 Y/ Q) O8 T! g# U
显然这是错误的. 这一点可以从代数的角度予以分析.
  e* i( r1 _; i* B7 b不妨设 , 则 , 即 , 显然 有3个结果, -2是其实数结果.
" k* T& g& \7 N, J  o# ^5 B/ Y另一方面, 设 , 则 , 即:  z7 o6 X- t! T# G' E- J8 B
6 R) ], G, Y$ H  z
显然 有6个结果, -2、2是其实数结果.
8 T& ~* Y, [! [: Q$ D这个简单的例子说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是完全正确的, 但是, 通过更多的实验可以发现: Maple只可能丢失部分结果, 而不会增加或很少给出完全错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其他任何数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性.   p3 u( L: S7 |' w
尽管Maple存在缺陷(实际上, 任何一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 事实上, Maple同其他数学软件或程序一样只是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的. $ R/ x2 E9 z4 w
2.1.1 有理数运算0 Q9 o* X3 f7 _" a
作为一个符号代数系统, Maple可以绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而只是把两个有公因数的整数的商作化简处理. 如果要求出两个整数运算的近似值时, 只需在任意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10, 据此可任意改变浮点数位, 如Digits:=20).
2 s/ P: B5 ~& B6 t: b; F6 Q> 12!+(7*8^2)-12345/125;
8 b5 m- {5 j( p& f! v
" F4 k* y8 V8 C> 123456789/987654321;
; U/ d1 _0 {, w) m2 }$ N * V, k4 f- h' i( W& r2 P5 m4 R& A( @
> evalf(%);
# {2 k5 e/ v2 z+ U# h, J8 C$ q) l 4 N$ o, K- ~9 @) n
> 10!; 100*100+1000+10+1; (100+100)*100-9;
( D; w5 V" e% [; o' C * ?/ u4 p* D. |
+ T" i6 I/ Y) r8 C- T6 E; }

3 q3 M: b! y* }8 T" U' f> big_number:=3^(3^3);
8 S8 C- E5 s5 X: D, D5 N% Q/ J ' w" o- [' _+ @6 T
> length(%);( ^/ h4 J' J1 G, w+ g9 ]

6 n5 b, a' A$ K9 F上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而另一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个非常有用的简写形式, 表示最后一次执行结果, 在本例中是上一行输出结果. 再看下面数值计算例子:   # O* X; e% |% o4 j# I
    1)整数的余(irem)/商(iquo)
+ n" ~. M9 V+ C7 K) [0 r9 a' P5 ^4 Y% E3 j命令格式:   " t2 z7 R* a, \: Y7 D, b
irem(m,n);        #求m除以n的余数
' o8 `+ e5 Z: e% hirem(m,n,'q');    #求m除以n的余数, 并将商赋给q
* z% k# `5 f/ P$ v8 ~iquo(m,n);        #求m除以n的商数, Y9 g4 q8 ^# s" S
iquo(m,n,'r');    #求m除以n的商数, 并将余数赋给r
) S& N% B! I  P. y: x其中, m, n是整数或整数函数, 也可以是代数值, 此时, irem保留为未求值. $ \7 V: B* ?5 _' k6 b
> irem(2002,101,'q'); # 求2002除以101的余数, 将商赋给q
* F0 p1 j6 P7 M, r8 |$ D' F
2 V% Y4 w5 P& W> q; #显示q
5 U! V. l6 Y$ ^( ]% U+ b) x ; b! N! _$ l8 [  S8 d6 M1 Q
> iquo(2002,101,'r'); # 求2002除以101的商, 将余数赋给r
! ^5 [- }1 u' F& o9 m7 t& I
, n3 V1 [7 f4 a4 S) p# r> r; #显示r
- c* B. L, e8 U6 g6 v; t + z2 u# n3 D2 l1 z/ H; k4 A
> irem(x,3);) ^: {9 q; X# y
+ z( c" o7 X0 O1 b9 F: o
2)素数判别(isprime)
8 K; R" J  W) P" ]  |) O6 r素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令可以判定一个整数n是否为素数. 命令格式: isprime(n); ' V+ U3 j1 N* x% }
    如果判定n可分解, 则返回false, 如果返回true, 则n“很可能”是素数. , V8 W% I1 _5 Y9 }& x# u
> isprime(2^(2^4)+1);
% i$ C! f* q2 w0 I6 @& j , t+ {" V! o) F$ J8 R
> isprime(2^(2^5)+1);
' G1 d1 U+ \& L 2 U' K" H. s) A" B8 U# e
上述两个例子是一个有趣的数论难题。形如 的数称为Fermat数, 其中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数. Fermat曾经猜想所有的Fn都是素数, 但是Euler在1732年证明了F5=641•6700417不是素数. 目前, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这样的素数是否有无穷多.
( b! {6 t9 A, m8 V3) 确定第i个素数(ithprime)7 e+ u! Y  X+ Z
若记第1个素数为2,判断第i个素数的命令格式: ithprime(i);    $ @" r& J; E. Q" g) i+ G
> ithprime(2002);
" ?4 `  g$ I' h- ?% U
* e' Z3 S" v+ V> ithprime(10000);% v/ D# j( b" l4 ^. a% c8 l' Y2 m

" J- W; T. [# V) ^! O4) 确定下一个较大(nextprime)/较小(prevprime)素数
7 \* ^2 _! @8 d, v( C  I  z当n为整数时,判断比n稍大或稍小的素数的命令格式为:   
, S8 m6 `; I5 E- T+ xnextprime(n);  
" J" t5 E8 p) e( O5 k8 Vprevprime(n);
; e# c  b" y# m; Y. |4 F" _: s5 J  F> nextprime(2002);, E$ a; D5 M2 a" b2 k( J+ K" N

$ c' u  P3 d: A1 x7 y/ c3 s8 d  R> prevprime(2002);
* K! K" v6 ]2 w/ G, g; l / P, A! Q$ l1 q. S1 K' r7 d' C
5) 一组数的最大值(max)/最小值(min)+ i4 Y2 q+ J" s2 a* p
命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值
  X1 n. Q! Q; j             min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值
2 D: l& {" B* b) S0 k> max(1/5,ln(3),9/17,-infinity);
& ~* Z/ Z, s" R+ C6 K# R0 |. l- U
1 k3 r  i# w3 \' N# s4 D> min(x+1,x+2,y);
- q( G0 V9 G- s6 A 3 G- M9 k* k# f* s3 u% I: o
6)模运算(mod/modp/mods)
% W1 X: l4 ?8 v9 F命令格式:  e mod m;    # 表达式e对m的整数的模运算
& G' s" W$ I/ U3 s1 m. Tmodp(e,m);  # e对正数m的模运算
) Q9 Q+ k" K: d5 z, Rmods(e,m);  # e对m负对称数(即 -m)的模运算
6 [% m/ ~/ C4 V& G`mod`(e,m);  # 表达式e对m的整数的模运算, 与e mod m等价
7 C( w; n( {# ^3 S3 ~值得注意的是, 要计算i^n mod m(其中i是一整数), 使用这种“明显的”语法是不必要的, 因为在计算模m之前, 指数要先在整数(可能导致一个非常大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 另一方面, mod运算符的左面优先比其他运算符低, 而右面优先高于+和-, 但低于*和/. / v% }6 h& w8 J1 b3 ]! l
> 2002 mod 101;
9 B5 `6 q* P3 ]* k" _9 o" Y7 h& q - [$ }2 ^" i& c* N
> modp(2002,101);5 ]1 U1 s2 i1 }+ a% {% s  u, T3 J

+ J, t; ?" U% _, l1 m) G3 @> mods(49,100);
& j3 h; N& M% I7 K  f7 F
7 z; P$ @8 E3 N. u7 A7 t' Z' {> mods(51,100);3 O8 F0 P, S( V8 a

- j4 C9 L3 i( Q9 C4 S6 o+ |1 E9 y> 2^101 mod 2002;  # 同 2 &^101 mod 2002;
( x3 }2 E( S# B5 g3 @/ C) u
0 ~( U) _" M" _2 ]2 `0 D7)随机数生成器(rand)
5 D; J, r6 S  o8 {1 n; ~命令格式:   
: y2 {; J% {0 \2 W  Yrand( );    #随机返回一个12位数字的非负整数$ t6 `0 R* j) o" t
rand(a..b);  #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数
+ n! e6 c3 P( W! u1 b> rand();
% T2 A, c# A7 |- d 5 Q$ h! k- z3 z: ?0 i. h7 S: Q  I
> myproc:=rand(1..2002):- o9 j( [; M  z5 J* a
> myproc();8 N0 `' z1 i1 B3 j) \; Y
( J9 u0 V8 u* [
> myproc();4 g: k4 g0 p# @! a5 A2 {
4 i" d+ r8 b. S$ z6 y% @
    注意, rand(n)是rand(0..n-1)的简写形式.' x2 P: L* o; U
2.1.2 复数运算
6 J8 C1 l, b# l: z复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自动的, 所有的算术运算符对复数类型均适用. 另外还可以用Re( )、Im( )、conjugate( )和argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算. 试作如下实验:   
/ M; G: J; D% P& q+ R% q> complex_number:=(1+2*I)*(3+4*I);
% m3 Q5 `+ A+ F( D: y) Z
: J8 V; y3 k$ `+ D; m& t/ q" P1 U> Re(%);Im(%%);conjugate(%%%);argument(complex_number);8 v6 p8 X" m6 g7 `( Y3 k
* ?; [8 e* A. E' x7 m; R
, N( W2 g- L. t
+ R2 B$ G/ F/ @3 z/ A4 d* S3 I/ G

, Q9 ]  E' i( d/ [1 K; c( p4 i值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多只能用3个%)改为1个%, 因为%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.
3 V9 ]1 w7 m0 H9 v0 ]7 }  Q2 m为了在符号表达式中进行复数运算, 可以用函数evalc( ), 函数evalc把表达式中所有的符号变量都当成实数, 也就是认为所有的复变量都写成 的形式, 其中a、b都是实变量. 另外还有一些实用命令, 分述如下:   # L! x" \5 t, C9 x/ N$ k
1) 绝对值函数
; R" W4 g' z! _, M9 K命令格式: abs(expr);  7 x- W1 j) v+ ~2 x1 [. n9 w
当expr为实数时,返回其绝对值,当expr为复数时,返回复数的模.
  O% e$ M6 a( B5 p+ \> abs(-2002);    #常数的绝对值
. S- \6 Y! Q/ T3 S+ }
4 D- ~6 x' h$ O; f& E* n$ B& s> abs(1+2*I);   #复数的模
2 q  x0 w7 l0 y
2 O: m$ _( Z4 L+ X> abs(sqrt(3)*I*u^2*v);  #复数表达式的绝对值
$ H; w$ J5 p) q7 [ + w1 _0 n1 v1 `$ |( \8 i
> abs(2*x-5);   #函数表达式的绝对值8 z' t# N3 {. ^" l( ~" @3 w# c+ B% B

0 \% e3 ^4 `! Z1 L1 g2 ]- P$ ^8 l2)复数的幅角函数0 [) ?0 f+ g* f8 T
命令格式:   argument(x);  #返回复数x的幅角的主值  s( F4 c' x$ a  Q! D
> argument(6+11*I);
8 R5 g# m6 C/ w! j% v & @- q& f/ d! D! x: v% y" {
> argument(exp(4*Pi/3*I));
! Q8 G, ^5 \4 O& P, ?' D8 V. F
3 E/ K+ v. f/ H  M$ l3)共轭复数2 t0 K$ S' P& {  ]  p7 B8 u8 Q/ q/ n
命令格式:   conjugate(x);  #返回x的共轭复数
. [, o: W- z2 b2 C, R0 ?) D  t> conjugate(6+8*I);) |0 F% d$ `  }1 `, j/ W
  X4 b6 T, n2 \# |- Q5 k9 \
> conjugate(exp(4*Pi/3*I));5 }5 ^" ]4 j* _9 S8 c  G- a

6 G; g# h5 I) S* T3 p2.1.3 数的进制转换9 `" H" [/ h8 K' z: l5 a
数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换非常容易, 使用convert命令即可.
: q4 i  h; D- v* o8 l. P: L1 q命令格式:   convert(expr, form, arg3, ...);   
+ j7 T+ {" t  U, k8 b: c. A" n( D其中, expr为任意表达式, form为一名称, arg3, ... 可选项. + I4 t5 T- W, E, \
下面对其中常用数的转换予以概述. 而convert的其它功能将在后叙章节详述. * ?% d. ]$ R8 C! o
    1)基数之间的转换% `0 B# X& P$ A% I7 B) }$ J
命令格式:   % z4 E' u$ V$ b' `9 r, t/ x/ U
convert(n, base, beta);      #将基数为10的数n转换为基数为beta的数
2 z9 m# C$ N2 Z" W9 _& [    convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数7 T  T7 l3 }- K# a
> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7
2 a/ Y" I* a8 w" \ ; B$ X* m5 g# ?, ?
> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数
+ `4 y9 U, C" } 1 X9 Z- |: l8 v1 ^. P
> convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)
' x8 ^+ c( _9 S- ]; c/ H( W% | & i5 |0 T; T4 ^  I6 c2 |' s% J
    2)转换为二进制形式" r4 _4 B' ~0 A& D
命令格式: convert(n, binary);
5 u; c* o) F/ N7 g+ R0 t2 V- E其功能是将十进制数n转换为2进制数. 值得注意的是, 数可以是正的, 也可以是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂.
' m0 V/ X0 V6 j  m6 Z> convert(2002,binary);   
- _5 j: x, N/ }  J8 p : R9 ?5 m# l7 E& ]# L% t
> convert(-1999,binary); & V7 D0 m7 z2 o% t' y3 n' h

4 V! f- T) x; I! e> convert(1999.7,binary);
2 |! h5 g* t# \$ i# _3 o  z( m / T8 s' w3 t" V- J8 ~
3)转换为十进制形式
5 _+ \- `0 R: R其它数值转换为十进制的命令格式为:   
6 R) P4 s' x8 A+ n) R- jconvert(n, decimal, binary);   #将一个2进制数n转换为10进制数- F; ^6 k5 F" U% `
    convert(n, decimal, octal);    #将一个8进制数n转换为10进制数
9 v+ w! k0 p+ T4 ^. X    convert(string, decimal, hex);  #将一个16进制字符串string转换为10进制数
1 V9 ?4 D4 F6 h$ D- O> convert(11111010010, decimal, binary);   
; ?. C/ L! x  g' Z# `) W) X
; T, J& \, w# d$ Z9 z- b> convert(-1234, decimal, octal);             ?% c  n6 ~' h; Z

9 z% o# X1 A$ F; {> convert("2A.C", decimal, hex);         
. n* K: \+ [4 F2 r) k! H9 g ) J+ z  V" J( s2 u; ?4 I! j
4) 转换为16进制数( A" P5 b$ P! \) L# P# M
将自然数n转换为16进制数的命令格式为: convert(n, hex);   
8 u" ]5 |, p0 K8 p6 ?) g> convert(2002,hex);  convert(1999,hex);, k! u% c, C" }  F$ `* M! K  y8 c+ W

( j$ e4 b, V7 \! W0 ]! S9 M
7 T& y6 e- s2 a% u% \; x5)转换为浮点数
% n( Z9 [' m, F4 E2 J命令格式: convert(expr, float);
& p. p0 e5 w- e0 M$ {/ J# \注意, convert/float命令将任意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用. & `6 A6 W! C. c  U% H
> convert(1999/2002,float);
# [& u5 U5 h( V+ w1 M
* r0 x" v  o0 C% z9 T3 F6 \> convert(Pi,float);
1 f  d+ t. \+ t% |3 D* q* R # H1 t! ?; E  m! p( m
2.2 初等数学
$ x4 x4 \$ c! D  k8 {" G% P    初等数学是数学的基础之一, 也是数学中最有魅力的一部分内容. 通过下面的内容我们可以领略Maple对初等数学的驾驭能力, 也可以通过这些实验对Maple产生一些感性认识. : `2 ~7 m* z/ q+ x
2.2.1 常用函数3 m7 r( P8 Z6 [) P1 d' y+ ~
作为一个数学工具, 基本的数学函数是必不可少的, Maple中的数学函数很多, 现例举一二如下:   1 r9 T8 C! p9 s* b- r6 F% @
指数函数: exp
( }: F' {" k8 j  c3 v$ n一般对数: log[a], Q4 }3 [) l5 R7 @
自然函数: ln6 {% G2 j$ ?2 v; U
常用对数: log105 ^1 p" T6 f7 K
平方根: sqrt
7 [" Q; ~, f$ d; q. M7 B! K8 H绝对值: abs
- M9 D" U: M7 `  A三角函数: sin、cos、tan、sec、csc、cot
$ L- f+ ]7 s% A5 ]0 e反三角函数: arcsin、arccos、arctan、arcsec、arccsc、arccot% C; w* H. A1 F6 Y- A
双曲函数: sinh、cosh、tanh、sech、csch、coth
% |1 Q3 w0 Q- C. m6 h0 _/ ]: ?反双曲函数: arcsinh、arccosh、arctanh、arcsech、arccsch、arccoth4 i4 d& M3 p' g6 z! r& w5 w" Q
贝赛尔函数: BesselI、BesselJ、BesselK、BesselY
; ?' _) V3 M# LGamma函数: GAMMA* {& T1 J+ \% m) P8 K" J/ X
误差函数: erf' T0 ?- p% u& X: }
函数是数学研究与应用的基础之一, 现通过一些实验说明Maple中的函数的用法及功能. : X" t: @' {3 u2 ]1 g
1) 确定乘积和不确定乘积/ X3 U3 C; u0 C
命令格式: product(f,k);  
/ C0 a5 D% \7 Y- bproduct(f,k=m..n);  * t8 J/ a, _- L
product(f,k=alpha);
; F, e1 ]& ]0 k1 E3 D8 b; B' Tproduct(f,k=expr);1 T( A4 T0 s- w
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—包含k的任意表达式.
. A0 C; T+ H( s6 s8 ~5 J. N3 E$ \, h> product(k^2,k=1..10);   #计算 关于1..10的连乘
0 ?8 l% C- b0 W- x4 l
+ ^# x; g, j2 E" _# Z> product(k^2,k);         #计算 的不确定乘积$ z: W! F& f0 s
) B8 [. F, f# U7 u) |. X# f2 \
> product(a[k],k=0..5);    #计算ai(i=0..5)的连乘" p, b' y  J- d/ U1 Q5 x

# u$ X% @7 C  l' @3 ~% l> product(a[k],k=0..n);    #计算ai(i=0..n)的连乘
% C0 M; t! o$ r5 U% n3 T, R, J0 ? & B8 K& }4 m& H( f8 _  S
> Product(n+k,k=0..m)=product(n+k,k=0..m);   #计算(n+k)的连乘, 并写出其惰性表达式2 K2 v. j" N5 |! l* [  A

3 {+ Z$ K+ _; V+ b> product(k,k=RootOf(x^3-2));     #计算 的三个根的乘积4 B' ^2 \# y- f' W3 K

5 Q" M5 d. e9 @* F4 W# P; A/ l3 g    product命令计算符号乘积, 常常用来计算一个公式的确实或不确实的乘积. 如果这个公式不能求值计算, Maple返回 函数. 典型的例子是:   / M3 L7 A0 U4 T1 H) j2 b' Q  S
> product(x+k,k=0..n-1);
. f. c6 J# s. f
4 R! a; y6 I2 _9 B, |如果求一个有限序列值的乘积而不是计算一个公式, 则用mul命令. 如:   
0 V; t) ]) ^# u8 A7 B9 f> mul(x+k,k=0..3);
4 y& V1 q5 H7 O' r
6 r$ [) {$ l& n* m9 F2)指数函数9 y  @) K. z' n" w
计算指数函数exp关于x的表达式的命令格式为: exp(x); ! N3 _+ T3 M" D. H* h
> exp(1);
- o# u1 t- \: v4 Y+ v+ _" k
1 Z* u( ]; B+ ^9 c7 I> evalf(%);) u4 B2 l- ?# k8 A4 L  i+ ?0 ?
5 w# |0 k0 B" b2 h, j. C2 ?- q
> exp(1.29+2*I);; J1 @" I. }- p, _$ c1 L
" \* D9 z2 R1 q2 h2 o( v  }! F
> evalc(exp(x+I*y));
3 e* o# @+ ^6 B3 |( }0 s 6 X% x/ H( H* U/ U0 P  n, o$ y
3)确定求和与不确定求和sum. m2 |4 s1 f- Z0 s
命令格式: sum(f,k);  ) Y1 T- O3 z' u4 [" h
sum(f,k=m..n);  2 \9 J) G" Y; l- k  Z' T
sum(f,k=alpha); # p& D& }# f, c5 n. N, @; w, v
sum(f,k=expr);. ]/ A9 n% @5 x6 M# I3 \0 N# g
其中, f—任意表达式, k—乘积指数名称, m,n—整数或任意表达式, alpha—代数数RootOf,     expr—不含k的表达式.
: Y  x+ b: ]7 J' s6 L9 h7 h: b8 N> Sum(k^2,k=1..n)=sum(k^2,k=1..n);- Y3 S6 p0 T: x* e9 C8 L" ?
& l. ^2 [2 @: x3 f
> Sum(k^3,k=1..n)=sum(k^3,k=1..n);0 M4 h) [. ^. P, P; @; ^1 j
  a* a% f3 [7 w* m1 ~; `
> Sum(k^4,k=1..n)=sum(k^4,k=1..n);6 G9 _" F9 T, l) x& b0 N+ L
7 Y- a) E; x+ z5 L; L) m! f, i
> Sum(1/k!,k=0..infinity)=sum(1/k!,k=0..infinity);
1 z! O4 n1 P+ S& [+ G: ?# o  H " z& w/ W- g5 T/ O( p0 I: d1 B
> sum(a[k]*x[k],k=0..n);
( S/ X+ l  s( Z " e7 w6 ]/ z( ?5 t$ U. }
> Sum(k/(k+1),k)=sum(k/(k+1),k);/ U3 V7 u" }6 k0 {0 S
: f6 `; [2 ]7 e* ]
> sum(k/(k+1),k=RootOf(x^2-3));
- h2 D7 i/ q$ E* P% [8 S / e( j" P) N' f# U7 x1 J# q
sum函数可计算一个公式的确定和与不确定和, 如果Maple无法计算封闭形式, 则返回未求值的结果. 值得注意的是, 在sum命令中将f和k用单引号括起来, 可避免过早求值. 这一点在某些情况下是必需的. . C7 k+ N0 I  J
> Sum('k','k'=0..n)=sum('k','k'=0..n);
5 N, s1 C8 ?+ \4 F1 t  u2 `1 a
% r5 U1 M1 x4 j& Q& O6 g如果计算一个有限序列的值, 而不是计算一个公式, 可用add命令. 如:   0 s$ ?0 `1 ?) `- h1 c
> add(k,k=1..100);
0 U4 `6 ]! i+ Z9 L  p 9 W6 I' Z8 V3 E
尽管sum命令常常用于计算显式求和, 但在程序设计中计算一个显式和应该使用add命令. + v8 A- y$ h  o7 i( x: y
另外, sum知道各种求和方法, 并会对各类发散的求和给出正确的结果, 如果要将求和限制为收敛求和, 就必须检查显式的收敛性. ( @2 f. D7 }" D, l
3)三角函数/双曲函数8 c; P+ n7 K% K, v
命令格式:   sin(x);   cos(x);   tan(x);   cot(x);   sec(x);   csc(x);
- H1 k; K) P2 D5 h/ S- d# n- y% A* y          sinh(x);  cosh(x);  tanh(x);  coth(x);  sech(x);  csch(x);: W! y; D, X$ {  Y
其中, x为任意表达式. , [+ \* Z. M/ U) ?, d* R
值得注意的是三角函数/双曲函数的参数以弧度为单位. Maple提供了利用常见三角函数/双曲函数恒等式进行化简和展开的程序, 也有将其转化为其它函数的命令convert.
* \6 w* Z% x& |> Sin(Pi)=sin(Pi);
$ k! h* p5 T6 K9 Y7 k4 a1 V$ r : ^$ A" I! ]# q& v
> coth(1.9+2.1*I);
+ F* {# [- b9 `% D1 ~6 X( _
8 _" w$ ^  P$ _> expand(sin(x+y));     #展开表达式
/ P* h& j, B5 e/ U % s# s* v( e& t9 ?6 o0 m" L( g& G
> combine(%);        #合并表达式# N4 a4 R. G. x4 w6 v7 r
; N- n8 i- P7 F  N( W
> convert(sin(7*Pi/60),'radical');
' ?( t# E  U8 Y * r6 \  x1 b6 ]5 a
> evalf(%);6 ?% O( W! C! M1 Z7 R

9 f! _. S# _+ q  n# ?( Y但有趣的是, combine只对sin, cos有效, 对tan, cot竟无能为力.
' L, S! ]. p9 k7 w% Z- ~# w4)反三角函数/反双曲函数2 M# [6 _, Y6 q
命令格式: arcsin(x);   arccos(x);   arctan(x);   arccot(x);   arcsec(x);   arccsc(x);
# q1 T3 u) q  `: ^     arcsinh(x);  arccosh(x);  arctanh(x);  arccoth(x);  arcsech(x);  arccsch(x);   
! Z- `2 F+ I; j. ?6 zarctan(y,x);
* r+ h: ^, w3 e& {+ h8 t& o其中, x, y为表达式. 反三角函数/反双曲函数的参数必须按弧度计算. & ]) D" ]$ j5 ^/ V  A. Y
算子记法可用于对于反三角函数和反双曲函数. 例如, sin@@(-1)求值为arcsin.* N( \0 p0 h5 s' x# {* V# |8 r0 }
> arcsinh(1);3 k% G* N: p* K3 w. @/ h
3 L4 i" G* ~* a9 Q; Z& _. v, D* }: Q
> cos(arcsin(x));3 J3 _6 z5 U, b/ j4 {
, g8 X: R: \, s: S6 @' ]
> arcsin(1.9+2.1*I);
- A! q9 T% a% W! t) R% L3 i1 H # Z. s& g  F! A' C" a) q3 ^* q
5)对数函数( R: ]7 Y3 J& f  i" p1 b, R
命令格式: ln(x);           #自然对数2 F9 _" R; g# u7 U6 P& a
log[a](x);        #一般对数* O1 Y) d( |; T6 S$ ?! k0 s4 y  F
log10(x);        #常用对数: i5 F: C# Z8 H2 t2 p1 @1 d6 a3 Q) D
一般地, 在ln(x)中要求x>0. 但对于复数型表达式x, 有:   ( a! @6 M+ o" K
  (其中,  )* t' w, Z: `: Z1 A: n, L
> ln(2002.0);
6 i3 r" z! f9 f 6 {3 P) \$ o/ r7 q/ k3 [, C
> ln(3+4*I);# K. @! r  i0 C5 m7 [6 l/ s
9 A+ s* ^9 ?  N1 [9 a  r2 R" Z
> evalc(%);    # 求出上式的实部、虚部
+ d  C. @6 A8 J0 d5 _/ q 8 T1 }3 o4 h0 R# q6 G
> log10(1000000);
) G% d7 j0 r  o+ O1 K  I; A- _4 \
8 u! J0 Q$ G7 J" n0 q> simplify(%);   #化简上式
, C2 U# i. q6 Q$ q% A & R4 V' y  }6 |1 U$ a& v* _1 c7 S
2.2.2 函数的定义
+ J' q% |: M( H5 S0 t: q# dMaple是一个计算机代数系统, 带未知或者已知字母变量的表达式是它的基本数据形式. 一个简单的问题是, 既然表达式中可以包含未知变量, 那么它是不是函数呢?试看下面一个例子:   
; |1 {2 M8 J8 c& h& v> f(x):=a*x^2+b*x+c;/ X. @! _/ m% y# @& i: g! U+ [
, C" B; ?- l' G9 T. `
可以看出, Maple接受了这样的赋值语句, 但f(x)是不是一个函数呢?要回答这个问题,一个简单的方法是求函数值:   
$ \2 k5 C' b; j$ A) C' u* u( N> f(x),f(0),f(1/a);
1 k) p( Q9 n. {/ `2 j ( Z+ U0 O* n* M) c1 E
由上述结果可以看出, 用赋值方法定义的f(x)是一个表达式而不是一个函数, 因为f(x)不能把所定义的“自变量”或者“参数”转换成别的变量或表达式. 但从赋值“过程”可以看出, f(x)虽然也算是一个“函数”, 但却是一个没有具体定义的函数:   
$ Q0 C$ W. a/ H6 x6 c( {2 {> print(f);  Z; U/ H( }# o6 M0 i
; N$ m. Z( R+ q8 ?) @+ Y( P
事实上, 我们所做的赋值运算, 只不过是在函数f的记忆表(remember table)中加入了f(x)在x上的值, 当我们把自变量换作0或1/a时, f(x)的记忆表中没有对应的表项, 所以输出结果就是抽象的表达式. 1 g# b" A- A. k2 h) X4 Q
在Maple中, 要真正完成一个函数的定义, 需要用算子(也称箭头操作符):   
( x+ ^5 Z/ {% t* }5 G% l* H% @) O' d> f:=x->a*x^2+b*x+c;3 \2 R. \. c$ ], B3 U% R% R8 l

# M7 ]' w6 Y& W) V> f(x),f(0),f(1/a);" W/ ~- ?5 y; d1 i: D% @, q

+ v# [! c1 U5 [* B2 b多变量的函数也可以用同样的方法予以定义, 只不过要把所有的自变量定成一个序列, 并用一个括号“()”将它们括起来(这个括号是必须的, 因为括号运算优先于分隔符“,”).
" i7 t! C% y  ^7 Q) o6 Q9 s> f:=(x,y)->x^2+y^2;
0 c5 t! y2 |( _. @ 5 _: P5 @% o+ `" i+ N5 L) T
> f(1,2);
/ X% {4 x6 T$ K( ]# q6 I8 k 4 W6 c0 q6 e" x- ?4 U0 t
> f:=(x,y)->a*x*y*exp(x^2+y^2);9 C5 m( |8 T0 n) ^8 n; m6 V" K% R% y& I
6 D/ w4 Y: G- k1 R( @; P) J
综上所述, 箭头操作符定义函数的方式一般为:   
" Q: ]+ x# o2 x% O$ `3 j' ]一元函数: 参数->函数表达式# o) N+ R! n' D6 |2 u% M' m
多多函数: (参数序列)->函数表达式
* F' o% R0 |" {; K' n1 v  {9 J无参数函数也许不好理解, 但可以用来定义常函数:   
9 B$ U4 s$ \# }2 M> E:=()->exp(1);$ b2 @: y. [$ y/ {$ z
- s1 v0 k9 @/ R0 u; y* Y8 k. f
> E();
) {2 z, v5 U# o* E0 M8 ]2 s0 j& Y
$ ?& X) z( b" G* B> E(x);
7 w# z! H4 G! v - m7 q# }5 e$ r  ^% u8 }" [6 \' T5 y
另一个定义函数的命令是unapply,其作用是从一个表达式建立一个算子或函数.
) t1 Z; e' S5 \" Y6 N; T% W0 l( `定义一个表达式为expr的关于x的函数f的命令格式为:  f:=unapply(expr, x);         
* }$ d/ j2 r, F7 A定义一个表达式为expr的关于x,y,…的多元函数f的命令格式为:  f:=unapply(expr, x, y, …);     9 k, p" C) U- m6 M4 {6 V' |
> f:=unapply(x^4+x^3+x^2+x+1,x);
/ Y# v, X0 _1 b) h- @ # B5 C# K7 D3 y! [% f& F. {/ F1 e
> f(4);
) {8 U6 H, w; ^, C1 J
; g  ]9 U* Y# |) F> f:=unapply(x*y/(x^2+y^2),x,y);  f& Q* S- P$ p* n

/ X' K+ h$ ~: ?2 k' L> f(1,1);
4 W7 A9 Q. k3 f2 ~& i; i0 x : W% C2 ~* T  h+ s
借助函数piecewise可以生成简单分段函数:# E3 U/ ?3 m& V% ?( s$ `  e
> abs(x)=piecewise(x>0,x,x=0,0,x<0,-x);% e, g  L1 p3 S
, f; E) P% C. o1 `, P
清除函数的定义用命令unassign. ! j+ c/ s  }& r  E
> unassign(f);& i2 o4 W# {) L) t. {, f
> f(1,1);
" p6 n& U8 z4 g( h# V
+ F* O+ H) M& K$ ^) v) f% h4 b除此之外, 还可以通过程序设计方式定义函数(参见第6章).
- ?! K2 D+ `6 K# @% ]定义了一个函数后, 就可以使用op或nops指令查看有关函数中操作数的信息. nops(expr)返回操作数的个数, 函数op的主要功能是获取表达式的操作数,其命令格式为:: m" e+ Z* t5 K3 @7 S# l
op(expr);         
. V5 B2 b7 z# W$ D: Qop(i, expr);         
* x" n, N* P: c# H, zop(i .. j, expr);      " Q0 q2 e7 v9 L* M2 m+ E! G/ j
nops(expr);
5 A1 a' _$ {% j( h如果函数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的类型. 3 ?0 w+ m5 j. N' F6 @) w& d$ r
命令op(i .. j, expr); 执行的结果是expr的第i到第j个操作数, i..j中含负整数时的情形同上.
7 q+ ]3 r; q9 l; D命令op(expr); 等价于op(1..nops(expr), expr);
1 u9 Q4 R& B7 j( A8 M特别地, 当op函数中i为列表[a1, a2, ..., an], 则op([a1, a2, ..., an], expr); 等价于op(an, op(..., op(a2, op(a1, e))...)); / w  u" w- u, Z2 U
而当expr为一般表达式时,nops(expr)命令返回的是表达式的项数, 当expr是级数时返回级数每一项的系数和指数的总和.
( l. o# {) d& N! _2 `, s# M> expr:=6+cos(x)+sin(x)*cos(x)^2;
" @& G/ M# Q. g; c + a! j- e" y4 E8 w( A" x/ s) E
> op(expr);
, N" G: D, U! }+ L$ H" B( A , I5 ^: Y7 M9 D6 n1 T
> nops(expr);
, A& s! t" W2 X+ r 6 L- e5 g4 Z  m/ @
> p:=x^2*y+3*x^3*z+2;( }- l9 u; X1 J
. _7 |" i7 c! B# }# I
> op(1,p);
2 I8 T3 k9 }; k. Q& l" D# G! n & O2 r0 x; q4 f; |
> op(1..nops(p),p);: Q& o0 n! C* P$ D* C
) p5 Z) q" f9 O; Y; ^* T
> op(op(2,p));( ~$ i) h+ N7 C! N+ ?
0 l% x9 m# t; t2 X+ \7 S
> u:=[1,4,9];
1 C" y* D6 P, H. M* J6 h7 D % K- l7 r2 `! D
> op(0,u);
' {( I7 w: J2 k" j
) n' ~1 }) d! U  Z* u1 [8 \> s:=series(sin(x),x=1,3);  |  y4 E  ?0 [" U) a6 q

, [3 f$ D8 i! a9 ^, p  D3 c> op(0,s);
% v7 Y9 r- _, _3 F3 c' B        
! }, m6 ?; A9 m3 U! i> nops(s);
. k/ A/ P5 |7 \" Z & e1 b0 c% p# R7 j
下面一个有趣的例子说明了Maple在处理算术运算时的“个性”:
" U, Z+ m1 S8 p$ s  w> op(x*y*z);2 d! N' ~5 ^. h4 o3 t( D

1 t. P! W* @: {0 D2 n5 W4 x* i0 O> op(x*y*z+1);
+ e' h5 H, h: Q, h7 E
) ^/ ~; l4 H) e1 X: t. m& M2.2.3 Maple中的常量与变量名$ |0 \* t" i7 M  Q' S' `0 _! ]7 V/ M& L
为了解决数学问题, 一些常用的数学常数是必要的. Maple系统中已经存储了一些数学常数在表达式序列constants中:   
0 a- s2 n! P- L0 E, j> constants;
! K. t$ w9 c# Q3 _" m& `# l) }
* t+ x' f- n% M& C- ]8 N5 Q# A! p% V, ]为了方便使用, 现将上述常数的具体含义列示如下:   
* v$ s5 u, b- \% v5 \2 H6 X- \  C常    数        名 称        近似值  ]6 I6 H0 g4 f: i- S, r7 N% O& F
圆周率 1 `& f7 ]+ ?# o2 Q% q
Pi        3.14159265355 E0 {# ^4 N% ~
Catalan常数
4 ~/ D& N* q) `* j% J( R2 w& x3 qCatalan        0.9159655942( D' K# t3 w3 r
Euler-Mascheroni常数
/ F- E" D# L! y/ J: m; zgamma        0.5772156649+ ^% _/ F6 u% s- @. s- _

3 k$ G* d$ P7 x* u. Z/ P4 `1 Tinfinity       
: `8 L2 Z: n( d" w1 w8 k$ \- F. g- V- A7 a/ Q
需要注意的是, 自然对数的底数e未作为一个常数出现, 但这个常数是存在的, 可以通过exp(1)来获取.
" c0 i& ~! q& O/ m/ q在Maple中, 最简单的变量名是字符串, 变量名是由字母、数码或下划线组成的序列, 其中第一个字符必须是字母或是下划线. 名字的长度限制是499个字符. 在定义变量名时常用连接符“.”将两个字符串连接成一个名. 主要有三种形式: “名.自然数”、“名.字符串”、“名.表达式”.
2 y# A0 a( X2 r# ~: b值得注意的是, 在Maple中是区分字母大小写的. 在使用变量、常量和函数时应记住这一点. 数学常量 用Pi表示, 而pi则仅为符号 无任何意义. 如g, G, new_term, New_Team, x13a, x13A都是不同的变量名.
' B. ^3 J* s8 q# M9 \, V在Maple中有一些保留字不可以被用作变量名:   ; l( u: m. T2 l
by      do      done     elif     else     end        fi        for      / d1 y% c9 l4 Z- }- k5 |
from    if       in       local     od     option    options     proc         
: J( `% d7 d! K- b+ k( I" Equit    read     save     stop     then     to        while      D
9 G9 d6 C1 A$ V# `: {. F% _Maple中的内部函数如sin, cos, exp, sqrt, ……等也不可以作变量名. ( u, X9 G% @1 v& N2 H7 J( P
另外一个值得注意的是在Maple中三种类型引号的不同作用:   5 W! A# E0 j0 w8 G6 f
`  `:   界定一个包含特殊字符的符号, 是为了输入特殊字符串用的;   
$ W* j2 c) s4 H$ s3 _- V'  ':   界定一个暂时不求值的表达式;   
3 ]# o2 G1 r9 S7 o2 {  z"  ":   界定一个字符串, 它不能被赋值. $ g6 U" G/ L: u6 w/ l! u* a: q
2.2.4 函数类型转换           
! }! s5 W8 x; M2 u/ ?6 x函数类型转换是数学应用中一个重要问题, 譬如, 将三角函数转换成指数函数, 双曲函数转换成指数函数, 等等. 在Maple中, 实现函数类型转换的命令是convert. 命令格式:  0 W, |: W: ?8 k* t: E# g) ~0 d8 \' n
    convert(expr, form);        #把数学式expr转换成form的形式
' \1 g/ a  F$ Y0 ^3 e0 W' d/ q9 {1 X% Y* Oconvert(expr, form, x);      #指定变量x, 此时form只适于exp、sin、cos
+ P& @: @4 ], |" n5 Yconvert指令所提供的三角函数、指数与函数的转换共有exp等7种:   . h5 E! u# ^4 Z2 I& N
(1) exp: 将三角函数转换成指数
0 n& P( }8 u2 i  q0 M* r+ v- }(2) expln: 把数学式转换成指数与对数
8 W" ~1 x. J6 \6 w/ f* ](3) expsincos: 分别把三角函数与双曲函数转换成sin、cos与指数的形式
1 I- i3 w% h. A(4) ln: 将反三角函数转换成对数
! D3 M: Q4 `7 |(5) sincos: 将三角函数转换成sin与cos的形式, 而把双曲函数转换成sinh与cosh的形式3 R) E% s9 p8 b, \, }
(6) tan: 将三角函数转换成tan的形式
$ V8 r$ O, Z3 w$ A, z! s) k(7) trig: 将指数函数转换成三角函数与对数函数
! O0 T6 j' d' L) C5 v- G3 e. r! O> convert(sinh(x),exp);   #将sinh(x)转换成exp类型
8 e: g5 X  T$ p" Q) T/ b3 I
( s& m; L. C5 b! N: A! Z, G> convert(cos(x)*sinh(y),exp);
( u" ?2 U$ }0 c% E* Z 9 u7 R* r4 j- M! M+ V3 _$ {
> convert(cos(x)*sinh(y),exp,y);- I8 G. L4 [8 l* @: m. M

' Z. P% w+ F. C* k3 w7 b9 l> convert(exp(x)*exp(x^(-2)),trig);
- i: J$ y- v) ^) e% e% z+ {
& ]$ q% e) C# q) b6 S; O> convert(arcsinh(x)*cos(x),expln);
' I0 @: F. A, s 1 G& y$ u) ?; r* N4 x
> convert(cot(x)+sinh(x),expsincos);* V/ ~8 }* G  }0 _, Z5 J

  G2 j6 {# G  R8 i2 s6 D> convert(arctanh(x),ln);4 S" }/ \( {9 t2 b. g
$ s, F  p2 T9 f) ?# S
convert在有理式的转换中也起着重要的作用. 在有关多项式运算的过程中, 利用秦九韶算法可以减少多项式求值的计算量. 在Maple中, 可以用函数convert将多项式转换为这种形式, 而cost则可以获取求值所需的计算量. 注意: cost命令是一个库函数, 第一次调用时需要使用with(codegen)加载. 例举如下:   3 e. s' p( ^; k8 \' ]
> with(codegen):
) B+ ~0 U1 Z- P: {4 c6 U> p:=4*x^4+3*x^3+2*x^2-x;
  U' r, h7 f+ m1 S  Z
, ?% |. t; V" A' ?. O% M> cost(p);
- h! @/ m. Q; P8 x& d; ]4 t
5 W7 O0 E% S5 b: V1 i4 J5 {> convert(p,'horner');  #将展开的表达式转换成嵌套形式7 O' V6 o4 h% o8 \) A/ E

- _3 {3 Z  }- w" s/ Z> cost(%);% r0 w( ~9 A% P7 S" f: A

2 Q: F$ U; y9 `& ]5 O" x同样, 把分式化成连分式(continued fraction)形式也可以降低求值所需的计算量.
1 K# J, g' z. `% f> (1+x+x^2+x^3)/p;
: L& q$ U2 o. s5 \* W
  U( d8 o* l* Y' b. O0 F" S> cost(%);
0 s% w* \" s! d
8 Q; E  m4 K) \1 F2 a> convert(%%,'confrac',x);
- `" a  k/ H6 } 3 ]; v8 D5 x+ L% ^$ Y
> cost(%);
; n9 W" @  N4 z: N$ m2 ?6 u . V" W; |5 m1 g! e3 c: v
在某些场合下(比如求微分、积分时), 把分式化成部分分式(partial fraction)也就是几个最简分式的和式的形式也可以简化运算, 但简化程度不及连分数形式. 0 c+ T- w8 `4 O6 Z  Q( r& }* z; J
> convert(%%, 'parfrac',x);1 K1 T$ ?# L3 Y1 [9 C# z0 |

% ~! Z2 x5 ]1 w: U( ]) u6 V) Z0 Y4 K* P> cost(%);
/ v' }# K# G, D# S) I & b0 x: m: g7 o9 K  v4 L
而把分数转换成连分数的方法为:$ a" I9 g+ J4 ~) T( ?: o$ d
> with(numtheory):* e9 G( X0 ^2 L; n
> cfrac(339/284);  j/ i8 u. W$ a  u3 G- Z5 P
7 t6 N: l6 u' [0 S
2.2.5 函数的映射—map指令
5 R: X3 D& M, K在符号运算的世界里, 映射指令map可以说是相当重要的一个指令, 它可以把函数或指令映射到这些结构里的元素, 而不破坏整个结构的完整性. 命令格式为:; [3 Y% r1 E' F( U+ Y/ S
map(f, expr);      #将函数f映射到expr的每个操作数
  |: d2 g/ c2 Bmap(f, expr, a);    #将函数f映射到expr的每个操作数, 并取出a为f的第2个自变量
3 E1 w; B- [1 u& w6 _: t: imap(f, expr, a1, a2,…, an); #将函数f映射到expr的每个操作数, 并取a1~an为f的第2~n+1个自变量& x/ Q" ~: k! u/ w4 H
map2(f, a1, expr, a2, …, an);    #以a1为第1个自变量, expr的操作数为第2个自变量, a2为, ^& k8 J  H  M" L: x! M9 C
第3个自变量…, an为第n+1个自变量来映射函数f
' S/ |& Z! N' r, ^% u> map(f,x1+x2+x3+x4,a1,a2,a3,a4);
# j- g' h* Z6 {' N/ C ; ?- A- M( z! \1 _- Z
> f:=x->sqrt(x)+x^2;
5 L* g0 Z& ~9 O! g+ e1 L# f
* {, g2 @. R! z> map(f,[a,b,c]);
. G5 P; \; O3 a 4 ]! V2 w4 v. f1 p
> map(h, [a,b,c],x,y);
( [/ t* R( m4 E
4 @8 y0 C6 t& N! V9 V> map(convert,[arcsinh(x/2),arccosh(x/2)],ln);0 d8 O( n1 J" w- W' @  W
; w1 U" X/ L( T% }. @
> map(x->convert(x,exp),[sin(x),cos(x)]);
6 C& S$ L" `4 r0 h* S
/ U* e" d& |4 w) j+ J0 ?上式的映射关系可通过下式理解:
0 r3 I1 o* s' l. V> [convert(sin(x),exp),convert(cos(x),exp)];
6 ^, s' F4 y! ^+ K) C. O! w
1 B, T* ^8 v; h3 s, e> restart:
) b% O2 d8 ^/ M+ H. _4 ^: s$ wmap2(f,a1,x1+x2+x3+x4,a2,a3,a4);
- h* F8 |0 A1 I& f  } - h& d8 X0 l; i7 K! z- K8 h
> map2(max,k,[a,b,c,d]);
- P: D0 B* @/ Y! Y* T& c
+ F) }# `7 D' D3 T8 E3 A2 F9 A再看下面示例:   1 ?1 o9 |8 W' G7 @. X) [, P  r
> L:=[seq(i,i=1..10)];
# s4 y- A/ [0 q- }6 K( ~ ( Q3 a7 ?: i$ w" f
> nops(L);
) \. ?7 l, g4 w0 f5 N! o
+ q+ g7 r* C! x7 Z& ~> sqr:=(x)->x^2;
. B: J2 M; U5 J. P  Z) u1 m) `% V * ?2 n6 _; p( E3 ^+ C2 N) ?! H' f( W
> map(sqr,L);
. K9 g" r0 f, u. w
8 _* j" I: d+ [' h> map((x)->x+1,L);
" j- ~( N- q+ S, f# q9 S! z- A
( K2 P2 D! Q5 G2 L% U; ^> map(f,L);
# X0 F" n' c# t3 L; W
' A) f) e7 ?: c2 Z> map(f,{a,b,c});
2 x2 D4 o" G, G- U
# ~2 N; [5 R, c: }> map(sqr,x+y*z);2 o: x! _! T( w: _: U4 X

% k' W% A1 D. j- O> M:=linalg[matrix](3,3,(i,j)->i+j);
( [6 H/ z+ {' H
* ]0 B; N+ n5 E7 P' N$ {> map((x)->1/x,M);. ~; F& e7 [! h# V4 s
1 W' I0 C- F* _6 n
3 求 值1 R" B/ r8 y' [8 F* H
3.1 赋值
( K" Y) ?- Q6 ^! |5 \在Maple中, 不需要申明变量的类型, 甚至在使用变量前不需要将它赋值, 这是Maple与其它高级程序设计语言不同的一点, 也正是Maple符号演算的魅力所在, 这个特性是由Maple与众不同的赋值方法决定的. 为了理解其赋值机制, 先看下面的例子. 8 W0 e4 v- i+ d8 B$ |9 C7 W
> p:=9*x^3-37*x^2+47*x-19;
* `* |! S* P' g& V9 G3 Q. p % D# W+ K' s' C( [; F
> roots(p);
1 ?7 \) C# I9 \! A9 D) K2 Z
0 y% c: k8 N/ T: v> subs(x=19/9,p);2 b- N; C  Q1 b7 z

1 y! D% h$ P' l! \2 D) T2 J% F在这个例子中, 第一条语句是一个赋值语句, 它的作用是把变量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;”这样的简单语句即可验证. * Y; M; O2 h) z2 M( h; H/ B- t
3.2 变量代换. J$ V$ A: a, X7 S! }- w
在表达式化简中, 变量代换是一个得力工具. 我们可以利用函数subs根据自己的意愿进行变量代换, 最简单的调用这个函数的形式是这样的:   
! [$ d% ]2 c) R% h3 }2 n2 Rsubs ( var = repacedment, expression);* i( z' V# g# d, c
调用的结果是将表达式expression中所有变量var出现的地方替换成 replacement. " i: A" X! S, J
> f:=x^2+exp(x^3)-8;
1 N% u1 E* l1 z" p+ k 2 }9 s- L$ r& x
> subs(x=1,f);" |1 r5 l- m( {8 m
2 {; t. l+ y7 w; `
> subs(x=0,cos(x)*(sin(x)+x^2+5));
$ P: r2 C7 J# r9 Z( G1 E/ x0 F 3 P, L& j) f- d' M! [
    由此可见, 变量替换只得到替换后的结果, 而不改变表达式的内容, 而且Maple只对替换的结果进行化简而不求值计算, 如果需要计算, 必须调用求值函数evalf. 如:   # z# d( J) P3 s% x9 p
> evalf(%);
6 t, d7 d8 Z' H9 l! a9 P
+ w( u6 U3 R3 Q& e/ o: p变量替换函数subs也可以进行多重的变量替换, 以两重代换为例:   / F4 \, g9 V! Y# B
subs (var1 = repacedment1, var2 = repacedment2, expression)- Z8 O, i6 \/ ?8 l
调用的结果和按从左到右的顺序连续两次调用是一样的, 也就是先将expression中的var1替换成replacement1, 再将其结果中的var2替换成replacement2, 把这种替换称作顺序替换;    与此相对, 还可以进行同步替换, 即同时将expression中的var1替换成replacement1, 而var2替换成replacement2. 同步替换的调用形式为:     |3 o" Y+ w2 R; ]. O6 [" o+ J
subs ( {var1 = repacedment1, var2 = repacedment2 }, expression)7 f3 i4 e4 E3 \6 D  h1 F
下面通过例子说明这几种形式的替换.   I; u6 u  T; t3 \3 m4 F8 e
> subs(x=y,y=z,x^2*y);              (顺序替换)8 q. ]6 @6 a" \$ ~3 \! F6 z. J

- \6 k5 B; s6 Q. }0 f> subs({x=y,y=z},x^2*y);            (同步替换)' |  B1 H: V" ]8 X

. @0 A. c* l! g> subs((a=b,b=c,c=a),a+2*b+3*c);   (顺序替换)
/ U* G1 ?+ o! d* E( C & e8 d6 ^. y6 v) b# U4 P
> subs({a=b,b=c,c=a},a+2*b+3*c);    (轮  换)! ?& F$ J6 b  x7 c+ S5 I/ i/ Z3 \5 _! c
2 y) f4 s! B, }. Q9 L. l
> subs({p=q,q=p},f(p,q));             (互  换)
; h& W) ~3 y4 X% V1 O5 J) O* V% L / A  h" E) J" m/ a; W( n# R
3.3 假设机制3 \- Z$ ^) v8 q, G. y
Maple是一种计算机代数语言, 显然, 很多人会尝试用Maple(或其他计算机代数语言)解决分析问题. 但由于分析问题与处理问题的考虑方法不同, 使得问题的解决存在某些困难. 例如考虑方程 的解. 如果k是实数, 结果显然是x=1, 但如果k是 的复根, 为了保证解x=1的正确性, 必需添加附带条件: 也就是当 时x=1. 这是一个对结果进行正确分析的例子. 然而从代数的角度考虑这个问题时就会把k当作不定元, 此时k没有值, 从方程两端去除k的多项式是合法的, 只要这个多项式不是零多项式即可(这一点是可以保证的, 因为其所有系数不全为0). 在此情况下x=1就不需要任何附加条件. 计算机代数系统经常采用这种分析的观点. 0 p& k5 C4 j3 C( H: ?& S! X* g$ r& P
在Maple中, 采用分析观点解决这类带有一定附加条件的实用工具是函数assume, 其命令格式为: assume(x, prop);: N! ]- }# }( j* r& ?
函数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);”也不会产生矛盾.
* S6 X0 k' \" t( t8 g> Int(exp(-s*t),t=0..infinity);+ k& i3 d, S" ^8 l& G
8 d9 t9 E9 p- K0 p! |' g
> value(%);
" |( w' ^2 z( IDefinite integration: Can't determine if the integral is convergent.3 y. v. J4 p* q0 j7 N0 `
Need to know the sign of --> s
- B9 ?5 M) r- d7 P+ u+ V8 xWill now try indefinite integration and then take limits.
# X) m* }" q# b, x* X- ^! z( n % S4 t& T! L7 k# }) p, G* [
> assume(s>0);
( P  ]& g8 Z" R5 `/ P> Int(exp(-s*t),t=0..infinity);
0 \& k1 `& K7 K& I, ^2 E9 q . s* D4 g( j, W
> value(%);# v" b1 a, `7 w  o
. @* l7 U0 e% K& [4 K
3.4 求值规则
; B/ e; e  n6 `7 u在多数情况下, Maple的求值规则设计为做用户期望的事情, 但要做到这一点很困难,因为不同的人在相同的情形下会有不同的期望. 在大多数情况下, 全局变量被完全求值, 局部变量被一层求值. 而由符号' '界定一个暂时不求值的表达式, 单步求值仅去掉引号, 不作计算, 这也是允许取消指定名字或清除变量的原因. 如下例:   
, D8 Z; ?3 Z6 k6 ?) j; F> x:=y;. p& L( ^* X# X* O  d

* m# I  ]4 |, z9 q4 W- P> y:=z;
. J3 N) v& X' c0 D* R7 L+ P; G
! A5 Y6 J+ A" t  r% E> z:=3;
" ^# G0 ~5 z7 d# J 8 C; h  R, o. J- C2 U
> x;
! E; s) c# X1 @# L) B( x ! c4 y7 M, v# X% u# ?8 U
> y;: s$ {& n5 _1 S5 N# |. e$ c1 y! t4 D$ z
) y$ d, D' G  t. A
> x:='x';
( p/ ^7 o. P1 Y' ~+ A
2 Q+ h, H+ _1 D3 g6 s  ~5 o9 |- ~> x;
8 x" c. y0 C* T. g
* q* ~3 E$ i+ }6 E> y;
( i8 G5 c" ^7 e7 @+ z$ i$ C
/ v! F" e' r$ Q- r% w. |1 @, A对于不同的问题, Maple设计了不同的求值命令. 现分述如下:   * ?4 ~, K! l4 v
1) 对表达式求值
+ n# ~, H! Z  @命令格式: eval(e, x=a);  #求表达式e在x=a处的值
7 @7 m, i; r2 \) V: t             eval(e, eqns); #对方程或方程组eqns求值
5 G$ `, B- J' M: l             eval(e);      #表达式e求值到上面两层
; I0 l0 J# Z6 e, u) V3 m! W1 ?( j             eval(x,n);    #给出求值名称的第n层求值8 @$ C( F- _8 E* @4 ]- D
> p:=x^5+x^4+x^3+x^2+x+73;
0 L: E# {/ i9 i
- S$ E! p8 T: k- J- u> eval(p,x=7);
( l* Z% }; a4 N' D  k+ L+ p& T ! O" w" r  \! s) p( t
> P:=exp(y)+x*y+exp(x);
" i( ]1 G1 I7 K; ?" s* w & |1 D: `6 T" T& a! Z# y
> eval(P,[x=2,y=3]);
9 g9 z8 W# F1 F9 T- f0 H& ?. ] & w' p7 A; X9 {5 _+ e6 g4 t3 z
    当表达式在异常点处求值时, eval会给一个错误消息. 如下:   - o9 h+ L" ^3 j7 s7 A7 ^/ H" e
> eval(sin(x)/x,x=0);
3 i, t8 F0 N" h+ h' FError, numeric exception: division by zero+ K% K5 {0 @$ o, r
    下面再看使用eval进行全层求值或者对名称几层求值的示例:   
, [( \3 n! i  c/ D3 g+ }  {0 S1 c> a:=b: b:=c: c:=x+1:7 s& P+ z7 h. t. R: @5 {
> a;              #默认的全层递归求值
1 `7 z* C+ x1 R$ _. d* h1 J$ A
/ R9 w2 g" t5 c: S; i6 |' \2 t> eval(a);        #强制全层递归求值
% C4 u( X5 S5 C. m  e
2 m; P. E$ C' W> eval(a,1);       #对a一层求值
+ g9 _% t3 y- N' r
$ C& W# \% m2 S3 W; h' Y3 S> eval(a,2);       #对a二层求值# n- s: |% ]1 S  o. R
' K) g* o* e8 E1 {
> eval(a,3);       #对a三层求值
" J- t, S' P: |. N ) k7 j. q- g( d1 [& F
> eval(a,4);       #对a四层求值. [" l5 _3 v" U2 |

: T3 x" n% O3 e) h    2) 在代数数(或者函数)域求值
3 \, L" ~& h/ d) b' \: d命令格式: evala(expr);       # 对表达式或者未求值函数求值# V4 K0 }8 R1 G0 ]
             evala(expr,opts);   #求值时可加选项(opts)
( e' ~& ~% n" g4 w# \所谓代数数(Algebraic number)就是整系数单变量多项式的根, 其范围比有理数大, 真包含于实数域, 也就是说任意实数都是整系数多项式的根(如 就不是任何整系数多项式的根). 另一方面, 代数数也不是都可以表示成为根式的, 如多项式 的根就不能表示成为根式的形式.
0 M3 F# i, `! p$ ?8 q! c4 I! A代数数的计算, 算法复杂, 而且相当费时. 在Maple中, 代数数用函数RootOf()来表示. 如 作为一个代数数, 可以表示为:   5 A7 y7 a  }6 [7 W0 u+ ^
> alpha:=RootOf(x^2-3,x);
8 @9 }9 j7 V; \+ X/ C  m
& m+ ^! o9 g5 y# C2 r6 m' L, l> simplify(alpha^2);
# ]0 a; }8 I5 q6 `
4 Q/ T( C. K, w. s$ @0 Q9 F8 B" T4 n在Maple内部, 代数数 不再表示为根式, 而在化简时, 仅仅利用到 这样的事实. 这里, Maple用到一个内部变量_Z. 再看下面一个例子,其中alias是缩写的定义函数,而参数lenstra指lenstra椭圆曲线方法:
+ X: H$ l# ]( b5 L" N2 c  ]> alias(alpha=RootOf(x^2-2)):
8 n" B6 X* @) T6 J. R> evala(factor(x^2-2,alpha),lenstra);
7 d& e& j5 X& H8 Z( ?6 Q1 q) u& o
5 U  A$ Z, }4 `; c4 _8 q" [> evala(quo(x^2-x+3,x-alpha,x,'r'));
- y" L$ @/ n9 p8 f/ ~' R, @: U
8 X2 {$ n4 j4 E1 l4 l> r;
3 y$ o; _! o0 P. u
: v+ F3 e7 a. K) s" I( Q> simplify(%);; g. i/ P- B, c* [* p: u
" U- O9 d* U' y0 u1 t0 M& K
3) 在复数域上符号求值" g* e3 Y( p- V
操纵复数型表达式并将其分离给出expr的实部和虚部的函数为evalc, 命令格式为:
1 M' h' b& q, z+ }evalc(expr);   ! A$ r( Q( J) q: p' r, c, w
evalc假定所有变量表示数值, 且实数变量的函数是实数类型. 其输出规范形式为: expr1+I*expr2.
+ _2 B  X* a, z& B" f> evalc(sin(6+8*I));
7 |5 ~* I( U2 H3 f; Q6 f# o
- o: h) s( x4 Q$ n4 S> evalc(f(exp(alpha+x*I)));
7 @1 e* q" k7 d+ j. E # Q+ S( a+ `% i5 |. ]
> evalc(abs(x+y*I)=cos(u(x)+I*v(y)));  b" z( K, p; H  b2 Z3 V

# r& h& T- W" p4) 使用浮点算法求值
1 \' Y2 k( K# X3 m+ j浮点算法是数值计算的一种基本方法,在任何情况下均可以对表达式expr使用evalf命令计算精度为n的浮点数(n=Digits), 如果n缺省, 则取系统默认值, 命令格式为: evalf(expr, n);     : i* w  f4 s" R1 x* H; q
> evalf(Pi,50);    / j2 f% L; F+ J* Q; q8 H7 i! z

) h9 X9 c/ m7 d  c6 |  f! x9 n> evalf(sin(3+4*I));   ' r1 \3 K- \) x' u

6 T. K* K0 n/ u" B) k> evalf(int(sin(x)/x,x=0..1),20);* F, n- X5 L' b( R5 X9 v0 l

' A& C7 r, Y( {5) 对惰性函数求值
3 U5 w8 v. u( p把只用表达式表示而暂不求值的函数称为惰性函数, 除了第一个字母大写外, Maple中的惰性函数和活性函数的名字是相同的. 惰性函数调用的典型用法是预防对问题的符号求值, 这样可以节省对输入进行符号处理的时间, 而value函数强制对其求值. 对任意代数表达式f求值的命令格式为: value(f);   7 u" O1 h7 l' ]
> F:=Int(exp(x),x);
( f1 Z! E9 b* m/ X' ^) C ; f% |3 l% O5 ^
> value(%);
0 K. i% l! W/ C5 x7 \5 p9 `1 f ; k* E! ?6 Z/ B9 e1 [) J! i& y
> f:=Limit(sin(x)/x,x=0);/ }& s0 N; ]7 E5 K

! ^- v; N, k% K3 L; V! ~> value(%);+ s8 V' ?0 `9 [0 f" U, ]6 v
0 C! t' F$ x" z
另外, 将惰性函数的大写字母改为小写字母亦即可求值. 如下例:   ' z2 y& f1 H' [0 W5 E% h
> Limit(sin(x)/x,x=0)=limit(sin(x)/x,x=0);
/ ?1 ^9 h3 t7 ]; C# x+ p
& }, B9 Z9 v, C5 [; \: S4 数据结构
1 A7 [0 X9 s: D3 ^/ _4 AMaple中有许多内建的与FORTRAN、C或Pascal不同的数据结构. 主要的数据结构有序列(sequence)、列表(list)、集合(set)、代数数( algebraic number)、未求值或惰性函数调用、表(table)、级数(series)、串(string)、索引名(index)、关系(relation)、过程体(process)以及整数(integer)、分数(fraction)、浮点数(float)、复数(complex number)等数据结构, 而矩阵(matrix)在Maple中表示为阵列, 是一种特殊的表. , W9 S! ~8 |1 D9 R% \0 F
4.1 数据类型查询
0 ^( V/ N& r1 N) V在Maple中, 用whattype指令来查询某个变量的数据类型或特定类型, 命令格式为:
" U/ v) J3 c* Y( i9 d# Zwhattype(expr)        # 查询expr的数据类型* `, x; ^0 x- `" O
type(expr, t)           # 查询expr是否为t类型, 若是则返回true, 否则返回false' A9 {: o9 A! i8 [$ T5 A
> whattype(12);
: J& P) ~% b  ?) |7 Y, f
9 |- f& `+ U' @3 q! ~2 |> whattype(Pi);9 \# F  |8 l, P8 Q1 Y
) s" |# M3 V0 T6 S. Q7 Y- b
> type(1.1,fraction);
8 V7 e- ]/ Y( C) `
( v9 M+ p! z' _, }> whattype(1.1);
" z* g9 W: {+ P. A; J" h
; r7 s+ c; `: O- D% y+ R1 I4 M- e4.2 序列, 列表和集合) I: C' n/ M) S! b$ X, e& m1 U: {
4.2.1 序列
% q1 j3 b; w  s, N9 P6 @! t# X所谓序列(Sequence), 就是一组用逗号隔开的表达式列. 如:   
1 m, p- R7 q9 S0 _+ E+ A> s:=1,4,9,16,25;
$ I$ b9 E! D7 Q& j7 d 4 J2 I7 B" @- ?5 u; R4 [& ?9 A
> t:=sin,com,tan,cot;
. F3 A+ B9 s# G* e: j
/ \3 K" A& E" N& i% p一个序列也可以由若干个序列复合而成, 如:   
% Q& ~! J* }: M> s:=1,(4,9,16),25;6 h. h- ]+ F+ f& v# B: O

! d" {* k% w5 |; |> s,s;( K/ n7 r3 j6 v* {, b% ~0 ~7 G
2 U! A( S; f5 _) z* Q
而符号NULL表示一个空序列. 序列有很多用途, 如构成列表、集合等. 事实上, 有些函数命令也是由序列构成. 例如:   
% D2 U9 R* _6 @8 S% u- R+ s> max(s);+ A5 A: e, n, t) Z0 A, [* B: c6 C
9 j: s0 N" }6 J
> min(s,0,s);
/ `/ W( {" N" b  Q2 `
4 p% K) E7 b0 l1 K值得注意的是, op和nops函数命令不适用于序列, 如op(s)或nops(s)都是错误的, 如果要使用op(s)或nops(s)前应先把序列s置于列表中. 9 ?& R/ H. b+ }  R/ K! q
> s:=1, 2, abc, x^2+1, `hi world`, Pi, x -> x^2, 1/2, 1;' n7 T3 K3 [* O. P. M) W( v" ?
* o% _1 B( z- m+ @; G7 W9 M
> op(s);
' \' @5 ~1 j8 O+ cError, wrong number (or type) of parameters in function op* d5 h. [" ?/ F5 m: a
> nops(s);
3 ?; Y% i& \5 ]! sError, wrong number (or type) of parameters in function nops/ p" E% C9 L# M
> op([s]);
3 E, s) O4 H) ~) s# A: { ' Y( }7 W( z/ D: E7 n
> nops([stuff]);1 Z0 ~! x: L9 L: k1 l
# a5 R6 W, ~9 z9 Y: _
函数seq是最有用的生成序列的命令, 通常用于写出具有一定规律的序列的通项, 命令格式为:   ' b% p: q1 O3 d/ u+ |1 _7 j
seq(f(i), i=m..n);  # 生成序列f(m), f(m+1), …, f(n) (m,n为任意有理数)
% I" W: S( M8 u/ Y* @& ~seq(f(i), i=expr);  # 生成一个f映射expr操作数的序列# K6 q) P: F, j7 B' ^- C
seq(f(op(i,expr)), i=1..nops(expr));  # 生成nops(expr)个元素组成的序列
# z; I1 f* M! T( P> seq(i^2,i=1..10);
- B2 H; [& \& d. Z( T4 c" t2 q , h) P4 ]) T$ a
> seq(ithprime(i),i=1..20);" i8 M, F( |( y0 D
5 F- j+ c" p  E$ ~* L6 @8 \
> seq(i^3,i=x+y+z);
& j& {0 M0 K7 q8 |) e3 i
8 C8 d5 ~) y1 u  W6 s> seq(D(f),f=[sin,cos,tan,cot]);+ M6 e% u, B. I) }: G: O: b
$ G2 P) ]; @5 z
> seq(f(op(i,x1+x2+x3+x4)),i=1..nops(x1+x2+x3+x4));
* E4 Q5 u' o+ g$ E- Q# r5 ? 6 |  D6 t$ \7 I( B
获得一个序列中的特定元素选用操作符[  ], 如:   ! W8 B2 u$ v. e% G5 x7 S3 V+ m
> seq(ithprime(i),i=1..20);' [4 ]+ I) R0 S. u; D8 i1 }2 |
, ?1 h% x  E$ c( _" l
> %[6],%[17];4 H' v+ ~6 R: w
; M3 X: D) b# J8 d% O1 U
4.2.2 列表
! a2 O9 k2 [9 j5 q, @6 H( Z  h列表(list), 就是把对象(元素)放在一起的一种数据结构, 一般地, 用方括号[  ]表示列表. 如下例:   
4 r0 M+ v$ C4 c- I% Y> l:=[x,1,1-z,x];
) d* e/ G' w* _" i9 O/ x 5 x6 i% y4 K+ f) R% W+ m# R4 q
> whattype(%);
; L( J+ }3 Y+ G6 a- _6 y4 g; f8 C
" m: l/ S9 t1 W+ v空列表定义为[ ].
) z2 Q5 Z( Z3 ?3 C4 ^3 @0 @但下述两个列表是不一样的, 因为对于列表而言, 次序是重要的:   
6 i: M* F1 i- V$ ^> L:=[1,2,3,4];8 {* d6 A6 E& v( \2 ]- i

7 B+ N3 z7 K7 c$ z0 q> M:=[2,3,4,1];
* J6 Q; M% F' t" v' i# [" M
4 {5 ]8 Z. f7 _$ m# I4.2.3 集合
8 j# A  h/ j- X0 p1 N集合(set)也是把对象(元素)放在一起的数据结构, 与列表不同的是集合中不可以有相同的元素(如果有, Maple也会自动将其当作同一个元素), 另外, 集合中的元素不管次序. 一般地, 用花括号表示集合.
  i4 b* P1 L) A! n& d> s:={x,1,1-z,x};% `* Y. S1 b+ y. |2 L: y# y0 t9 q# w
  U) P" P6 ]! O& |, T
> whattype(%);: [* }% W$ d. E2 }7 S- Q
/ S! X9 p5 [8 C
空集定义为{ }.
& M! r. ]/ S9 t2 X! f( Z+ q. f函数nop返回列表或集合的元素数, 而op则可返回其第I个元素. 6 x- H4 Q- i, t( G& T0 v1 e: H' V( T5 C
> op(1,s);
- u" C5 e" E6 I9 w7 h2 J+ A* a8 @
0 H! K7 b' ]& F; i( l' u> s[1];/ b. N- q! W# T/ I, n7 s
. O) N" E6 G9 [. F/ _
> op(1..3,s);* E1 \; p2 r8 A3 ^1 _" C! K7 _$ P
+ T5 s8 p" E. K
> s[1..3];
# V) [' N  A9 v# O$ x. k
3 ~1 {' B3 K2 C3 Y2 h函数member可以判定元素是否属于一个列表或集合, 如果属于, 返回true, 否则返回false. ( X. G# l- B3 E6 ?. W* K
> member(1+x,s);
' s% m2 D* W3 i1 C; y" M: c
( m5 Q" V: f4 Z, g# t: e+ W. z可以通过下述方法在列表中增减元素:   + B/ y3 H& W) f/ _# a2 [, n
> t:=[op(s),x];# L. j" H8 D. A$ i" ?' k- T/ H

9 h8 g+ {; N$ t* E- l% `/ P> u:=[s[1..5],s[7..nops(s)]];' G7 n& |4 v  V  P' I9 u: p; {

7 g& l# _5 E% W! ?; C7 i& ?Maple中集合的基本运算有交(intersect)、并(union)、差(minus):   
& K5 M5 H8 m$ m> A:={seq(i^3,i=1..10)};B:={seq(i^2,i=1..10)};, j8 S) A5 I% j; y3 o  S  Y
  Y! H* z8 k1 [& _* o
4 B6 A; B$ w% L/ k$ G6 ?! X
> A intersect B;
3 b* N: w; z& {
9 v  A" r% ?* I2 o) h# V> A union B; # }( D# ?2 `3 i
' t, S5 t  F' p5 p+ i2 Q  @. t
> A minus B;
5 \8 o0 b6 ]. h8 A5 g4 K7 c- o
$ A- _% T1 S) @+ J  D9 O4 R4.3 数组和表
: [# i8 v" {! a; p3 D在Maple中, 数组(array)由命令array产生, 其下标变量(index)可以自由指定. 下标由1开始的一维数组称为向量(vector), 二维以上的数组称为矩阵(matrix). 数组的元素按顺序排列, 任意存取一数组的元素要比列表或序列快的多. 区分一个数据结构是数组还是列表要用“type”命令.
5 i2 s% E; y! {! |1 F4 O+ z    表(table)在建立时使用圆括号, 变量能对一个表赋值, 但一个在存取在算子中的未赋值变量会被自动地假定是表, 表的索引可以成为任意Maple表达式. 表中元素的次序不是固定的. . s" A# `% q9 ~) Q$ z
> A:=array(1..4);* B; O+ w3 g" R# l* Z5 x0 \; ]! H

* {8 v$ a% A/ X" X0 K( Q" k- C! x8 ^> for i from 1 to 4 do A[i]:=i: od:1 a  i) K. F( H  i
> eval(A);
6 _/ v9 T$ z  Z! i # c; ]" P2 r: J
> type(A,array);
7 G! T( K4 v/ F3 U
: F7 T3 C0 O$ e- p> type(A,list);
+ ^( V1 p, Z! d1 t) G6 U. f6 w
# |5 a  K5 U/ h( ]# w8 w> T:=table();6 c. p7 m$ q5 L0 K4 p' Y6 y4 u

4 K! Q. T( U4 N3 P8 r- a, ^4 I) r> T[1]:= 1;
" x& c0 s6 m! W$ v' m $ p. t% \5 E% Z0 s6 T$ \
> T[5]:= 5;% e) B9 Y& Y( [/ R2 E- s
* m- J6 N1 c4 J# g5 d8 e
> T[3]:= 3;
2 r* F7 K/ z2 t. _# {" [& P4 c ( R* Y3 i5 a! b9 w' b0 Q8 S2 i
> T[sam]:=sally;9 X) A) W: K/ |( e% q
/ m' c' ^: D" c" x3 Q4 Z' y; Q% k8 ^
> T[Pi]:=exp(1);
. ~) ~' G. I! Q/ m; Q8 R / B* B9 k* B; \0 v' D2 E
> x:='x';% ]8 H. M2 ~+ q% h/ Z$ C: m7 Q
3 w# }1 }! U$ j, v6 `' u
> T[(1+x+x^3)*sin(x)] := 0;
, f' j& y+ f+ K) a. O   J" E4 y4 O: e# ?) X) L
> eval(T);
. p$ O9 p2 e1 y/ h- X$ J 4 b2 b6 p0 Z; w  m2 y; Z- T
> T[3]:='T[3]';9 w; a* C% |9 N
) ~, @& T4 y- H( e6 w3 E! f8 ~$ q8 s
> eval(T);! d/ ~+ d* U& X. s5 O
6 a+ T( ~9 h6 ]- J  w
4.4 其他数据结构
& O) H: g& D6 p8 r2 a: ~1 H- j串在Maple中是很重要的, 他们主要用于取名字和显示信息. 一个Maple的串可以作为变量名, 它们中的大多数是简单的、不需要加引号的串, 但是如果变量名中包含/. 例如“diff/T”则必须把变量名用引号括起来. 1 |5 d+ v0 p( y, U: i
索引名是像Database[1,2,drawer]或A[3]这样的对象, 在使用索引前不需要直接建立表, 如果不得不做, Maple会自动建立表. 索引名通常被用于矩阵和向量. 为了保证Maple建立表的正确次序, 建议在赋值前直接建立.
1 p0 u! T* Q* Z' ~! I' p3 {$ m8 K> x:=T[3];4 V3 C% g6 k' S9 M( u
( \7 u) ~2 Y1 a
> eval(T);
% p" v9 I  b8 t6 L% Y
+ w& Y/ ]) _, r) S# n- {3 n> T[5]:=y;9 W3 _4 b, n7 e( Z, M& E7 ]: O
! L. q$ p3 y! O6 R- }- t0 z
> eval(T);" ^9 G  o! a/ z. H" D0 q, q- r7 ?
+ ~& @1 k5 ^7 i% W3 M( `; P
由此可见, Maple并不直接建立T的表, 直到给T[5]赋了值.     
. K- F8 ]1 ?; _' F6 _' A数值数据结构(整数、分数、有理数、浮点数、硬件浮点数和复数等)在它们的使用中是大量透明的. 浮点数是有传染性的, 这意味着如果数值结构中有一个是浮点数, 则整个结构自动转换为浮点数. , Y, V" N- ]5 e5 a% d9 k8 s
4.5 数据类型转换和合并
- o1 j9 e4 @) G! O/ ^7 A) N& r# Qconvert是一个功能强大的类型转换函数, 它可以实现列表和数组的类型转换:   
( h1 l- i( `  y3 p# D( p2 b0 Y> L:=[1,2,3,4];
. D9 D# q9 |) Q6 {
1 i9 ^6 c$ I0 _- q* Z+ M( q> type(L,list);
; L# ~8 m/ r6 o$ H5 k7 U# w 5 y8 t8 c% Q  C6 O8 ]; `" t
> A:=convert(L,array);/ j' E- }) S0 {+ j  P
7 h8 J% k, @4 r5 h- u% t
> type(A,list);
/ q7 B' I" i: a$ Y3 Z0 ^' c+ g $ g- k2 u3 b+ _( G  S" p4 Q% d
> type(A,array);; C. a3 G- W+ }# d! {2 ?& g# |

8 v" _; y4 o: p) y6 O& _3 t另一个有用的函数zip则可把两个列表或向量合并:   / a. x2 H6 W1 v, \3 l( C
>L:=[seq(i,i=1..10)];
& V. I0 A4 ~7 h( W( ~- P' P# G 5 a) y2 N4 c9 R
> Sqr:=(x)->x^2;
+ N5 x$ O, e8 x& S: j- H
# ~# O  h2 T, J9 j& |: R' @> M:=map(sqr,L);* l6 i1 \  v6 [  v( p  K/ f( _

& }+ B+ }. o! m$ N> LM:=zip((x,y)->[x,y],L,M);
6 b+ s1 k1 {, ^4 V' w6 ?
6 \2 P& A% B, q7 ^7 W, w4 S> map(op,LM);& o2 M" H1 S* M  `1 n3 Z9 R/ a+ A

1 n' D$ I1 ?8 }* F+ y5 Maple高级输入与输出操作
; `! ~3 [% Q1 Q% M  Y* c6 qMaple提供了良好的接口来编辑与计算数学式. 许多时候, 我们可能需要把Maple的运算结果输出到一个文件中, 或者在一个文本编辑器里先编好一个较大的Maple程序, 再将它加载到Maple的环境里.
$ ?9 V) f5 l! }  e/ r: q4 G/ M5.1 写入文件) e$ l8 I% C% F8 a
5.1.1 将数值数据写入到一个文件  _6 ?# B4 Z2 ^% e. b
如果Maple的计算结果是一长串的数值串行或数组, 而想把它写到一个文件时, 用writedata命令.
, q/ v% Z) F- B; q6 Q& M若Maple的计算结果data为集合、矩阵、列表、向量等形式时, 将其写入名为filename的文件时命令格式为: writedata("filename", data);
. s' B2 o2 ^3 F' t> with(linalg):
/ A5 U* N  |! [* y& ~> M:=matrix(3,3,[1,2,3,4,5,6,7,8,9]);' N/ S, a1 n" K+ f+ h  d( N. W
: i2 S. u( r  S. m, X. J
> writedata("e:\\filename.txt",M);
1 z  v' l: s6 S" X' J( Q  H& o而将结果附加在一个已存在的文件后时,使用命令: writedata[APPEND]("filename", data);
" h5 ~* Y2 C/ v' I8 K7 `> W:=matrix(2,2,[1,2,3,4]);
' v9 l( N7 k- H$ t5 W% X
/ i# P8 x0 T2 o5 e> writedata[APPEND]("e:\\filename.txt",W);. X: P/ _% x) o7 J" ~- a% c
需要注意的是, 这里的APPEND是必需的, 否则W结果将会覆盖M结果.
* \( P4 [9 z1 |. G+ e$ \% m5 W另外, 若想将结果显示在屏幕上时, 用命令: writedata('terminal', data);  J7 e3 y' Z+ u# s
> writedata[APPEND]("e:\\filename.txt",W);
3 f' ?8 v9 n4 a* r! o> writedata('terminal',M);/ z% H) X( d! Y  Y" ?
1                   2                   3           
1 D( J- a' y$ v4                   5                   6           
0 ]4 _, U3 m7 n0 S1 i, H7                   8                   9   
1 b, N% H; }7 F! k5 A5 X5.1.2 将Maple语句写入一个文件
6 s  s1 ~. M- S6 v如果所要写入文件的是表达式、函数的定义或者是一个完整的程序, 则使用命令save, 写入一个或多个语句的命令格式分别如下:! G. A; Y. q" u6 k& C
save name, "filename";
# F" G; N% n8 c  q! Q- `* {5 ]: nsave name1, name2, …, "filename";
3 G4 \& I& e9 Y3 e8 X$ |若filename的扩展名为.m, 则Maple会以内定的格式储存, 若扩展名为.txt, 则以纯文本文件储存. 以内定的格式储存的文件作纯文本编辑器无法读取, 但在大多数情况下, 它会比纯文本文件的加载速度更快, 且文件容量小.
# T$ V! [! m% ~1 ?> myfunc:=(k,n)->sum(x^k/k!,x=1..n);
7 b+ i) i3 y. q! \ 6 ^% |0 e6 R$ V8 z& n
> myresult:=myfunc(6,8);$ R& k; R+ j* n! T! r* G; j

7 J/ @7 L9 l6 M' h> save myfunc,myresult,"e:\\test.m";( [: O  l; a  U1 V+ |  w9 M1 X
调用已存m文件用命令read. 试看下述实验:
4 D$ v! i  e3 @$ e3 L( ]> restart:
0 |2 ]7 t( G6 |5 p$ f5 s> myfunc(6,8);4 Z; O/ b! D9 A3 \
* u+ r' _+ e0 B
> read "e:\\test.m";
5 t( b4 B+ f6 P" {$ a/ v> myfunc(6,8);% h7 i' k5 c6 T; ~

& Z9 J$ u+ Q8 m! p- d7 ~: v> myresult;
: L) F# h' C: n* t. \% Y7 C7 F) u
: P; f' A& j! G( K5 {4 a/ W    而存为txt文件时则将整个语句存为一个文件:
, l$ Z4 r5 o1 z( u" A! n9 T> save myfunc,myresult,"e:\\test.txt";
7 {4 w! z. Q( U) j: M3 a> restart: read"e:\\test.txt";" c/ C+ ?& o- D. d
+ A9 n. O( e$ L# Y- ]6 Q

% n1 U) Q; A3 ~8 \* F8 d* p5.2 读取文件
+ K3 c0 A$ B' n$ i4 C在Maple里最常用的两个读取文件的命令, 一个是读取数值数据, 另一个是是读取Maple的指令./ o& k" U" Q6 R: o7 X1 z2 w! g
5.2.1 读取数值数据) |9 ], @9 A- S" X, i
如果想把大量的数据导入Maple里进行进一步的运算或者要运用大量的实验数据在Maple环境绘图时, 可以用readdata( )命令完成., I. L) w7 |) n4 g1 K5 J1 @6 v
从filename文件里读取n行数据时使用命令: readdata("filename",n);' `: W& s! x, j8 g: X& A
以指定的格式读取数据时使用命令: readdata("filename",[tyep1,type2,…]);2 X* `! [3 b4 j6 P0 p; H! l& ]1 ^
> readdata("e:\\filename.txt",3);  |8 S: _! v! ?( W% g: m

! u4 U$ i1 @% R: ?  P# F' J    读取filename的前三列, 第一列为整数形式, 第二、三列为浮点数形式:
" w1 R, T( {" I/ A( r3 |> readdata("e:\\filename.txt",[integer,float,float]);
2 S; D( e; C; T  {  B! d7 l& k! F 8 @6 r& p6 J% k+ E2 l% C4 f% q% H
下面再看一个运用大量的实验数据在Maple环境绘图的实验:; d* g! R& T4 P3 Y; N7 k4 d
> mypts:=[seq([x/1000,cos(x^2/100000)],x=1..1000)]:! r6 c9 P) M; n8 T7 b$ i! X
> writedata("e:\\data.txt",evalf(mypts));
; X7 w( G: x1 Y/ @> dots:=readdata("e:\\data.txt",100):
* E+ Y9 G: j) _1 I  v, L6 C> nops(dots);
" ?* z6 |8 ~" [! z: I4 i; H " l; r- ~  q. B+ c9 ~  a2 n
> dots[1..4];* s; W+ }5 E# p( c) |" v8 L
7 R, X/ T2 E* |& `% j: D
> plot(dots,style=line);
* p2 e: t4 Y; C7 t 6 g: }# ]1 _$ n1 b$ h+ i
5.2.2 读取Maple的指令! j; P, d0 q, |3 _
在编写程序时, 在普通软件中先编好程序再将其读入Maple环境中常常比直接在Maple中编写更为方便. 如果要将程序代码或Maple指令加载用read命令:; s% F' }3 l0 d+ a; v: K( }( c
read "filename";
; p8 n2 q. v5 S5 H4 [/ |如下例:
9 G* g: l% D9 }3 N" t5 L. J0 l% C> reatart:; U  x: ?0 C* |4 ], p8 c! c
> myfunc:=(a::list)->add(i,i=a);+ `! {$ b+ m1 O3 g2 t/ |
# t" |  M) G/ d' G3 k# J' _
> avg:=(a::list)->myfunc(a)/nops(a);
) Z- e- E3 m4 Q : d; k" H. {0 e% l4 B
> save myfunc,avg,"e:\\function.m";1 }4 E. x- s. J& I; a7 m
> restart:
1 {6 Y. z; v6 c( u% `, K1 Z  O. \0 r5 ]1 F> read "e:\\function.m";
% }0 S% w  Y6 H' L> myfunc([1,2,3,4,5,6,7,8,9]);
+ B/ s( [% M5 z1 b7 Q* Q
# [6 G* q; N+ Y+ g> avg([1,2,3,4,5,6,7,8,9]);4 B; p; q) V4 j/ c

! E9 f! h: ^& O8 Q; I" P$ I  O" ?5.3 与其它程序语言的连接; @) D) D- J! S1 |! v
5.3.1 转换成FORTRAN或C语言) c8 ]1 T* ?; v7 m0 K
调用codegen程序包中的fortran命令可以把Maple的结果转换成FORTRAN语言:
. Z# G0 a  Q  k1 E6 s> with(codegen,fortran):0 Y  @7 z3 y3 |) O
f:= 1-2*x+3*x^2-2*x^3+x^4;
& M  _7 B9 M& s- p. W3 }6 C 2 d9 @3 G( S4 V. E& R
> fortran(%);
' ~# s' v4 A/ b8 I  N) C      t0 = 1-2*x+3*x**2-2*x**3+x**4
( G( o0 S5 n! j$ r6 Y  H) m! h; ?% j  A > fortran(f,optimized);
$ w; }1 E5 X; W  Q6 ]( x. F1 }      t2 = x**2
% u+ f: ]  J- p; j5 v; O      t6 = t2**2
" c; i6 A) ~. I" \      t7 = 1-2*x+3*t2-2*t2*x+t6, o% J* ^6 e/ t
> fortran(convert(f,horner,x));$ V0 g( |9 p' T5 E7 o, _
      t0 = 1+(-2+(3+(-2+x)*x)*x)*x0 }3 W9 ]" X& j
而codegen程序包中的C命令可以把Maple结果转换成C语言格式:
) D; \- M, o6 {: R9 l& L> with(codegen,C):
3 a, d, A, ]( c8 u" u$ a$ w2 uf:=1-x/2+3*x^2-x^3+x^4;# N3 ~- P; V4 m! q  W

) C1 e! }  x/ H) `> C(f);5 t! j' U$ ?. A. H, a
      t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;
% h. g! O- I+ T; q5 P> C(f,optimized);8 V: e6 O. K/ a
      t2 = x*x;5 P. ], Y9 u. F9 I  U" w7 B
      t5 = t2*t2;3 k3 w6 x; ^2 L1 Q0 G. Y
      t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
3 p0 ]& V/ K/ Y6 E* r& S# G- ?optimized命令表示要对转换的表达式进行优化, 如果不加此可选参数, 则直接对表达式进行一一对应的转换.
3 h8 ~0 j, o8 o5 ]: J6 J& q5.3.2 生成LATEX
% \# M7 D7 S1 `9 I2 |Maple可以把它的表达式转换成LATEX, 使用latex命令即可:
; R* E, \6 [& v5 A> latex(x^2+y^2=z^2);. c# H6 b9 ]6 k& U; ^9 B9 A
{x}^{2}+{y}^{2}={z}^{2}; R# ^- Y' U7 A" @" J$ k
    还可以将转换结果存为一个文件(LatexFile):
% H# ^# W3 a/ @9 j> latex(x^2 + y^2 = z^2, LatexFile);
/ N3 p8 T- A' K* z( E6 n    再如下例:
5 |4 |1 y& t/ v3 J% B( b0 Q> latex(Int(1/(x^2+1),x)=int(1/(x^2+1),x));$ F/ C' F8 L, u
\int \! \left( {x}^{2}+1 \right) ^{-1}{dx}=\arctan\left( x \right)
( w4 u/ W9 ~% U, b& `: t2 S' _" [4 f4 a4 F( ~; v( s
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年!: `: x( \4 d& v6 T  I! P
    - O3 l, ^7 Z, D7 Q( F) v
    $ [" a2 R" X7 G* i7 p8 W
    回复

    使用道具 举报

    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-8-6 12:34 , Processed in 0.542818 second(s), 100 queries .

    回顶部