Maple中的微分代数方程求解
数学软件Maple使用教程

数学软件Maple使⽤教程数学实验数学软件Maple使⽤教程序⾔⼀.什么是数学实验?我们都熟悉物理实验和化学实验,就是利⽤仪器设备,通过实验来了解物理现象、化学物质等的特性。
同样,数学实验也是要通过实验来了解数学问题的特性并解决对应的数学问题。
过去,因为实验设备和实验⼿段的问题,⽆法解决数学上的实验问题,所以,⼀直没有听说过数学实验这个词。
随着计算机的飞速发展,计算速度越来越快,软件功能也越来越强,许多数学问题都可以由计算机代替完成,也为我们⽤实验解决数学问题提供了可能。
数学实验就是以计算机为仪器,以软件为载体,通过实验解决实际中的数学问题。
⼆.常⽤的数学软件⽬前较流⾏的数学软件主要有四种:1.MathACD其优点是许多数学符号键盘化,通过键盘可以直接输⼊数学符号,在教学⽅⾯使⽤起来⾮常⽅便。
缺点是⽬前仅能作数值运算,符号运算功能较弱,输出界⾯不好。
2.Matlab优点是⼤型矩阵运算功能⾮常强,构造个⼈适⽤函数⽅便很⽅便,因此,⾮常适合⼤型⼯程技术中使⽤。
缺点是输出界⾯稍差,符号运算功能也显得弱⼀些。
不过,在这个公司购买了Maple公司的内核以后,符号运算功能已经得到了⼤⼤的加强。
再⼀个缺点就是这个软件太⼤,按现在流⾏的版本5.2,⾃⾝有400多兆,占硬盘空间近1个G,⼀般稍早些的计算机都安装部下。
我们这次没⽤它主要就是这个原因。
3.Mathematica其优点是结构严谨,输出界⾯好,计算功能强,是专业科学技术⼈员所喜爱的数学软件。
缺点是软件本⾝较⼤,⽬前流⾏的3.0版本有200兆;另⼀个缺点就是命令太长,每⼀个命令都要输⼊英⽂全名,因此,需要英语⽔平较⾼。
4.Maple优点是输出界⾯很好,与我们平常书写⼏乎⼀致;还有⼀个最⼤的优点就是它的符号运算功能特别强,这对于既要作数值运算,⼜要作符号运算时就显得⾮常⽅便了。
除此之外,其软件只有30兆,安装也很⽅便(直接拷贝就可以⽤)。
所以,我们把它放到学校⽹上直接调⽤。
微分方程的maple求解

微分⽅程的maple求解1、常⽤函数1)求解常微分⽅程的命令dsolve.dsolve(常微分⽅程)dsolve(常微分⽅程,待解函数,选项)dsolve({常微分⽅程,初值},待解函数,选项)dsolve({常微分⽅程组,初值},{待解函数},选项)其中选项设置解得求解⽅法和解的表⽰⽅式。
求解⽅法有type=formal_series(形式幂级数解)、type=formal_solution(形式解)、type=numeric(数值解)、type=series(级数解)、method=fourier(通过Fourier变换求解)、method=laplace(通过Laplace变换求解)等。
解的表⽰⽅式有explicit(显式)、implicit(隐式)、parametric(参数式)。
当⽅程⽐较复杂时,要想得到显式解通常⼗分困难,结果也会相当复杂。
这时,⽅程的隐式解更为有⽤,⼀般也要简单得多。
dsolve为标准库函数。
2)求解⼀阶线性常微分⽅程的命令linearsol.在Maple中求解⼀阶线性⽅程既可以⽤dsolve函数求解,也可以⽤Detools函数包中的linearsol函数求解。
linearsol是专门求解线性微分⽅程的命令,使⽤格式为: linearsol(线性⽅程,待解函数)linearsol的返回值为集合形式的解。
3)偏微分⽅程求解命令pdsolve.pdsolve(偏微分⽅程,待解变量,选项)pdsolve(偏微分⽅程,初值或边界条件,选项)pdsolve为标准库函数,可直接使⽤。
如果求解成功,将得到⼏种可能结果:⽅程的通解;拟通解(包含有任意函数,但不⾜以构造通解);⼀些常微分⽅程的集合;2、⽅法1)⼀阶常微分⽅程的解法a 分离变量法 I 直接分离变量法。
如()()dyf xg y dx=,⽅程右端是两个分别只含x 或y 的函数因式乘积,其通解为()()dyf x dx Cg y =+?。
Maple6-ch4.1-常微分方程

