maple 教程

1 初识计算机代数系统Maple

1.1 Maple简说

1980年9月, 加拿大Waterloo大学的符号计算机研究小组成立, 開始了符号计算在计算机上实现的研究项目, 数学软件Maple是这个项目的产品. 眼下, 这仍是一个正在研究的项目.

Maple的第一个商业版本号是1985年出版的. 随后几经更新, 到1992年, Windows系统下的Maple 2面世后, Maple被广泛地使用, 得到越来越多的用户. 特别是1994年, Maple 3出版后, 兴起了Maple热. 1996年初, Maple 4问世, 1998年初, Maple 5正式发行. 眼下广泛流行的是Maple 7以及2002年5月面市的Maple 8.

Maple是一个具有强大符号运算能力、数值计算能力、图形处理能力的交互式计算机代数系统(Computer Algebra System). 它能够借助键盘和显示器取代原来的笔和纸进行各种科学计算、数学推理、猜想的证明以及智能化文字处理.

Maple这个超强数学工具不仅适合数学家、物理学家、project师, 还适合化学家、生物学家和社会学家, 总之, 它适合于全部须要科学计算的人.

1.2 Maple结构

Maple软件主要由三个部分组成: 用户界面(Iris)、代数运算器(Kernel)、外部函数库(External library). 用户界面和代数运算器是用C语言写成的, 仅仅占整个软件的一小部分, 当系统启动时, 即被装入, 主要负责输入命令和算式的初步处理、显示结果、函数图象的显示等. 代数运算器负责输入的编译、主要的代数运算(如有理数运算、初等代数运算等)以及内存的管理.
Maple的大部分数学函数和过程是用Maple自身的语言写成的, 存于外部函数库中. 当一个函数被调用时, 在多数情况下, Maple会自己主动将该函数的过程调入内存, 一些不经常使用的函数才须要用户自己调入, 如线性代数包、统计包等, 这使得Maple在资源的利用上具有非常大的优势, 仅仅有最实用的东西才留驻内存, 这保证了Maple能够在较小内存的计算机上正常执行. 用户能够查看Maple的非内存函数的源程序, 也能够将自己编的函数、过程加到Maple的程序库中, 或建立自己的函数库.

1.3 Maple输入输出方式

为了满足不同用户的须要, Maple能够更换输入输出格式: 从菜单“Options | Input Display和Out Display下能够选择所需的输入输出格式.

Maple 7有2种输入方式: Maple语言(Maple Notation)和标准数学记法(Standard Math Notation). Maple语言是一种结构良好、方便有用的内建高级语言, 它的语法和Pascal或C有一定程度的相似, 但有非常大区别. 它支持多种数据操作命令, 如函数、序列、集合、列表、数组、表, 还包括很多数据操作命令, 如类型检验、选择、组合等. 标准数学记法就是我们经常使用的数学语言.

