Maple6ch41常微分方程共23页Word格式.docx
《Maple6ch41常微分方程共23页Word格式.docx》由会员分享,可在线阅读,更多相关《Maple6ch41常微分方程共23页Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
其中“_a”为积分变量.即解为
最后加入参数“parametric”,可以知道经过一段时段运算后的结果:
sol4:
=dsolve(eq,implicit,y(x),useInt,parametric);
我们惊讶地发现函数没有给出任何结果,这是因为解太复杂了,函数找不到用参数表示的方法。
下面我们用一个比较简单的例子来说明设置参数以后的结果,大家容易从结果中看出表示的方法:
dsolve(diff(y(x),x)=-x/y(x),parametric);
圆曲线上切线的斜率
此为圆的上半圆与下半圆曲线表示式.
dsolve(diff(y(x),x)=-x/y(x),implicit,parametric);
参数式
此为圆曲线的参数式,但并不是常用的
参数式格式.
2.用函数odetest检验常微分方程的解
odetest(sol,ODE);
——y(x)可省略
odetest(sol,ODE,y(x));
——y(x)最好加上
odetest(solsys,sysODE);
——用于方程组
以返回值为“0”给出解为真。
with(DEtools):
odetest(sol1[1],eq,y(x));
sol1[1]是方程的解
odetest(sol1[2],eq,y(x));
sol1[2]是方程的解
odetest(sol1[3],eq,y(x));
sol1[3]是方程的解
odetest(sol2,eq,y(x));
sol2是方程的解
odetest(sol3,eq,y(x));
sol3是方程的解
odetest(sol4,eq,y(x));
sol4不能代入检验
Error,(inodetest)expectingthesecondargumenttobeanODEorasetorlistofODEs.Received:
y(x)
下面验证一个函数是否前面所给方程的解:
y(x)=x^2;
验证y(x)=x^2是否方程的解,这里的y(x)不能赋给
odetest(%,eq);
所给函数y(x)=x^2使方程左端不为0,故不是方程的解
但它是下列方程的解:
=diff(y(x),x)=2*x;
3.用Deplot函数来显示微分方程的解的图像
DEplot(deqns,vars,trange,eqns);
Deplot(deqns,vars,trange,inits,eqns);
其中deqns:
是待求的微分方程或微分方程组,本节中就是指微分方程;
vars:
是一个非独立的变量或变量的集合,如y(x);
trange:
设定变量的取值范围;
eqns是一个等式形式的条件,如:
linecolor=blue(设定图像中线的颜色为蓝的);
stepsize=0.05(变量的取值步长);
inits:
是微分方程的初值条件,如果有多个初值条件,用集合表示,并且每个初值条件都必须用方括号起来,如果不给初始值,函数将等间隔的取最后解中的常数为某值。
请看下面的例子:
DEplot(eq,y(x),x=-10..10,y=0..3,linecolor=blue,stepsize=0.05);
这个例子中没有为微分方程设定初始值,所以函数用一些箭头来表示解的趋势,假如我们设方程的初始值是y(0)=2。
图像将变为:
DEplot(eq,y(x),x=-10..10,[[y(0)=2]],y=0..3,linecolor=blue,stepsize
=0.05);
[[y(0)=2]]这个初始条件也可放在“y=0..3”的后面
图形中的粗线就是满足初始条件的解的图形,假如我们对这个图形是不是刚才求得的解的图形有疑问的话,我们可以用另外一个作图函数contourplot来验证一下,这个函数在plots程序包里:
with(plots):
f:
=sin(x)+1/3*y^3+y:
contourplot(f,x=-10..10,y=-3..3,coloring=[red,blue]);
显然,过y(0)=2这点的图形跟上面图形中篮粗线对应的图形是一样的,说明我们的求解没有错。
如果将这个图的范围适当调整,尽量得到过y(0)=2的那条曲线,显示效果会更好些。
实际上,只要将作图中y的范围改为-2.55~2.55即可达到目的.
4.用各种特定函数求解各种微分方程——P176
odeadvisor(ODE);
在Detools程序包中
这是一个判断微分方程类型的函数,可用来判分离变量、一阶线性、全微分方程还是普通方程。
最常见的返回参数和中文含义如下:
separable可分离变量方程,用separablesol(lode,v)求解,其中v为未知函数
linear线性方程,用linearsol(lode,v)
homogeneous齐次型方程,用homogeneous(lode,v)
bernoulli贝努里
exact全微分方程
Abel阿贝尔方程
Quadrature积分形式的微分方程(如dy=xdx),是可离变量方程中最简单的
(1)可分离变量的方程
解:
(Maple-lx4-解法参考)
=x*y(x)*(1-x*diff(y(x),x))=x+y(x)*diff(y(x),x);
调用程序包
odeadvisor(eq);
判断方程类型
方程为可分离变量的方程
separablesol(eq,y(x));
用程序包中的分离变量法求解
法2:
仍用dsolve求解:
dsolve(eq,explicit);
用通用函数求解.接上方程,结果与上法相同
法3:
将方程改为
求隐式解:
diffy:
diffy'
初始化变量,这步一要定做
diffy=solve(eq,diff(y(x),x));
解出y的导数
f'
g:
g'
=x->
x/(x^2+1);
g:
=y->
y/(y-1);
构造函数f(x),g(y)
这里的y视为单变量,不要写成y(x)
RHS:
=int(g(y),y);
LHS:
=int(f(x),x);
赋表达式分别得左、右两端
LHS=RHS+C;
给出隐式解
solve(%,y);
求出显式解
(2)齐次型的方程
解(Maple-lx4-1)
法1:
(按齐次方程专用求解函数求解)
;
=diff(y(x),x)=y(x)/x+tan(y(x)/x);
调程序包
判断类型
齐次型方程的A种,是一阶、线性对称方程
genhomosol(eq);
用齐次方程的求解函数求解,得以下两个通解
用通用函数求解:
按解齐次型方程的求解方法求解:
y:
y'
x:
x'
u:
u'
如果不是新打开的Maple工作窗口,最好要这一步
=u*x:
one:
=expand(eq);
试将方程中“y/x”直接换成u后给出新方程
two:
=subs(diff(x(x),x)=1,x(x)=x,one);
简化方程
diffu:
=solve(two,diff(u(x),x));
化为可分离变量的方程
left:
=int(1/tan(u),u);
right:
=int(1/x,x);
按可分离变量方法求
解,这里的u不能写成u(x),因为要把它当单变量进行积分
初始化变量y,此前它是”ux”
subs(u=y/x,left)=right+_C1;
这一结果与前的解仅在于任意常数的写法上不同而已.
法4:
本人的解法——化为分离变量方程的求解函数进行求解:
y(x):
y(x)'
u(x):
u(x)'
=u(x)*x:
注意函数关系,如果用y=ux或(x)=u*x,得不到下面的形式
eq1:
=subs(y(x)/x=u(x),eq);
替换完毕,再对方程化简
上式两端可不再化简,解过程用时相近
separablesol(eq1,u(x));
用分离变量法函数求解方程,得两个同样的通解
a:
=subs(u(x)=y/x,%);
换回原变量,如果不将两个通解赋值给集合a,就不能用“solve”对集合中的两个非方程组的函数关于同一变量求解
y1:
=solve(op(1,a),y);
y2:
=solve(op(2,a),y);
给出两个显式解
上面用了提出集合元素的函数“op”,参第一章“1.1.3集合”.也可用分离方程中变量的函数isolate,执行“isolate(op(1,a),y);
”得到第一个通解中的y的表达式.请试之.
Ex.2’解齐次型(C)的微分方程
答案:
解(Maple-lx4-2)
也可以用通用求解函数dsolve()求解.这里选用求齐次型方程的求解函数进行求解:
=diff(y(x),x)=(x-y(x)+1)/(x+y(x)-2);
=genhomosol(eq);
用齐次型方程的求解函数求解,解用集合表示,其解需要
按元素取出使用,为此,将解赋给集合“a”
由于x与y的隐式关系很简单,而这里的显示结果即较为复杂,为此,如以下化简:
subs(_C1=C,a[1]):
subs(y(x)=z,a[1]):
subs(_C1=C,%);
替换
map(simplify,%);
对上式两端化简。
因为上式根号中的内容计算机不认识,现在认识的是它的如下根式中的化简结果,所以,要想解出根式下面的表达式,要先化简
isolate(%,8*C^2*x^2-8*C^2*x+2*C^2+1);
解出根式下面的表达式
simplify((lhs(%)-rhs(%)))=0;
取出上式的左右两端作差的方程,
目的是消去相同项
sort(%,z);
对变量z按降幂排此代数方程的两端
simplify((lhs(%)+14*C^2-1))=-4*C^2*_C1;
用solve解出后两项行吗?
factor(%)/(-4*C^2);
先分解因式,再除以分母才可以得到下面的结果
subs(z=y,%):
注:
这个结果用通用求解函数也不能简单给出,而是给出
dsolve(eq,implicit);
问题:
试将此结果化为如上多项式形式的“标准”答案。
(3)一阶线性方程
Ex.3解一阶线性微分方程
解(Maple-lx4-3)
=diff(y(x),x)+y(x)/x=sin(x)/x;
(用通用函数求解,解出后的检验略)
dsolve(eq);
(用特定求解方程的函数求解,解出后的检验略)
linearsol(eq);
(用
的通解公式
求解)
P(x):
=1/x;
Q(x):
=sin(x)/x;
y(x)=exp(-int(P(x),x))*(int(Q(x)*exp(int(P(x),x)),x)+C);
(4)贝努里方程
Ex.4解贝努里微分方程
解(Maple-lx4-4)
restart;
=diff(y(x),x)=6*y(x)/x-x*y(x)^2;
(用通用函数求解)
用通用函数求解
(按贝努里方程专用求解函数求解)
bernoullisol(eq);
(按解贝努里方程的推导方法求解)
=subs(y(x)=1/z(x),eq);
odeadvisor(eq1,z(x));
simplify(%);
如用通用函数或专用求解函数求解,这步不需要
factor(%)*(-z(x)^2);
如用通用函数或专用求解函数求解,这步不需要
linearsol(%);
上面已经判断为线性方程,就可用线性方程专用求解函数
subs(z(x)=1/y(x),%);
solve(%,y(x));
也可用simplify(%)
(5)全微分方程
解(Maple-lx4-4)
=diff(y(x),x)=(2+y(x)*exp(x*y(x)))/(2*y(x)
-x*exp(x*y(x)));
(用通用求解函数求解)
eq1'
=(2*y(x)-x*exp(x*y(x)))*diff(y(x),x)=2+y(x)*exp(x
*y(x));
=dsolve(eq);
系统用隐式给出了通解
odetest(sol1,eq);
验隐式解是正确的
要求给出显式解
odetest(sol2,eq);
验显式解是正确的
(用专用求解函数求解)
odeadvisor(eq,y(x));
判断方程类型(给出结果不知是何类型
但从原方程观察应为全微分方程(exact))
odeadvisor(eq1,y(x));
转换成“eq1”判断为全微分方程(是否都需这样转化)
exactsol(eq1);
用全微分方程的专用求解函数求解
(按全微分方程的求解步骤进行求解)
M:
M'
N:
N'
=(x,y)->
2+y*exp(x*y);
-(2*y-x*exp(x*y));
eq2:
eq2'
=M(x,y(x))+N(x,y(x))*diff(y(x),x)=0;
化为M(x,y)dx+N(x,y)dy=0格式
testeq(diff(N(x,y),x),diff(M(x,y),y));
方程为全微分方程的充要条件是
exactsol(eq2);
方程的隐式解为
Ex.5’
解(Maple-lx4-6)
要求:
用3~4种方法给出通解,并将答案化成下式。
答案:
(6)高阶常系数线性(非)齐次微分方程——Maple:
P188~193
(7)级数解(默认为5阶展式)——Maple:
P193~195——dsolve(ODE,y(x),
4.1.2常微分方程组的解析解
求解函数与求解常微分方程所用的函数一样,它的参数形式如下:
dsolve({sysODE,Ics},{func},extra_args);
其中各参数的意义如下:
sysODE方程组的集合
Ics初始条件的集合
Func待求的函数集合
Exgra_args设置解的形式
解
sysOde:
sysOde'
={D(x)(t)=x(t)+y(t)+exp(-t),D(y)(t)=y(t)};
dsolve(sysOde,{x(t),y(t)});
={D(x)(t)=y(t)-z(t),D(y)(t)=z(t),D(z)(t)=y(t)};
dsolve(sysOde,{x(t),y(t),z(t)},implicit);
odetest(%,sysOde);
验法1
=dsolve(sysOde,{x(t),y(t),z(t)});
验法2
odetest(a,sysOde);
4.1.3常微分方程定解问题的求解
很多时候求定解问题是先求出通解,再求定解。
但用Maple在大多数情形下可直接求解。
所用求解函数仍是dsolve:
dsolve({ODE,ICs},y(x),extra_args);
dsolve({sysODE,sysICs},{func},extra_args);
注意:
在使用上面第二个命令求方程组定解问题时,“sysODE,sysICs”的内容都要以元素给出,而不能用子集合分别给出“sysODE”、“sysICs”。
1.一个方程的定解问题
(一阶方程的定解问题)
=D(y)(x)+4*x*y(x)/(x^2-1)=x*sqrt(y(x));
简化方程再求解
=dsolve({eq,y(0)=4},y(x));
给出含RootOf(查帮助)的解
=allvalues(sol1);
将RootOf表达的解化为常见式
(隐式解可以避开RootOf函数,但解过程稍复杂)
=dsolve(eq,y(x),implicit);
求隐式解
isolate(subs(x=0,y(0)=4,sol2),_C1);
确定任意常数_C1
isolate(subs(_C1=-2,sol2),y(x));
将任意常数_C1代入解sol2中
(高阶方程的定解问题)
=diff(x(t),t,t)-2*diff(x(t),t)+x(t)=4*t*exp(t);
dsolve({eq,x(0)=2,D(x)(0)=2},x(t));
2.方程组的定解问题
(方程组的定解问题)
dsolve({sysOde[1],sysOde[2],x(0)=0,y(0)=0},{x(t),y(t)});
4.1.4常微分方程的数值解
除了上面介绍的几种特殊的常微方程以外,大部分常微方程都很难求解析解,如下面这个简单的一阶方程:
={D(y)(x)=cos(x*y(x))};
dsolve(eq,y(x));
经过一段时间的计算后,给出空解
这个时候我们就得用数值方法得到微分方程的数值解,所求函数可以是
dsolve(deqns,vars,numeric)
dsolve(deqns,vars,numeric,options)
dsolve(deqns,vars,type=numeric)
dsolve(deqns,vars,type=numeric,options)
其中:
deqns是待求微分方程或方程组和初始值的集合
vars是待求的微分方程中的待求函数
numeric或type=numeric设置函数求出方程的数值解而不是解析解
options设置函数求解的各种设置,是一个可选参数,看帮助,这节经常用到的是output=listprocedure,value=[a1,a2,…,an],ai表示待求的数值点的自变量的值,前者表示让dsolve函数以列表加过程的方式输出,而后者则让函数输出给定的几个点的函数值,对这两者的理解参下例:
法1(希望将解以过程表示时,然后随机求值,则用:
)
=D(y)(x)=cos(x*y(x));
=dsolve({eq,y(0)=2},y(x),type=numeric,output=
listprocedure);
s:
=[1,2,3,4,5];
接下来再随机求值
map(g,s);
“map”的用法
先解出过程的好处在于还可以观察解的基本形状,
plot('
rhs(g(x)[2])'
x=-10..10);
对每个x的值,用上面的过程解g
的表达式算出相应的g(x)值
在上面的命令中,g(x)是一个列表,里面每个元素都是自变量x的取值表达式和其对应的应变量y的取值表达式构成的,而画图时只需第二个表达式的右端的值,故用“rhs(g(x)[2])”来取列表的每个元素的第二个表达式的值.
法2(如果只想知道后面的结果:
=D(y)(x)=cos(x*y(x))