1第四章 微分方程§4.1 常微分方程4.1.1 常微分方程的解析解1. 函数dsolve 在微分方程中的应用在Maple 中,这是一个用途最广的函数——称为通用函数吧,几乎可以求解所有的微 分方程和方程组,既能求解解析解,也能求解数值解,本节只介绍其求微分方程的解析解中的作用:dsolve (ODE);dsolve (ODE,y(x),extra_args);其中,ODE(Ordinary Differential Equation)是一个常微分方程; y(x)为未函数,求解时这个参数可以省略;第三个参数extra_args 是一个可选的参数,主要用来设置最后解析解的形式或求解过程中一些积分的设置,它的选值很广,这里仅举几个参数。
(1) explicit: 求出显式解; (2) implicit: 解可以是隐式;(3) useInt: 运算中用“Int ”函数代替“int ”函数,可加快运算速度; (4) parametric: 将最后的解析解表达成另外一个自变量的形式。
这些参数的位置很灵活,可以放在除第一个参数位置外的任何位置,并且它们的组合 也很灵活,可以单独作用,也可几何参数合用,只要在中间用逗号隔开,而且参数并不一定需要写在一起,也可以分开。
> eq:='eq': eq:=diff(y(x),x)*(1+y(x)^2)+cos(x)=0; 可以两端都不是零:= eq = + ⎛⎝ ⎫⎭⎪⎪∂()y x () + 1()y x 2()cos x 0 > sol1:=dsolve(eq,explicit); 给出显式解sol1()y x =:= 12- ()- - + 12()sin x 12_C12 - + + 3418()cos 2x 72()sin x _C136_C12()/234()- - + 12()sin x 12_C12 - + + 3418()cos 2x 72()sin x _C136_C12()/13,其中“_C 1”表示第一个任意常数。
数学软件Maple在常微分方程教学中的应用

作者简介 : 李姝敏 ( 1 9 7 9一) , 女, 内蒙古赤峰人 , 硕士 , 讲师 , 研 究方向 : 孤 立子理 论与可积 系统及其应 用。
55
定 对应 的 函数 Y ( ), 也 可得 到 微 分 方程 ( 2 ) 一 个 的
在 常微 分 方 程 的 教材 中 , 首 先 要 介 绍初 等 积 分 法 求解 一 阶 常微分 方程 ( 教材第二章 ) , 即将 微 分 方 程求解 问题转 化 为积分 问题 。虽然 不是 所有 的微 分
收稿 日期 : 2 0 1 3—1 0— 2 3
基金项 目: 国家 自然科 学基金 的项 目( 1 1 2 6 1 0 3 5 ) , 内蒙古 自然科学基 -  ̄ , . ( 2 0 1 2 MS 0 1 0 2 ) , 内蒙古教 育厅 高等 学校科研 项
例 1求 解一 阶 常微 分方程
:
d
2 —y
。
( 1 )
并 画 出该 方程 的方 向场 和积 分 曲线 。 解: ( 一) 求 解 采 用 用软 件 Ma p l e的 d s o l v e 命 令
s o l u t i o n := d s o l v e( d i f( Y ( ) , ) = 2 Y ( ) , Y ( ) ) ; 结 果 为 s o l u t i o n : =Y ( ) =一2+2 +e 一 C 1 —
方 程都 可 以利 用初 等 积 分 法 求 解 , 但 是 也 反 映 了微
分方程的相 当一部分 , 因此是微分方程求解 的基础。
在 第一 章第 三 节介 绍微 分方 程 的积分 曲线 , 等倾 线 , 方 向场 等概 念 时 , 对 于初 次 接 触 常 微 分 方程 的学 生 来说 , 几 乎 都不 理解 , 这 也会 影 响学生 的积 极性 和学 习兴趣 。如果将 数 学 软件 Ma p l e应 用 于 教 学 , 就 比 较 形象 和 直观 , 也 便 于 学 生 的 理解 。下 面通 过 一 个
怎样利用Maple对方程进行求解