启动Maple, 会出现新建文档中的“[>”提示符, 这是Maple中可运行块的标志, 在“>”后就可以输入命令, 结束用“;”(显示输出结果)或者“:”(不 显示输出结果). 可是, 值得注意的是, 并非说Maple的每一行仅仅能运行一句命令, 而是在一个完整的可运行块中健入回车之后,
Maple会运行当前运行块中全部命令(能够是若干条命令或者是一段程序). 假设要输入的命令非常长, 不能在一行输完, 能够换行输入, 此时换行命令用“shift+Enter”组合键, 而在最后一行增加结束标志“;”或“:”, 也可在非末行尾加符号“\”完毕.

Maple 7有4种输出方式:
Maple语言、格式化文本(Character Notation)、固定格式记法(Typeset Notation)、标准数学记法(Standard Math Notation). 通常採用标准数学记法.

Maple会认识一些输入的变量名称, 如希腊字母等. 为了使用方便, 现将希腊字母表罗列例如以下,输入时仅仅需录入对应的英文,要输入大写希腊字母, 仅仅需把英文首字母大写:


alpha


beta


gamma


delta


epsilon


zeta


eta


theta


iota


kappa


lambda


mu


nu


xi


omicron


pi


rho


sigma


tau


upsilon


phi


chi


psi


omega

有时候为了美观或特殊须要,能够採用Maple中的函数或程序设计方式控制其输出方式,例如以下例:

> for i to 10 do

printf("i=%+2d and i^(1/2)=%+6.3f", i, eval(sqrt(i)));

od;

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

+2d的含义是带符号的十进位整数。域宽为2. 显然。这样的输出方式不是我们想要的,为了得到更美观的输出效果。在语句中增加换行控制符“\n”就可以:

> for i to 10 do

printf("i=%+2d and i^(1/2)=%+6.3f\n", i, eval(sqrt(i)));

od;

i=+1 and i^(1/2)=+1.000

i=+2 and i^(1/2)=+1.414

i=+3 and i^(1/2)=+1.732

i=+4 and i^(1/2)=+2.000

i=+5 and i^(1/2)=+2.236

i=+6 and i^(1/2)=+2.449

i=+7 and i^(1/2)=+2.646

i=+8 and i^(1/2)=+2.828

i=+9 and i^(1/2)=+3.000

i=+10 and i^(1/2)=+3.162

再看下例:将输入的两个数字用特殊形式打印:

> niceP:=proc(x,y)

printf("value of x=%6.4f, value of y=%6.4f",x,y);

end proc;

> niceP(2.4,2002.204);

value of x=2.4000, value of y=2002.2040

1.4 Maple联机帮助

学会寻求联机帮助是掌握一个软件的钥匙. Maple有一个很好的联机帮助系统, 它包括了90%以上命令的使用说明. 要了解Maple的功能可用菜单帮助“Help”, 它给出Maple内容的浏览表, 这是一种树结构的文件夹表, 跟有…的词条说明其后还有子文件夹, 点击这种词条后子文件夹就会出现(也能够用Tab键和up, down选定). 能够从底栏中看到函数命令全称, 比如, 我们选graphics…, 出现该条的子文件夹,
从中选2D…, 再选plot就可得到作函数图象的命令plot的完整帮助信息. 一般帮助信息都有实例, 我们能够将实例中的命令部分复制到作业面进行计算、演示, 由此可了解该命令的作用.

在使用过程中, 假设对一个命令把握不准, 可用键盘命令对某个命令进行查询. 比如, 在命令区输入命令“?plot”(或help(plot);), 然后回车将给出plot命令的帮助信息, 或者将鼠标放在选定的要查询的命令的不论什么位置再点击菜单中的“Help”就可以.

2 Maple的基本运算

2.1 数值计算问题

算术是数学中最古老、最基础和最初等的一个分支, 它研究数的性质及其运算, 主要包含自然数、分数、小数的性质以及他们的加、减、乘、除四则运算. 在应用Maple做算术运算时, 仅仅需将Maple当作一个“计算器”使用, 所不同的是命令结束时需加“;”或“:”.

在Maple中, 基本的算术运算符有“+”(加)、“–”(减)、“*”(乘)、“/”(除)以及“^”(乘方或幂。或记为**), 算术运算符与数字或字母一起组成随意表达式, 但当中“+”、“*”是最基本的运算, 其余运算均可归诸于求和或乘积形式. 算述表达式运算的次序为: 从左到右, 圆括号最先, 幂运算优先, 其次是乘除,最后是加减. 值得注意的是, “^”的表达式仅仅能有两个操作数, 换言之, 是错误的, 而“+”或“*”的随意表达式能够有两个或者两个以上的操作数.

Maple有能力精确计算随意位的整数、有理数或者实数、复数的四则运算, 以及模算术、硬件浮点数和随意精度的浮点数甚至于矩阵的计算等等. 总之, Maple能够进行随意数值计算.

可是, 不论什么软件或程序毕竟仅仅是人们进行科学研究的一种必要的辅助, 即便它有非常多长处, 但也有它的局限性, 为了客观地认识数学软件、认识Maple, 以下通过两个简单样例予以说明.

第一个简单的数值计算实例想说明Maple数值计算的答案的正确性:

> 3!!!;

2601218943565795100204903227081043611191521875016945785727541837850835631156947382240678577958130457082619920575892247259536641565162052015873791984587740832529105244690388811884123764341191951045505346658616243271940197113909845536727278537099345629855586719369774070003700430783758997420676784016967207846280629229032107161669867260548988445514257193985499448939594496064045132362140265986193073249369770477606067680670176491669403034819961881455625195592566918830825514942947596537274845624628824234526597789737740896466553992435928786212515967483220976029505696699927284670563747137533019248313587076125412683415860129447566011455420749589952563543068288634631084965650682771552996256790845235702552186222358130016700834523443236821935793184701956510729781804354173890560727428048583995919729021726612291298420516067579036232337699453964191475175567557695392233803056825308599977441675784352815913461340394604901269542028838347101363733824484506660093348484440711931292537694657354337375724772230181534032647177531984537341478674327048457983786618703257405938924215709695994630557521063203263493209220738320923356309923267504401701760572026010829288042335606643089888710297380797578013056049576342838683057190662205291174822510536697756603029574043387983471518552602805333866357139101046336419769097397432285994219837046979109956303389604675889865795711176566670039156748153115943980043625399399731203066490601325311304719028898491856203766669164468791125249193754425845895000311561682974304641142538074897281723375955380661719801404677935614793635266265683339509760000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

上述运算结果在IBM PC机(1G, 128M)上计算仅仅须要0.01秒, 得到如此复杂的结果(1747位), 一个自然的问题是: 答案正确吗?

为了回答这个问题, 我们借助于数值分析方法, 由Stiring公式

可得: , 前三位数字与Maple输出结果同样, 且两者结果均为1747位. 另外, 在720!的计算中, 5的因子的个数为:

这些5与足够多的2相乘将得到178个0, 而Maple的输出结果中最后178位数为零. 由此, 能够相信Maple结果的正确性.

还有一个样例则想说明Maple计算的局限性:

Maple在处理问题时, 为了避免失根, 从不求算术式的近似值, 分数则化简为既约分数. 因此, 在Maple中非常easy得到:

显然这是错误的. 这一点能够从代数的角度予以分析.

最好还是设 , 则 , 即 , 显然 有3个结果, -2是事实上数结果.

还有一方面, 设 , 则 , 即:

显然 有6个结果, -2、2是事实上数结果.

这个简单的样例说明了Maple在数值计算方面绝对不是万能的, 其计算结果也不是全然正确的, 可是, 通过很多其它的实验能够发现: Maple仅仅可能丢失部分结果, 而不会添加或非常少给出全然错误的结果(如上例中Maple的浮点数结果皆为 ). 这一点提醒我们, 在利用Maple或其它不论什么数学软件或应用程序进行科学计算时, 必须运用相关数学基础知识校验结果的正确性.

虽然Maple存在缺陷(实际上, 不论什么一个数学软件或程序都存在缺陷), 但无数的事实说明Maple仍然不失为一个具有强大科学计算功能的计算机代数系统. 其实, Maple同其它数学软件或程序一样仅仅是科学计算的一个辅助工具, 数学基础才是数学科学中最重要的.

2.1.1 有理数运算

作为一个符号代数系统, Maple能够绝对避免算术运算的舍入误差. 与计算器不同, Maple从来不自作主张把算术式近似成浮点数, 而仅仅是把两个有公因数的整数的商作化简处理. 假设要求出两个整数运算的近似值时, 仅仅需在随意一个整数后加“.”(或“.0”), 或者利用“evalf”命令把表达式转换成浮点形式, 默认浮点数位是10 (即: Digits:=10,
据此可随意改变浮点数位, 如Digits:=20).

> 12!+(7*8^2)-12345/125;

> 123456789/987654321;

> evalf(%);

> 10!; 100*100+1000+10+1; (100+100)*100-9;

> big_number:=3^(3^3);

> length(%);

上述实验中使用了一个变量“big_number”并用“:=”对其赋值, 与Pascal语言一样为一个变量赋值用的是“:=”. 而还有一个函数“length”作用在整数上时是整数的十进制位数即数字的长度. “%”是一个很实用的简写形式, 表示最后一次运行结果, 在本例中是上一行输出结果. 再看以下数值计算样例:

1)整数的余(irem)/商(iquo)

