最新第四章Maple简介
Maple简介

Maple简介Maple简介⼀、Maple操作界⾯介绍1、编辑功能:编辑功能中查找模块,可以帮助查找你所需要的关键字节.具体操作如图所⽰:按上述操作完成后,出现下图所⽰的对话框:在⽂本框中输⼊你要查找的字符或者符号,可以通过findprevious上下翻看,也可以通过replacewith操作替代你所查找的字符或者符号.cancle表⽰取消操作.其他编辑操作包括分割或连接(splitorjoin)分为⼀个执⾏过程(快截键为f3、f4)和选定块(shift+f3、shift+f4)过程四个操作块运⾏操作(Execute):运⾏选定或者当前的maple中的语句;删除运⾏结果操作(Removeoutput):将选定或者当前的maple中运⾏结果从⼯作爷中删除或者不显⽰;2、⽰图操作( VIEW)⽂档在屏幕上的显⽰模式称为“⽰图”,maple⽰图菜单主要设置⼯作爷⽂档的⼀些视图属性,所包括菜单如上图所⽰。
⼯具条(toolbar)的功能和其他系统⼀样,主要包括打开⽂件、创建新⽂档、存盘、打印当前页⾯、复制、剪切、粘贴、撤消操作等。
内容⼯具条:“枫叶”表⽰设置⼯作页和标准公式和maple语⾔之间的转换“X”表⽰设置⼯作页和标准公式在活动和⾮活动⽅式之间的转换“(对号)”表⽰标准公式有效时⾃动检查输⼊表达式的正确性“!”表⽰运⾏当前表达式3、插⼊操作(INSERT)插⼊操作⽐较简单这⾥就不做详细介绍,主要功能分为:⽂本插⼊(textinput);标准maple数学表达式插⼊;运⾏单元executegroup插⼊其中包括在光标前插⼊和光标后插⼊图形插⼊plot,其中包括两维和三维图象的插⼊电⼦表格插⼊spreadsheet段落插⼊parigraph,其中包括光标前插⼊和光标后插⼊数学输⼊对象(image)插⼊插⼊超级连接hyperlink4、其他操作窗⼝的功能和其他软件基本相同,这⾥就不做详细介绍了。
⼆、基本语法规则MaPle的科学计算功能主要是以命令输⼊的⽅式来实现的。
计算机代数系统第4章-Maple方程求解