怎样利用Maple对方程进行求解
Maple的运算功能非常强大,在运算时能够解决各种各样的数学问题,对于一般的函数而言能够解决,同样的,也能够对方程进行求解。
下面介绍Maple求解方程的一些命令。
Maple解方程时经常用到下面几个命令:
solve(方程,未知数);fsolve(方程,未知数,选项);解数值解
选项:plex复数域上求根,2.fulldigits保持精度,3.maxsols=n求n个解,4.范围。
一.一元方程(省略“=”号为=0)
二.方程组
三.数值解
四.多项式分解因式、函数展开、合并、化简、转换:
factor(多项式,k),expand(函数),combine(函数),simplify(表达式),convert(表达式,形式,选项),取分子numer(分式),取分母denom(分式)
以上内容向大家介绍了Maple求解方程的常见命令格式,Maple对于一般的函数和方程都能够进行求解,甚至是复杂的方程也能进行求解,Maple符号计算尤其突出,这方面是所有的计算软件都无法比拟的。
数学软件Maple使用教程

数学软件Maple使⽤教程数学实验数学软件Maple使⽤教程序⾔⼀.什么是数学实验?我们都熟悉物理实验和化学实验,就是利⽤仪器设备,通过实验来了解物理现象、化学物质等的特性。
同样,数学实验也是要通过实验来了解数学问题的特性并解决对应的数学问题。
过去,因为实验设备和实验⼿段的问题,⽆法解决数学上的实验问题,所以,⼀直没有听说过数学实验这个词。
随着计算机的飞速发展,计算速度越来越快,软件功能也越来越强,许多数学问题都可以由计算机代替完成,也为我们⽤实验解决数学问题提供了可能。
数学实验就是以计算机为仪器,以软件为载体,通过实验解决实际中的数学问题。
⼆.常⽤的数学软件⽬前较流⾏的数学软件主要有四种:1.MathACD其优点是许多数学符号键盘化,通过键盘可以直接输⼊数学符号,在教学⽅⾯使⽤起来⾮常⽅便。
缺点是⽬前仅能作数值运算,符号运算功能较弱,输出界⾯不好。
2.Matlab优点是⼤型矩阵运算功能⾮常强,构造个⼈适⽤函数⽅便很⽅便,因此,⾮常适合⼤型⼯程技术中使⽤。
缺点是输出界⾯稍差,符号运算功能也显得弱⼀些。
不过,在这个公司购买了Maple公司的内核以后,符号运算功能已经得到了⼤⼤的加强。
再⼀个缺点就是这个软件太⼤,按现在流⾏的版本5.2,⾃⾝有400多兆,占硬盘空间近1个G,⼀般稍早些的计算机都安装部下。
我们这次没⽤它主要就是这个原因。
3.Mathematica其优点是结构严谨,输出界⾯好,计算功能强,是专业科学技术⼈员所喜爱的数学软件。
缺点是软件本⾝较⼤,⽬前流⾏的3.0版本有200兆;另⼀个缺点就是命令太长,每⼀个命令都要输⼊英⽂全名,因此,需要英语⽔平较⾼。
4.Maple优点是输出界⾯很好,与我们平常书写⼏乎⼀致;还有⼀个最⼤的优点就是它的符号运算功能特别强,这对于既要作数值运算,⼜要作符号运算时就显得⾮常⽅便了。
除此之外,其软件只有30兆,安装也很⽅便(直接拷贝就可以⽤)。
所以,我们把它放到学校⽹上直接调⽤。
第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工具姓名:学号:专业:学科:老师:目录一、简介 (3)概况: (3)Maple 主要技术特征: (3)1. 强大的求解器:数学和分析软件的领导者 (3)2. 技术文件环境:重新定义数学的使用性 (4)3. 知识捕捉:不仅是工具,更是知识 (4)4. 外部程序连接:无缝集成到您现有的工具链中 (4)二、Maple在微分方程中的应用 (5)1、常用函数 (5)1)求解常微分方程的命令dsolve. (5)2)求解一阶线性常微分方程的命令linearsol. (5)3)偏微分方程求解命令pdsolve. (6)2、方法 (6)1)一阶常微分方程的解法 (6)2)二阶线性常微分方程的解法 (7)3、作图 (8)1)常微分方程数值解作图命令odeplot (8)2)偏微分方程作图命令PDEplot (8)三、各种方程的求解 (8)第一部分:一阶常微分方程 (8)1、可分离变量方程 (8)2、齐次方程 (9)3、线性方程 (10)4、Bernoulli方程 (10)第二部分:二阶线性常微分方程 (11)1、二阶常系数线性齐次方程 (11)2、二阶常系数线性非齐次方程 (12)3、Euler方程(变系数) (12)第三部分:偏微分方程 (13)1、波动方程 (13)2、热传导方程 (14)3、作图 (14)四、总结 (15)一、简介概况:Maple是目前世界上最为通用的数学和工程计算软件之一,在数学和科学领域享有盛誉,有“数学家的软件”之称。
Maple 在全球拥有数百万用户,被广泛地应用于科学、工程和教育等领域,用户渗透超过96%的世界主要高校和研究所,超过81%的世界财富五百强企业。
Maple系统内置高级技术解决建模和仿真中的数学问题,包括世界上最强大的的符号计算、无限精度数值计算、创新的互联网连接、强大的4GL语言等,内置超过5000个计算命令,数学和分析功能覆盖几乎所有的数学分支,如微积分、微分方程、特殊函数、线性代数、图像声音处理、统计、动力系统等。
第5章 微分方程(Maple)
第5章微分方程5.1 常微分方程5.1.1 常微分方程的求解和作图命令z 求解微分方程命令dsolve在微分方程中,我们称只有一个自变量的微分方程为常微分方程,具有两个或两个以上自变量的微分方程为偏微分方程。
例如:描述物体冷却过程的数学模型)(0u u k dtdu−−= 含有自变量t 、未知函数u 以及一阶导数dudt,是一个常微分方程。
Maple 中求解常微分方程的命令为dsolve 函数,其用法有dsolve (常微方程)dsolve (常微方程,待解函数,选项)dsolve ({常微方程,初值},待解函数,选项) dsolve ({常微方程组,初值},{待解函数},选项)z 方程数值解作图命令odeplot要做出常微分方程数值解的图象,请使用odeplot 函数。
odeplot 在程序包plots 中,可通过with(plots)或plots[odeplot]调出。
odeplot (数值解,被绘函数,参数范围,选项)5.1.2 一阶常微分方程z 可分离变量方程若一阶微分方程有形式)()(y g x f dxdy=,则称为可分离变量方程。
一般可以通过对方程dx x f y g dy)()(=两边分别积分,得到方程的隐式解。
例:求解微分方程sin()'()sin()x y x y =。
> eq:=diff(y(x),x)=sin(x)/sin(y(x));显然,这是可分离变量的常微分方程。
用Detools 程序包中的odeadvisor 函数检测方程的类型,输出结果_separable 说明方程类型是可分离变量的。
> DEtools[odeadvisor](eq);[_separable]用dsolve 函数求解方程,得到方程的通解。
> dsolve(eq);设定选项implicit ,得到方程的隐式解。
> dsolve(eq,implicit);附加初始值y(0)=1,得到方程的准确解。
maple_chap7
整数解中以下滑线开始的变量可以取任意整数。然后,我们将结果在代入到我们所需要的无量纲量中去:
Maple对于幂的连乘积的化简规则是把相同底数的项合并起来,而在这里,为了得到相互无关的无量纲量,需要将相同指数的项合并起来(因为_N1,_N2,_N3是相互独立的整数)。可以编写一小段程序实现这个功能。我们知道,对连乘积求对数后,原来的指数都变成了对数项的系数,然后,我们就可以用函数collect将相同系数的项合并。最后,再用exp函数获得我们所需要的形式。
在这一章中,我们将学习在Maple中实现的各种求解方程和方程组的方法。再学习方程的精确解法的同时,也将介绍各种数值解法,并通过例子使读者能够快速的掌握它们的用法。对于许多常微分方程(组),Maple都可以显式或隐式地给出它的们解析解。而在Maple中,许多常用的近似解法也都予以了实现,例如级数方法,渐进解法等等。我们还将介绍利用Maple解决一部分偏微分方程问题的方法。
7.3
在数学中,常微分方程是这样定义的,它具有一般形式:F ( y, y', y", ..., y(n), x ) = 0,其中y, y', y", ..., y(n)是一元函数y (x)对其自变量x的各阶导数,F是定义在Rn+2上的实值函数。称该常微分方程为线性的,当且仅当F对其前n+1个变元而言是线性函数,亦即可以表示成为如下的形式:
函数realroot还有一个可选参数,它是用来限制区间的最大长度的,为了保证使用数值求解方法时收敛,我们可以用它限制区间的最大长度。
7.2.2
Maple的函数isolve是用来求解方程或方程组的整数解的,它常常被用来求解不定方程。作为它的一个简单应用,我们来看一个量纲分析的小例子。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Part10:Maple中的微分代数方程求解
西希安工程模拟软件(上海)有限公司,2008
10.0 Maple中的微分方程求解器介绍
Maple中微分方程求解器使用领先的算法求解以下问题:
常微分方程 (ODEs): dsolve 命令用于求解线性和非线性ODEs, 初始值问题 (IVP), 以及边界值问题 (BVP),可以通过参数项选择求符号解 (解析解) 或数值解。
ODE Analyzer Assistant 微分方程分析器助手提供一个交互式用户界面方便用户求解 ODE 以及显示结果的图形。
了解更多信息,参考帮助系统中的 dsolve, dsolve/numeric, 和 ODE Analyzer.
偏微分方程 (PDEs): pdsolve 命令用于求 PDEs 和含边界值问题的 PDEs 的符号解或数值解。
使用Maple的PDE工具可以完成对PDE系统的结构分析和指数降阶处理。
了解更多信息,参考帮助系统中的 pdsolve and pdsolve/numeric.
微分-代数方程 (DAEs): dsolve/numeric 命令是符号-数值混合求解器,使用符号预处理和降阶技术,让Maple能够求解高指数的DAE问题。
Maple内置三个求解器用于处理DAEs:1)修正的 Runge-Kutta Fehlberg 方法,2)Rosenbrock 方法,以及 3)修正的拓展后向差分隐式方法。
10.1 Maple中的微分代数方程(DAEs)
更多亮点:
大部分情况下,通过识别是否存在因变量的纯代数方程,dsolve命令可以判断给定的问题是否是微分代数方程,而不是常微分方程。
如果输入是一个不含有纯代数方程的微分代数方程,使用solve求解时需要用method参数指定对象是一个微分代数方程。
dsolve 有三种数值方法求解DAEs。
默认的 DAE IVP 方法是 modified Runge-Kutta Fehlberg method (rkf45_dae),另两个方法是 rosenbrock_dae 和 Modified Extended Backward-Differentiation Implicit method (mebdfi),可以通过 method 参数项指定。
Maple 的ODE数值求解器和DAE IVP(初值问题)求解器可以处理用户自定义事件。
关于求解DAEs的更多信息,请参考帮助 dsolve/numeric 和 dsolve/numeric/DAE.
(1)
(2)
(4)
(3)
(6)
(5)
在本文中,我们将求解两个DAE问题,第一个问题仅调用 dsolve/numeric 命令,使用默认的 DAE 求解器;第二个问题指定 Mebdfi 方法。
10.1.1 高阶DAEs:笛卡儿坐标下的一个简单的单摆
在这个例子中,我们对建立了笛卡尔坐标系下的单摆模型。
这个问题表示为一个index-3 DAE,我们在 dsolve 命令指定 numeric 参数项。
然后是用 plots[odeplot] 绘制结果的图形。
加载 plots 绘图功能包,
运动方程:
和
是单摆的位置坐标,
是刚性连杆上的压缩力。
DAE系统的指数可以通过对约束方程 (
) 重复求导获得:
(10)
(9)(7)
(8)
最后一个方程中的 的系数是(见 ),这个方程是是一个常微分方程,
DAEs方程组的指数为3。
(对约束方程求导三次后得到常微分方程。
)现在,求解这个方程组,并画出结果的图形:
x, y
1
vx, vy
123
4
(11)
(12)
z
10.1.2 使用指定的方法求解DAE:物体相互作用的范例
这是三个变量的问题,不能使用Maple默认的数值ODE求解器求解,但可以通过指定的
DAE求解器求解。
首先我们使用 PDEtools[declare] 用撇号()显示导数。
上的。
(12)
(13)
10.2 练习
10.3.1 求线性常微分方程的解析解
问题:
求解,初始条件
答案
直接使用鼠标求解。
不要担心结果里面的常数。
可以通过在表达式中定义初始条件 ,重新求解。
solve DE
solve DE
solve DE
solve DE
10.3.2 求解常微分方程组
求解两个二次常微分方程组:和。
答案
首先定义微分方程组:
(16)
(17)
(14)
(18)
(15)
和
的解。
10.3.3 求常微分方程初始值问题的数值解
答案
Solve DE
相关帮助
dsolve , dsolve/numeric , dsolve/numeric/DAE , pdsolve。