命令格式:

irem(m,n);        #求m除以n的余数

irem(m,n,‘q‘);    #求m除以n的余数, 并将商赋给q

iquo(m,n);        #求m除以n的商数

iquo(m,n,‘r‘);    #求m除以n的商数, 并将余数赋给r

当中, m, n是整数或整数函数, 也能够是代数值, 此时, irem保留为未求值.

> irem(2002,101,‘q‘); # 求2002除以101的余数, 将商赋给q

> q; #显示q

> iquo(2002,101,‘r‘); # 求2002除以101的商, 将余数赋给r

> r; #显示r

> irem(x,3);

2)素数判别(isprime)

素数判别一直是初等数论的一个难点, 也是整数分解问题的基础. Maple提供的isprime命令能够判定一个整数n是否为素数. 命令格式: isprime(n);

假设判定n可分解, 则返回false, 假设返回true, 则n“非常可能”是素数.

> isprime(2^(2^4)+1);

> isprime(2^(2^5)+1);

上述两个样例是一个有趣的数论难题。

形如 的数称为Fermat数, 当中的素数称为Fermat素数, 显然, F0=3、F1=5、F2=17、F3=257、F4=65537都是素数.
Fermat以前猜想全部的Fn都是素数, 可是Euler在1732年证明了F5=641?6700417不是素数. 眼下, 这仍是一个未解决的问题, 人们不知道还有没有Fermat素数, 更不知道这种素数是否有无穷多.