第四章 方程求解1 代数方程(组)求解1.1 常用求解工具—solve求解代数方程或代数方程组, 使用Maple 中的solve 函数. 求解关于x 的方程eqn=0的命令格式为:solve(eqn, x);求解关于变量组vars 的方程组eqns 的命令为:solve(eqns, vars);> eqn:=(x^2+x+2)*(x-1);:= eqn () + + x 2x 2() - x 1> solve(eqn,x);,,1- + 1212I 7- - 1212I 7 当然, solve 也可以求解含有未知参数的方程:> eqn:=2*x^2-5*a*x=1;:= eqn = - 2x 25a x 1> solve(eqn,x);, + 5a 14 + 25a 28 - 5a 1 + 25a 28 solve 函数的第一个参数是有待求解的方程或方程的集合, 当然也可以是单个表达式或者表达式的集合, 如下例:> solve(a+ln(x-3)-ln(x),x);3e a- + 1ea 对于第二个参数, Maple 的标准形式是未知变量或者变量集合, 当其被省略时, 函数indets 自动获取未知变量. 但当方程中含有参数时, 则会出现一些意想不到的情况: > solve(a+ln(x-3)-ln(x));{}, = x x = a - + ()ln - x 3()ln x很多情况下, 我们知道一类方程或方程组有解, 但却没有解决这类方程的一般解法, 或者说没有解析解. 比如, 一般的五次或五次以上的多项式, 其解不能写成解析表达式. Maple 具备用所有一般算法尝试所遇到的问题, 在找不到解的时候, Maple 会用RootOf 给出形式解.> x^7-2*x^6-4*x^5-x^3+x^2+6*x+4;- - - + + + x 72x 64x 5x 3x 26x 4> solve(%); + 15 - 15()RootOf , - - _Z 5_Z 1 = index 1()RootOf , - - _Z 5_Z 1 = index 2()RootOf , - - _Z 5_Z 1 = index 3,,,,,()RootOf , - - _Z 5_Z 1 = index 4()RootOf , - - _Z 5_Z 1 = index 5, > solve(cos(x)=x,x);()RootOf - _Z ()cos _Z对于方程组解的个数可用nops 命令获得, 如:> eqns:={seq(x[i]^2=x[i],i=1..7)};:= eqns {},,,,,, = x 12x 1 = x 22x 2 = x 32x 3 = x 42x 4 = x 52x 5 = x 62x 6 = x 72x 7 > nops({solve(eqns)}); 128但是, 有时候, Maple 甚至对一些“显而易见”的结果置之不理, 如:> solve(sin(x)=3*x/Pi,x);()RootOf - 3_Z ()sin _Z π此方程的解为0 ,6π±, 但Maple 却对这个超越方程无能为力, 即便使用allvalues 求解也只有下述结果:> allvalues(%);()RootOf , - 3_Z ()sin _Z π0.另外一个问题是, Maple 在求解方程之前,会对所有的方程或表达式进行化简, 而不管表达式的类型, 由此而产生一些低级的错误:> (x-1)^2/(x^2-1);() - x 12- x 21> solve(%);1但是, 大量实验表明, solve 的确是一个实用的方程求解工具, 但是也不可盲目相信它给出的一切结果, 特别是对于非线性方程而言, 对于给出的结果需要加以验证.下面通过几个例子说明在Maple 中非线性方程组的求解问题.例:求解方程组:⎩⎨⎧=-=+y x y x 925222 > eqns:={x^2+y^2=25,y=x^2-5};:= eqns {}, = y - x 25 = + x 2y 225> vars:={x,y};:= vars {},x y> solve(eqns,vars);,,,{}, = x 0 = y -5{}, = x 0 = y -5{}, = y 4 = x 3{}, = y 4 = x -3也可用下面的语句一步求出:> solve({x^2+y^2=25,y=x^2-5},{x,y});,,,{}, = x 0 = y -5{}, = x 0 = y -5{}, = y 4 = x 3{}, = y 4 = x -3这个问题非常简单, 但通常遇到的非线性问题却不是这么简单, 例如要求解方程组:y x y x y x -=+=+,122> eqns:={x^2+y^2=1,sqrt(x+y)=x-y};vars:={x,y};:= eqns {}, = + x 2y 21 = + x y - x y:= vars {},x y> sols:=solve(eqns,vars);sols = y ()RootOf , + + 2_Z 24_Z 3 - -1.000000000.7071067812I ,{ := = x - - ()RootOf , + + 2_Z 24_Z 3 - -1.000000000.7071067812I 2}{}, = x 1 = y 0,可以看出, 方程解的形式是以集合的序列给出的, 序列中的每一个集合是方程的一组解, 这样就很利于我们用subs 把解代入原方程组进行检验:> subs(sols[2],eqns);{} = 11> sols2:=allvalues(sols[1]);:= sols2{}, = x - + 112I 2 = y - - 112I 2 > simplify(subs(sols2,eqns));{}, = I 2I 2 = 111.2 其他求解工具1.2.1 数值求解对于求代数方程的数值解问题, Maple 提供了函数fsolve , fsolve 的使用方法和solve 很相似:fsolve(eqns, vars, options);其中, eqns 表示一个方程、方程组或者一个程序, vars 表示一个未知量或者未知量集合, options 控制解的参数(诸如:complex: 复根; maxsols=n :只找到n 阶最小根; intervals :在给定闭区间内求根, 等).> fsolve(x^5-x+1,x);-1.167303978> fsolve(x^5-x+1,x,complex);-1.167303978 - -.1812324445 1.083954101I + -.1812324445 1.083954101I - .7648844336.3524715460I ,,,,+ .7648844336.3524715460I > fsolve(x^3-3*x+1,x,0..1);.3472963553对于多项式方程, fsolve 在默认情况下以给出所有的实数解, 如果附加参数complex , 就可以给出所有的解. 但对于更一般的其他形式的方程, fsolve 却往往只满足于得到一个解:> eqn:=sin(x)=x/2;:= eqn = ()sin x 1x > fsolve(eqn);0.> fsolve(eqn,x,0.1..infinity);1.895494267> fsolve(eqn,x,-infinity..-0.1);-1.895494267函数fsolve 主要基于两个算法, 通常使用牛顿法, 如果牛顿法无效, 它就改而使用切线法. 为了使fsolve 可以求得所有的实根, 我们通常需要确定这些根所在的区间. 对于单变量多项式, 函数realroot 可以获得多项式的所有实根所在的区间.> 4+6*x+x^2-x^3-4*x^5-2*x^6+x^7;+ + - - - + 46x x 2x 34x 52x 6x 7> realroot(%);[],,[],02[],24[],-2-1函数realroot 还有一个可选参数, 它是用来限制区间的最大长度的, 为了保证使用数值求解方法时收敛, 我们可以用它限制区间的最大长度:> realroot(%%,1/1000);⎡⎣⎢⎢⎤⎦⎥⎥,,⎡⎣⎢⎢⎤⎦⎥⎥,11951024299256⎡⎣⎢⎢⎤⎦⎥⎥,331310241657512⎡⎣⎢⎢⎤⎦⎥⎥,-633512-12651024 求解方程或方程组的整数解时使用函数isolve , 它常常被用来求解不定方程. 例如著名的“百钱买百鸡”问题♣的求解过程为:> isolve({x+y+z=100,5*x+3*y+z/3=100});{},, = z + 753_Z1 = x 4_Z1 = y - 257_Z1据此可得满足该问题的三组解为:{x, y, z}={4, 18, 78}, {x, y, z}={8, 11, 81}, {x, y, z}={12, 4, 84}1.2.2 整数环中的方程(组)求解利用Maple 中的函数msolve(eqns, vars, n), 可以在模n 的整数环中求解方程(组)eqns.例:在Z 7中求解Pell 方程2837-=x y> msolve(y^7=x^3-28,7); {}, = x 3 = y 6{}, = x 4 = y 1{}, = y 0 = x 0{}, = x 1 = y 1{}, = y 6 = x 6,,,,,{}, = x 2 = y 1{}, = y 6 = x 5, 再如下例:> msolve(y^4=x^3+32,5);,,,,{}, = x 2 = y 0{}, = x 4 = y 1{}, = x 4 = y 2{}, = x 4 = y 3{}, = x 4 = y 41.2.3 递归方程的求解在Maple 中, 可以求解有限差分方程(也称递归方程), 所需调用的函数是rsolve , 该函数使用的是一些比较通用的方法, 例如产生函数法、z 变换法以及一些基于变量替换和特征方程的方法. 作为例子, 求解Fibonacci 多项式:> eq:=f(n)=f(n-1)+2*f(n-2);:= eq = ()f n + ()f - n 12()f - n 2> rsolve({eq,f(0)=1,f(1)=1},f(n)); + 1()-1n 22n 当然, 并不是所有的递归形式的函数方程的解可以写成解析形式, 如果不能, Maple 将保留原来的调用形式. 此时, 可用asympt 函数获得它的渐进表达式, 也就是1/n 的级数解. 例如, 对于一个具有超越形式的递归函数方程, 仍然可以得到解的渐进形式:♣ 百钱买百鸡问题:用100元钱买100只鸡, 大公鸡5元钱1只, 大母鸡3元钱1只, 小鸡1元钱3只, 问如何买法?> rsolve(u(n+1)=ln(u(n)+1),u(n));()rsolve , = ()u + n 1()ln + ()u n 1()u n> asympt(%,n,5);+ + + 21 + _C 2()ln n n 2 - + - + 11_C 1_C 2⎛⎝ ⎫⎭⎪⎪- + 2_C 2()ln n 2()ln n 2n 3⎛⎝ ⎫⎭⎪⎪O 1n 41.2.4 不等式(组)求解求解一元不等式方程(组)使用命令solve :> solve((x-1)*(x-2)*(x-3)<0,x);,()RealRange ,-∞()Open 1()RealRange ,()Open 2()Open 3> solve((x-1+a)*(x-2+a)*(x-3+a) < 0, {x});,{} < x - 1a {}, < - 2a x < x - 3a> solve(exp(x)>x+1);,()RealRange ,-∞()Open 0()RealRange ,()Open 0∞> solve({x^2*y^2=0,x-y=1,x<>0});,{}, = y 0 = x 1{}, = y 0 = x 1对于由不等式方程组约束的最优问题的求解使用“线性规则”工具包simplex : > with(simplex):> cnsts:={3*x+4*y-3*z<=23, 5*x-4*y-3*z<=10,7*x+4*y+11*z<=30};:= cnsts {},, ≤ + - 3x 4y 3z 23 ≤ - - 5x 4y 3z 10 ≤ + + 7x 4y 11z 30 > obj:=-x+y+2*z;:= obj - + + x y 2z> maximize(obj,cnsts union {x>=0,y>=0,z>=0});{},, = z 12 = y 498= x 0 2 常微分方程求解微分方程求解是数学研究与应用的一个重点和难点. Maple 能够显式或隐式地解析地求解许多微分方程求解. 在常微分方程求解器dsolve 中使用了一些传统的技术例如laplace 变换和积分因子法等, 函数pdesolve 则使用诸如特征根法等经典方法求解偏微分方程. 此外, Maple 还提供了可作摄动解的所有工具, 例如Poincare-Lindstedt 法和高阶多重尺度法.帮助处理常微分方程(组)的各类函数存于Detools 软件包中, 函数种类主要有:可视化类的函数, 处理宠加莱动态系统的函数, 调整微分方程的函数, 处理积分因子、李对称法和常微分方程分类的函数, 微分算子的函数, 利用可积性与微分消去的方法简化微分方程的函数, 以及构造封闭解的函数等. 更重要的是其提供的强大的图形绘制命令Deplot 能够帮助我们解决一些较为复杂的问题.2.1 常微分方程的解析解求解常微分方程最简单的方法是利用求解函数dsolve . 命令格式为:dsolve(ODE);dsolve(ODE, y(x), extra_args);dsolve({ODE, ICs}, y(x), extra_args);dsolve({sysODE, ICs}, {funcs}, extra_args);其中, ODE —常微分方程, y(x)—单变量的任意变量函数, Ics —初始条件, {sysODE}—ODE 方程组的集合, {funcs}—变量函数的集合, extra_args —依赖于要求解的问题类型.例如, 对于一阶常微分方程y xy y y x -=')ln(可用dsolve 直接求得解析解: > ODE:=x*diff(y(x),x)=y(x)*ln(x*y(x))-y(x);:= ODE = x ⎛⎝ ⎫⎭⎪⎪∂∂x ()y x - ()y x ()ln x ()y x ()y x > dsolve(ODE,y(x));= ()y x e ⎛⎝ ⎫⎭⎪⎪x _C1x可以看出, dsolve 的第一个参数是待求的微分方程, 第二个参数是未知函数. 需要注意的是, 无论在方程中还是作为第二个参数, 未知函数必须用函数的形式给出(即:必须加括号, 并在其中明确自变量), 这一规定是必须的, 否则Maple 将无法区分方程中的函数、自变量和参变量, 这一点和我们平时的书写习惯不一致. 为了使其与我们的习惯一致, 可用alias 将函数用别称表示:> alias(y=y(x));> ODE:=x*diff(y,x)=y*ln(x*y)-y;:= ODE = x ⎛⎝ ⎫⎭⎪⎪∂∂x y - y ()ln x y y > dsolve(ODE,y);= y e⎛⎝ ⎫⎭⎪⎪x x函数dsolve 给出的是微分方程的通解, 其中的任意常数是用下划线起始的内部变量表示的.在Maple 中, 微分方程的解是很容易验证的, 只需要将解代入到原方程并化简就可以了.> subs(%,ODE);= x ⎛⎝⎫⎭⎪⎪⎪⎪∂∂x e ⎛⎝ ⎫⎭⎪⎪x x - e ⎛⎝ ⎫⎭⎪⎪x ⎛⎝ ⎫⎭⎪⎪ln e ⎛⎝ ⎫⎭⎪⎪x x e ⎛⎝ ⎫⎭⎪⎪xx > assume(x,real): assume(_C1,real):> simplify(%); = -e ⎛⎝ ⎫⎭⎪⎪x~()- + x~_C1~x~_C1~-e ⎛⎝ ⎫⎭⎪⎪x~()- + x~_C1~x~_C1~> evalb(%); true evalb 函数的目的是对一个包含关系型运算符的表达式使用三值逻辑系统求值, 返回的值是true, false 和FAIL. 如果无法求值, 则返回一个未求值的表达式. 通常包含关系型运算符“=, <>, <, <=, >, >=”的表达式在Maple 中看作是代数方程或者不等式. 然而, 作为参数传递给evalb 或者出现在if 或while 语句的逻辑表达式中时, 它们会被求值为true 或false. 值得注意的是, evalb 不化简表达式, 因此在使用evalb 之前应将表达式化简, 否则可能会出错. 再看下面常微分方程的求解:12+='y y> alias(y=y(x)):> ODE:=diff(y,x)=sqrt(y^2+1);:= ODE = ∂∂xy + y 21 > dsolve(ODE,y);= y ()sinh + x _C1函数dsolve 对于求解含有未知参变量的常微分方程也完全可以胜任:> alias(y=y(x)):> ODE:=diff(y,x)=-y/sqrt(a^2-y^2);:= ODE = ∂∂xy -y - a 2y 2> sol:=dsolve(ODE,y); := sol = + - + x - a 2y 2a 2⎛⎝ ⎫⎭⎪⎪ln + 2a 22a 2- a 2y 2y a 2_C10由此可见, 对于不能表示成显式结果的微分方程解, Maple 尽可能将结果表示成隐式解. 另外, 对于平凡解y=0常常忽略, 这一点应该引起注意.dsolve 对于求解微分方程初值问题也十分方便的:> ODE:=diff(u(t),t$2)+omega^2*u(t)=0;:= ODE = + ⎛⎝ ⎫⎭⎪⎪∂∂2t 2()u t ω2()u t 0 > dsolve({ODE,u(0)=u0,D(u)(0)=v0},u(t)); =()u t + v0()sin ωt u0()cos ωt 2.2 利用积分变换求解微分方程 对于特殊的微分方程, 我们还可以指定dsolve 利用积分变换方法求解, 只需要在dsolve 中加入可选参数method=transform 即可. 其中transform 是积分变换, 可以是laplace 、fourier 、fouriercos 或者fouriersin 变换.作为例子, 我们来看一个具有阻尼的振子在阶跃冲击(Heaviside 函数)下的响应: > ODE:=diff(u(t),t$2)+2*d*omega*diff(u(t),t)+omega^2*u(t)=Heaviside(t);:= ODE = + + ⎛⎝ ⎫⎭⎪⎪∂∂2t 2()u t 2d ω⎛⎝ ⎫⎭⎪⎪∂∂t ()u t ω2()u t ()Heaviside t > initvals:=(u(0)=u[0],D(u)(0)=v[0]);:= initvals , = ()u 0u 0 = ()()D u 0v 0> solution:=dsolve({ODE,initvals},u(t),method=laplace);:= solution = ()u t + 1ωe ()-t d ω⎛⎝ ⎫⎭⎪⎪⎪ + () - ω2u 01()cosh t - d 2ω2ω2ω() + - ωv 0d ω2u 0d ()sinh t - d 2ω2ω2 - d 2ω2ω2ωMaple 给出了问题的通解, 但没有区分自由振动(d=0)、欠阻尼(0<d<1)、临界阻尼(d=1)和过阻尼(d>1)的情况. 下面加以区分求解:> assume(omega>0):> simplify(subs(d=0,solution));= ()u t + - + 1()cos t ωω2u 0()cos t ωv 0()sin t ωωω2> K:=subs(d=1/5,u[0]=1,v[0]=1,solution);:= K = ()u t + 1ωe ()-/15t ω⎛⎝ ⎫⎭⎪⎪⎪⎪⎪⎪⎪ + () - ω21⎛⎝ ⎫⎭⎪⎪cosh t -2425ω2ω⎛⎝ ⎫⎭⎪⎪ + - ω15ω215⎛⎝ ⎫⎭⎪⎪sinh t -2425ω2-2425ω2ω> with(plots):> plot3d(rhs(%%),omega=2/3..4/3,t=0..20,style=hidden,orientation=[-30,45],axes=framed);对于d=1的情况, 可可用下式获得结果:> limit(rhs(solution),d=1);() + - + - + ω2u 0ω2v 0t 1ω3u 0t t ωe()t ωe ()-t ωω2再如下例:> diff(u(t),t$2)+3*diff(u(t),t)+2*u(t)=exp(-abs(t));= + + ⎛⎝ ⎫⎭⎪⎪∂∂2t 2()u t 3⎛⎝ ⎫⎭⎪⎪∂∂t ()u t 2()u t e ()-t > dsolve(%,u(t),method=fourier);= ()u t + + - 2e ()-2t ()Heaviside t 1e t ()Heaviside -t e ()-t t ()Heaviside t 1e ()-t ()Heaviside t2.3 常微分方程组的求解函数dsolve 不仅可以用来求解单个常微分方程, 也可以求解联立的常微分方程组. 特别是对于线性微分方程组, 由于数学上具有成熟的理论, Maple 的求解也是得心应手. 其命令格式为:dsolve( {eqn1, eqn2, …, ini_conds}, {vars});其中, ini_conds 是初始条件.> eqn1:={diff(x(t),t)=x(t)+y(t),diff(y(t),t)=y(t)-x(t)};:= eqn1{}, = ∂∂t ()x t + ()x t ()y t = ∂∂t()y t - ()y t ()x t > dsolve(eqn1,{x(t),y(t)}); {}, = ()x t e t () + _C1()sin t _C2()cos t = ()y t e t () - _C1()cos t _C2()sin t > eqn2:=2*diff(x(t),t$2)+2*x(t)+y(t)=2*t;:= eqn2 = + + 2⎛⎝ ⎫⎭⎪⎪∂∂2t 2()x t 2()x t ()y t 2t > eqn3:=diff(y(t),t$2)+2*x(t)+y(t)=t^2+1;:= eqn3 = + + ⎛⎝ ⎫⎭⎪⎪∂∂2t 2()y t 2()x t ()y t + t 21 > dsolve({eqn2, qn3, x(0)=0, D(x)(0)=1, y(0)=0, D(y)(0)=0}, {x(t),y(t)} );= ()x t + - + 18()sin 2t 2112t 3148t 434t ,{ = ()y t - + - + 1()sin 2t 21t 1t 21t 31t 4}2.4 常微分方程的级数解法1) 泰勒级数解法当一个常微分方程的解析解难以求得时, 可以用Maple 求得方程解的级数近似, 这在大多数情况下是一种非常好的方法. 级数解法是一种半解析半数值的方法. 泰勒级数法的使用命令为:dsolve({ODE,Ics}, y(x), 'series'); 或dsolve({ODE,Ics}, y(x), 'type=series');下面求解物理摆的大幅振动方程:θθsin g l -=, 其中l 是摆长, θ是摆角, g 是重力加速度.> ODE:=l*diff(theta(t),t$2)=-g*sin(theta(t));:= ODE = l ⎛⎝ ⎫⎭⎪⎪∂∂2t 2()θt -g ()sin ()θt > initvals:=theta(0)=0,D(theta)(0)=v[0]/l;:= initvals , = ()θ00 =()()D θ0v 0l> sol:=dsolve({ODE,initvals},theta(t),type=series);:= sol = ()θt - + + v 0l t 16g v 0l 2t 31120g v 0() + v 02g l l4t 5()O t 6 > Order:=11:> sol:=dsolve({ODE,initvals},theta(t),type=series);:= sol =()θt -+ - + + v 0l t 16g v 0l 2t 31120g v 0() + v 02g l l 4t 515040g v 0() + + 11g l v 02g 2l 2v 04l 6t 71362880g v 0() + + + 57g v 04l 102g 2v 02l 2g 3l 3v 06l 8t 9()O t 112) 幂级数解法对于一个符号代数系统来说, 幂级数是必不可少的微分方程求解工具. 幂级数求解函数powsolve 存于工具包powseries 中. 但是, 这一求解函数的使用范围很有限, 它只可以用来求解多项式系数的线性常微分方程或方程组,其求解命令为:powseries[function] (prep)或直接载入软件包后用function(prep), prep 为求解的线性微分方程及其初值.例:求解:042=+''+'y x y y x> ODE:=x*diff(y(x),x$2)+diff(y(x),x)+4*x^2*y(x)=0;:= ODE = + + x ⎛⎝ ⎫⎭⎪⎪∂∂2x 2()y x ⎛⎝ ⎫⎭⎪⎪∂()y x 4x 2()y x 0 > dsolve(ODE,y(x));= ()y x + _C1⎛⎝ ⎫⎭⎪⎪BesselJ ,04x ()/32_C2⎛⎝ ⎫⎭⎪⎪BesselY ,04x ()/32> initvals:=y(0)=y0,D(y)(0)=0;:= initvals , = ()y 0y0 = ()()D y 00> with(powseries):> sol:=powsolve({ODE,initvals});:= sol proc () ... end proc powparm> tpsform(sol,x,16);- + - + - + y049y0x 3481y0x 6166561y0x 9459049y0x 121613286025y0x 15()O x 16也可以用powsolve 给出的函数直接获得用递归形式定义的幂级数系数, 不过参数必须用_k , 这是powsolve 使用的临时变量. > sol(_k);-4()a - _k 3_k2例:求解一维谐振子的解:0)(2=-+''y x y ε > alias(y=y(x)):> ODE:=diff(y,x$2)+(epsilon-x^2)*y=0;:= ODE = + ⎛⎝ ⎫⎭⎪⎪∂∂2x 2y () - εx 2y 0 > H:=powsolve(ODE);:= H proc () ... end proc powparm> tpsform(H,x,8);C0C1x 1εC0x 21εC1x 3⎛⎝ ⎫⎭⎪⎪ + 1ε2C01C0x 4⎛⎝ ⎫⎭⎪⎪ + 1ε2C11C1x 5⎛⎝ ⎫⎭⎪⎪- - 1ε⎛⎝ ⎫⎭⎪⎪ + 1ε2C01C01εC0 + - - + + + x 6⎛⎝ ⎫⎭⎪⎪- - 1ε⎛⎝ ⎫⎭⎪⎪ + 1ε2C11C11εC1x 7()O x 8 + + > H(_k);-- ε()a - _k 2()a - _k 4_k ()- _k 12.5 常微分方程的数值解法在对微分方程的解析解失效后, 可以求助于数值方法求解微分方程. 数值求解的好处是只要微分方程的条件足够多时一般都可求得结果, 然而所得结果是否正确则必须依赖相关数学基础加以判断. 调用函数dsolve 求常微分方程初值问题的数值解时需加入参数type=numeric .另一方面, 常微分方程初值问题数值求解还可以选择算法, 加入参数“method=方法参数”即可, 方法参数主要有:rkf45:4~5阶变步长Runge-Kutta-Fehlberg 法 dverk78:7~8阶变步长Runge-Kutta-Fehlberg 法classical :经典方法, 包括向前欧拉法, 改进欧拉法, 2、3、4阶龙格库塔法,Sdams-Bashford 方法等 gear :吉尔单步法 mgear :吉尔多步法 2.5.1变步长龙格库塔法下面用4~5阶Runge-Kutta-Fehlberg 法求解van der Pol 方程:⎩⎨⎧-='==+'--''1.0)0(,0)0(0)1(2y y y y y y > ODE:=diff(y(t),t$2)-(1-y(t)^2)*diff(y(t),t)+y(t)=0;:= ODE = - + ⎛⎝ ⎫⎭⎪⎪∂∂2t()y t () - 1()y t 2⎛⎝ ⎫⎭⎪⎪∂()y t ()y t 0> initvals:=y(0)=0,D(y)(0)=-0.1;:= initvals , = ()y 00 = ()()D y 0-.1> F:=dsolve({ODE,initvals},y(t),type=numeric);:= F proc () ... end proc rkf45_x此时, 函数返回的是一个函数, 可以在给定的数值点上对它求值:> F(0);⎡⎣⎢⎢⎤⎦⎥⎥,, = t 0. = ()y t 0. = ∂()y t -.1 > F(1);⎡⎣⎢⎢⎤⎦⎥⎥,, = t 1. = ()y t -.144768589749425608 = ∂()y t -.178104066128215944 可以看到, F 给出的是一个包括t 、y(t)、D(y)(t)在内的有序表, 它对于每一个时间点可以给出一组数值表达式. 有序表的每一项是一个等式, 可对其作图描述. > plot('rhs(F(t)[2])', t=0..15, title="solution of the Van de Pol's Equation");> plots[odeplot](F,[t,y(t)],0..15,title="solution of the Van de Pol's Equation");2.5.2吉尔法求解刚性方程在科学和工程计算中, 常常会遇到这样一类常微分方程问题, 它可以表示成方程组:00)(),,(y t y y t f y ==', 称其为刚性方程, 其解的分量数量相差很大, 分量的变化速度也相差很大. 如果用常规方法求解, 为了使变量有足够高的精度, 必须取很小的步长, 而为了使慢变分量达到近似的稳态解, 则需要很长的时间, 这样用小步长大时间跨度的计算, 必定造成庞大的计算量, 而且会使误差不断积累. 吉尔法是专门用来求解刚性方程的一种数值方法.> ODE:=diff(u(t),t)=-2000*u(t)+999.75*v(t)+1000.25,diff(v(t),t)=u(t)-v(t);:= ODE , = ∂∂t ()u t - + + 2000()u t 999.75()v t 1000.25 = ∂∂t()v t - ()u t ()v t> initvals:=u(0)=0,v(0)=-2;:= initvals , = ()u 00 = ()v 0-2> ansl:=dsolve({ODE,initvals},{u(t),v(t)},type=numeric,method=gear);:= ansl proc () ... end proc x_gear> ansl(10,0);[],, = t 10. = ()u t .989893921726687442 = ()v t .979787842765888594> p1:=plots[odeplot] (ansl,[t,u(t)],0..20,color=red):p2:=plots[odeplot] (ansl,[t,v(t)],0..20,color=blue):plots[display] ({p1,p2}, title="Solution of a stiff equation");2.5.3 经典数值方法Maple中常微分方程数值解法中有一类被称作是“经典”(classical)方法. 当然, 称其为经典方法不是因为它们常用或是精度高, 而是因为它们的形式简单, 经常被用于计算方法课上的教学内容. 它们是一些常见的固定步长方法, 在dsolve中用参数method=classical[方法名称], 如果不特别指出, 将默认采用向前欧拉法. 主要有:foreuler:向前欧拉法(默认)hunform:Heun公式法(梯形方法, 改进欧拉法)imply:改进多项式法rk2:二阶龙格库塔法rk3:三阶龙格库塔法rk4:四阶龙格库塔法adambash:Adams-Bashford方法(预测法)abmoulton:Adams-Bashford-Moulton方法(预测法)下面给出微分方程数值方法的参数表:另外, 还有一些特殊的附加参数:maxfun :整数类型, 用于最大的函数值数量, 默认值50000, 为负数时表示无限制 corrections :正整数类型, 指定每步修正值数量, 在abmoulton 中使用, 建议值≤4 stepsize :浮点数值, 指定步长 下面看一个简单的例子:> ODE:=diff(y(x),x)=y(x)-2*x/y(x);:= ODE = ∂∂x ()y x - ()y x 2x()y x> initvals:=y(0)=1;:= initvals = ()y 01> sol1:=dsolve({ODE,initvals},y(x),numeric,method=classical,stepsize=0.1,start=0);:= sol1proc () ... end proc x_classical而其解析解为:> sol2:=dsolve({diff(y(x),x)=y(x)-2*x/y(x), y(0)=1}, y(x));:= sol2 = ()y x + 2x 1将两者图形同时绘制在同一坐标系中比较, 可以发现, 在经过一段时间后, 欧拉法的数值结果会产生较大误差.> plot({rhs(sol2),'rhs(sol1(x)[2])'},x=0..2);求解微方程, 无论使用什么方法或者加入什么选项, 求解完成后必须利用相关数学知识进行逻辑判断, 绝对不对简单迷信Maple 给出的结果, 否则很有可能得到一个对于方程本身也许还看得过去, 但在数学或者物理意义上不合理的解.2.6摄动法求解常微分方程由于微分方程求解的复杂性, 一般微分方程常常不能求得精确解析解, 需要借助其它方法求得近似解或数值解, 或者两种方法兼而有之. 摄动法是重要的近似求解方法.摄动法又称小参数法, 它处理含小参数ε的系统, 一般当ε=0时可求得解x 0. 于是可把原系统的解展成ε的幂级数 +++=2210εεx x x x , 若这个级数当ε→0时一致收敛,则称正则摄动, 否则称奇异摄动. 摄动法的种类繁多, 最有代表性的是庞加莱—林斯泰特(Poicare-Lindstedt )法, 在此, 我们以该方法求解van der Pol 方程:0)1(2=+'--''y y y y ε当ε=0时该方程退化为数学单摆的常微分方程, 当ε=1时为3.5讨论的情况, 对任意ε, 该微分方程拥有一个渐进稳定的周期解, 称为极限环.由于van der Pol 方程中没有显式的时间依赖项, 不失一般性, 设初值为y(0)=0. 在庞加莱—林斯泰特法中, 时间通过变换拉伸:t ωτ=, 其中∑∞==0i ii εωω对于)(τy , van der Pol 方程变为:0)1(22=+'--''y y y y ωεωrestart:diff(y(t),t$2)-epsilon*(1-y(t)^2)*diff(y(t),t)+y(t)=0;= - + ⎛⎝ ⎫⎭⎪⎪∂∂2t 2()y t ε() - 1()y t 2⎛⎝ ⎫⎭⎪⎪∂∂t ()y t ()y t 0 > ODE:=DEtools[Dchangevar]({t=tau/omega,y(t)=y(tau)},%,t,tau);:= ODE = - + ω2⎛⎝ ⎫⎭⎪⎪∂∂2τ2()y τε() - 1()y τ2ω⎛⎝ ⎫⎭⎪⎪∂()y τ()y τ0> e_order:=6:> macro(e=epsilon,t=tau):> alias(seq(y[i]=eta[i](tau),i=0..e_order)): > e:=()->e:> for i from 0 to e_order do eta[i]:=t->eta[i](t) od:> omega:=1+sum('w[i]*e^i','i'=1..e_order);:= ω + + + + + + 1w 1εw 2ε2w 3ε3w 4ε4w 5ε5w 6ε6> y:=sum('eta[i]*e^i','i'=0..e_order);:= y + + + + + + η0η1εη2ε2η3ε3η4ε4η5ε5η6ε6> deqn:=simplify(collect(ODE,e),{e^(e_order+1)=0}):> for i from 0 to e_order do ode[i]:=coeff(lhs(deqn),e,i)=0 od:> ode[0];= + y 0⎛⎝ ⎫⎭⎪⎪∂∂2τ2y 00> ode[1];= - + + + ⎛⎝ ⎫⎭⎪⎪∂∂2τ2y 1⎛⎝ ⎫⎭⎪⎪∂y 0y 12w 1⎛⎝ ⎫⎭⎪⎪∂∂2τ2y 0⎛⎝⎫⎭⎪⎪∂y 0y 020 > ode[2];= + - + + + - + + + ⎛⎝ ⎫⎭⎪⎪∂y 0w 1y 022⎛⎝ ⎫⎭⎪⎪∂y 0y 0y 1⎛⎝ ⎫⎭⎪⎪∂y 1⎛⎝ ⎫⎭⎪⎪∂∂2τy 2y 2⎛⎝ ⎫⎭⎪⎪∂y 1y 02⎛⎝ ⎫⎭⎪⎪∂y 0w 12w 1⎛⎝ ⎫⎭⎪⎪∂∂2τy 12⎛⎝ ⎫⎭⎪⎪∂∂2τy 0w 2⎛⎝ ⎫⎭⎪⎪∂∂2τy 0w 12> dsolve({ode[0],eta[0](0)=0,D(eta[0])(0)=C[1]},eta[0](t));= y 0C 1()sin τ> eta[0]:=unapply(rhs(%),t);:= η0 → τC 1()sin τ> ode[1];= - + - + ⎛⎝ ⎫⎭⎪⎪∂∂2τ2y 1C 1()cos τy 12w 1C 1()sin τC 13()cos τ()sin τ20 > map(combine,ode[1],'trig');= - + - + - ⎛⎝ ⎫⎭⎪⎪∂∂2τ2y 1C 1()cos τy 12w 1C 1()sin τ14C 13()cos τ14C 13()cos 3τ0 > ode[1]:=map(collect,%,[sin(t),cos(t)]);:= ode 1 = - + + + - 2w 1C 1()sin τ⎛⎝ ⎫⎭⎪⎪- + C 114C 13()cos τ⎛⎝ ⎫⎭⎪⎪∂∂2τ2y 1y 114C 13()cos 3τ0 > dsolve({ode[1],eta[1](0)=0,D(eta[1])(0)=C[2]},eta[1](t),method=laplace);= y 1 + - ⎛⎝ ⎫⎭⎪⎪- + + 18C 1() - C 12() + C 12τw 1C 1C 2()sin τ⎛⎝ ⎫⎭⎪⎪ - 132C 13C 1τw 1()cos τ132C 13()cos 3τ > map(collect,%,[sin(t),cos(t),t]);= y 1 + - ⎛⎝ ⎫⎭⎪⎪- + + 1C 1() - C 12() + C 12τw 1C 1C 2()sin τ⎛⎝ ⎫⎭⎪⎪ - 1C 13C 1τw 1()cos τ1C 13()cos 3τ> solve({coeff(lhs(ode[1]),sin(t))=0,coeff(lhs(ode[1]),cos(t))=0});,,{}, = C 10 = w 1w 1{}, = C 12 = w 10{}, = C 1-2 = w 10> w[1]:=0:C[1]:=-2: > ode[1];= + + ⎛⎝ ⎫⎭⎪⎪∂∂2τ2y 1y 12()cos 3τ0 > dsolve({ode[1],eta[1](0)=0,D(eta[1])(0)=C[2]},eta[1](t),method=laplace);= y 1 - + 1()cos 3τ1()cos τC 2()sin τ> eta[1]:=unapply(rhs(%),tau);:= η1 → τ - + 1()cos 3τ1()cos τC 2()sin τ> map(combine,ode[2],'trig'):> ode[2]:=map(collect,%,[sin(t),sin(3*t),cos(t),cos(3*t)]);:= ode 2 = + + - + - + ⎛⎝ ⎫⎭⎪⎪ + 14w 2()sin τ5()sin 5τ⎛⎝ ⎫⎭⎪⎪∂∂2τ2y 23()sin 3τ2C 2()cos τ3C 2()cos 3τy 20> solve({coeff(lhs(ode[2]),sin(t))=0,coeff(lhs(ode[2]),cos(t))=0});{}, = C 20 = w 2-1> assign(%):> dsolve({ode[2],eta[2](0)=0,D(eta[2])(0)=C[3]},eta[2](t),method=laplace): > eta[2]:=unapply(rhs(%),t);:= η2 → τ-+ + 3()sin 3τ⎛⎝ ⎫⎭⎪⎪ + 29C 3()sin τ5()sin 5τ > for i from 0 to e_order domap(combine,ode[i],'trig'):ode[i]:=map(collect,%,[seq(sin((2*j+1)*t),j=0..i),seq(cos((2*j+1)*t),j=0..i)]): solve({coeff(lhs(ode[i]),sin(t))=0,coeff(lhs(ode[i]),cos(t))=0}): assign(%):dsolve({ode[i],eta[i](0)=0,D(eta[i])(0)=C[i+1]},eta[i](t),method=laplace): collect(%,[seq(sin((2*j+1)*t),j=0..i),seq(cos((2*j+1)*t),j=0..i)]): eta[i]:=unapply(rhs(%),t); od:> omega;- + + 1116ε2173072ε435884736ε6> y(t):> y:=unapply(simplify(y(t),{e^e_order=0}),t): > e:=1:y(t);1037927()sinτ1519()sinτ()cosτ681()sinτ()cosτ461()sinτ()cosτ813()sinτ()cosτ25257957()cosτ35533()cosτ11912187()cosτ7799991()cosτ- + - - + + + + -1212373 259200()cosτ511494128800()cosτ9- -> plot(y(t),t=0..15);在该问题的求解过程中, 前半部分我们按照交互式命令方式输入, 也就是把数学逻辑推理的过程“翻译”成Maple函数, 而在后半部分, 则采用程序设计方式书写了数学推导过程, 这是应用Maple解决实际问题的两种方式. 前一种方法只需了解Maple函数即可应用, 而后一种程序设计方式则需掌握Maple程序设计语言. 但是, 不论是那一种方式, 数学基础总是最重要的.3 偏微分方程求解初步Maple中偏微分方程求解器为pdsolve, 该函数及其它偏微分方程求解工具存于软件包PDEtools中. 函数pdsolve能够很快的辨认出偏微分方程是否为可以用标准方法求解的类型, 如果无法判别, 则pdsolve采用一种启发式的算法尝试偏微分方程按特征结构分离出来. pdsolve的策略就是寻找给定偏微分方程的通解, 如不能成功则寻找可以完全分离的变量, 因此, 该函数返回的结果可能为:(i) 通解;(ii) 近似的通解(即包含任意函数但又不足以得到通解的解);(iii) 变量分离的非耦合的常微分方程.如不能完全分离变量, 则函数再次调用自身, 如仍失败则返回未完全分离的变量并给出一个警告信息. 其命令格式为:pdsolve(PDE, f);其中, PDE为偏微分方程, f为被求解函数.下面通过几个例子说明pdsolve的用法:> PDE1:=diff(u(x,t),[t$2])-1/v^2*diff(u(x,t),[x$2]);:= PDE1 - ⎛⎝ ⎫⎭⎪⎪∂∂2t 2()u ,x t ∂∂2x 2()u ,x t v 2 > pdsolve(PDE1,u(x,t));= ()u ,x t + ()_F1- - t v x ()_F2 - t v x> restart:> PDE2:=a*x*diff(u(x,t),x)+b*t*diff(u(x,t),t)=0;:= PDE2 = + a x ⎛⎝ ⎫⎭⎪⎪∂∂x ()u ,x t b t ⎛⎝ ⎫⎭⎪⎪∂∂t ()u ,x t 0 > pdsolve(PDE2,u(x,t));= ()u ,x t ⎛⎝ ⎫⎭⎪⎪⎪⎪_F1t x ⎛⎝ ⎫⎭⎪⎪b a> PDE3:=diff(u(x,t),x$2)-t^2*diff(u(x,t),t$2)-t*diff(u(x,t),t)=0;:= PDE3 = - - ⎛⎝ ⎫⎭⎪⎪∂∂2x 2()u ,x t t 2⎛⎝ ⎫⎭⎪⎪∂∂2t 2()u ,x t t ⎛⎝ ⎫⎭⎪⎪∂∂t ()u ,x t 0 > pdsolve(PDE3,u(x,t));= ()u ,x t + ()_F1t e x ()_F2t e()-x> restart:> heatPDE:=diff(u(x,t),t)=diff(u(x,t),[x$2]);:= heatPDE = ∂()u ,x t ∂∂2x2()u ,x t> pdsolve(heatPDE,u(x,t));() = ()u ,x t ()_F1x ()_F2t &where ⎡⎣⎢⎢⎤⎦⎥⎥{}, = ∂∂2x 2()_F1x _c 1()_F1x = ∂∂t ()_F2t _c 1()_F2t > dsolve(diff(F2(t),t)=c[1]*F2(t),F2(t));= ()F2t _C1e()c 1t> dsolve(diff(F1(x),[x$2])=c[1]*F1(x));= ()F1x + _C1e()c 1x _C2e()-c 1x> result:=rhs(%)*rhs(%%);:= result () + _C1e ()c 1x _C2e()-c 1x _C1e()c 1t> subs(u(x,t)=result,heatPDE):expand(%);+_C12c 1e()c 1t e()c 1x _C1c 1e()c 1t _C2e()c 1x =+_C12c 1e()c 1t e ()c 1x _C1c 1e()c 1t _C2e()c 1x> lhs(%)-rhs(%);。
第四章 Maple 简介

2. 向量的其他运算
• CrossProduct(U, V)计算两个三维向量的叉 积 • DotProduct(U, V)计算两个相同维数向量的 点积 • VectorAngle(U, V)计算两个相同维数向量 间的夹角 • VectorNorm(U, 2)计算向量U的欧氏长度
3. 矩阵的其他运算
二、安装、启动与退出
• 1. 软件的安装 • 2. 软件的启动与退出
三、界面简介
四、基本操作
• 1. 基本运算符
– 加、减、乘、除和乘方的符号+、-、*、/ 和^ – 在运算过程中加注释, 用符号“#”起始就行了
• 2. 变量与函数
– Maple本身定义的函数的第一个字母小写,函数 的变量用圆括号()
• 3. 工具栏(Palettes)的使用 • 4. 帮助系统的使用
第二节 Maple 的简单应用
• • • • • • 一、算术运算 二、函数运算 三、初等代数运算 四、微积分运算 五、线性代数运算 六、作图
一、算术运算
• • • • • 1. 数值表示和计算 2. 整数运算 3. 内部常数 4. 小数划为分数运算 5. 复数运算
3. 积分运算
• int(expr, x) 求expr对于x的不定积分 • int(expr, x=a..b, ...) 求expr对于x由a到b的 定积分, …为选项 • changevar(s, f, u) 对积分f作变量替换s, u为 新的积分变量 • intparts(f, u) 对积分f作分部积分, u为在udv 中选择的u
4. 解不等式
• Maple用指令solve解不等式,不等号为:
• • • • • <=(小于等于) >=(大于等于) <(小于) >(大宇) <>(不等于)
四章节Maple简介

3. 定义函数
• 定义函数的基本方式是: “函数名 := 变量 - > 变量的表达式”
2. Maple的自定义函数
• sqrt(x) 平方根函数 • exp(x), ln(x) 指数函数和自然对数函数 • log[b](x) 以b为底的对数函数 • Abs(x) 绝对值函数 • round(x) 最接近x的整数rand ()12位的随机数 • Max(a,b,c, ),min(a,b,c, ) a, b, c, 中的最
• evalf(expr,n) expr的计算结果含n位数字
• Digits
查看数值的默认位数
• Digits:=n 将数值的默认位数设定为n
2. 整数运算
• ifactor(n)
将整数n分解为素数的乘积
• igcd(m,n,k,…) 求m,n,k, 的最大公约数
• ilcm(m,n,k,…) 求m,n,k, 的最小公倍数
3. 积分运算
• int(expr, x) 求expr对于x的不定积分 • int(expr, x=a..b, ...) 求expr对于x由a到b的
定积分, …为选项 • changevar(s, f, u) 对积分f作变量替换s, u为
新的积分变量 • intparts(f, u) 对积分f作分部积分, u为在udv
• Limit(f(x), x=a, dir ) 求表达式f(x)当x沿方向dir趋于a时的极限
• Limit(f(x,y,…),{x=a,y=b}) 求表达式f(x, y,…)
线性代数及线性规划(Maple和LINDO)

第0章数学软件教学目的:认知目标:使学生掌握数学软件Maple和LINDO的运行与基本操作。
能力目标:训练学生抽象利用计算机解决数学问题能力。
情感目标:培养学生辩证唯物主义思想。
教学重点:使学生掌握数学软件Maple和LINDO的运行与基本操作。
教学时数:2课时教学内容:数学软件是指专用于于解决数学问题的计算机程序。
0.1 Maple简介0.1.1 Maple简介1.Maple简介Maple是加拿大University of Waterloo和Waterloo Maple Software公司注册的一套为微积分、线性代数和微分方程等高等数学使用的软件包。
它是当今世界上最优秀的几个数学软件之一,Maple 软件几乎涉及到高等数学的各个分支,并提供了一套完善的程序设计语言,有多达2700多种命令和函数,它的图形式输入、输出界面,与通用的数学表达方式几乎一样,用户无需记忆许多语法规则就可以轻松的掌握它的使用。
Maple软件适用于解决微积分、解析几何、线性代数、微分方程、计算方法、概率统计等数学分支中的常见计算问题。
2.Maple结构Maple是一个具有强大符号运算能力、数值计算能力、图形处理能力的交互式计算机代数系统。
它可以借助键盘和显示器代替原来的笔和纸进行各种科学计算、数学推理、猜想的证明以及智能化文字处理。
Maple软件结构主要由三个部分组成:用户界面、代数运算器、外部函数库。
3.Maple的启动与基本操作⑴启动:系统安装好以后,在Windows XP中,用鼠标点击开始→程序→Maple菜单即可进入系统。
或在桌面用鼠标直接双击Maple快捷图标,即可进入系统。
⑵基本操作:常用工具栏中(从左到右)有新建、打开、保存、打印、剪切、复制、粘贴、撤消、Maple输入转换、文体输入转换、增加命令区、撤消分组、建立分组、停止运行等按钮。
0.1.2 Maple的运算1.初试Maple2.Maple的基本运算⑴算术运算⑵代数运算3.Maple的线性代数运算⑴矩阵的建立⑵矩阵的基本运算⑶矩阵的初等变换0.1.3 Maple的函数绘图1.二维图象2.极坐标系图象3.三维图象4.动画0.2 LINDO简介0.2.1 LINDO 简介LINDO 用于求解线性规划,整数规划和二次规划问题。
第4章 maple方程求解

eq := f( n ) f( n 1 ) 2 f( n 2 )
> rsolve({eq,f(0)=1,f(1)=1},f(n));
1 2 ( -1 ) n 2 n 3 3
当然, 并不是所有的递归形式的函数方程的解可以写成解析形式, 如果不能, Maple 将保留原来的调用形式. 此时, 可用 asympt 函数获得它的渐进表达式, 也就是 1/n 的级 数解. 例如, 对于一个具有超越形式的递归函数方程, 仍然可以得到解的渐进形式:
可以看出, 方程解的形式是以集合的序列给出的, 序列中的每一个集合是方程的一 组解, 这样就很利于我们用 subs 把解代入原方程组进行检验: > subs(sols[2],eqns);
{ 1 1 }
> sols2:=allvalues(sols[1]);
1 1 sols2 := { x 1 I 2 , y 1 I 2 } 2 2 > simplify(subs(sols2,eqns));
> solve(%);
1
- 101 -
但是, 大量实验表明, solve 的确是一个实用的方程求解工具, 但是也不可盲目相信 它给出的一切结果, 特别是对于非线性方程而言, 对于给出的结果需要加以验证. 下面通过几个例子说明在 Maple 中非线性方程组的求解问题.
x 2 y 2 25 例:求解方程组: 2 x 9 y
也可用下面的语句一步求出: > solve({x^2+y^2=25,y=x^2-5},{x,y});
{ x 0, y -5 }, { x 0, y -5 }, { y 4, x 3 }, { y 4, x -3 }
这个问题非常简单 , 但通常遇到的非线性问题却不是这么简单 , 例如要求解方程 组: x y 1, x y x y
第四章Maple简介.ppt

精选
16
3. 定义函数
• 定义函数的根本方式是:
• “函数名 := 变量 - > 变量的表达式〞
1. 极限运算
• Limit(f(x), x = a ) 求表达式f(x)当x趋于a时的极限
• Limit(f(x), x=a, dir ) 求表达式f(x)当x沿方向dir趋于a时的极限
• Limit(f(x,y,…),{x=a,y=b}) 求表达式f(x, y,…)
当x,y,…分别趋于a、b,…时的极限
• Maple承受中文输入,这为我们编写中文课 件或做中文注释提供了方便.
精选
3
二、安装、启动与退出
• 1. 软件的安装 • 2. 软件的启动与退出
精选
4
三、界面简介
精选
5
四、根本操作
• 1. 根本运算符
• 加、减、乘、除和乘方的符号+、-、*、/ 和 ^
• 在运算过程中加注释, 用符号“#〞起始就 行了
• 加载程序包LinearAlgebra • 1. 向量和矩阵的输入和运算 • 2. 向量的其他运算 • 3. 矩阵的其他运算 • 4. 求解线性方程组 • 5. 矩阵的特征值和特征向量
精选
31
1. 向量和矩阵的输入和运算
• v := <a1, a2, …, ak> 定义k维列向量 • vv := <a1 | a2 | … | ak> 定义k维行向量v • M:=<<a11, …, ak1>|…|<a1n, …, akn>> 定义kΧn
第4章-方程求解(Maple中文教程)

第4章-⽅程求解(Maple中⽂教程)第四章⽅程求解1 代数⽅程(组)求解1.1 常⽤求解⼯具—solve求解代数⽅程或代数⽅程组, 使⽤Maple 中的solve 函数. 求解关于x 的⽅程eqn=0的命令格式为:solve(eqn, x);求解关于变量组vars 的⽅程组eqns 的命令为:solve(eqns, vars);> eqn:=(x^2+x+2)*(x-1);:= eqn () + + x 2x 2() ? x 1> solve(eqn,x);,,1? + 1212I 7? ? 1212I 7 当然, solve 也可以求解含有未知参数的⽅程:> eqn:=2*x^2-5*a*x=1;:= eqn = ? 2x 25a x 1 > solve(eqn,x);, + 54a 14 + 25a 28 ? 54a 14 + 25a 28 solve 函数的第⼀个参数是有待求解的⽅程或⽅程的集合, 当然也可以是单个表达式或者表达式的集合, 如下例:> solve(a+ln(x-3)-ln(x),x);3e a+ 1ea 对于第⼆个参数, Maple 的标准形式是未知变量或者变量集合, 当其被省略时, 函数indets ⾃动获取未知变量. 但当⽅程中含有参数时, 则会出现⼀些意想不到的情况: > solve(a+ln(x-3)-ln(x));{}, = x x = a ? + ()ln ? x 3()ln x很多情况下, 我们知道⼀类⽅程或⽅程组有解, 但却没有解决这类⽅程的⼀般解法, 或者说没有解析解. ⽐如, ⼀般的五次或五次以上的多项式, 其解不能写成解析表达式. Maple 具备⽤所有⼀般算法尝试所遇到的问题, 在找不到解的时候, Maple 会⽤RootOf 给出形式解.> x^7-2*x^6-4*x^5-x^3+x^2+6*x+4;+ + + x 72x 64x 5x 3x 26x 4> solve(%); + 15 ? 15()RootOf , ? ? _Z 5_Z 1 = index 1()RootOf , ? ? _Z 5_Z 1 = index 2(RootOf ,) ? ? _Z 5_Z 1 = index 3,,,, ()RootOf , ? ? _Z 5_Z 1 = index 4()RootOf , ? ? _Z 5_Z 1 = index 5,,> solve(cos(x)=x,x);()RootOf ? _Z ()cos _Z对于⽅程组解的个数可⽤nops 命令获得, 如:> eqns:={seq(x[i]^2=x[i],i=1..7)};:= eqns {,,,,,, = x 12x 1 = x 22x 2 = x 32x 3 = x 42x 4 = x 52x 5 = x 62x 6 = x 72x 7} > nops({solve(eqns)});128但是, 有时候, Maple 甚⾄对⼀些“显⽽易见”的结果置之不理, 如:> solve(sin(x)=3*x/Pi,x);()RootOf ? 3_Z ()sin _Z π此⽅程的解为0 ,6π±, 但Maple 却对这个超越⽅程⽆能为⼒, 即便使⽤allvalues求解也只有下述结果:> allvalues(%);()RootOf , ? 3_Z ()sin _Z π0.另外⼀个问题是, Maple 在求解⽅程之前,会对所有的⽅程或表达式进⾏化简, ⽽不管表达式的类型, 由此⽽产⽣⼀些低级的错误: > (x-1)^2/(x^2-1);() ? x 12x 21> solve(%);1但是, ⼤量实验表明, solve 的确是⼀个实⽤的⽅程求解⼯具, 但是也不可盲⽬相信它给出的⼀切结果, 特别是对于⾮线性⽅程⽽⾔, 对于给出的结果需要加以验证.下⾯通过⼏个例⼦说明在Maple 中⾮线性⽅程组的求解问题.例:求解⽅程组: ?=?=+y x y x 925222> eqns:={x^2+y^2=25,y=x^2-5};:= eqns {}, = y ? x 25 = + x 2y 225> vars:={x,y};:= vars {},x y> solve(eqns,vars);,,,{}, = x 0 = y -5{}, = x 0 = y -5{}, = y 4 = x 3{}, = y 4 = x -3也可⽤下⾯的语句⼀步求出:> solve({x^2+y^2=25,y=x^2-5},{x,y});,,,{}, = x 0 = y -5{}, = x 0 = y -5{}, = y 4 = x 3{}, = y 4 = x -3这个问题⾮常简单, 但通常遇到的⾮线性问题却不是这么简单, 例如要求解⽅程组:y x y x y x ?=+=+,122> eqns:={x^2+y^2=1,sqrt(x+y)=x-y}; vars:={x,y};:= eqns {}, = + x 2y 21 = + x y ? x y:= vars {},x y> sols:=solve(eqns,vars);sols = y ()RootOf , + + 2_Z 24_Z 3 ? -1.000000000.7071067812I ,{ := = x ? ? ()RootOf , + + 2_Z 24_Z 3 ? -1.000000000.7071067812I 2}{}, = x 1 = y 0,可以看出, ⽅程解的形式是以集合的序列给出的, 序列中的每⼀个集合是⽅程的⼀组解, 这样就很利于我们⽤subs 把解代⼊原⽅程组进⾏检验:> subs(sols[2],eqns);{} = 11> sols2:=allvalues(sols[1]);:= sols2{}, = x ? + 11I 2 = y ? ? 11I 2 > simplify(subs(sols2,eqns));{}, = I 2I 2 = 111.2 其他求解⼯具1.2.1 数值求解对于求代数⽅程的数值解问题, Maple 提供了函数fsolve , fsolve 的使⽤⽅法和solve 很相似:fsolve(eqns, vars, options);其中, eqns 表⽰⼀个⽅程、⽅程组或者⼀个程序, vars 表⽰⼀个未知量或者未知量集合, options 控制解的参数(诸如:complex:复根; maxsols=n :只找到n 阶最⼩根; intervals :在给定闭区间内求根, 等).> fsolve(x^5-x+1,x);-1.167303978> fsolve(x^5-x+1,x,complex);-1.167303978 ? -.1812324445 1.083954101I + -.1812324445 1.083954101I ? .7648844336.3524715460I ,,, +.7648844336.3524715460I ,> fsolve(x^3-3*x+1,x,0..1);.3472963553对于多项式⽅程, fsolve 在默认情况下以给出所有的实数解, 如果附加参数complex , 就可以给出所有的解. 但对于更⼀般的其他形式的⽅程, fsolve 却往往只满⾜于得到⼀个解:> eqn:=sin(x)=x/2;:= eqn = ()sin x 12x > fsolve(eqn);0.> fsolve(eqn,x,0.1..infinity);1.895494267> fsolve(eqn,x,-infinity..-0.1);-1.895494267函数fsolve 主要基于两个算法, 通常使⽤⽜顿法, 如果⽜顿法⽆效, 它就改⽽使⽤切线法. 为了使fsolve 可以求得所有的实根, 我们通常需要确定这些根所在的区间. 对于单变量多项式, 函数realroot 可以获得多项式的所有实根所在的区间.> 4+6*x+x^2-x^3-4*x^5-2*x^6+x^7;+ + ? ? ? + 46x x 2x 34x 52x 6x 7> realroot(%);[],,[],02[],24[],-2-1函数realroot 还有⼀个可选参数, 它是⽤来限制区间的最⼤长度的, 为了保证使⽤数值求解⽅法时收敛, 我们可以⽤它限制区间的最⼤长度:> realroot(%%,1/1000);,,,1195299,33131657,-633-1265 求解⽅程或⽅程组的整数解时使⽤函数isolve , 它常常被⽤来求解不定⽅程. 例如著名的“百钱买百鸡”问题?的求解过程为:> isolve({x+y+z=100,5*x+3*y+z/3=100});{},, = z + 753_Z1 = x 4_Z1 = y ? 257_Z1据此可得满⾜该问题的三组解为:{x, y, z}={4, 18, 78}, {x, y, z}={8, 11, 81}, {x, y, z}={12, 4, 84}1.2.2 整数环中的⽅程(组)求解利⽤Maple 中的函数msolve(eqns, vars, n), 可以在模n 的整数环中求解⽅程(组)eqns.例:在Z 7中求解Pell ⽅程2837?=x y > msolve(y^7=x^3-28,7);{}, = x 3 = y 6{}, = x 4 = y 1{}, = y 0 = x 0{}, = x 1 = y 1{}, = y 6 = x 6,,,,,{}, = x 2 = y 1{}, = y 6 = x 5, 再如下例:> msolve(y^4=x^3+32,5);,,,,{}, = x 2 = y 0{}, = x 4 = y 1{}, = x 4 = y 2{}, = x 4 = y 3{}, = x 4 = y 41.2.3 递归⽅程的求解在Maple 中, 可以求解有限差分⽅程(也称递归⽅程), 所需调⽤的函数是rsolve , 该函数使⽤的是⼀些⽐较通⽤的⽅法, 例如产⽣函数法、z 变换法以及⼀些基于变量替换和特征⽅程的⽅法. 作为例⼦, 求解Fibonacci 多项式:> eq:=f(n)=f(n-1)+2*f(n-2);:= eq = ()f n + ()f ? n 12()f ? n 2> rsolve({eq,f(0)=1,f(1)=1},f(n)); + 13()-1n 232n 当然, 并不是所有的递归形式的函数⽅程的解可以写成解析形式, 如果不能, Maple 将保留原来的调⽤形式. 此时, 可⽤asympt 函数获得它的渐进表达式, 也就是1/n 的级数解. 例如, 对于⼀个具有超越形式的递归函数⽅程, 仍然可以得到解的渐进形式: ? 百钱买百鸡问题:⽤100元钱买100只鸡, ⼤公鸡5元钱1只, ⼤母鸡3元钱1只, ⼩鸡1元钱3只, 问如何买法?> rsolve(u(n+1)=ln(u(n)+1),u(n));()rsolve , = ()u + n 1()ln + ()u n 1()u n> asympt(%,n,5);+ + + 21n + _C 23()ln n n 2 ? + ? + 1913_C 12_C 2 + 23_C 29()ln n 29()ln n 2n 3????????O 1n 41.2.4 不等式(组)求解求解⼀元不等式⽅程(组)使⽤命令solve :> solve((x-1)*(x-2)*(x-3)<0,x);,()RealRange ,?∞()Open 1()RealRange ,()Open 2()Open 3> solve((x-1+a)*(x-2+a)*(x-3+a) < 0, {x});,{} < x ? 1a {}, < ? 2a x < x ? 3a> solve(exp(x)>x+1);,()RealRange ,?∞()Open 0()RealRange ,()Open 0∞> solve({x^2*y^2=0,x-y=1,x<>0});,{}, = y 0 = x 1{}, = y 0 = x 1对于由不等式⽅程组约束的最优问题的求解使⽤“线性规则”⼯具包simplex : > with(simplex):> cnsts:={3*x+4*y-3*z<=23, 5*x-4*y-3*z<=10,7*x+4*y+11*z<=30};:= cnsts {,, ≤ } + ? 3x 4y 3z 23 ≤ ? ? 5x 4y 3z 10 ≤ + + 7x 4y 11z 30 > obj:=-x+y+2*z;:= obj ? + + x y 2z> maximize(obj,cnsts union {x>=0,y>=0,z>=0});{},, = z 12 = y 498= x 0 2 常微分⽅程求解微分⽅程求解是数学研究与应⽤的⼀个重点和难点. Maple 能够显式或隐式地解析地求解许多微分⽅程求解. 在常微分⽅程求解器dsolve 中使⽤了⼀些传统的技术例如laplace 变换和积分因⼦法等, 函数pdesolve 则使⽤诸如特征根法等经典⽅法求解偏微分⽅程. 此外, Maple 还提供了可作摄动解的所有⼯具, 例如Poincare-Lindstedt 法和⾼阶多重尺度法.帮助处理常微分⽅程(组)的各类函数存于Detools 软件包中, 函数种类主要有:可视化类的函数, 处理宠加莱动态系统的函数, 调整微分⽅程的函数, 处理积分因⼦、李对称法和常微分⽅程分类的函数, 微分算⼦的函数, 利⽤可积性与微分消去的⽅法简化微分⽅程的函数, 以及构造封闭解的函数等. 更重要的是其提供的强⼤的图形绘制命令Deplot 能够帮助我们解决⼀些较为复杂的问题.2.1 常微分⽅程的解析解求解常微分⽅程最简单的⽅法是利⽤求解函数dsolve . 命令格式为:dsolve(ODE);dsolve(ODE, y(x), extra_args);dsolve({ODE, ICs}, y(x), extra_args);dsolve({sysODE, ICs}, {funcs}, extra_args);其中, ODE—常微分⽅程, y(x)—单变量的任意变量函数, Ics—初始条件, {sysODE}—ODE ⽅程组的集合, {funcs}—变量函数的集合, extra_args—依赖于要求解的问题类型.例如, 对于⼀阶常微分⽅程y xy y y x ?=′)ln(可⽤dsolve 直接求得解析解: > ODE:=x*diff(y(x),x)=y(x)*ln(x*y(x))-y(x);:= ODE = xx ()y x ? ()y x ()ln x ()y x ()y x > dsolve(ODE,y(x));= ()y x ex可以看出, dsolve 的第⼀个参数是待求的微分⽅程, 第⼆个参数是未知函数. 需要注意的是, ⽆论在⽅程中还是作为第⼆个参数,未知函数必须⽤函数的形式给出(即:必须加括号, 并在其中明确⾃变量), 这⼀规定是必须的, 否则Maple 将⽆法区分⽅程中的函数、⾃变量和参变量, 这⼀点和我们平时的书写习惯不⼀致. 为了使其与我们的习惯⼀致, 可⽤alias 将函数⽤别称表⽰:> alias(y=y(x));> ODE:=x*diff(y,x)=y*ln(x*y)-y;:= ODE = xx y ? y ()ln x y y > dsolve(ODE,y);= y ex _C1x函数dsolve 给出的是微分⽅程的通解, 其中的任意常数是⽤下划线起始的内部变量表⽰的.在Maple 中, 微分⽅程的解是很容易验证的, 只需要将解代⼊到原⽅程并化简就可以了.> subs(%,ODE);= xx e ??x _C1x ? e ??x _C1??ln e ??x _C1x e ??x_C1x > assume(x,real): assume(_C1,real):> simplify(%); = ?e x~_C1~()? + x~_C1~x~_C1~?e x~_C1~()? + x~_C1~x~_C1~> evalb(%);trueevalb 函数的⽬的是对⼀个包含关系型运算符的表达式使⽤三值逻辑系统求值, 返回的值是true, false 和FAIL. 如果⽆法求值, 则返回⼀个未求值的表达式. 通常包含关系型运算符“=, <>, <, <=, >, >=”的表达式在Maple 中看作是代数⽅程或者不等式. 然⽽, 作为参数传递给evalb 或者出现在if 或while 语句的逻辑表达式中时, 它们会被求值为true 或false. 值得注意的是, evalb 不化简表达式, 因此在使⽤evalb 之前应将表达式化简, 否则可能会出错. 再看下⾯常微分⽅程的求解:12+=′y y> alias(y=y(x)):> ODE:=diff(y,x)=sqrt(y^2+1);:=ODE = ??xy + y 21 > dsolve(ODE,y); = y ()sinh + x _C1函数dsolve 对于求解含有未知参变量的常微分⽅程也完全可以胜任:> alias(y=y(x)):> ODE:=diff(y,x)=-y/sqrt(a^2-y^2);:=ODE = ?y ?y ? a 2y 2> sol:=dsolve(ODE,y); := sol = + ? + x ? a 2y 2a 2ln + 2a 22a 2a 2y 2y a 2_C10由此可见, 对于不能表⽰成显式结果的微分⽅程解, Maple 尽可能将结果表⽰成隐式解. 另外, 对于平凡解y=0常常忽略, 这⼀点应该引起注意.dsolve 对于求解微分⽅程初值问题也⼗分⽅便的:> ODE:=diff(u(t),t$2)+omega^2*u(t)=0;:= ODE = +2t 2()u t ω2()u t 0 > dsolve({ODE,u(0)=u0,D(u)(0)=v0},u(t)); = ()u t + v0()sin ωt ωu0()cos ωt 2.2 利⽤积分变换求解微分⽅程对于特殊的微分⽅程, 我们还可以指定dsolve 利⽤积分变换⽅法求解, 只需要在dsolve 中加⼊可选参数method=transform 即可.其中transform 是积分变换, 可以是laplace 、fourier 、fouriercos 或者fouriersin 变换.作为例⼦, 我们来看⼀个具有阻尼的振⼦在阶跃冲击(Heaviside 函数)下的响应: >ODE:=diff(u(t),t$2)+2*d*omega*diff(u(t),t)+omega^2*u(t)=Heaviside(t);:= ODE = + + 2t 2()u t 2d ωt ()u t ω2()u t ()Heaviside t > initvals:=(u(0)=u[0],D(u)(0)=v[0]);:= initvals , = ()u 0u 0 = ()()D u 0v 0> solution:=dsolve({ODE,initvals},u(t),method=laplace);:= solution = ()u t + 1ωe ()?t d ω + () ? ω2u 01()cosh t ? d 2ω2ω2ω() + ? ωv 0d ω2u 0d ()sinh t ? d 2ω2ω2 ? d 2ω2ω2ωMaple 给出了问题的通解, 但没有区分⾃由振动(d=0)、⽋阻尼(01)的情况. 下⾯加以区分求解:> assume(omega>0):> simplify(subs(d=0,solution));= ()u t + ? + 1()cos t ωω2u 0()cos t ωv 0()sin t ωωω2> K:=subs(d=1/5,u[0]=1,v[0]=1,solution);:= K = ()u t + 1ωe ()?/15t ω + () ? ω21cosh t ?2425ω2ω + ? ω15ω215 sinh t ?2425ω2?2425ω2> with(plots):> plot3d(rhs(%%),omega=2/3..4/3,t=0..20,style=hidden,orientation=[-30,45],axes=framed);对于d=1的情况, 可可⽤下式获得结果:> limit(rhs(solution),d=1);() + ? + ? + ω2u 0ω2v 0t 1ω3u 0t t ωe()t ωe ()?t ωω2再如下例:> diff(u(t),t$2)+3*diff(u(t),t)+2*u(t)=exp(-abs(t));= + +2t 2()u t 3?()u t 2()u t e ()?t > dsolve(%,u(t),method=fourier);= ()u t + + ? 23e ()?2t ()Heaviside t 16e t ()Heaviside ?t e ()?t t ()Heaviside t 12e ()?t ()Heaviside t2.3 常微分⽅程组的求解函数dsolve 不仅可以⽤来求解单个常微分⽅程, 也可以求解联⽴的常微分⽅程组. 特别是对于线性微分⽅程组, 由于数学上具有成熟的理论, Maple 的求解也是得⼼应⼿. 其命令格式为:dsolve( {eqn1, eqn2, …, ini_conds}, {vars});其中, ini_conds 是初始条件.> eqn1:={diff(x(t),t)=x(t)+y(t),diff(y(t),t)=y(t)-x(t)};:= eqn1{, = }??t ()x t + ()x t ()y t = ??t()y t ? ()y t ()x t > dsolve(eqn1,{x(t),y(t)});{, = ()x t e }t () + _C1()sin t _C2()cos t = ()y t e t () ? _C1()cos t _C2()sin t >eqn2:=2*diff(x(t),t$2)+2*x(t)+y(t)=2*t;:= eqn2 = + + 22t 2()x t 2()x t ()y t 2t > eqn3:=diff(y(t),t$2)+2*x(t)+y(t)=t^2+1;:= eqn3 = + +2t 2()y t 2()x t ()y t + t 21 > dsolve({eqn2, qn3, x(0)=0, D(x)(0)=1, y(0)=0, D(y)(0)=0}, {x(t),y(t)} ); = ()x t + ? + 18()sin 2t 2112t 3148t 434t ,{ = ()y t ? + ? + 14()sin 2t 212t 12t 216t 3124t 4} 2.4 常微分⽅程的级数解法1) 泰勒级数解法当⼀个常微分⽅程的解析解难以求得时, 可以⽤Maple 求得⽅程解的级数近似, 这在⼤多数情况下是⼀种⾮常好的⽅法. 级数解法是⼀种半解析半数值的⽅法. 泰勒级数法的使⽤命令为:dsolve({ODE,Ics}, y(x), 'series'); 或dsolve({ODE,Ics}, y(x), 'type=series');下⾯求解物理摆的⼤幅振动⽅程:θθsin g l ?=, 其中l 是摆长,θ是摆⾓, g 是重⼒加速度.> ODE:=l*diff(theta(t),t$2)=-g*sin(theta(t)); := ODE = l2t 2()θt ?g ()sin ()θt > initvals:=theta(0)=0,D(theta)(0)=v[0]/l; := initvals , = ()θ00 = ()()D θ0v 0l> sol:=dsolve({ODE,initvals},theta(t),type=series);:= sol = ()θt ? + + v 0l t 16g v 0l 2t 31120g v 0() + v 02g l l4t 5()O t 6 > Order:=11:> sol:=dsolve({ODE,initvals},theta(t),type=series); := sol = ()θt ? + ? + + v 0t 1g v 0l 2t 31g v 0() + v 02g l l 4t 51g v 0() + + 11g l v 02g 2l 2v 04l 6t 71g v 0() + + + 57g v 04l 102g 2v 02l 2g 3l 3v 06l 8t9()O t 112) 幂级数解法对于⼀个符号代数系统来说, 幂级数是必不可少的微分⽅程求解⼯具. 幂级数求解函数powsolve 存于⼯具包powseries 中. 但是, 这⼀求解函数的使⽤范围很有限, 它只可以⽤来求解多项式系数的线性常微分⽅程或⽅程组,其求解命令为:powseries[function] (prep)或直接载⼊软件包后⽤function(prep), prep 为求解的线性微分⽅程及其初值.例:求解:042=+′′+′y x y y x > ODE:=x*diff(y(x),x$2)+diff(y(x),x)+4*x^2*y(x)=0;:= ODE = + + x2x 2()y x ??x ()y x 4x 2()y x 0 > dsolve(ODE,y(x));= ()y x + _C1BesselJ ,043x ()/32_C2??????BesselY ,043x ()/32 > initvals:=y(0)=y0,D(y)(0)=0;:= initvals , = ()y 0y0 = ()()D y 00> with(powseries):> sol:=powsolve({ODE,initvals});:= sol proc ()... end proc powparm> tpsform(sol,x,16);+ + + y049y0x 3481y0x 6166561y0x 9459049y0x 121613286025y0x 15()O x 16 也可以⽤powsolve 给出的函数直接获得⽤递归形式定义的幂级数系数, 不过参数必须⽤_k , 这是powsolve 使⽤的临时变量.> sol(_k);4()a _k 3_k2 例:求解⼀维谐振⼦的解:0)(2=?+′′y x y ε> alias(y=y(x)):> ODE:=diff(y,x$2)+(epsilon-x^2)*y=0;:= ODE = +2x 2y () ? εx 2y 0 > H:=powsolve(ODE);:= H proc ()... end proc powparm> tpsform(H,x,8);C0C1x 12εC0x 216εC1x 3 + 124ε2C0112C0x 4+ 1120ε2C1120C1x 5????????? ? 130ε + 124ε2C0112C0160εC0 + ? ? + + + x 6????????? ? 1ε + 1ε2C11C11εC1x 7()O x 8 + +> H(_k);ε()a ? _k 2(a ) ? _k 4_k ()_k 1 2.5 常微分⽅程的数值解法在对微分⽅程的解析解失效后, 可以求助于数值⽅法求解微分⽅程. 数值求解的好处是只要微分⽅程的条件⾜够多时⼀般都可求得结果, 然⽽所得结果是否正确则必须依赖相关数学基础加以判断. 调⽤函数dsolve 求常微分⽅程初值问题的数值解时需加⼊参数type=numeric .另⼀⽅⾯, 常微分⽅程初值问题数值求解还可以选择算法, 加⼊参数“method=⽅法参数”即可, ⽅法参数主要有:rkf45:4~5阶变步长Runge-Kutta-Fehlberg 法dverk78:7~8阶变步长Runge-Kutta-Fehlberg 法classical :经典⽅法, 包括向前欧拉法, 改进欧拉法, 2、3、4阶龙格库塔法,Sdams-Bashford ⽅法等gear :吉尔单步法mgear :吉尔多步法2.5.1变步长龙格库塔法下⾯⽤4~5阶Runge-Kutta-Fehlberg 法求解van der Pol ⽅程:=′==+′??′′1.0)0(,0)0(0)1(2y y y y y y > ODE:=diff(y(t),t$2)-(1-y(t)^2)*diff(y(t),t)+y(t)=0;:= ODE = ? + 2t 2()y t () ? 1()y t 2t ()y t ()y t 0> initvals:=y(0)=0,D(y)(0)=-0.1;:= initvals , = ()y 00 = ()()D y 0-.1> F:=dsolve({ODE,initvals},y(t),type=numeric);:= F proc ()... end proc rkf45_x此时, 函数返回的是⼀个函数, 可以在给定的数值点上对它求值:> F(0);,, = t 0. = ()y t 0. = t ()y t -.1 > F(1);,, = t 1. = ()y t -.144768589749425608 = ??t ()y t -.178104066128215944 可以看到, F 给出的是⼀个包括t 、y(t)、D(y)(t)在内的有序表, 它对于每⼀个时间点可以给出⼀组数值表达式. 有序表的每⼀项是⼀个等式, 可对其作图描述. >plot('rhs(F(t)[2])', t=0..15, title="solution of the Van de Pol's Equation");> plots[odeplot](F,[t,y(t)],0..15,title="solution of the Van de Pol's Equation");2.5.2吉尔法求解刚性⽅程在科学和⼯程计算中, 常常会遇到这样⼀类常微分⽅程问题, 它可以表⽰成⽅程组:00)(),,(y t y y t f y ==′, 称其为刚性⽅程, 其解的分量数量相差很⼤, 分量的变化速度也相差很⼤. 如果⽤常规⽅法求解, 为了使变量有⾜够⾼的精度, 必须取很⼩的步长, ⽽为了使慢变分量达到近似的稳态解, 则需要很长的时间, 这样⽤⼩步长⼤时间跨度的计算, 必定造成庞⼤的计算量, ⽽且会使误差不断积累. 吉尔法是专门⽤来求解刚性⽅程的⼀种数值⽅法.> ODE:=diff(u(t),t)=-2000*u(t)+999.75*v(t)+1000.25,diff(v(t),t)=u(t)-v(t);:=ODE , = ??t ()u t ? + + 2000()u t 999.75()v t 1000.25 = ??t()v t ? ()u t ()v t > initvals:=u(0)=0,v(0)=-2; := initvals , = ()u 00 = ()v 0-2> ansl:=dsolve({ODE,initvals},{u(t),v(t)},type=numeric,method=gear);:= ansl proc ()... end proc x_gear> ansl(10,0);[,, = t 10.] = ()u t .989893921726687442 = ()v t .979787842765888594 > p1:=plots[odeplot] (ansl,[t,u(t)],0..20,color=red):p2:=plots[odeplot] (ansl,[t,v(t)],0..20,color=blue):plots[display] ({p1,p2}, title="Solution of a stiff equation");2.5.3 经典数值⽅法Maple中常微分⽅程数值解法中有⼀类被称作是“经典”(classical)⽅法. 当然, 称其为经典⽅法不是因为它们常⽤或是精度⾼, ⽽是因为它们的形式简单, 经常被⽤于计算⽅法课上的教学内容. 它们是⼀些常见的固定步长⽅法, 在dsolve中⽤参数method=classical[⽅法名称], 如果不特别指出, 将默认采⽤向前欧拉法. 主要有:foreuler:向前欧拉法(默认)hunform:Heun公式法(梯形⽅法, 改进欧拉法)imply:改进多项式法rk2:⼆阶龙格库塔法rk3:三阶龙格库塔法rk4:四阶龙格库塔法adambash:Adams-Bashford⽅法(预测法)abmoulton:Adams-Bashford-Moulton⽅法(预测法)下⾯给出微分⽅程数值⽅法的参数表:参数名参数类型参数⽤途参数⽤法initial 浮点数的⼀维数组指定初值向量number 正整数指定向量个数output 'procedurelist'(默认)或'listprocedure'指定⽣成单个函数或多个函数的有序表Procedurelis:单个函数, 返回有序表Listprocedure:函数的有序表procedure ⼦程序名⽤⼦程序形式指定第⼀尖常微分⽅程组的右边部分参数1:未知函数的个数参数2:⾃变量参数3:函数向量参数4:导函数向量start 浮点数⾃变量起始值startinit 布尔量(默认FALSE) 指定数值积分是否总是从起始值开始对dverk78不适⽤value 浮点数向量(⼀维数组) 指定需要输出函数值的⾃变量数值点如果给定, 结果是⼀个22×的矩阵. 元素[1,1]是⼀个向量, 含⾃变量名和函数名称; 元素[2,1]是⼀个数值矩阵, 其中第⼀列value的输⼊相同, 其他列中是相应的函数值另外, 还有⼀些特殊的附加参数:maxfun :整数类型, ⽤于最⼤的函数值数量, 默认值50000, 为负数时表⽰⽆限制 corrections :正整数类型, 指定每步修正值数量, 在abmoulton 中使⽤, 建议值≤4 stepsize :浮点数值, 指定步长下⾯看⼀个简单的例⼦:> ODE:=diff(y(x),x)=y(x)-2*x/y(x);:=ODE = ?()y x ? ()y x 2x > initvals:=y(0)=1;:= initvals = ()y 01> sol1:=dsolve({ODE,initvals},y(x),numeric,method=classical,stepsize=0.1,start=0);:= sol1proc ()... end proc x_classical⽽其解析解为:> sol2:=dsolve({diff(y(x),x)=y(x)-2*x/y(x), y(0)=1}, y(x));:= sol2 = ()y x + 2x 1将两者图形同时绘制在同⼀坐标系中⽐较, 可以发现, 在经过⼀段时间后, 欧拉法的数值结果会产⽣较⼤误差.> plot({rhs(sol2),'rhs(sol1(x)[2])'},x=0..2);求解微⽅程, ⽆论使⽤什么⽅法或者加⼊什么选项, 求解完成后必须利⽤相关数学知识进⾏逻辑判断, 绝对不对简单迷信Maple 给出的结果, 否则很有可能得到⼀个对于⽅程本⾝也许还看得过去, 但在数学或者物理意义上不合理的解.2.6摄动法求解常微分⽅程由于微分⽅程求解的复杂性, ⼀般微分⽅程常常不能求得精确解析解, 需要借助其它⽅法求得近似解或数值解, 或者两种⽅法兼⽽有之. 摄动法是重要的近似求解⽅法.摄动法⼜称⼩参数法, 它处理含⼩参数ε的系统, ⼀般当ε=0时可求得解x 0. 于是可把原系统的解展成ε的幂级数, 若这个级数当L +++=2210εεx x x x ε→0时⼀致收敛,则称正则摄动, 否则称奇异摄动. 摄动法的种类繁多, 最有代表性的是庞加莱—林斯泰特(Poicare-Lindstedt )法, 在此,我们以该⽅法求解van der Pol ⽅程:0)1(2=+′??′′y y y y ε当ε=0时该⽅程退化为数学单摆的常微分⽅程, 当ε=1时为3.5讨论的情况, 对任意ε, 该微分⽅程拥有⼀个渐进稳定的周期解, 称为极限环.由于van der Pol ⽅程中没有显式的时间依赖项, 不失⼀般性, 设初值为y(0)=0. 在庞加莱—林斯泰特法中, 时间通过变换拉伸:t ωτ=, 其中∑∞==0i i i εωω对于)(τy , van der Pol ⽅程变为:0)1(22=+′??′′y y y y ωεωrestart:diff(y(t),t$2)-epsilon*(1-y(t)^2)*diff(y(t),t)+y(t)=0;= ? +2t 2()y t ε() ? 1()y t 2()y t ()y t 0 > ODE:=DEtools[Dchangevar]({t=tau/omega,y(t)=y(tau)},%,t,tau);:= ODE = ? + ω22τ2()y τε() ? 1()y τ2ωτ()y τ()y τ0 > e_order:=6:> macro(e=epsilon,t=tau):> alias(seq(y[i]=eta[i](tau),i=0..e_order)):> e:=()->e:> for i from 0 to e_order doeta[i]:=t->eta[i](t)od:> omega:=1+sum('w[i]*e^i','i'=1..e_order);:= ω + + + + + + 1w 1εw 2ε2w 3ε3w 4ε4w 5ε5w 6ε6> y:=sum('eta[i]*e^i','i'=0..e_order);:= y + + + + + + η0η1εη2ε2η3ε3η4ε4η5ε5η6ε6> deqn:=simplify(collect(ODE,e),{e^(e_order+1)=0}):> for i from 0 to e_order doode[i]:=coeff(lhs(deqn),e,i)=0od:> ode[0];= + y 02τ2y 00> ode[1];= ? + + + 2τ2y 1τy 0y 12w 12τ2y 0??τy 0y 020 > ode[2];= + ? + + + ? + + + τy 0w 1y 022τy 0y 0y 1τy 12τy 2y 2τy 1y 02τy 0w 12w 12τy 122τy 0w 22τy 0w 120 > dsolve({ode[0],eta[0] (0)=0,D(eta[0])(0)=C[1]},eta[0](t));= y 0C 1()sin τ> eta[0]:=unapply(rhs(%),t);:= η0 →τC 1()sin τ> ode[1];= ? + ? +2τ2y 1C 1()cos τy 12w 1C 1()sin τC 13()cos τ()sin τ20 > map(combine,ode[1],'trig');= ? + ? + ? ??????2τ2y 1C 1()cos τy 12w 1C 1()sin τ14C 13()cos τ14C 13()cos 3τ0 > ode[1]:=map(collect,%,[sin(t),cos(t)]);:= ode 1 = ? + + + ? 2w 1C 1()sin τ + C 11C 13()cos τ2τ2y 1y 11C 13()cos 3τ0 > dsolve({ode[1],eta[1](0)=0,D(eta[1])(0)=C[2]},eta[1](t),method=laplace);= y 1 + ? ????????? + + 18C 1() ? C 12() + C 12τw 1C 1C 2()sin τ? 132C 13C 1τw 1()cos τ132C 13()cos 3τ > map(collect,%,[sin(t),cos(t),t]);= y 1 + ? ????????? + + 18C 1() ? C 12() + C 12τw 1C 1C 2()sin τ? 132C 13C 1τw 1()cos τ132C 13()cos 3τ> solve({coeff(lhs(ode[1]),sin(t))=0,coeff(lhs(ode[1]),cos(t))=0});,,{}, = C 10 = w 1w 1{}, = C 12 = w 10{}, = C 1-2 = w 10> w[1]:=0:C[1]:=-2:> ode[1];= + +2τ2y 1y 12()cos 3τ0 > dsolve({ode[1],eta[1](0)=0,D(eta[1])(0)=C[2]},eta[1](t),method=laplace);= y 1 ? + 14()cos 3τ14()cos τC 2()sin τ > eta[1]:=unapply(rhs(%),tau);:= η1 →τ ? + 14()cos 3τ14()cos τC 2()sin τ > map(combine,ode[2],'trig'):> ode[2]:=map(collect,%,[sin(t),sin(3*t),cos(t),cos(3*t)]);:= ode 2 = + + ? + ? + + 144w 2()sin τ54()sin 5τ2τ2y 232()sin 3τ2C 2()cos τ3C 2()cos 3τy 20 > solve({coeff(lhs(ode[2]),sin(t))=0,coeff(lhs(ode[2]),cos(t))=0}); {}, = C 20 = w 2-116> assign(%):> dsolve({ode[2],eta[2](0)=0,D(eta[2])(0)=C[3]},eta[2](t),method=laplace):> eta[2]:=unapply(rhs(%),t);:= η2 →τ? + + 316()sin 3τ+ 2996C 3()sin τ596()sin 5τ > for i from 0 to e_order domap(combine,ode[i],'trig'):ode[i]:=map(collect,%,[seq(sin((2*j+1)*t),j=0..i),seq(cos((2*j+1)*t),j=0..i)]):solve({coeff(lhs(ode[i]),sin(t))=0,coeff(lhs(ode[i]),cos(t))=0}):assign(%):dsolve({ode[i],eta[i](0)=0,D(eta[i])(0)=C[i+1]},eta[i](t),method=laplace):collect(%,[seq(sin((2*j+1)*t),j=0..i),seq(cos((2*j+1)*t),j=0..i)]):eta[i]:=unapply(rhs(%),t);od:> omega;+ + 11ε217ε435ε6。
最新第四章Maple简介

第四章Maple简介
4. 求解线性方程组
• RowSpace(A)给出矩阵A的行空间的一个基 • ColumnSpace(A)给出矩阵A的列空间的一
个基 • NullSpace(A)计算以A为系数矩阵的齐次方
中选择的u
第四章Maple简介
4. 级数
• Sum(f, k= m..n)求和式
n
f (k )
k m
• Product(f, k= m..n)连乘式 n
f (k)
k m
• series(expr, x=a, n) 求出表达式expr在a点 次数至n的幂级数展开式
• convert(series,polynom) 去除幂级数的余 项而留下多项式
做一系列变换使得expr具有最简形式 • collect(expr, x)
给出expr按照x方幂展开的形式
第四章Maple简介
2. 有理化分母和部分分式
• rationalize(expr) 有理化根式分式的分母 • convert(f, parfrac, x) 将f按x化为部分分式 • convert(f, parfrac, x, K)
– % 指上一步的运算结果 – %% %(n个%)指前倒数第n步的运算结果
第四章Maple简介
2. Maple的自定义函数
• sqrt(x) 平方根函数 • exp(x), ln(x) 指数函数和自然对数函数 • log[b](x) 以b为底的对数函数 • Abs(x) 绝对值函数 • round(x) 最接近x的整数rand ()12位的随机数 • Max(a,b,c, ),min(a,b,c, ) a, b, c, 中的最
MAPLE软件简介及其应用

Maple有非常强大、完善的在线帮助功 能。Maple可通过Introduction, Topic Search 和键盘命令等方式寻求帮助。
例如,?interp; ?dsolve;
1.8 Maple 的函数库 Maple有数以千计的函数,这些函数被 分成四大类: 标准库、混合库、专用软件包 和共享软件包。
Maple 有几十个专用软件包,分别处 理不同数学分支问题。
专用软件包在使用时要用命令with(软 件包名)调入。
4. 共享库
共享库是由 Maple 爱好者开发的软件 包。这些程序用户可上网搜寻。
第二章 Maple语言基础
Maple 是一个可编程的数学环境。本 章介绍 Maple 的符号集、语句、表达式、 基本数据类型以及基本的程序语言。 2.1 标识符与变量名
Maple可进行无误差的符号计算和高精 度的数值计算。例如, 100!, Pi, sqrt(2), sin(3)。
1.4 Maple 的图形显示
1. 一般函数做图
plot(f(x),x=a..b,option); plot3d(f(x,y),x=a..b,y=c..d,option);
2. 极坐标做图
所有分支。 Maple支持函数、序列、集合、列表、 数组、表等多种数据结构。 用户可以查看 Maple的非内部函数的源程序,也可以将自 己编和函数、过程添加到Maple的函数库中 或建立自己的函数库。 Maple 的一个突出 特点是它的界面非常友好。它有一个非常 好的帮助系统,可以很方便地查找函数和 命令的用法。
od;
3. 布尔表达式和逻辑运算
Maple中的关系运算符为<,<=,>,>=,=, <>;逻辑运算符为and, or, not。 “表达式 关系运算符 表达式”称为关 系式,其值为true或false。
第4章-方程求解(Maple 中文教程)

第四章 方程求解1 代数方程(组)求解1.1 常用求解工具—solve求解代数方程或代数方程组, 使用Maple 中的solve 函数. 求解关于x 的方程eqn=0的命令格式为:solve(eqn, x);求解关于变量组vars 的方程组eqns 的命令为:solve(eqns, vars);> eqn:=(x^2+x+2)*(x-1);:= eqn () + + x 2x 2() − x 1> solve(eqn,x);,,1− + 1212I 7− − 1212I 7 当然, solve 也可以求解含有未知参数的方程:> eqn:=2*x^2-5*a*x=1;:= eqn = − 2x 25a x 1 > solve(eqn,x);, + 54a 14 + 25a 28 − 54a 14 + 25a 28 solve 函数的第一个参数是有待求解的方程或方程的集合, 当然也可以是单个表达式或者表达式的集合, 如下例:> solve(a+ln(x-3)-ln(x),x);3e a− + 1ea 对于第二个参数, Maple 的标准形式是未知变量或者变量集合, 当其被省略时, 函数indets 自动获取未知变量. 但当方程中含有参数时, 则会出现一些意想不到的情况: > solve(a+ln(x-3)-ln(x));{}, = x x = a − + ()ln − x 3()ln x很多情况下, 我们知道一类方程或方程组有解, 但却没有解决这类方程的一般解法, 或者说没有解析解. 比如, 一般的五次或五次以上的多项式, 其解不能写成解析表达式. Maple 具备用所有一般算法尝试所遇到的问题, 在找不到解的时候, Maple 会用RootOf 给出形式解.> x^7-2*x^6-4*x^5-x^3+x^2+6*x+4;− − − + + + x 72x 64x 5x 3x 26x 4> solve(%); + 15 − 15()RootOf , − − _Z 5_Z 1 = index 1()RootOf , − − _Z 5_Z 1 = index 2(RootOf ,) − − _Z 5_Z 1 = index 3,,,,()RootOf , − − _Z 5_Z 1 = index 4()RootOf , − − _Z 5_Z 1 = index 5,,> solve(cos(x)=x,x);()RootOf − _Z ()cos _Z对于方程组解的个数可用nops 命令获得, 如:> eqns:={seq(x[i]^2=x[i],i=1..7)};:= eqns {,,,,,, = x 12x 1 = x 22x 2 = x 32x 3 = x 42x 4 = x 52x 5 = x 62x 6 = x 72x 7} > nops({solve(eqns)});128但是, 有时候, Maple 甚至对一些“显而易见”的结果置之不理, 如:> solve(sin(x)=3*x/Pi,x);()RootOf − 3_Z ()sin _Z π此方程的解为0 ,6π±, 但Maple 却对这个超越方程无能为力, 即便使用allvalues求解也只有下述结果:> allvalues(%);()RootOf , − 3_Z ()sin _Z π0.另外一个问题是, Maple 在求解方程之前,会对所有的方程或表达式进行化简, 而不管表达式的类型, 由此而产生一些低级的错误: > (x-1)^2/(x^2-1);() − x 12− x 21> solve(%);1但是, 大量实验表明, solve 的确是一个实用的方程求解工具, 但是也不可盲目相信它给出的一切结果, 特别是对于非线性方程而言, 对于给出的结果需要加以验证.下面通过几个例子说明在Maple 中非线性方程组的求解问题.例:求解方程组: ⎩⎨⎧=−=+y x y x 925222> eqns:={x^2+y^2=25,y=x^2-5};:= eqns {}, = y − x 25 = + x 2y 225> vars:={x,y};:= vars {},x y> solve(eqns,vars);,,,{}, = x 0 = y -5{}, = x 0 = y -5{}, = y 4 = x 3{}, = y 4 = x -3也可用下面的语句一步求出:> solve({x^2+y^2=25,y=x^2-5},{x,y});,,,{}, = x 0 = y -5{}, = x 0 = y -5{}, = y 4 = x 3{}, = y 4 = x -3这个问题非常简单, 但通常遇到的非线性问题却不是这么简单, 例如要求解方程组:y x y x y x −=+=+,122> eqns:={x^2+y^2=1,sqrt(x+y)=x-y}; vars:={x,y};:= eqns {}, = + x 2y 21 = + x y − x y:= vars {},x y> sols:=solve(eqns,vars);sols = y ()RootOf , + + 2_Z 24_Z 3 − -1.000000000.7071067812I ,{ := = x − − ()RootOf , + + 2_Z 24_Z 3 − -1.000000000.7071067812I 2}{}, = x 1 = y 0,可以看出, 方程解的形式是以集合的序列给出的, 序列中的每一个集合是方程的一组解, 这样就很利于我们用subs 把解代入原方程组进行检验:> subs(sols[2],eqns);{} = 11> sols2:=allvalues(sols[1]);:= sols2{}, = x − + 11I 2 = y − − 11I 2 > simplify(subs(sols2,eqns));{}, = I 2I 2 = 111.2 其他求解工具1.2.1 数值求解对于求代数方程的数值解问题, Maple 提供了函数fsolve , fsolve 的使用方法和solve 很相似:fsolve(eqns, vars, options);其中, eqns 表示一个方程、方程组或者一个程序, vars 表示一个未知量或者未知量集合, options 控制解的参数(诸如:complex: 复根; maxsols=n :只找到n 阶最小根; intervals :在给定闭区间内求根, 等).> fsolve(x^5-x+1,x);-1.167303978> fsolve(x^5-x+1,x,complex);-1.167303978 − -.1812324445 1.083954101I + -.1812324445 1.083954101I − .7648844336.3524715460I ,,, + .7648844336.3524715460I ,> fsolve(x^3-3*x+1,x,0..1);.3472963553对于多项式方程, fsolve 在默认情况下以给出所有的实数解, 如果附加参数complex , 就可以给出所有的解. 但对于更一般的其他形式的方程, fsolve 却往往只满足于得到一个解:> eqn:=sin(x)=x/2;:= eqn = ()sin x 12x > fsolve(eqn);0.> fsolve(eqn,x,0.1..infinity);1.895494267> fsolve(eqn,x,-infinity..-0.1);-1.895494267函数fsolve 主要基于两个算法, 通常使用牛顿法, 如果牛顿法无效, 它就改而使用切线法. 为了使fsolve 可以求得所有的实根, 我们通常需要确定这些根所在的区间. 对于单变量多项式, 函数realroot 可以获得多项式的所有实根所在的区间.> 4+6*x+x^2-x^3-4*x^5-2*x^6+x^7;+ + − − − + 46x x 2x 34x 52x 6x 7> realroot(%);[],,[],02[],24[],-2-1函数realroot 还有一个可选参数, 它是用来限制区间的最大长度的, 为了保证使用数值求解方法时收敛, 我们可以用它限制区间的最大长度:> realroot(%%,1/1000);⎡⎣⎢⎢⎤⎦⎥⎥,,⎡⎣⎢⎢⎤⎦⎥⎥,1195299⎡⎣⎢⎢⎤⎦⎥⎥,33131657⎡⎣⎢⎢⎤⎦⎥⎥,-633-1265 求解方程或方程组的整数解时使用函数isolve , 它常常被用来求解不定方程. 例如著名的“百钱买百鸡”问题♣的求解过程为:> isolve({x+y+z=100,5*x+3*y+z/3=100});{},, = z + 753_Z1 = x 4_Z1 = y − 257_Z1据此可得满足该问题的三组解为:{x, y, z}={4, 18, 78}, {x, y, z}={8, 11, 81}, {x, y, z}={12, 4, 84}1.2.2 整数环中的方程(组)求解利用Maple 中的函数msolve(eqns, vars, n), 可以在模n 的整数环中求解方程(组)eqns.例:在Z 7中求解Pell 方程2837−=x y > msolve(y^7=x^3-28,7);{}, = x 3 = y 6{}, = x 4 = y 1{}, = y 0 = x 0{}, = x 1 = y 1{}, = y 6 = x 6,,,,,{}, = x 2 = y 1{}, = y 6 = x 5, 再如下例:> msolve(y^4=x^3+32,5);,,,,{}, = x 2 = y 0{}, = x 4 = y 1{}, = x 4 = y 2{}, = x 4 = y 3{}, = x 4 = y 41.2.3 递归方程的求解在Maple 中, 可以求解有限差分方程(也称递归方程), 所需调用的函数是rsolve , 该函数使用的是一些比较通用的方法, 例如产生函数法、z 变换法以及一些基于变量替换和特征方程的方法. 作为例子, 求解Fibonacci 多项式:> eq:=f(n)=f(n-1)+2*f(n-2);:= eq = ()f n + ()f − n 12()f − n 2> rsolve({eq,f(0)=1,f(1)=1},f(n)); + 13()-1n 232n 当然, 并不是所有的递归形式的函数方程的解可以写成解析形式, 如果不能, Maple 将保留原来的调用形式. 此时, 可用asympt 函数获得它的渐进表达式, 也就是1/n 的级数解. 例如, 对于一个具有超越形式的递归函数方程, 仍然可以得到解的渐进形式: ♣ 百钱买百鸡问题:用100元钱买100只鸡, 大公鸡5元钱1只, 大母鸡3元钱1只, 小鸡1元钱3只, 问如何买法?> rsolve(u(n+1)=ln(u(n)+1),u(n));()rsolve , = ()u + n 1()ln + ()u n 1()u n> asympt(%,n,5);+ + + 21n + _C 23()ln n n 2 − + − + 1913_C 12_C 2⎛⎝⎜⎜⎞⎠⎟⎟− + 23_C 29()ln n 29()ln n 2n 3⎛⎝⎜⎜⎞⎠⎟⎟O 1n 41.2.4 不等式(组)求解求解一元不等式方程(组)使用命令solve :> solve((x-1)*(x-2)*(x-3)<0,x);,()RealRange ,−∞()Open 1()RealRange ,()Open 2()Open 3> solve((x-1+a)*(x-2+a)*(x-3+a) < 0, {x});,{} < x − 1a {}, < − 2a x < x − 3a> solve(exp(x)>x+1);,()RealRange ,−∞()Open 0()RealRange ,()Open 0∞> solve({x^2*y^2=0,x-y=1,x<>0});,{}, = y 0 = x 1{}, = y 0 = x 1对于由不等式方程组约束的最优问题的求解使用“线性规则”工具包simplex : > with(simplex):> cnsts:={3*x+4*y-3*z<=23, 5*x-4*y-3*z<=10,7*x+4*y+11*z<=30};:= cnsts {,, ≤ } + − 3x 4y 3z 23 ≤ − − 5x 4y 3z 10 ≤ + + 7x 4y 11z 30 > obj:=-x+y+2*z;:= obj − + + x y 2z> maximize(obj,cnsts union {x>=0,y>=0,z>=0});{},, = z 12 = y 498= x 0 2 常微分方程求解微分方程求解是数学研究与应用的一个重点和难点. Maple 能够显式或隐式地解析地求解许多微分方程求解. 在常微分方程求解器dsolve 中使用了一些传统的技术例如laplace 变换和积分因子法等, 函数pdesolve 则使用诸如特征根法等经典方法求解偏微分方程. 此外, Maple 还提供了可作摄动解的所有工具, 例如Poincare-Lindstedt 法和高阶多重尺度法.帮助处理常微分方程(组)的各类函数存于Detools 软件包中, 函数种类主要有:可视化类的函数, 处理宠加莱动态系统的函数, 调整微分方程的函数, 处理积分因子、李对称法和常微分方程分类的函数, 微分算子的函数, 利用可积性与微分消去的方法简化微分方程的函数, 以及构造封闭解的函数等. 更重要的是其提供的强大的图形绘制命令Deplot 能够帮助我们解决一些较为复杂的问题.2.1 常微分方程的解析解求解常微分方程最简单的方法是利用求解函数dsolve . 命令格式为:dsolve(ODE);dsolve(ODE, y(x), extra_args);dsolve({ODE, ICs}, y(x), extra_args);dsolve({sysODE, ICs}, {funcs}, extra_args);其中, ODE—常微分方程, y(x)—单变量的任意变量函数, Ics—初始条件, {sysODE}—ODE 方程组的集合, {funcs}—变量函数的集合, extra_args—依赖于要求解的问题类型.例如, 对于一阶常微分方程y xy y y x −=′)ln(可用dsolve 直接求得解析解: > ODE:=x*diff(y(x),x)=y(x)*ln(x*y(x))-y(x);:= ODE = x ⎛⎝⎜⎜⎞⎠⎟⎟∂∂x ()y x − ()y x ()ln x ()y x ()y x > dsolve(ODE,y(x));= ()y x e ⎛⎝⎜⎜⎞⎠⎟⎟x可以看出, dsolve 的第一个参数是待求的微分方程, 第二个参数是未知函数. 需要注意的是, 无论在方程中还是作为第二个参数, 未知函数必须用函数的形式给出(即:必须加括号, 并在其中明确自变量), 这一规定是必须的, 否则Maple 将无法区分方程中的函数、自变量和参变量, 这一点和我们平时的书写习惯不一致. 为了使其与我们的习惯一致, 可用alias 将函数用别称表示:> alias(y=y(x));> ODE:=x*diff(y,x)=y*ln(x*y)-y;:= ODE = x ⎛⎝⎜⎜⎞⎠⎟⎟∂∂x y − y ()ln x y y > dsolve(ODE,y);= y e⎛⎝⎜⎜⎞⎠⎟⎟x _C1x函数dsolve 给出的是微分方程的通解, 其中的任意常数是用下划线起始的内部变量表示的.在Maple 中, 微分方程的解是很容易验证的, 只需要将解代入到原方程并化简就可以了.> subs(%,ODE);= x ⎛⎝⎜⎜⎜⎜⎞⎠⎟⎟⎟⎟∂∂x e ⎛⎝⎜⎜⎞⎠⎟⎟x _C1x − e ⎛⎝⎜⎜⎞⎠⎟⎟x _C1⎛⎝⎜⎜⎞⎠⎟⎟ln e ⎛⎝⎜⎜⎞⎠⎟⎟x _C1x e ⎛⎝⎜⎜⎞⎠⎟⎟x_C1x > assume(x,real): assume(_C1,real):> simplify(%); = −e ⎛⎝⎜⎜⎞⎠⎟⎟x~_C1~()− + x~_C1~x~_C1~−e ⎛⎝⎜⎜⎞⎠⎟⎟x~_C1~()− + x~_C1~x~_C1~> evalb(%);trueevalb 函数的目的是对一个包含关系型运算符的表达式使用三值逻辑系统求值, 返回的值是true, false 和FAIL. 如果无法求值, 则返回一个未求值的表达式. 通常包含关系型运算符“=, <>, <, <=, >, >=”的表达式在Maple 中看作是代数方程或者不等式. 然而, 作为参数传递给evalb 或者出现在if 或while 语句的逻辑表达式中时, 它们会被求值为true 或false. 值得注意的是, evalb 不化简表达式, 因此在使用evalb 之前应将表达式化简, 否则可能会出错. 再看下面常微分方程的求解:12+=′y y> alias(y=y(x)):> ODE:=diff(y,x)=sqrt(y^2+1);:=ODE = ∂∂xy + y 21 > dsolve(ODE,y); = y ()sinh + x _C1函数dsolve 对于求解含有未知参变量的常微分方程也完全可以胜任:> alias(y=y(x)):> ODE:=diff(y,x)=-y/sqrt(a^2-y^2);:=ODE = ∂y −y − a 2y 2> sol:=dsolve(ODE,y); := sol = + − + x − a 2y 2a 2⎛⎝⎜⎜⎞⎠⎟⎟ln + 2a 22a 2− a 2y 2y a 2_C10由此可见, 对于不能表示成显式结果的微分方程解, Maple 尽可能将结果表示成隐式解. 另外, 对于平凡解y=0常常忽略, 这一点应该引起注意.dsolve 对于求解微分方程初值问题也十分方便的:> ODE:=diff(u(t),t$2)+omega^2*u(t)=0;:= ODE = + ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2t 2()u t ω2()u t 0 > dsolve({ODE,u(0)=u0,D(u)(0)=v0},u(t)); = ()u t + v0()sin ωt ωu0()cos ωt 2.2 利用积分变换求解微分方程对于特殊的微分方程, 我们还可以指定dsolve 利用积分变换方法求解, 只需要在dsolve 中加入可选参数method=transform 即可. 其中transform 是积分变换, 可以是laplace 、fourier 、fouriercos 或者fouriersin 变换.作为例子, 我们来看一个具有阻尼的振子在阶跃冲击(Heaviside 函数)下的响应: > ODE:=diff(u(t),t$2)+2*d*omega*diff(u(t),t)+omega^2*u(t)=Heaviside(t);:= ODE = + + ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2t 2()u t 2d ω⎛⎝⎜⎜⎞⎠⎟⎟∂∂t ()u t ω2()u t ()Heaviside t > initvals:=(u(0)=u[0],D(u)(0)=v[0]);:= initvals , = ()u 0u 0 = ()()D u 0v 0> solution:=dsolve({ODE,initvals},u(t),method=laplace);:= solution = ()u t + 1ωe ()−t d ω⎛⎝⎜⎜⎜⎞⎠⎟⎟⎟ + () − ω2u 01()cosh t − d 2ω2ω2ω() + − ωv 0d ω2u 0d ()sinh t − d 2ω2ω2 − d 2ω2ω2ωMaple 给出了问题的通解, 但没有区分自由振动(d=0)、欠阻尼(0<d<1)、临界阻尼(d=1)和过阻尼(d>1)的情况. 下面加以区分求解:> assume(omega>0):> simplify(subs(d=0,solution));= ()u t + − + 1()cos t ωω2u 0()cos t ωv 0()sin t ωωω2> K:=subs(d=1/5,u[0]=1,v[0]=1,solution);:= K = ()u t + 1ωe ()−/15t ω⎛⎝⎜⎜⎜⎜⎜⎜⎜⎞⎠⎟⎟⎟⎟⎟⎟⎟ + () − ω21⎛⎝⎜⎜⎞⎠⎟⎟cosh t −2425ω2ω⎛⎝⎜⎜⎞⎠⎟⎟ + − ω15ω215⎛⎝⎜⎜⎞⎠⎟⎟sinh t −2425ω2−2425ω2> with(plots):> plot3d(rhs(%%),omega=2/3..4/3,t=0..20,style=hidden,orientation=[-30,45],axes=framed);对于d=1的情况, 可可用下式获得结果:> limit(rhs(solution),d=1);() + − + − + ω2u 0ω2v 0t 1ω3u 0t t ωe()t ωe ()−t ωω2再如下例:> diff(u(t),t$2)+3*diff(u(t),t)+2*u(t)=exp(-abs(t));= + + ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2t 2()u t 3⎛⎝⎜⎜⎞⎠⎟⎟∂()u t 2()u t e ()−t > dsolve(%,u(t),method=fourier);= ()u t + + − 23e ()−2t ()Heaviside t 16e t ()Heaviside −t e ()−t t ()Heaviside t 12e ()−t ()Heaviside t2.3 常微分方程组的求解函数dsolve 不仅可以用来求解单个常微分方程, 也可以求解联立的常微分方程组. 特别是对于线性微分方程组, 由于数学上具有成熟的理论, Maple 的求解也是得心应手. 其命令格式为:dsolve( {eqn1, eqn2, …, ini_conds}, {vars});其中, ini_conds 是初始条件.> eqn1:={diff(x(t),t)=x(t)+y(t),diff(y(t),t)=y(t)-x(t)};:= eqn1{, = }∂∂t ()x t + ()x t ()y t = ∂∂t()y t − ()y t ()x t > dsolve(eqn1,{x(t),y(t)});{, = ()x t e }t () + _C1()sin t _C2()cos t = ()y t e t () − _C1()cos t _C2()sin t > eqn2:=2*diff(x(t),t$2)+2*x(t)+y(t)=2*t;:= eqn2 = + + 2⎛⎝⎜⎜⎞⎠⎟⎟∂∂2t 2()x t 2()x t ()y t 2t > eqn3:=diff(y(t),t$2)+2*x(t)+y(t)=t^2+1;:= eqn3 = + + ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2t 2()y t 2()x t ()y t + t 21 > dsolve({eqn2, qn3, x(0)=0, D(x)(0)=1, y(0)=0, D(y)(0)=0}, {x(t),y(t)} );= ()x t + − + 18()sin 2t 2112t 3148t 434t ,{ = ()y t − + − + 14()sin 2t 212t 12t 216t 3124t 4}2.4 常微分方程的级数解法1) 泰勒级数解法当一个常微分方程的解析解难以求得时, 可以用Maple 求得方程解的级数近似, 这在大多数情况下是一种非常好的方法. 级数解法是一种半解析半数值的方法. 泰勒级数法的使用命令为:dsolve({ODE,Ics}, y(x), 'series'); 或dsolve({ODE,Ics}, y(x), 'type=series');下面求解物理摆的大幅振动方程:θθsin g l −=, 其中l 是摆长, θ是摆角, g 是重力加速度.> ODE:=l*diff(theta(t),t$2)=-g*sin(theta(t));:= ODE = l ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2t 2()θt −g ()sin ()θt> initvals:=theta(0)=0,D(theta)(0)=v[0]/l;:= initvals , = ()θ00 =()()D θ0v 0l> sol:=dsolve({ODE,initvals},theta(t),type=series);:= sol = ()θt − + + v 0l t 16g v 0l 2t 31120g v 0() + v 02g l l4t 5()O t 6 > Order:=11:> sol:=dsolve({ODE,initvals},theta(t),type=series);:= sol =()θt −+ − + + v 0t 1g v 0l 2t 31g v 0() + v 02g l l4t 51g v 0() + + 11g l v 02g 2l 2v 04l 6t 71g v 0() + + + 57g v 04l 102g 2v 02l 2g 3l 3v 06l 8t 9()O t 112) 幂级数解法对于一个符号代数系统来说, 幂级数是必不可少的微分方程求解工具. 幂级数求解函数powsolve 存于工具包powseries 中. 但是, 这一求解函数的使用范围很有限, 它只可以用来求解多项式系数的线性常微分方程或方程组,其求解命令为:powseries[function] (prep)或直接载入软件包后用function(prep), prep 为求解的线性微分方程及其初值.例:求解:042=+′′+′y x y y x > ODE:=x*diff(y(x),x$2)+diff(y(x),x)+4*x^2*y(x)=0;:= ODE = + + x ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2x 2()y x ⎛⎝⎜⎜⎞⎠⎟⎟∂∂x ()y x 4x 2()y x 0 > dsolve(ODE,y(x));= ()y x + _C1⎛⎝⎜⎜⎞⎠⎟⎟BesselJ ,043x ()/32_C2⎛⎝⎜⎜⎞⎠⎟⎟BesselY ,043x ()/32> initvals:=y(0)=y0,D(y)(0)=0;:= initvals , = ()y 0y0 = ()()D y 00> with(powseries):> sol:=powsolve({ODE,initvals});:= sol proc ()... end proc powparm> tpsform(sol,x,16);− + − + − + y049y0x 3481y0x 6166561y0x 9459049y0x 121613286025y0x 15()O x 16也可以用powsolve 给出的函数直接获得用递归形式定义的幂级数系数, 不过参数必须用_k , 这是powsolve 使用的临时变量. > sol(_k);−4()a − _k 3_k2例:求解一维谐振子的解: 0)(2=−+′′y x y ε> alias(y=y(x)):> ODE:=diff(y,x$2)+(epsilon-x^2)*y=0;:= ODE = + ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2x 2y () − εx 2y 0 > H:=powsolve(ODE);:= H proc ()... end proc powparm> tpsform(H,x,8);C0C1x 12εC0x 216εC1x 3⎛⎝⎜⎜⎞⎠⎟⎟ + 124ε2C0112C0x 4⎛⎝⎜⎜⎞⎠⎟⎟ + 1120ε2C1120C1x 5⎛⎝⎜⎜⎞⎠⎟⎟− − 130ε⎛⎝⎜⎜⎞⎠⎟⎟ + 124ε2C0112C0160εC0 + − − + + + x 6⎛⎝⎜⎜⎞⎠⎟⎟− − 1ε⎛⎝⎜⎜⎞⎠⎟⎟ + 1ε2C11C11εC1x 7()O x 8 + +> H(_k);−− ε()a − _k 2(a )− _k 4_k ()− _k 12.5 常微分方程的数值解法在对微分方程的解析解失效后, 可以求助于数值方法求解微分方程. 数值求解的好处是只要微分方程的条件足够多时一般都可求得结果, 然而所得结果是否正确则必须依赖相关数学基础加以判断. 调用函数dsolve 求常微分方程初值问题的数值解时需加入参数type=numeric .另一方面, 常微分方程初值问题数值求解还可以选择算法, 加入参数“method=方法参数”即可, 方法参数主要有:rkf45:4~5阶变步长Runge-Kutta-Fehlberg 法 dverk78:7~8阶变步长Runge-Kutta-Fehlberg 法classical :经典方法, 包括向前欧拉法, 改进欧拉法, 2、3、4阶龙格库塔法,Sdams-Bashford 方法等 gear :吉尔单步法 mgear :吉尔多步法 2.5.1变步长龙格库塔法下面用4~5阶Runge-Kutta-Fehlberg 法求解van der Pol 方程:⎩⎨⎧−=′==+′−−′′1.0)0(,0)0(0)1(2y y y y y y > ODE:=diff(y(t),t$2)-(1-y(t)^2)*diff(y(t),t)+y(t)=0;:= ODE = − + ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2t 2()y t () − 1()y t 2⎛⎝⎜⎜⎞⎠⎟⎟∂∂t ()y t ()y t 0> initvals:=y(0)=0,D(y)(0)=-0.1;:= initvals , = ()y 00 = ()()D y 0-.1> F:=dsolve({ODE,initvals},y(t),type=numeric);:= F proc ()... end proc rkf45_x此时, 函数返回的是一个函数, 可以在给定的数值点上对它求值:> F(0);⎡⎣⎢⎢⎤⎦⎥⎥,, = t 0. = ()y t 0. = ∂∂t ()y t -.1 > F(1);⎡⎣⎢⎢⎤⎦⎥⎥,, = t 1. = ()y t -.144768589749425608 = ∂∂t ()y t -.178104066128215944可以看到, F 给出的是一个包括t 、y(t)、D(y)(t)在内的有序表, 它对于每一个时间点可以给出一组数值表达式. 有序表的每一项是一个等式, 可对其作图描述. > plot('rhs(F(t)[2])', t=0..15, title="solution of the Van de Pol's Equation");> plots[odeplot](F,[t,y(t)],0..15,title="solution of the Van de Pol's Equation");2.5.2吉尔法求解刚性方程在科学和工程计算中, 常常会遇到这样一类常微分方程问题, 它可以表示成方程组:00)(),,(y t y y t f y ==′, 称其为刚性方程, 其解的分量数量相差很大, 分量的变化速度也相差很大. 如果用常规方法求解, 为了使变量有足够高的精度, 必须取很小的步长, 而为了使慢变分量达到近似的稳态解, 则需要很长的时间, 这样用小步长大时间跨度的计算, 必定造成庞大的计算量, 而且会使误差不断积累. 吉尔法是专门用来求解刚性方程的一种数值方法.> ODE:=diff(u(t),t)=-2000*u(t)+999.75*v(t)+1000.25,diff(v(t),t)=u(t)-v(t);:=ODE , = ∂∂t ()u t − + + 2000()u t 999.75()v t 1000.25 = ∂∂t()v t − ()u t ()v t > initvals:=u(0)=0,v(0)=-2; := initvals , = ()u 00 = ()v 0-2> ansl:=dsolve({ODE,initvals},{u(t),v(t)},type=numeric,method=gear);:= ansl proc ()... end proc x_gear> ansl(10,0);[,, = t 10.] = ()u t .989893921726687442 = ()v t .979787842765888594> p1:=plots[odeplot] (ansl,[t,u(t)],0..20,color=red):p2:=plots[odeplot] (ansl,[t,v(t)],0..20,color=blue):plots[display] ({p1,p2}, title="Solution of a stiff equation");2.5.3 经典数值方法Maple中常微分方程数值解法中有一类被称作是“经典”(classical)方法. 当然, 称其为经典方法不是因为它们常用或是精度高, 而是因为它们的形式简单, 经常被用于计算方法课上的教学内容. 它们是一些常见的固定步长方法, 在dsolve中用参数method=classical[方法名称], 如果不特别指出, 将默认采用向前欧拉法. 主要有:foreuler:向前欧拉法(默认)hunform:Heun公式法(梯形方法, 改进欧拉法)imply:改进多项式法rk2:二阶龙格库塔法rk3:三阶龙格库塔法rk4:四阶龙格库塔法adambash:Adams-Bashford方法(预测法)abmoulton:Adams-Bashford-Moulton方法(预测法)下面给出微分方程数值方法的参数表:参数名参数类型参数用途参数用法initial 浮点数的一维数组指定初值向量number 正整数指定向量个数output 'procedurelist'(默认)或'listprocedure'指定生成单个函数或多个函数的有序表Procedurelis:单个函数, 返回有序表Listprocedure:函数的有序表procedure 子程序名用子程序形式指定第一尖常微分方程组的右边部分参数1:未知函数的个数参数2:自变量参数3:函数向量参数4:导函数向量start 浮点数自变量起始值startinit 布尔量(默认FALSE) 指定数值积分是否总是从起始值开始对dverk78不适用value 浮点数向量(一维数组) 指定需要输出函数值的自变量数值点如果给定, 结果是一个22×的矩阵. 元素[1,1]是一个向量, 含自变量名和函数名称; 元素[2,1]是一个数值矩阵, 其中第一列value的输入相同, 其他列中是相应的函数值另外, 还有一些特殊的附加参数:maxfun :整数类型, 用于最大的函数值数量, 默认值50000, 为负数时表示无限制 corrections :正整数类型, 指定每步修正值数量, 在abmoulton 中使用, 建议值≤4 stepsize :浮点数值, 指定步长 下面看一个简单的例子:> ODE:=diff(y(x),x)=y(x)-2*x/y(x);:=ODE = ∂()y x − ()y x 2x > initvals:=y(0)=1;:= initvals = ()y 01> sol1:=dsolve({ODE,initvals},y(x),numeric,method=classical,stepsize=0.1,start=0);:= sol1proc ()... end proc x_classical而其解析解为:> sol2:=dsolve({diff(y(x),x)=y(x)-2*x/y(x), y(0)=1}, y(x));:= sol2 = ()y x + 2x 1将两者图形同时绘制在同一坐标系中比较, 可以发现, 在经过一段时间后, 欧拉法的数值结果会产生较大误差.> plot({rhs(sol2),'rhs(sol1(x)[2])'},x=0..2);求解微方程, 无论使用什么方法或者加入什么选项, 求解完成后必须利用相关数学知识进行逻辑判断, 绝对不对简单迷信Maple 给出的结果, 否则很有可能得到一个对于方程本身也许还看得过去, 但在数学或者物理意义上不合理的解.2.6摄动法求解常微分方程由于微分方程求解的复杂性, 一般微分方程常常不能求得精确解析解, 需要借助其它方法求得近似解或数值解, 或者两种方法兼而有之. 摄动法是重要的近似求解方法.摄动法又称小参数法, 它处理含小参数ε的系统, 一般当ε=0时可求得解x 0. 于是可把原系统的解展成ε的幂级数, 若这个级数当L +++=2210εεx x x x ε→0时一致收敛,则称正则摄动, 否则称奇异摄动. 摄动法的种类繁多, 最有代表性的是庞加莱—林斯泰特(Poicare-Lindstedt )法, 在此, 我们以该方法求解van der Pol 方程:0)1(2=+′−−′′y y y y ε当ε=0时该方程退化为数学单摆的常微分方程, 当ε=1时为3.5讨论的情况, 对任意ε, 该微分方程拥有一个渐进稳定的周期解, 称为极限环.由于van der Pol 方程中没有显式的时间依赖项, 不失一般性, 设初值为y(0)=0. 在庞加莱—林斯泰特法中, 时间通过变换拉伸:t ωτ=, 其中∑∞==0i i i εωω对于)(τy , van der Pol 方程变为:0)1(22=+′−−′′y y y y ωεωrestart:diff(y(t),t$2)-epsilon*(1-y(t)^2)*diff(y(t),t)+y(t)=0;= − + ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2t 2()y t ε() − 1()y t 2⎛⎝⎜⎜⎞⎠⎟⎟∂()y t ()y t 0 > ODE:=DEtools[Dchangevar]({t=tau/omega,y(t)=y(tau)},%,t,tau);:= ODE = − + ω2⎛⎝⎜⎜⎞⎠⎟⎟∂∂2τ2()y τε() − 1()y τ2ω⎛⎝⎜⎜⎞⎠⎟⎟∂∂τ()y τ()y τ0> e_order:=6:> macro(e=epsilon,t=tau):> alias(seq(y[i]=eta[i](tau),i=0..e_order)):> e:=()->e:> for i from 0 to e_order do eta[i]:=t->eta[i](t) od:> omega:=1+sum('w[i]*e^i','i'=1..e_order);:= ω + + + + + + 1w 1εw 2ε2w 3ε3w 4ε4w 5ε5w 6ε6> y:=sum('eta[i]*e^i','i'=0..e_order);:= y + + + + + + η0η1εη2ε2η3ε3η4ε4η5ε5η6ε6> deqn:=simplify(collect(ODE,e),{e^(e_order+1)=0}):> for i from 0 to e_order do ode[i]:=coeff(lhs(deqn),e,i)=0 od:> ode[0];= + y 0⎛⎝⎜⎜⎞⎠⎟⎟∂∂2τ2y 00> ode[1];= − + + + ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2τ2y 1⎛⎝⎜⎜⎞⎠⎟⎟∂∂τy 0y 12w 1⎛⎝⎜⎜⎞⎠⎟⎟∂∂2τ2y 0⎛⎝⎜⎜⎞⎠⎟⎟∂∂τy 0y 020 > ode[2];= + − + + + − + + + ⎛⎝⎜⎜⎞⎠⎟⎟∂∂τy 0w 1y 022⎛⎝⎜⎜⎞⎠⎟⎟∂∂τy 0y 0y 1⎛⎝⎜⎜⎞⎠⎟⎟∂∂τy 1⎛⎝⎜⎜⎞⎠⎟⎟∂∂2τy 2y 2⎛⎝⎜⎜⎞⎠⎟⎟∂∂τy 1y 02⎛⎝⎜⎜⎞⎠⎟⎟∂∂τy 0w 12w 1⎛⎝⎜⎜⎞⎠⎟⎟∂∂2τy 12⎛⎝⎜⎜⎞⎠⎟⎟∂∂2τy 0w 2⎛⎝⎜⎜⎞⎠⎟⎟∂∂2τy 0w 120> dsolve({ode[0],eta[0](0)=0,D(eta[0])(0)=C[1]},eta[0](t));= y 0C 1()sin τ> eta[0]:=unapply(rhs(%),t);:= η0 → τC 1()sin τ> ode[1];= − + − + ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2τ2y 1C 1()cos τy 12w 1C 1()sin τC 13()cos τ()sin τ20 > map(combine,ode[1],'trig');= − + − + − ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2τ2y 1C 1()cos τy 12w 1C 1()sin τ14C 13()cos τ14C 13()cos 3τ0 > ode[1]:=map(collect,%,[sin(t),cos(t)]);:= ode 1 = − + + + − 2w 1C 1()sin τ⎛⎝⎜⎜⎞⎠⎟⎟− + C 11C 13()cos τ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2τ2y 1y 11C 13()cos 3τ0 > dsolve({ode[1],eta[1](0)=0,D(eta[1])(0)=C[2]},eta[1](t),method=laplace);= y 1 + − ⎛⎝⎜⎜⎞⎠⎟⎟− + + 18C 1() − C 12() + C 12τw 1C 1C 2()sin τ⎛⎝⎜⎜⎞⎠⎟⎟ − 132C 13C 1τw 1()cos τ132C 13()cos 3τ > map(collect,%,[sin(t),cos(t),t]);= y 1 + − ⎛⎝⎜⎜⎞⎠⎟⎟− + + 18C 1() − C 12() + C 12τw 1C 1C 2()sin τ⎛⎝⎜⎜⎞⎠⎟⎟ − 132C 13C 1τw 1()cos τ132C 13()cos 3τ> solve({coeff(lhs(ode[1]),sin(t))=0,coeff(lhs(ode[1]),cos(t))=0});,,{}, = C 10 = w 1w 1{}, = C 12 = w 10{}, = C 1-2 = w 10> w[1]:=0:C[1]:=-2:> ode[1];= + + ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2τ2y 1y 12()cos 3τ0 > dsolve({ode[1],eta[1](0)=0,D(eta[1])(0)=C[2]},eta[1](t),method=laplace);= y 1 − + 14()cos 3τ14()cos τC 2()sin τ> eta[1]:=unapply(rhs(%),tau);:= η1 → τ − + 14()cos 3τ14()cos τC 2()sin τ> map(combine,ode[2],'trig'):> ode[2]:=map(collect,%,[sin(t),sin(3*t),cos(t),cos(3*t)]);:= ode 2 = + + − + − + ⎛⎝⎜⎜⎞⎠⎟⎟ + 144w 2()sin τ54()sin 5τ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2τ2y 232()sin 3τ2C 2()cos τ3C 2()cos 3τy 20 > solve({coeff(lhs(ode[2]),sin(t))=0,coeff(lhs(ode[2]),cos(t))=0});{}, = C 20 =w 2-116> assign(%):> dsolve({ode[2],eta[2](0)=0,D(eta[2])(0)=C[3]},eta[2](t),method=laplace):> eta[2]:=unapply(rhs(%),t);:= η2 → τ−+ + 316()sin 3τ⎛⎝⎜⎜⎞⎠⎟⎟ + 2996C 3()sin τ596()sin 5τ > for i from 0 to e_order domap(combine,ode[i],'trig'):ode[i]:=map(collect,%,[seq(sin((2*j+1)*t),j=0..i),seq(cos((2*j+1)*t),j=0..i)]): solve({coeff(lhs(ode[i]),sin(t))=0,coeff(lhs(ode[i]),cos(t))=0}): assign(%):dsolve({ode[i],eta[i](0)=0,D(eta[i])(0)=C[i+1]},eta[i](t),method=laplace): collect(%,[seq(sin((2*j+1)*t),j=0..i),seq(cos((2*j+1)*t),j=0..i)]): eta[i]:=unapply(rhs(%),t); od:> omega;−+ + 11ε217ε435ε6> y(t):> y:=unapply(simplify(y(t),{e^e_order=0}),t): > e:=1:y(t);1037927 552960()sinτ1519540()sinτ()cosτ68132()sinτ()cosτ46180()sinτ()cosτ813256()sinτ()cosτ252579573317760()cosτ355337200()cosτ11912187129600()cosτ77999911105920()cosτ− + − − + + + + −1212373()cosτ5114941()cosτ9− −> plot(y(t),t=0..15);在该问题的求解过程中, 前半部分我们按照交互式命令方式输入, 也就是把数学逻辑推理的过程“翻译”成Maple函数, 而在后半部分, 则采用程序设计方式书写了数学推导过程, 这是应用Maple解决实际问题的两种方式. 前一种方法只需了解Maple函数即可应用, 而后一种程序设计方式则需掌握Maple程序设计语言. 但是, 不论是那一种方式, 数学基础总是最重要的.3 偏微分方程求解初步Maple中偏微分方程求解器为pdsolve, 该函数及其它偏微分方程求解工具存于软件包PDEtools中. 函数pdsolve能够很快的辨认出偏微分方程是否为可以用标准方法求解的类型, 如果无法判别, 则pdsolve采用一种启发式的算法尝试偏微分方程按特征结构分离出来. pdsolve的策略就是寻找给定偏微分方程的通解, 如不能成功则寻找可以完全分离的变量, 因此, 该函数返回的结果可能为:(i) 通解;(ii) 近似的通解(即包含任意函数但又不足以得到通解的解);(iii) 变量分离的非耦合的常微分方程.如不能完全分离变量, 则函数再次调用自身, 如仍失败则返回未完全分离的变量并给出一个警告信息. 其命令格式为:pdsolve(PDE, f);其中, PDE为偏微分方程, f为被求解函数.下面通过几个例子说明pdsolve的用法:> PDE1:=diff(u(x,t),[t$2])-1/v^2*diff(u(x,t),[x$2]);:= PDE1 − ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2t 2()u ,x t ∂∂2x 2()u ,x t v 2 > pdsolve(PDE1,u(x,t));= ()u ,x t + ()_F1− − t v x ()_F2 − t v x> restart:> PDE2:=a*x*diff(u(x,t),x)+b*t*diff(u(x,t),t)=0;:= PDE2 = + a x ⎛⎝⎜⎜⎞⎠⎟⎟∂∂x ()u ,x t b t ⎛⎝⎜⎜⎞⎠⎟⎟∂∂t ()u ,x t 0 > pdsolve(PDE2,u(x,t));= ()u ,x t ⎛⎝⎜⎜⎜⎜⎞⎠⎟⎟⎟⎟_F1t x ⎛⎝⎜⎜⎞⎠⎟⎟b a> PDE3:=diff(u(x,t),x$2)-t^2*diff(u(x,t),t$2)-t*diff(u(x,t),t)=0;:= PDE3 = − − ⎛⎝⎜⎜⎞⎠⎟⎟∂∂2x 2()u ,x t t 2⎛⎝⎜⎜⎞⎠⎟⎟∂∂2t 2()u ,x t t ⎛⎝⎜⎜⎞⎠⎟⎟∂∂t ()u ,x t 0 > pdsolve(PDE3,u(x,t));= ()u ,x t + ()_F1t e x ()_F2t e()−x> restart:> heatPDE:=diff(u(x,t),t)=diff(u(x,t),[x$2]);:= heatPDE = ∂∂t ()u ,x t ∂∂2x2()u ,x t> pdsolve(heatPDE,u(x,t));() = ()u ,x t ()_F1x ()_F2t &where ⎡⎣⎢⎢⎤⎦⎥⎥{}, = ∂∂2x2()_F1x _c 1()_F1x = ∂()_F2t _c 1()_F2t > dsolve(diff(F2(t),t)=c[1]*F2(t),F2(t));= ()F2t _C1e()c 1t> dsolve(diff(F1(x),[x$2])=c[1]*F1(x));= ()F1x + _C1e()c 1x _C2e()−c 1x> result:=rhs(%)*rhs(%%);:= result () + _C1e ()c 1x _C2e()−c 1x _C1e()c 1t> subs(u(x,t)=result,heatPDE):expand(%);+_C12c 1e()c 1t e()c 1x _C1c 1e()c 1t _C2e()c 1x =+_C12c 1e()c 1t e ()c 1x _C1c 1e()c 1t _C2e()c 1x> lhs(%)-rhs(%);。
Maple讲解

• 第一节 Maple 概述 • 第二节 Maple 的简单应用
第一节 Maple 概述
• • • • 一、主要功能 二、安装、启动与退出 三、界面简介 四、基本操作
一、主要功能
• Maple的主要功能包括计算功能(符号计算、 数值处理、二维与三维作图)和编辑功能 等两方面 • Maple接受中文输入,这为我们编写中文课 件或做中文注释提供了方便.
3. 内部常数
• • • • • Pi表示圆周率π I表示纯虚数 自然对数的底用exp(1)表示 角的单位度数是deg 无穷大为infinity.
4. 小数划为分数运算
• convert(x,rational) 将实数(有理数)x转换为 精确分数 • convert(x,rational,n) 将实数(无理数)x转换 为分子与分母非零数码的个数和为n的分数
4. 解不等式
• Maple用指令solve解不等式,不等号为:
• • • • • <=(小于等于) >=(大于等于) <(小于) >(大宇) <>(不等于)
四、微积分运算
• • • • • 1. 极限运算 2. 求导运算 3. 积分运算 4. 级数 5. 微分方程
1. 极限运算
• Limit(f(x), x = a ) 求表达式f(x)当x趋于a时的极限 • Limit(f(x), x=a, dir ) 求表达式f(x)当x沿方向dir趋于a时的极限 • Limit(f(x,y,…),{x=a,y=b}) 求表达式f(x, y,…) 当x,y,…分别趋于a、b,…时的极限
三、初等代数运算
• • • • 1. 不同形式代数表达式之间的转换 2. 有理化分母和部分分式 3. 解方程 4. 解不等式
第4章 线性代数(Maple)

(1.1)(1.2)第4章 线性代数4.1使用线性代数的命令之前,必须首先加载函数包 LinearAlgebra 或 Student[LinearAlgebra]。
with LinearAlgebra ;,Add ,Adjoint ,BackwardSubstitute ,BandMatrix ,Basis ,BezoutMatrix ,BidiagonalForm ,BilinearForm ,CharacteristicMatrix ,CharacteristicPolynomial ,Column ,ColumnDimension ,ColumnOperation ,ColumnSpace ,CompanionMatrix ,ConditionNumber ,ConstantMatrix ,ConstantVector ,Copy ,CreatePermutation ,CrossProduct ,DeleteColumn ,DeleteRow ,Determinant ,Diagonal ,DiagonalMatrix ,Dimension ,Dimensions ,DotProduct ,EigenConditionNumbers ,Eigenvalues ,Eigenvectors ,Equal ,ForwardSubstitute ,FrobeniusForm ,GaussianElimination ,GenerateEquations ,GenerateMatrix ,Generic ,GetResultDataType ,GetResultShape ,GivensRotationMatrix ,GramSchmidt ,HankelMatrix ,HermiteForm ,HermitianTranspose ,HessenbergForm ,HilbertMatrix ,HouseholderMatrix ,IdentityMatrix ,IntersectionBasis ,IsDefinite ,IsOrthogonal ,IsSimilar ,IsUnitary ,JordanBlockMatrix ,JordanForm ,LA_Main ,LUDecomposition ,LeastSquares ,LinearSolve ,Map ,Map2,MatrixAdd ,MatrixExponential ,MatrixFunction ,MatrixInverse ,MatrixMatrixMultiply ,MatrixNorm ,MatrixPower ,MatrixScalarMultiply ,MatrixVectorMultiply ,MinimalPolynomial ,Minor ,Modular ,Multiply ,NoUserValue ,Norm ,Normalize ,NullSpace ,OuterProductMatrix ,Permanent ,Pivot ,PopovForm ,QRDecomposition ,RandomMatrix ,RandomVector ,Rank ,RationalCanonicalForm ,ReducedRowEchelonForm ,Row ,RowDimension ,RowOperation ,RowSpace ,ScalarMatrix ,ScalarMultiply ,ScalarVector ,SchurForm ,SingularValues ,SmithForm ,StronglyConnectedBlocks ,SubMatrix ,SubVector ,SumBasis ,SylvesterMatrix ,ToeplitzMatrix ,Trace ,Transpose ,TridiagonalForm ,UnitVector ,VandermondeMatrix ,VectorAdd ,VectorAngle ,VectorMatrixMultiply ,VectorNorm ,VectorScalarMultiply ,ZeroMatrix ,ZeroVector ,Zip with Student LinearAlgebra ;,`.`,AddRow ,AddRows ,Adjoint ,ApplyLinearTransformPlot ,(1.3)(1.4)BackwardSubstitute ,BandMatrix ,Basis ,BilinearForm ,CharacteristicMatrix ,CharacteristicPolynomial ,ColumnDimension ,ColumnSpace ,CompanionMatrix ,ConstantMatrix ,ConstantVector ,CrossProductPlot ,Determinant ,Diagonal ,DiagonalMatrix ,Dimension ,Dimensions ,EigenPlot ,EigenPlotTutor ,Eigenvalues ,EigenvaluesTutor ,Eigenvectors ,EigenvectorsTutor ,Equal ,GaussJordanEliminationTutor ,GaussianElimination ,GaussianEliminationTutor ,GenerateEquations ,GenerateMatrix ,GramSchmidt ,HermitianTranspose ,Id ,IdentityMatrix ,IntersectionBasis ,InverseTutor ,IsDefinite ,IsOrthogonal ,IsSimilar ,IsUnitary ,JordanBlockMatrix ,JordanForm ,LUDecomposition ,LeastSquares ,LeastSquaresPlot ,LinearSolve ,LinearSolveTutor ,LinearSystemPlot ,LinearSystemPlotTutor ,LinearTransformPlot ,LinearTransformPlotTutor ,MatrixBuilder ,MinimalPolynomial ,Minor ,MultiplyRow ,Norm ,Normalize ,NullSpace ,Pivot ,PlanePlot ,ProjectionPlot ,QRDecomposition ,RandomMatrix ,RandomVector ,Rank ,ReducedRowEchelonForm ,ReflectionMatrix ,RotationMatrix ,RowDimension ,RowSpace ,SetDefault ,SetDefaults ,SumBasis ,SwapRow ,SwapRows ,Trace ,Transpose ,UnitVector ,VectorAngle ,VectorSumPlot ,ZeroMatrix ,ZeroVector如需向量和向量场运算,还应加载函数包 VectorCalculus 或 Student[VectorCalculus]。
第四章 Maple 简介

3. 积分运算
• int(expr, x) 求expr对于x的不定积分 • int(expr, x=a..b, ...) 求expr对于x由a到b的 定积分, …为选项 • changevar(s, f, u) 对积分f作变量替换s, u为 新的积分变量 • intparts(f, u) 对积分f作分部积分, u为在udv 中选择的u
三、初等代数运算
• • • • 1. 不同形式代数表达式之间的转换 2. 有理化分母和部分分式 3. 解方程 4. 解不等式
1. 不同形式代数表达式之间的转换
• expand(expr) 乘出expr所有乘积和幂(简称展开) • factor(expr) 将expr分解成因子的乘积 • normal(expr) 消去分子和分母的公因子 • simplify(expr) 做一系列变换使得expr具有最简形式 • collect(expr, x) 给出expr按照x方幂展开的形式
2. Maple的自定义函数
• • • • • • • • • • sqrt(x) 平方根函数 exp(x), ln(x) 指数函数和自然对数函数 log[b](x) 以b为底的对数函数 Abs(x) 绝对值函数 round(x) 最接近x的整数rand ()12位的随机数 Max(a,b,c,),min(a,b,c,) a, b, c, 中的最 大(小)数 floor(x) 不大于x的最大整数 ceil(x) 不小于x的最小整数 trunc(x) x靠近0的整数部分 frac(x) x的分数部分(=x-trunc(x))signum(x)符号函数
2. 向量的其他运算
• CrossProduct(U, V)计算两个三维向量的叉 积 • DotProduct(U, V)计算两个相同维数向量的 点积 • VectorAngle(U, V)计算两个相同维数向量 间的夹角 • VectorNorm(U, 2)计算向量U的欧氏长度
Maple教程第四章线性代数

72第四章 线性代数。
73.线性代数是讨论有限维空间线性理论的基础数学分支。
由于线性问题广泛地存在于自然科学和计数科学的各个领域,而且某些非线性问题在一定条件下也可以转化为线性问题来处理,线性代数中的概念和方法,已经被广泛地运用到各个学科领域中。
在计算机技术高度发展的今天,线性代数更是如虎添翼,成为了从事自然科学和工程计数工作不可缺少的数学工具之一。
正因为此,Maple 也对线性代数工具有专门的实现,它对于解决小规模线性代数问题,尤其是符号线性代数问题,是极为实用的。
不过,如果要处理较大规模的数值线性代数问题,还是推荐您使用专门的线性代数工具——Matlab ,它在数值矩阵运算方面是首屈一指的。
在上一章中的数组部分中,我们曾经简要地介绍过矩阵和向量,我们还提到了Maple 的线性代数工具包。
这一章将为您更为详尽地介绍Maple 中矩阵和向量的使用和运算,以及Maple 线性代数工具包中的主要函数和它们的用法,我们将通过例子介绍Maple 解决实际线性代数问题的方法。
我们还会顺带介绍Maple 中矩阵求值的一些内部机制,使您能更好的理解Maple 的复合数据类型,为利用Maple 自己编制计算程序打下基础。
4.1 矩阵的基本运算在开始用Maple 进行矩阵运算之前,需要载入Maple 的线性代数工具包——linalg ,Maple 中大部分矩阵运算以及和矩阵相关的函数都是在这个工具包中定义的。
在载入这个工具包时产生了两个警告,不用为此担心,这是因为Maple 系统中已有的两个函数——norm 和trace 被linalg 中的同名函数所覆盖了。
原来系统中这两个函数分别是用于计算多项式的范数(norm )和程序调试跟踪的,一般情况下,在解决线性代数问题时用不到。
如果确实要用系统中的库函数,可以再用readlib 将其重新载入进来。
linalg 中的主要函数的详细介绍我们将留到本章第三节中完成,在这一节中,我们主要着眼于矩阵的基本运算,比如加法、乘法和乘幂等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
– 定义表达式p := x2 + sin x – 然后使用指令:函数名 := unapply(p,x)
• 定义分段函数的指令: piecewise • 清除变量赋值和自定义函数的指令:
变量名:=’变量名’ 或 函数名:= ’函数名’. • 清除所有自定义变量和函数的指令: restart
第四章Maple简介
4. 小数划为分数运算
• convert(x,rational) 将实数(有理数)x转换为 精确分数
• convert(x,rational,n) 将实数(无理数)x转换 为分子与分母非零数码的个数和为n的分数
第四章Maple简介
5. 复数运算
• z = a + b*I 复数z的代数表示,a, b为实数 • Re(z)求复数z的实部 • Im(z)求复数z的虚部 • abs(z)求复数z的模长或绝对值 • argument(z)求复数z的幅角(在-π和π之间) • Conjugate(z)求复数z的共轭复数 • evalc(expr)完成表达式expr的复数运算
– % 指上一步的运算结果 – %% %(n个%)指前倒数第n步的运算结果
第四章Maple简介
2. Maple的自定义函数
• sqrt(x) 平方根函数 • exp(x), ln(x) 指数函数和自然对数函数 • log[b](x) 以b为底的对数函数 • Abs(x) 绝对值函数 • round(x) 最接近x的整数rand ()12位的随机数 • Max(a,b,c, ),min(a,b,c, ) a, b, c, 中的最
大(小)数 • floor(x) 不大于x的最大整数 • ceil(x) 不小于x的最小整数 • trunc(x) x靠近0的整数部分 • frac(x) x的分数部分(=x-trunc(x))signum(x)符号函数
第四章Maple简介
3. 定义函数
• 定义函数的基本方式是: “函数名 := 变量 - > 变量的表达式”
• Maple接受中文输入,这为我们编写中文课 件或做中文注释提供了方便.
第四章Maple简介
二、安装、启动与退出
• 1. 软件的安装 • 2. 软件的启动与退出
第四章Maple简介
三、界面简介
第四章Maple简介
四、基本操作
• 1. 基本运算符
– 加、减、乘、除和乘方的符号+、-、*、/ 和^ – 在运算过程中加注释, 用符号“#”起始就行了
做一系列变换使得expr具有最简形式 • collect(expr, x)
给出expr按照x方幂展开的形式
第四章Maple简介
2. 有理化分母和部分分式
• rationalize(expr) 有理化根式分式的分母 • convert(f, parfrac, x) 将f按x化为部分分式 • convert(f, parfrac, x, K)
第四章Maple简介
二、函数运算
• 1. 变量 • 2. Maple的自定义函数 • 3. 定义函数
第四章Maple简介
1. 变量
• 变量的赋值方式是:变量 := 值 • 变量的第一个字母不能是数字 • 指令assigned(x) 用于查看变量x是否被赋值,
若被赋值,返回true, 否则false • 百分号%的用法:
• Digits
查看数值的默认位数
• Digits:=n 将数值的默认位数设定为n
第四章Maple简介
2. 整数运算
• ifactor(n)
将整数n分解为素数的乘积
• igcd(m,n,k,…) 求m,n,k, 的最大公约数
• ilcm(m,n,k,…) 求m,n,k, 的最小公倍数
• ithprime(n)
将f在K上按x化为部分分式
第四章Maple简介
3. 解方程
• solve(eqn, x) 对方程eqn求解x • subs(x=soln,eqn)验证解soln满足方程eqn • solve({eqn1,eqn2,…}, {x,y,…}) 对未知数x,
• 2. 变量与函数
– Maple本身定义的函数的第一个字母小写,函数 的变量用圆括号()
• 3. 工具栏(Palettes)的使用 • 4. 帮助系统的使用
第四章Maple简介
第二节 Maple 的简单应用
• 一、算术运算 • 二、函数运算 • 三、初等代数运算 • 四、微积分运算 • 五、线性代数运算 • 六、作图
第四章Maple简介
三、初等代数运算
• 1. 不同形式代数表达式之间的转换 • 2. 有理化分母和部分分式 • 3. 解方程 • 4. 解不等式
第四章Maple简介
1. 不同形式代数表达式之间的转换
• expand(expr) 乘出expr所有乘积和幂(简称展开)
• factor(expr) 将expr分解成因子的乘积 • normal(expr) 消去分子和分母的公因子 • simplify(expr)
给出第n个素数
• isprime(n)
判定n是(True)否(False)为素数
factorial(n)或n! 计算n阶阶乘
• rand(m..n) 随机产生在m与n间的整数
• irem(m,n)
计算m/n的余数
• iquo(m,n)
计算m/n的商
Hale Waihona Puke 第四章Maple简介3. 内部常数
• Pi表示圆周率π • I表示纯虚数 • 自然对数的底用exp(1)表示 • 角的单位度数是deg • 无穷大为infinity.
第四章 Maple 简介
• 第一节 Maple 概述 • 第二节 Maple 的简单应用
第四章Maple简介
第一节 Maple 概述
• 一、主要功能 • 二、安装、启动与退出 • 三、界面简介 • 四、基本操作
第四章Maple简介
一、主要功能
• Maple的主要功能包括计算功能(符号计算、 数值处理、二维与三维作图)和编辑功能 等两方面
第四章Maple简介
一、算术运算
• 1. 数值表示和计算 • 2. 整数运算 • 3. 内部常数 • 4. 小数划为分数运算 • 5. 复数运算
第四章Maple简介
1. 数值表示和计算
• evalf(expr) expr的计算结果含有机器的默 认位的数字
• evalf(expr,n) expr的计算结果含n位数字