3) 确定第i个素数(ithprime)

若记第1个素数为2,推断第i个素数的命令格式: ithprime(i);

> ithprime(2002);

> ithprime(10000);

4) 确定下一个较大(nextprime)/较小(prevprime)素数

当n为整数时,推断比n稍大或稍小的素数的命令格式为:

nextprime(n);

prevprime(n);

> nextprime(2002);

> prevprime(2002);

5) 一组数的最大值(max)/最小值(min)

命令格式: max(x1,x2,…,xn);   #求x1,x2,…,xn中的最大值

min(x1,x2,…,xn);   #求x1,x2,…,xn中的最小值

> max(1/5,ln(3),9/17,-infinity);

> min(x+1,x+2,y);

6)模运算(mod/modp/mods)

命令格式: e mod m;    # 表达式e对m的整数的模运算

modp(e,m); # e对正数m的模运算

mods(e,m); # e对m负对称数(即 -m)的模运算

`mod`(e,m); # 表达式e对m的整数的模运算, 与e mod m等价

值得注意的是, 要计算i^n mod m(当中i是一整数), 使用这样的“明显的”语法是不必要的, 由于在计算模m之前, 指数要先在整数(可能导致一个很大的整数)上计算. 更适合的是使用惰性运算符“&^”即: i &^n mod m, 此时, 指数运算将由mod运算符智能地处理. 还有一方面, mod运算符的左面优先比其它运算符低, 而右面优先高于+和-, 但低于*和/.

> 2002 mod 101;

> modp(2002,101);

> mods(49,100);

> mods(51,100);

> 2^101 mod 2002; # 同 2 &^101 mod 2002;

7)随机数生成器(rand)

命令格式:

rand( );    #随机返回一个12位数字的非负整数

rand(a..b); #调用rand(a..b)返回一个程序, 它在调用时生成一个在范围[a, b]内的随机数

> rand();

> myproc:=rand(1..2002):

> myproc();

> myproc();

注意, rand(n)是rand(0..n-1)的简写形式.

2.1.2 复数运算

复数是Maple中的基本数据类型. 虚数单位i在Maple中用I表示. 在运算中, 数值类型转化成复数类型是自己主动的, 全部的算术运算符对复数类型均适用. 另外还能够用Re( )Im( )conjugate( )argument( )等函数分别计算实数的实部、虚部、共轭复数和幅角主值等运算.
试作例如以下实验:

> complex_number:=(1+2*I)*(3+4*I);

> Re(%);Im(%%);conjugate(%%%);argument(complex_number);

值得注意的是上行命令中均以“;”结束, 因此不能将命令中的2个%或3个%(最多仅仅能用3个%)改为1个%, 由于%表示上一次输出结果, 若上行命令改为“,”结束, 则均可用1个%.

为了在符号表达式中进行复数运算, 能够用函数evalc( ), 函数evalc把表达式中全部的符号变量都当成实数, 也就是觉得全部的复变量都写成 的形式, 当中a、b都是实变量. 另外另一些有用命令, 分述例如以下:

1) 绝对值函数

命令格式: abs(expr);

当expr为实数时,返回其绝对值。当expr为复数时,返回复数的模.

abs(-2002);    #常数的绝对值

abs(1+2*I);   #复数的模

abs(sqrt(3)*I*u^2*v); #复数表达式的绝对值

abs(2*x-5);   #函数表达式的绝对值

2)复数的幅角函数

命令格式:   argument(x); #返回复数x的幅角的主值

> argument(6+11*I);

> argument(exp(4*Pi/3*I));

3)共轭复数

命令格式:   conjugate(x); #返回x的共轭复数

> conjugate(6+8*I);

> conjugate(exp(4*Pi/3*I));

2.1.3 数的进制转换

数的进制是数值运算中的一个重要问题. 而在Maple中数的进制转换很easy, 使用convert命令就可以.

命令格式:   convert(expr, form, arg3, ...);

当中, expr为随意表达式, form为一名称, arg3, ... 可选项.

以下对当中经常使用数的转换予以概述. 而convert的其他功能将在后叙章节详述.

1)基数之间的转换

命令格式:

convert(n, base, beta);      #将基数为10的数n转换为基数为beta的数

convert(n, base, alpha, beta);#将基数为alpha的数字n转换为基数为beta的数

> convert(2003,base,7); #将10进制数2002转换为7进制数, 结果为: (5561)7

> convert([1,6,5,5],base,7,10); #将7进制数5561转换为10进制数

convert(2002,base,60);       #将十进制数2002转换为60进制数, 得33(分钟)22(秒)

2)转换为二进制形式

命令格式: convert(n, binary);

其功能是将十进制数n转换为2进制数. 值得注意的是, 数能够是正的, 也能够是负的, 或者是整数, 或者是浮点数, 是浮点数时情况较为复杂.

convert(2002,binary);

convert(-1999,binary);

convert(1999.7,binary);

3)转换为十进制形式

其他数值转换为十进制的命令格式为:

convert(n, decimal, binary);   #将一个2进制数n转换为10进制数

convert(n, decimal, octal);    #将一个8进制数n转换为10进制数

convert(string, decimal, hex); #将一个16进制字符串string转换为10进制数

convert(11111010010, decimal, binary);

convert(-1234, decimal, octal);

> convert("2A.C", decimal, hex);

4) 转换为16进制数

将自然数n转换为16进制数的命令格式为: convert(n, hex);

convert(2002,hex); convert(1999,hex);

5)转换为浮点数

命令格式: convert(expr, float);

注意, convert/float命令将随意表达式转换为精度为全局变量Digits的浮点数, 且仅是对evalf的调用.

convert(1999/2002,float);

convert(Pi,float);

时间: 2024-10-13 09:19:59

maple 教程的相关文章

org-mode入门教程

org-mode 入门教程By Z.H. Fu 切问录 www.fuzihao.org org-mode 入门教程 org-mode是Emacs提供的一个强大的编辑模式,可以用于做会议笔记以及制作各种待办事项(GDT).其语法类似于Markdown但是提供了比Markdown更多的操作,再加上Emacs强大的编辑功能,能给笔记增加很多动态的操作(能纯文本上实现折叠.展开.树状视图.表格求和.求代码运行结果等功能),可以说org-mode是最强大的标记语言.而org-mode的强大,也导致了他比m

velocity教程

Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只 关注页面的显示效果,而由java程序开发人员关注业务逻辑编码.Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提 供了便利,同时也为我们

Velocity快速入门教程

Velocity快速入门教程-脚本语法详解(转) 1.变量 (1)变量的定义: #set($name = "hello")      说明:velocity中变量是弱类型的. 当使用#set 指令时,括在双引号中的字面字符串将解析和重新解释,如下所示: #set($directoryRoot = "www" ) #set($templateName = "index.vm" ) #set($template = "$directoryR

利用emacs调试C++程序教程

俗话说,Emacs是神的编辑器,而Vim是编辑器之神.高手程序员都是用这两样神器进行开发.本人觉得,Emacs之所以厉害,是因为许多在其他编辑器下必须用鼠标点选很多步的操作,在Emacs下都可以通过键盘来完成.大大地节省了你在显示器上找按钮的时间.Emacs在Linux上运行感觉比windows流畅些,用Emacs编辑程序时,手基本不用离开键盘,就可以完成所有的工作.那么今天就让我们看看如何利用Emacs来调试C++程序. 一.安装Emacs和GCC 下载地址:Emacs:http://www.

The Swift Programming Language-官方教程精译Swift(5)集合类型 -- Collection Types

Swift语言提供经典的数组和字典两种集合类型来存储集合数据.数组用来按顺序存储相同类型的数据.字典虽然无序存储相同类型数据值但是需要由独有的标识符引用和寻址(就是键值对). Swift语言里的数组和字典中存储的数据值类型必须明确. 这意味着我们不能把不正确的数据类型插入其中. 同时这也说明我们完全可以对获取出的值类型非常自信. Swift对显式类型集合的使用确保了我们的代码对工作所需要的类型非常清楚,也让我们在开发中可以早早地找到任何的类型不匹配错误. 注意: Swift的数组结构在被声明成常

Apple Swift 中文教程 快速参考 基本语法 更新中...

总的来说,语法有java的味道,也有python的味道,还有swift自己的味道. 有些语法还是挺不伦不类的,不太好理解,即使你有几年的java或python经验,也不见得有些语法你能很轻松的看明白. 有些语法特性很好,很个性,但有些语法个人感觉乱,特性多,注意点多,还不太好理解. 慢慢学习吧... ================================================================= 值类型 Int Double Bool String 用双引号"&

Swift编程高级教程(三)集合类型-数组

集合类型-数组 Swift语言提供了两种集合数据类型:数组和字典,数组是一系列相同类型的变量值有序存储:字典是一系列相同类型的变量值的无序存储,可以通过一个唯一标识符(键)来引用和查找. 数组和字典总是能识别自己所能够存储的键值的类型,就是说,我们不能够往这两个容器内插入错误的类型.显式类型声明的集合能确保我们的代码总是能识别其所能存储的变量类型,并能够让我们在实际编码中捕捉到出现的任何类型错误. 提示Swift的数组类型的变量在常量,变量赋值或者给函数和方法传参的时候会表现出和其他类型不一样的

6.Swift教程翻译系列——Swift集合类型

英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 Swift提供数组和字典两种集合类型,用来存储许多值的情况.数组有序的存储一组相同类型的值.字典也存储一组相同类型的值但是是无序的,字典中存储的值可以通过一个唯一的标识(也就是Key)来查找. 在Swift中,数组和字典总是清楚自己能存储的值的类型和key的类型.也就是说你不会错误的把其他不对应的类型存进数组或者字典.所以你也能确定从数组或者字典中取出来的值的类型肯定也不会错了

Windows Git+TortoiseGit简易使用教程

转载自 http://blog.csdn.net/jarelzhou/article/details/8256139 官方教程:http://tortoisegit.org/docs/tortoisegit/(英文版) 为什么选择Git 效率 很多人有一种习惯吧,什么软件都要最新的,最好的.其实吧,软件就是工具,生产力工具,为的是提高我们的生产力.如果现有的工具已经可以满足生产力要求了,就没有必要换了.生产效率高低应当是选择工具的第一位. 历史 开源世界的版本控制系统,经历了这么几代: 第一代,