Maple-ch-常微分方程

Maple-ch-常微分方程
Maple-ch-常微分方程

1 / 20

第四章 微分方程

§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”表示第一个任意常数。方程的解是很恐怖的解,这里仅给出了一个解,另

2 / 20

外还有两个更长的解,读者可以在Maple 下执行上面求解过程观察到另外两个解的全貌。这是由于将解转换成显函数造成的,假如我们将参数进行改善:

> sol2:=dsolve(eq,implicit,y(x)); 给出隐式解,式中的y(x)可省略

:= sol2 = + + + ()sin x ()y x 1

()y x 3_C10

再加上一个参数“useInt ”,可以明显感到运算速度非常快,因此,它在求解过程中积分比较复杂时很有用,同时还能使解过程、解结果给出较多的信息: > sol3:=dsolve(eq,implicit,y(x),useInt);

:= sol3 = - + d ???()cos x x d ??

??

()

y x - - 1_a 2_a _C10

其中“_a ”为积分变量.即解为.0)1(cos 2=+---

?

?C dt t xdx y

a

最后加入参数“parametric ”,可以知道经过一段时段运算后的结果: > sol4:=dsolve(eq,implicit,y(x),useInt,parametric);

:= sol4

我们惊讶地发现函数没有给出任何结果,这是因为解太复杂了,函数找不到用参数表示的方法。

下面我们用一个比较简单的例子来说明设置参数以后的结果,大家容易从结果中看出表示的方法:

>dsolve(diff(y(x),x)=-x/y(x), parametric); 圆曲线上切线的斜率

, = ()y x - + x 2_C1 = ()y x -- + x 2_C1

此为圆的上半圆与下半圆曲线表示式.

> dsolve(diff(y(x),x)=-x/y(x),implicit, parametric); 参数式

??????

??, = ()x _T -_T _C1 + 1_T 2 = ()y _T _C1 + 1_T 2

此为圆曲线的参数式,但并不是常用的t a y t a x sin ,cos ==参数式格式. 2. 用函数odetest 检验常微分方程的解

odetest(sol,ODE); ——y(x)可省略 odetest(sol,ODE,y(x));——y(x)最好加上 odetest(solsys,sysODE);——用于方程组

以返回值为“0”给出解为真。 > with(DEtools):

3 / 20

> 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, (in odetest) expecting the second argument to be an ODE or a set or list of ODEs. Received: y(x)

下面验证一个函数是否前面所给方程的解:

> y(x)=x^2; 验证y(x)=x^2是否方程的解,这里的y(x)不能赋给

= ()y x x 2

> odetest(%,eq); 所给函数y(x)=x^2使方程左端不为0,故不是方程的解

+ + 2x 2x 5()cos x

但它是下列方程的解:

> eq:='eq': eq:=diff(y(x),x)=2*x;

:= eq = ?

()y x 2x

> y(x)=x^2;

= ()y x x 2

> odetest(%,eq);

3.用Deplot 函数来显示微分方程的解的图像

DEplot(deqns,vars,trange,eqns); Deplot(deqns,vars,trange,inits, eqns);

其中 deqns :是待求的微分方程或微分方程组,本节中就是指微分方程;

vars :是一个非独立的变量或变量的集合,如y(x);

trange :设定变量的取值范围;eqns 是一个等式形式的条件,如:

linecolor=blue(设定图像中线的颜色为蓝的);

4 / 20

stepsize=0.05(变量的取值步长);

inits :是微分方程的初值条件,如果有多个初值条件,用集合表示,并且每个初

值条件都必须用方括号起来,如果不给初始值,函数将等间隔的取最后解中的常数为某值。请看下面的例子:

> with(DEtools):

> eq:='eq': eq:=diff(y(x),x)*(1+y(x)^2)+cos(x)=0;

:= eq = + ?? ??

????x ()y x () + 1()y x 2()cos x 0 > 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):

5 / 20

> 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)可分离变量的方程

.)1( Ex.1y y x y x xy '+='-解可分离变量方程

解:(Maple-lx4-解法参考) > eq:='eq':

> eq:=x*y(x)*(1-x*diff(y(x),x))=x+y(x)*diff(y(x),x);

:= eq = x ()y x ?? ???? - 1x ?? ??????x ()y x + x ()y x ?? ??

????x ()y x > with(DEtools): 调用程序包

6 / 20

> odeadvisor(eq); 判断方程类型

[]_separable 方程为可分离变量的方程

> separablesol(eq,y(x)); 用程序包中的分离变量法求解

{} = ()y x + ()LambertW + x 21_C1e

()

-11

法2: 仍用dsolve 求解:

> dsolve(eq,explicit); 用通用函数求解.接上方程,结果与上法相同

= ()y x + ()LambertW + x 21_C1e

()

-11

法3: 将方程改为

C dx x f dy y g y g x f dx dy +==??)()(,)

()(再利用求隐式解: > diffy:='diffy': 初始化变量,这步一要定做 > diffy=solve(eq,diff(y(x),x)); 解出y 的导数

=

diffy x ()

- ()y x 1()y x ()

+ x 2

1 > f:='f': g:='g':

> f:=x->x/(x^2+1);g:=y->y/(y-1); 构造函数f(x),g(y)

:= f →

x x

+ x 2

1

:= g →

y y

这里的y 视为单变量,不要写成y(x)

> RHS:=int(g(y),y);LHS:=int(f(x),x); 赋表达式分别得左、右两端

:= RHS + y ()ln - y 1

:= LHS 1

2

()ln + x 21

> LHS=RHS+C; 给出隐式解

= 1

2

()ln + x 21 + + y ()ln - y 1C > solve(%,y); 求出显式解

+ ()LambertW e

()

- - /12()ln + x 2

11C 1

7 / 20

(2)齐次型的方程

.tan Ex.2的通解求齐次型方程x

y

x y y +=

' 解 (Maple-lx4-1)

法1: (按齐次方程专用求解函数求解) > eq:='eq';

:= eq eq

> eq:=diff(y(x),x)=y(x)/x+tan(y(x)/x);

:= eq = ??x ()y x + ()y x x ?? ??

??tan ()y x x > with(DEtools): 调程序包 > odeadvisor(eq); 判断类型

[],,[],_homogeneous class A [],_1st_order _with_linear_symmetries _dAlembert

齐次型方程的A 种,是一阶、线性对称方程

> genhomosol(eq); 用齐次方程的求解函数求解,得以下两个通解

{}, = ()y x ??

?????arctan -()- + 1_C1x 2_C1x - + 1_C1x 2x = ()y x -?? ??

???arctan -()- + 1_C1x 2_C1x - + 1_C1x 2x 法2: 用通用函数求解:

> dsolve(eq,explicit);

, = ()y x ?? ?????arctan -()- + 1_C1x 2_C1x - + 1_C1x 2x = ()y x -?? ?

?

???arctan -()- + 1_C1x 2_C1x - + 1_C1x 2x

法3: 按解齐次型方程的求解方法求解:

> y:='y':x:='x':u:='u': 如果不是新打开的Maple 工作窗口,最好要这一步 > y:=u*x:

> one:=expand(eq); 试将方程中“y/x”直接换成u 后给出新方程

:= one = + ?? ??????x ()u x ()x x ()u x ?? ??????x ()x x + ()u x ()x x x ?? ??

??tan ()u x ()x x x > two:=subs(diff(x(x),x)=1,x(x)=x,one); 简化方程

:= two = + ?? ??

????x ()u x x ()u x + ()u x ()tan ()u x

8 / 20

> diffu:=solve(two,diff(u(x),x)); 化为可分离变量的方程

:=

diffu ()

tan ()u x x

> left:=int(1/tan(u),u);right:=int(1/x,x); 按可分离变量方法求

解,这里的u 不能写成u(x),因为要把它当单变量进行积分

:= left - ()ln ()tan u 1

2

()ln + 1()tan u 2

:= right ()ln x

> y:='y': 初始化变量y,此前它是”ux” > subs(u=y/x,left)=right+_C1;

= - ?? ????ln ?? ????tan y x 12?? ??

???

ln + 1?? ????tan y x 2

+ ()ln x _C1 > solve(%,y);

,??

??????arctan -()- + 1e

()

2_C1x 2e

()

2_C1x - + 1e

()

2_C1x 2

x -??

??

?

???arctan -()- + 1e

()

2_C1x 2e

()

2_C1x - + 1e

()

2_C1x 2

x 这一结果与前的解仅在于任意常数的写法上不同而已.

法4: 本人的解法——化为分离变量方程的求解函数进行求解:

> y(x):='y(x)':x:='x':u(x):='u(x)':

> y(x):=u(x)*x: 注意函数关系,如果用y=ux 或(x)=u*x,得不到下面的形式

> eq1:=subs(y(x)/x=u(x),eq); 替换完毕,再对方程化简

:= eq1 = + ?? ??????x ()u x x ()u x + ()u x ()tan ()u x

上式两端可不再化简,解过程用时相近

> separablesol(eq1,u(x)); 用分离变量法函数求解方程,得两个同样的通解

{}, = ()u x ?? ?????arctan () - 1_C1x 2_C1x - + 1_C1x 2 = ()u x -?? ??

???arctan () - 1_C1x 2_C1x - + 1_C1x 2 > a:=subs(u(x)=y/x,%); 换回原变量,如果不将两个通解赋值给集合a,就不能用“solve ”对集合中的两个非方程组的函数关于同一变量求解

9 / 20

:= a {}, = y ?? ?????arctan -()- + 1_C1x 2_C1x - + 1_C1x 2 = y -?? ??

???arctan -()- + 1_C1x 2_C1x - + 1_C1x 2 > y1:=solve(op(1,a),y);y2:=solve(op(2,a),y); 给出两个显式解

:= y1?? ?

????arctan -()- + 1_C1x 2_C1x - + 1_C1x 2x := y2-??

??

???arctan -()- + 1_C1x 2_C1x - + 1_C1x 2x 上面用了提出集合元素的函数“op ”,参第一章“1.1.3 集合”. 也可用分离方程中变量的函数isolate,执行“isolate(op(1,a),y);”得到第一个通解中的y 的表达式.请试之.

Ex.2’ 解齐次型(C )的微分方程.3

1-++-=

'y x y x y 答案: = - + - - y 24y 2x y 2x x 2

C

解 (Maple-lx4-2) .,)(2

22111解读者可比照固定方法求有固定的解法对准齐次型方程

c y b x a c y b x a f dx dy

++++=也可以用通用求解函数dsolve()求解.这里选用求齐次型方程的求解函数进行求解: > eq:='eq':

> eq:=diff(y(x),x)=(x-y(x)+1)/(x+y(x)-2);

:= eq = ??x ()y x - + x ()y x 1 + - x ()y x 2

> with(DEtools):

> a:=genhomosol(eq); 用齐次型方程的求解函数求解,解用集合表示,其解需

按元素取出使用,为此,将解赋给集合“a ”

:= a {} = ()y x - 31 + () - 2x 1_C1 + 2() - 2x 12_C121

由于x 与y 的隐式关系很简单,而这里的显示结果即较为复杂,为此,如以下化简:

> subs(_C1=C,a[1]):subs(y(x)=z,a[1]):subs(_C1=C,%); 替换

= z - 3212 + () - 2x 1C + 2() - 2x 12C 21C

10 / 20

> map(simplify,%); 对上式两端化简。因为上式根号中的内容计算机不认

识,现在认识的是它的如下根式中的化简结果,所以,要想解出根式下面的表达式,要先化简

= z -12- + + 4C 2C x - + + 8x 2C 28x C 22C 21C

> isolate(%,8*C^2*x^2-8*C^2*x+2*C^2+1); 解出根式下面的表达式

= - + + 8x 2C 28x C 22C 21()- + - 2z C 4C 2C x 2

> simplify((lhs(%)-rhs(%)))=0; 取出上式的左右两端作差的方程,

目的是消去相同项

= - + - + + - + 4C 2z 216C 2z 8x C 2z 8x C 24x 2C 214C 210

> sort(%,z); 对变量z 按降幂排此代数方程的两端

= - + - + + - + 4C 2z 216C 2z 8x C 2z 8x C 24x 2C 214C 210

> simplify((lhs(%)+14*C^2-1))=-4*C^2*_C1; 用solve 解出后两项行吗?

= - + - + + 4C 2z 216C 2z 8x C 2z 8x C 24x 2C 2-4C 2_C1

> factor(%)/(-4*C^2); 先分解因式,再除以分母才可以得到下面的结果

= - + - - z 24z 2x z 2x x 2_C1

> subs(z=y,%):subs(_C1=C,%);

= - + - - y 24y 2x y 2x x 2C

注: 这个结果用通用求解函数也不能简单给出,而是给出

> dsolve(eq,implicit);

= - - - 12?? ?

?

???ln - - + () - 2x 122()- + 2()y x 3() - 2x 1()- + 2()y x 32() - 2x 12()ln - 2x 1_C10 问题: 试将此结果化为如上多项式形式的“标准”答案。

(3)一阶线性方程

Ex. 3 解一阶线性微分方程.sin x

x x y y =+

' 答案: 解 (Maple-lx4-3)

11 / 20

> eq:='eq':

> eq:=diff(y(x),x)+y(x)/x=sin(x)/x;

:= eq = + ?? ??

????x ()y x ()y x x ()sin x x 法1: (用通用函数求解,解出后的检验略)

> dsolve(eq);

=

()y x - + ()cos x _C1

x

法2: (用特定求解方程的函数求解,解出后的检验略) > with(DEtools): > linearsol(eq);

{} =

()y x - + ()cos x _C1

x

法3: (用)()(x Q y x P y =+'的通解公式??????+??=?--C dx e x Q e y dx

x P dx x P )()()(求解) > P(x):=1/x;Q(x):=sin(x)/x;

:= ()P x 1

x

:= ()Q x ()

sin x

> y(x)=exp(-int(P(x),x))*(int(Q(x)*exp(int(P(x),x)),x)+C);

= ()y x - + ()cos x C x

(4) 贝努里方程

Ex. 4 解贝努里微分方程.62xy x

y y -='

解(Maple-lx4-4) > restart; > eq:='eq':

> eq:=diff(y(x),x)=6*y(x)/x-x*y(x)^2;

:= eq = ??x ()y x - 6()y x x

x ()y x 2

法1:(用通用函数求解)

> dsolve(eq); 用通用函数求解

12 / 20

= ()y x 8x 6

+ x 88_C1

法2: (按贝努里方程专用求解函数求解) > with(DEtools):

> bernoullisol(eq);

{} = ()y x 8x 6

+ x 88_C1

法3: (按解贝努里方程的推导方法求解) > eq1:=subs(y(x)=1/z(x),eq);

:= eq1 = ??x 1()z x -

61()z x x x

()z x 2

> with(DEtools):

> odeadvisor(eq1,z(x));

[]_linear

> simplify(%); 如用通用函数或专用求解函数求解,这步不需要

= -??

x ()z x ()z x 2 - 6()z x x 2

()z x 2

x

> factor(%)*(-z(x)^2); 如用通用函数或专用求解函数求解,这步不需要

= ??x ()z x - + 6()z x x 2x

> linearsol(%); 上面已经判断为线性方程,就可用线性方程专用求解函数

??

?????????????? = ()z x + 18x 8_C1x 6 > subs(z(x)=1/y(x),%);

??????????

?????? = 1()y x + 18x 8_C1x 6

13 / 20

> solve(%,y(x)); 也可用simplify(%)

{} = ()y x 8x 6

+ x 88_C1

(5) 全微分方程

.22Ex.5的通解求xy

xy

xe y ye y -+='

解 (Maple-lx4-4) > restart; > eq:='eq':

> eq:=diff(y(x),x)=(2+y(x)*exp(x*y(x)))/(2*y(x)

-x*exp(x*y(x)));

:= eq = ??x ()y x + 2()y x e ()

x ()y x - 2()y x x e

()x ()y x 法1:(用通用求解函数求解) > eq1:='eq1':

> eq1:=(2*y(x)-x*exp(x*y(x)))*diff(y(x),x)=2+y(x)*exp(x

*y(x));

:= eq1 = () - 2()y x x e

()

x ()y x ?? ??

???()y x + 2()y x e ()x ()y x > with(DEtools):

> sol1:=dsolve(eq); 系统用隐式给出了通解

:= sol1 = - - + + 2x e ()

x ()y x ()y x 2_C10

> odetest(sol1,eq); 验隐式解是正确的 0

> sol2:=dsolve(eq,explicit); 要求给出显式解

:= sol2 = ()y x ()RootOf - - + + 2x e ()

x _Z _Z 2_C1

> odetest(sol2,eq); 验显式解是正确的

14 / 20

法2: (用专用求解函数求解)

> odeadvisor(eq,y(x)); 判断方程类型(给出结果不知是何类型

但从原方程观察应为全微分方程

(exact))

[]y=_G(x,y')

> odeadvisor(eq1,y(x)); 转换成“eq1”判断为全微分方程(是否都需这样转化)

[]_exact

> exactsol(eq1); 用全微分方程的专用求解函数求解

{} = - - + + 2x e

()

x ()y x ()y x 2_C10

法3:(按全微分方程的求解步骤进行求解) > M:='M':N:='N':

> M:=(x,y)->2+y*exp(x*y);N:=(x,y)->-(2*y-x*exp(x*y));

:= M → (),x y + 2y e

()

y x := N → (),x y - + 2y x e

()

y x

> eq2:='eq2':

> eq2:=M(x,y(x))+N(x,y(x))*diff(y(x),x)=0;

化为M(x,y)dx+N(x,y)dy=0格

:= eq2 = + + 2()y x e

()

x ()y x ()- + 2()y x x e

()

x ()y x ?? ??

????x ()y x 0 > testeq(diff(N(x,y),x),diff(M(x,y),y));

方程为全微分方程的充要条件是

y

M

x N ??=?? true

> exactsol(eq2); 方程的隐式解为

{} = + - + 2x e

()

x ()y x ()y x 2_C10

Ex.5’ .0)1

()1(cos 2

=-

++dy y x

y

dx y

x 解 (Maple-lx4-6)

15 / 20

.0)1()1(cos 2=-++

dy y

x

y dx y x 要求: 用3~4种方法给出通解,并将答案化成下式。

答案:.||ln sin ln sin C y x

y x C y x y x =++=++或

(6) 高阶常系数线性(非)齐次微分方程——M aple: P188~193

(7) 级数解(默认为5阶展式)——M aple: P193~195——dsolve(ODE,y(x),

4.1.1 常微分方程的解析解 4.1.2 常微分方程组的解析解

求解函数与求解常微分方程所用的函数一样,它的参数形式如下:

dsolve({sysODE,Ics},{func},extra_args);

其中各参数的意义如下:

sysODE 方程组的集合 Ics 初始条件的集合 Func 待求的函数集合 Exgra_args 设置解的形式 .1-4.1.2 Ex.的解析解求??????

?=++=y dt

dy e y x dt

dx

t

> sysOde:='sysOde':

> sysOde:={D(x)(t)=x(t)+y(t)+exp(-t),D(y)(t)=y(t)};

:= sysOde {}, = ()()D x t + + ()x t ()y t e

()

-t = ()()D y t ()y t

> dsolve(sysOde,{x(t),y(t)});

{}, = ()y t _C2e t = ()x t - + e t _C2t 1e ()

-t e t _C1

16 / 20

.2-4.1.2 Ex.的解析解求????

?????==-=y dt dz z dt dy

z y dt dx

> sysOde:='sysOde':

> sysOde:={D(x)(t)=y(t)-z(t),D(y)(t)=z(t),D(z)(t)=y(t)};

:= sysOde {},, = ()()D x t - ()y t ()z t = ()()D z t ()y t = ()()D y t ()z t

> dsolve(sysOde,{x(t),y(t),z(t)},implicit);

{},, = ()z t - _C2e t _C3e ()

-t = ()x t - + 2_C3e

()

-t _C1 = ()y t + _C2e t _C3e

()

-t

> odetest(%,sysOde); 验法1 {}0

> a:=dsolve(sysOde,{x(t),y(t),z(t)}); 验法2

:= a {},, = ()z t - _C2e t _C3e

()

-t = ()x t - + 2_C3e

()

-t _C1 = ()y t + _C2e t _C3e

()

-t

> odetest(a,sysOde);

{}0

4.1.3 常微分方程定解问题的求解

很多时候求定解问题是先求出通解,再求定解。但用Maple 在大多数情形下可直接求解。所用求解函数仍是dsolve:

dsolve({ODE,ICs},y(x),extra_args);

dsolve({sysODE,sysICs},{func},extra_args);

注意: 在使用上面第二个命令求方程组定解问题时,“sysODE,sysICs ”的内容都要以元

素给出,而不能用子集合分别给出“sysODE ”、“sysICs ”。

1. 一个方程的定解问题 .4)0(,1

411-4.1.3 Ex.2

==-+

'y x y x x

y y 求定解问题

解: (一阶方程的定解问题)

17 / 20

> restart; > eq:='eq':

> eq:=D(y)(x)+4*x*y(x)/(x^2-1)=x*sqrt(y(x)); 简化方程再求解

:= eq = +

()()D y x 4x ()

y x - x 2

1

x ()y x > sol1:=dsolve({eq,y(0)=4},y(x)); 给出含RootOf (查帮助)的解

:= sol1 = ()y x ()RootOf

- - + + 8_Z x 28_Z x 42x 216 > sol1:=allvalues(sol1); 将RootOf 表达的解化为常见式

:= sol1 = ()y x 164

()

- + - 16x 42x 2

2

()

- x 212 法2: (隐式解可以避开RootOf 函数,但解过程稍复杂)

> sol2:=dsolve(eq,y(x),implicit); 求隐式解

:= sol2 = - ()y x - + 18x 414

x 2

_C1 - x 2

1

0 > isolate(subs(x=0,y(0)=4,sol2),_C1); 确定任意常数_C1

= _C1-4

> simplify(%);

= _C1-2

> isolate(subs(_C1=-2,sol2),y(x)); 将任意常数_C1代入解sol2中

= ()y x ?? ???? - - 18x 414x 222

()

- x 212

.2)0(,2)0(,222-4.1.3 Ex.22='==+-x x te x dt dx

dt

x d t 求定解问题

解: (高阶方程的定解问题) > restart;

> eq:='eq':

> eq:=diff(x(t),t,t)-2*diff(x(t),t)+x(t)=4*t*exp(t);

18 / 20

:= eq = - + ?? ??

?????2t 2()x t 2?? ??????t ()x t ()x t 4t e t > dsolve({eq,x(0)=2,D(x)(0)=2},x(t));

= ()x t + 2

3

t 3e t 2e t

2.方程组的定解问题

.1)0(1)0(,3-4.1.3 Ex.的解析解求???==???????=++=y x y dt

dy e y x dt

dx

t

解: (方程组的定解问题)

> sysOde:='sysOde':

> sysOde:={D(x)(t)=x(t)+y(t)+exp(-t),D(y)(t)=y(t)};

:= sysOde {}, = ()()D x t + + ()x t ()y t e

()

-t = ()()D y t ()y t

> dsolve({sysOde[1],sysOde[2],x(0)=0,y(0)=0},{x(t),y(t)});

{}, = ()y t 0 = ()x t - + 1e ()-t 1e t

4.1.4 常微分方程的数值解

除了上面介绍的几种特殊的常微方程以外,大部分常微方程都很难求解析解,如下面

这个简单的一阶方程:

.cos xy dt

dx

= > eq:='eq':

> eq:={D(y)(x)=cos(x*y(x))};

:= eq {} = ()()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) 其中:

19 / 20

deqns 是待求微分方程或方程组和初始值的集合 vars 是待求的微分方程中的待求函数

numeric 或type=numeric 设置函数求出方程的数值解而不是解析解

options 设置函数求解的各种设置,是一个可选参数,看帮助,这节经常用到的是output=listprocedure, value=[a 1, a 2, …,a n ],a i 表示待求的数值点的自变量的值,前者表示让dsolve 函数以列表加过程的方式输出,而后者则让函数输出给定的几个点的函数值,对这两者的理解参下例:

.5,4,3,2,12)0(,cos 1-4.1.4 Ex.的值处在点求

y x y xy dt

dx

=== 解

法1 (希望将解以过程表示时,然后随机求值,则用:) > eq:='eq':

> eq:=D(y)(x)=cos(x*y(x));

:= eq = ()()D y x ()cos x ()y x

> g:='g':

> g:=dsolve({eq,y(0)=2},y(x),type=numeric,output=

listprocedure);

:= g [], = x ()proc () ... end proc x = ()y x ()proc () ... end proc x

> s:=[1,2,3,4,5]; 接下来再随机求值

:= s [],,,,12345

> map(g,s); “map ”的用法

[], = ()x 11 = ()()y x 1 2.29315655054552536,

[[], = ()x 22 = ()()y x 2 1.39327424171786984,[], = ()x 33 = ()()y x 3.671501612834831008,[], = ()x 44 = ()()y x 4.426707150540812874,[], = ()x 55 = ()()y x 5.328723945693345898

]

先解出过程的好处在于还可以观察解的基本形状,

> plot('rhs(g(x)[2])',x=-10..10); 对每个x 的值,用上面的过程解g

的表达式算出相应的g(x)值

20 / 20

在上面的命令中,g(x)是一个列表,里面每个元素都是自变量x 的取值表达式和其对应的应变量y 的取值表达式构成的,而画图时只需第二个表达式的右端的值,故用“rhs(g(x)[2])”来取列表的每个元素的第二个表达式的值.

法2 (如果只想知道后面的结果:) > restart; > eq:='eq':

> eq:=D(y)(x)=cos(x*y(x));

:= eq = ()()D y x ()cos x ()y x

>

dsolve({eq,y(0)=2},y(x),type=numeric,value=array([1,2,3,4,5]));

?????????????????

???

??????????[],x ()y x ??

??????????????????????1 2.2931565502 1.3932742403.67150161314.42670715055.3287239457

常微分方程作业欧拉法与改进欧拉法

P77 31.利用改进欧拉方法计算下列初值问题,并画出近似解的草图:dy + =t = t y y ≤ ≤ ,2 ;5.0 0,3 )0( )1(= ,1 ? dt 代码: %改进欧拉法 function Euler(t0,y0,inv,h) n=round(inv(2)-inv(1))/h; t(1)=t0; y(1)=y0; for i=1:n y1(i+1)=y(i)+h*fun(t(i),y(i)); t(i+1)=t(i)+h; y(i+1)=y(i)+1/2*h*(fun(t(i),y(i))+ fun(t(i+1),y1(i+1))) end plot(t,y,'*r') function y=fun(t,y); y=y+1; 调用:Euler(0,3,[0,2],0.5) 得到解析解:hold on; y=dsolve('Dy=y+1','(y(0)=3)','t'); ezplot(y,[0,2]) 图像:

dy y =t - t y ;2.0 t = ≤ )0( 0,5.0 ,4 )2(2= ≤ ? ,2 dt 代码: function Euler1(t0,y0,inv,h) n=round(inv(2)-inv(1))/h; t(1)=t0; y(1)=y0; for i=1:n y1(i+1)=y(i)+h*fun(t(i),y(i)); t(i+1)=t(i)+h; y(i+1)=y(i)+1/2*h*(fun(t(i),y(i))+ fun(t(i+1),y1(i+1))) end plot(t,y,'*r') function y=fun(t,y); y=y^2-4*t; 调用: Euler1(0,0.5,[0,2],0.2) 图像:

常微分方程的Euler解法

毕业论文 题目:常微分方程的Euler解法 及其程序设计 学院:数学与信息科学学院 专业:数学与应用数学 毕业年限: 2011年6月 学生: 学号: 指导教师:

常微分方程的Euler解法及其程序设计 摘要本文总结了常微分方程的Euler解法,对各种格式给出了误差估计,设计了这些格式的计算程序. 关键词常微分方程;Euler解法;误差分析;程序设计 Euler Method of Ordinary Differential Equation and Its Programming Abstract Euler method of ordinary differential equation is summarized,the error of each format is analyzed and its programming is designed in this paper. Keywords Ordinary differential equation; Euler method; Error analysis; Programming

科学技术中常常需要求解常微分方程的定解问题,这类问题最简单的形式,即为微分方程 (,)dy f x y dx = (1) 的初值问题 00(,),(). dy f x y dx y x y ?=???=? (2) 定理 (存在与唯一性定理)如果方程(1)的右端函数(,)f x y 在闭矩形域 000000:,R x a x x a y b y y b -≤≤+-≤≤+ 上满足如下条件: (1)在R 上连续; (2)在R 上关于变量y 满足利普希茨(Lipschitz )条件,即存在常数L ,使 对于R 上任何一对点(,)x y 和(,)x y 有不等式: (,)(,)f x y f x y L y y -≤-, 则初值问题(2)在区间00000x h x x h -≤≤+上存在唯一解 00(),()y y x y x y ==, 其中0(,)min(,),max (,)x y R b h a M f x y M ∈==. 根据存在与唯一性定理,只要(,)f x y 关于y 满足Lipschitz 条件 (,)(,)f x y f x y L y y -≤-, 即可保证其解()y y x =存在并唯一. 然而解析方法只能用来求解少数较简单和典型的常微分方程,例如线性常系数微分方程等,对于变系数常微分方程的解析求解就比较困难,而一般的非线性常微分方程就更不用说,因此,在大多数情况下,实际问题中归结出来的微分方程主要靠数值解法求解.

有限差分法求解偏微分方程MATLAB教学教材

有限差分法求解偏微分方程M A T L A B

南京理工大学 课程考核论文 课程名称:高等数值分析 论文题目:有限差分法求解偏微分方程姓名:罗晨 学号: 115104000545 成绩: 有限差分法求解偏微分方程

一、主要内容 1.有限差分法求解偏微分方程,偏微分方程如一般形式的一维抛物线型方程: 22(,)()u u f x t t x αα??-=??其中为常数 具体求解的偏微分方程如下: 22001 (,0)sin()(0,)(1,)00 u u x t x u x x u t u t t π???-=≤≤?????? =??? ==≥??? 2.推导五种差分格式、截断误差并分析其稳定性; 3.编写MATLAB 程序实现五种差分格式对偏微分方程的求解及误差分析; 4.结论及完成本次实验报告的感想。 二、推导几种差分格式的过程: 有限差分法(finite-difference methods )是一种数值方法通过有限个微分方程近似求导从而寻求微分方程的近似解。有限差分法的基本思想是把连续的定解区域用有限个离散点构成的网格来代替;把连续定解区域上的连续变量的函数用在网格上定义的离散变量函数来近似;把原方程和定解条件中的微商用差商来近似,积分用积分和来近似,于是原微分方程和定解条件就近似地代之以代数方程组,即有限差分方程组,解此方程组就可以得到原问题在离散点上的近似解。 推导差分方程的过程中需要用到的泰勒展开公式如下: ()2 100000000()()()()()()()......()(()) 1!2!! n n n f x f x f x f x f x x x x x x x o x x n +'''=+-+-++-+- (2-1) 求解区域的网格划分步长参数如下:

欧拉及改进的欧拉法求解常微分方程

生物信息技术0801 徐聪U200812594 #include #include void f1(double *y,double *x,double *yy) { y[0]=2.0; x[0]=0.0; yy[0]=2.0; for(int i=1;i<=9;i++) { x[i]=x[i-1]+0.2; y[i]=y[i-1]+0.2*(y[i-1]-x[i-1]); yy[i]=x[i]+1+exp(x[i]); printf("若x=%f,计算值是%f,真实值是%f,截断误差是%f\n ",x[i],y[i],yy[i],y[i]-yy[i]); } }; void f2(double *y,double *x,double *yy) { y[0]=1.0; x[0]=0.0; yy[0]=1.0; for(int i=1;i<=9;i++) { x[i]=x[i-1]+0.2; y[i]=y[i-1]+0.2*(2*y[i-1]+x[i-1]*x[i-1]); yy[i]=-0.5*(x[i]*x[i]+x[i]+0.5)+1.25*exp(2*x[i]); printf("若x=%f,计算值是%f,真实值是%f,截断误差是%f\n ",x[i],y[i],yy[i],y[i]-yy[i]); } }; void f3(double *y,double *x,double *yy,double *y0) { y[0]=2.0; x[0]=0.0; yy[0]=2.0; for(int i=1;i<=9;i++) { x[i]=x[i-1]+0.2; y0[i]=y[i-1]+0.2*(y[i-1]-x[i-1]); y[i]=y[i-1]+0.1*(y[i-1]-x[i-1]+y0[i-1]-x[i-1]);

(完整版)偏微分方程的MATLAB解法

引言 偏微分方程定解问题有着广泛的应用背景。人们用偏微分方程来描述、解释或者预见各种自然现象,并用于科学和工程技术的各个领域fll。然而,对于广大应用工作者来说,从偏微分方程模型出发,使用有限元法或有限差分法求解都要耗费很大的工作量,才能得到数值解。现在,MATLAB PDEToolbox已实现对于空间二维问题高速、准确的求解过程。 偏微分方程 如果一个微分方程中出现的未知函数只含一个自变量,这个方程叫做常微分方程,也简称微分方程;如果一个微分方程中出现多元函数的偏导数,或者说如果未知函数和几个变量有关,而且方程中出现未知函数对几个变量的导数,那么这种微分方程就是偏微分方程。 常用的方法有变分法和有限差分法。变分法是把定解问题转化成变分问题,再求变分问题的近似解;有限差分法是把定解问题转化成代数方程,然后用计算机进行计算;还有一种更有意义的模拟法,它用另一个物理的问题实验研究来代替所研究某个物理问题的定解。虽然物理现象本质不同,但是抽象地表示在数学上是同一个定解问题,如研究某个不规则形状的物体里的稳定温度分布问题,由于求解比较困难,可作相应的静电场或稳恒电流场实验研究,测定场中各处的电势,从而也解决了所研究的稳定温度场中的温度分布问题。 随着物理科学所研究的现象在广度和深度两方面的扩展,偏微分方程的应用范围更广泛。从数学自身的角度看,偏微分方程的求解促使数学在函数论、变分法、级数展开、常微分方程、代数、微分几何等各方面进行发展。从这个角度说,偏微分方程变成了数学的中心。

一、MATLAB方法简介及应用 1.1 MATLAB简介 MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。 1.2 Matlab主要功能 数值分析 数值和符号计算 工程与科学绘图 控制系统的设计与仿真 数字图像处理 数字信号处理 通讯系统设计与仿真 财务与金融工程 1.3 优势特点 1) 高效的数值计算及符号计算功能,能使用户从繁杂的数学运算分析中解脱出来; 2) 具有完备的图形处理功能,实现计算结果和编程的可视化; 3) 友好的用户界面及接近数学表达式的自然化语言,使学者易于学习和掌握; 4) 功能丰富的应用工具箱(如信号处理工具箱、通信工具箱等) ,

复变函数经典例题

第一章例题 例1.1试问函数把平面上的下列曲线分别变成平面上的何种曲线? (1)以原点为心,2为半径,在第一象项里的圆弧; (2)倾角的直线; (3)双曲线。 解设,则 因此 (1)在平面上对应的图形为:以原点为心,4为半径,在上半平面的半圆周。(2)在平面上对应的图形为:射线。 (3)因,故,在平面上对应的图形为:直线 。 例1.2设在点连续,且,则在点的某以邻域内恒不为0. 证因在点连续,则,只要,就有 特别,取,则由上面的不等式得 因此,在邻域内就恒不为0。 例1.3设 试证在原点无极限,从而在原点不连续。

证令变点,则 从而(沿正实轴) 而沿第一象限的平分角线,时,。 故在原点无确定的极限,从而在原点不连续。 第二章例题 例2.1在平面上处处不可微 证易知该函数在平面上处处连续。但 当时,极限不存在。因取实数趋于0时,起极限为1,取纯虚数而趋于零时,其极限为-1。故处处不可微。 例 2.2函数在满足定理2.1的条件,但在不可微。 证因。故 但

在时无极限,这是因让沿射线随 而趋于零,即知上式趋于一个与有关的值。 例2.3讨论的解析性 解因, 故 要使条件成立,必有,故只在可微,从而,处处不解析。例2.4讨论的可微性和解析性 解因, 故 要使条件成立,必有,故只在直线上可微,从而,处处不解析。 例2.5讨论的可微性和解析性,并求。 解因, 而 在复平面上处处连续且满足条件,从而在平面上处处可微,也处处解析。且 。 例2.6设确定在从原点起沿负实轴割破了的平面上且,试求 之值。 解设,则

由代入得 解得:,从而 。 例2.7设则 且的主值为。 例2.8考查下列二函数有哪些支点 (a) (b) 解(a)作一条内部含0但不含1的简单闭曲线, 当沿正方向绕行一周时,的辐角得到增量,的辐角没有改变, 即 从而 故的终值较初值增加了一个因子,发生了变化,可见0是的支点。同理1 也是其支点。 任何异于0,1的有限点都不可能是支点。因若设是含但不含0,1的简

第8章 常微分方程数值解法 本章主要内容: 1.欧拉法

第8章 常微分方程数值解法 本章主要内容: 1.欧拉法、改进欧拉法. 2.龙格-库塔法。 3.单步法的收敛性与稳定性。 重点、难点 一、微分方程的数值解法 在工程技术或自然科学中,我们会遇到的许多微分方程的问题,而我们只能对其中具有较简单形式的微分方程才能够求出它们的精确解。对于大量的微分方程问题我们需要考虑求它们的满足一定精度要求的近似解的方法,称为微分方程的数值解法。本章我们主要 讨论常微分方程初值问题?????==00 )() ,(y x y y x f dx dy 的数值解法。 数值解法的基本思想是:在常微分方程初值问题解的存在区间[a,b]内,取n+1个节点a=x 0<x 1<…<x N =b (其中差h n = x n –x n-1称为步长,一般取h 为常数,即等步长),在这些节点上把常微分方程的初值问题离散化为差分方程的相应问题,再求出这些点的上的差分方程值作为相应的微分方程的近似值(满足精度要求)。 二、欧拉法与改进欧拉法 欧拉法与改进欧拉法是用数值积分方法对微分方程进行离散化的一种方法。 将常微分方程),(y x f y ='变为() *+=?++1 1))(,()()(n x n x n n dt t y t f x y x y 1.欧拉法(欧拉折线法) 欧拉法是求解常微分方程初值问题的一种最简单的数值解法。 欧拉法的基本思想:用左矩阵公式计算(*)式右端积分,则得欧拉法的计算公式为:N a b h N n y x hf y y n n n n -= -=+=+)1,...,1,0(),(1 欧拉法局部截断误差 11121 )(2 ++++≤≤''=n n n n n x x y h R ξξ或简记为O (h 2)。

MATLAB Euler法解常微分方程

Euler 法解常微分方程 Euler 法解常微分方程算法: Step 1 分别取积分上限、积分下限、步长 Step 2计算h n n +=判断b n ≤是否成立,成立转到Step 3,否则继续进行Step 4 Step 3 计算),(1n n n n y x hf y y +=+ Step 4 ),(1n n n n y x hf y y +=+ Euler 法解常微分方程算程序: function euler2(fun,y0,A,h) %fun--y' %y0---初值 %A----x 取值范围 %a----x 左区间端点值 %b----x 右区间端点值 %h----给定步长 x=min(A); b=max(A); y=y0; while x

0.4613 指导教师: 年 月 日 改进Euelr 法解常微分方程 改进Euler 法解常微分方程算法: Step 1 分别取积分上限、积分下限、步长 Step 2 取一个以h 为步长,a ,b 分别为左右端点的矩阵 Step 3 (1)做显性Euler 预测),( 1n n i i y x hf y y +=+ (2)将1+i y 带入,(),([2h 11++++=i i i i i x f y x f y y Step 4计算h n n +=判断b n ≤是否成立,成立返回Step 5 )],(),([2h 111+++++=i i i i i i y x f y x f y y 改进Euler 法解常微分方程算程序: function gaijineuler2(fun,y0,A,h) %fun--y' %y0---初值 %A----x 取值范围 %a----x 左区间端点值 %b----x 右区间端点值 %h----给定步长 a=min(A); b=max(A); x=a:h:b; y(1)=y0; for i=1:length(x)-1 w1=feval(fun,x(i),y(i)); y(i+1)=y(i)+h*w1; w2=feval(fun,x(i+1),y(i+1)); y(i+1)=y(i)+h*(w1+w2)/2; end x=x'

常微分方程欧拉算法

常微分方程欧拉算法 Company Document number:WUUT-WUUY-WBBGB-BWYTT-1982GT

常微分方程欧拉算法 摘要:本文主要论述了常微分方程的欧拉算法的算法原理,误差分析,实例,程序,以及算法比较等内容。 关键词:常微分方程 显式欧拉法 隐式欧拉法 引言:微分方程初值问题模型是常见的一类数学模型。对于一些简单而典型的微分方程模型,譬如线性方程、某些特殊的一阶非线性方程等是可以设法求出其解析解的,并有理论上的结果可资利用。但在数学建模中碰到的常微分方程初值问题模型,通常很难,甚至根本无法求出其解析解,而只能求其近似解。因此,研究其数值方法,以便快速求得数值鳃有其重大意义。 一、欧拉算法原理 对于微分方程初值问题 的解在xy 平面上是一条曲线,称为该微分方程的积分曲线。积分曲线上一点(),x y 的切线斜率等于函数f 在点(),x y 的值,从初始点()000,P x y 出发,向该点的切线方向推进到下一个点()111,P x y ,然后依次做下去,得到后面的未知点。一般地,若知道(),n n n P x y 依上述方法推进到点()111,n n n P x y +++,则两点的坐标关系为: 即 这种方法就是欧拉(Euler )方法(也叫显式欧拉法或向前欧拉法)。当初值0y 已知,则n y 可以逐步算出 对微分方程()=x y dy f dx ,从n x 到1n x +积分,那么有 现在用左矩形公式()(),n n hf x y x 代替()()1 ,n n x x f t y t dt +?,n y 代替()n y x ,1n y +代替() 1n y x +就得到了欧拉方法。如果用右矩形公式()()11,n n hf x y x ++去代替右端积分,则得到另外一 个公式,该方法就称为隐式欧拉法(或后退欧拉法),其公式为 欧拉公式与隐式欧拉公式的区别在于欧拉公式是关于1n y +的一个直接计算公式,然而隐式欧拉公式右端含有1n y +,所以它实际上是关于1n y +的一个函数方程。 二、实例 例 取h=,用Euler 方法解

MATLAB求解常微分方程数值解

利用MATLAB求解常微分方程数值解

目录 1. 内容简介 (1) 2. Euler Method(欧拉法)求解 (1) 2.1. 显式Euler法和隐式Euler法 (2) 2.2. 梯形公式和改进Euler法 (3) 2.3. Euler法实用性 (4) 3. Runge-Kutta Method(龙格库塔法)求解 (5) 3.1. Runge-Kutta基本原理 (5) 3.2. MATLAB中使用Runge-Kutta法的函数 (7) 4. 使用MATLAB求解常微分方程 (7) 4.1. 使用ode45函数求解非刚性常微分方程 (8) 4.2. 刚性常微分方程 (9) 5. 总结 (9) 参考文献 (11) 附录 (12) 1. 显式Euler法数值求解 (12) 2. 改进Euler法数值求解 (12) 3. 四阶四级Runge-Kutta法数值求解 (13) 4.使用ode45求解 (14)

1.内容简介 把《高等工程数学》看了一遍,增加对数学内容的了解,对其中数值解法比较感兴趣,这大概是因为在其它各方面的学习和研究中经常会遇到数值解法的问题。理解模型然后列出微分方程,却对着方程无从下手,无法得出精确结果实在是让人难受的一件事情。 实际问题中更多遇到的是利用数值法求解偏微分方程问题,但考虑到先从常微分方程下手更为简单有效率,所以本文只研究常微分方程的数值解法。把一个工程实际问题弄出精确结果远比弄清楚各种细枝末节更有意思,因此文章中不追求非常严格地证明,而是偏向如何利用工具实际求解出常微分方程的数值解,力求将课程上所学的知识真正地运用到实际方程的求解中去,在以后遇到微分方程的时候能够熟练运用MATLAB得到能够在工程上运用的结果。 文中求解过程中用到MATLAB进行数值求解,主要目的是弄清楚各个函数本质上是如何对常微分方程进行求解的,对各种方法进行MATLAB编程求解,并将求得的数值解与精确解对比,其中源程序在附录中。最后考察MATLAB中各个函数的适用范围,当遇到实际工程问题时能够正确地得到问题的数值解。 2.Euler Method(欧拉法)求解 Euler法求解常微分方程主要包括3种形式,即显式Euler法、隐式Euler法、梯形公式法,本节内容分别介绍这3种方法的具体内容,并在最后对3种方法精度进行对比,讨论Euler法的实用性。 本节考虑实际初值问题 使用解析法,对方程两边同乘以得到下式

fortran下欧拉法求解常微分方程(实例)

1. Euler 公式 100(,)() i i i i y y hf x y y y x +=+??=? 实例: ,00(,),0,1,01f x y x y x y x =-==≤≤ 精确解为:1x y x e -=+- 程序代码: DIMENSION x(0:20),y(0:20),z(0:20),k(0:21) DOUBLE PRECISION x,y,z,k,h,x0,y0,z0,k0,n f(x,y)=x-y n=20 h=1/n x(0)=0 y(0)=0 DO i=0,n-1 y(i+1)=y(i)+f(x(i),y(i))*h x(i+1)=x(i)+h ENDDO k(0)=0 DO i=0,n z(i)=k(i)+exp(-k(i))-1 k(i+1)=k(i)+h END DO open(10,file='1.txt') WRITE(10,10) (x(i),y(i),z(i),i=0,20) WRITE(*,10) (x(i),y(i),z(i),i=0,20) 10 FORMAT(1x,f10.8,2x,f10.8,2x,f10.8/) END 输出结果: 0.00000000 0.00000000 0.00000000 0.05000000 0.00000000 0.00122942 0.10000000 0.00250000 0.00483742 0.15000000 0.00737500 0.01070798 0.20000000 0.01450625 0.01873075 0.25000000 0.02378094 0.02880078 ???=='00)(),(y x y y x f y ???=='0 0)(),(y x y y x f y

MATLABEuler法解常微分方程

Euler法解常微分方程 Euler法解常微分方程算法: Step 1 分别取积分上限、积分下限、步长 Step 2计算判断是否成立,成立转到Step 3,否则继续进行Step 4 Step 3 计算 Step 4 Euler法解常微分方程算程序: function euler2(fun,y0,A,h) %fun--y' %y0---初值 %A----x取值范围 %a----x左区间端点值 %b----x右区间端点值 %h----给定步长 x=min(A); b=max(A); y=y0; while x

Step 3 (1)做显性Euler预测 (2)将带入 Step 4计算判断是否成立,成立返回Step 3,否则继续进行Step 5 Step 5 改进Euler法解常微分方程算程序: function gaijineuler2(fun,y0,A,h) %fun--y' %y0---初值 %A----x取值范围 %a----x左区间端点值 %b----x右区间端点值 %h----给定步长 a=min(A); b=max(A); x=a:h:b; y(1)=y0; for i=1:length(x)-1 w1=feval(fun,x(i),y(i)); y(i+1)=y(i)+h*w1; w2=feval(fun,x(i+1),y(i+1)); y(i+1)=y(i)+h*(w1+w2)/2; end x=x' y=y' 例:用改进Euler法计算下列初值问题(取步长h=0.25) 输入:fun=inline('-x*y^2') gaijineuler2(fun,2,[0 5],0.25) 得到: x = 0.2500 0.5000 0.7500 1.0000 1.2500 1.5000 1.7500 2.0000 2.2500 2.5000 2.7500

常微分方程欧拉算法

常微分方程欧拉算法 Prepared on 22 November 2020

常微分方程欧拉算法 摘要:本文主要论述了常微分方程的欧拉算法的算法原理,误差分析,实例,程序,以及算法比较等内容。 关键词:常微分方程 显式欧拉法 隐式欧拉法 引言:微分方程初值问题模型是常见的一类数学模型。对于一些简单而典型的微分方程模型,譬如线性方程、某些特殊的一阶非线性方程等是可以设法求出其解析解的,并有理论上的结果可资利用。但在数学建模中碰到的常微分方程初值问题模型,通常很难,甚至根本无法求出其解析解,而只能求其近似解。因此,研究其数值方法,以便快速求得数值鳃有其重大意义。 一、欧拉算法原理 对于微分方程初值问题 的解在xy 平面上是一条曲线,称为该微分方程的积分曲线。积分曲线上一点(),x y 的切线斜率等于函数f 在点(),x y 的值,从初始点()000,P x y 出发,向该点的切线方向推进到下一个点()111,P x y ,然后依次做下去,得到后面的未知点。一般地,若知道(),n n n P x y 依上述方法推进到点()111,n n n P x y +++,则两点的坐标关系为: 即 这种方法就是欧拉(Euler )方法(也叫显式欧拉法或向前欧拉法)。当初值0y 已知,则n y 可以逐步算出 对微分方程()=x y dy f dx ,从n x 到1n x +积分,那么有 现在用左矩形公式()(),n n hf x y x 代替()()1 ,n n x x f t y t dt +?,n y 代替()n y x ,1n y +代替() 1n y x +就得到了欧拉方法。如果用右矩形公式()()11,n n hf x y x ++去代替右端积分,则得到另外一 个公式,该方法就称为隐式欧拉法(或后退欧拉法),其公式为 欧拉公式与隐式欧拉公式的区别在于欧拉公式是关于1n y +的一个直接计算公式,然而隐式欧拉公式右端含有1n y +,所以它实际上是关于1n y +的一个函数方程。 二、实例 例 取h=,用Euler 方法解

常微分方程作业欧拉法与改进欧拉法

常微分方程作业欧拉法与改进欧 拉法 P77 31.利用改进欧拉方法计算下列初值问题,并画出近似解的草图: (1) 3 =y 1,y(0) =3,0汀岂2, :t=0.5; dt 代码: %改进欧拉法 fun cti on Euler(t0,y0,i nv,h) n=rou nd(i nv(2)-in v(1))/h; t(1)=t0; y(1)=y0; for i=1: n y1(i+1)=y(i)+h*fun(t(i),y(i)); t(i+1)=t(i)+h;

y(i+1)=y (i)+1/2*h*(fu n( t(i),y(i))+ fun( t(i+1),y1(i+1))) end plot(t,y,'*r') fun cti on y=fun (t,y); y=y+1; 调用:Euler(0,3,[0,2],0.5) 得到解析解:hold on; y=dsolve('Dy=y+1','(y(0)=3)', 't'); ezplot(y,[0,2])

图像: (2)女=y2—4t,y(0) =0.5,0 叭乞2, :t =0.2; dt 代码: function Euler1(t0,y0,inv,h) n=rou nd(i nv(2)-in v(1))/h; t(1)=t0; y(1)=y0; for i=1: n y1(i+1)=y(i)+h*fu n(t(i),y(i)); t(i+l)=t(i)+h; y(i+1)=y (i)+1/2*h*(fu n( t(i),y(i))+ fun( t(i+1),y1(i+1)))

end plot(t,y,'*r') fun cti on y=fun (t,y); y=y A2-4*t; 调用: Euler1(0,0.5,[0,2],0.2) 图像:

欧拉法解常微分方程

数学与计算科学学院 实验报告 实验项目名称 Eular 方法求解一阶常微分方程数值解 所属课程名称 偏微分方程数值解 _________________ 实验类型 ________________ 验证性 _______________________ 实验日期 ___________ 2015-3-26 _____________________ 级 __________ 号 _________ 名 ________________ 绩 ______________________ 一、实验概述: 【实验目的】 纟沙理工久 班 学 姓 成

熟练掌握应用显性Eular法和隐式Eular法求解一般一阶常微分方程的近似数值解。 【实验原理】 虽然求解常微分方程有各种各样的解析方法,但解析方法只能用来求解一些特殊类型的方程。求解从实际问题当中归结出来的微分方程主要靠数值解法。欧拉方法是一类重要的数值解法。这类方法回避解y(x)的函数表达式,而是寻求它在一系 列离散节点上的近似值,相邻的两个节点的间距称作步长。假定步长为定数。 欧拉方法是一类离散化方法,这类方法将寻求解y(x)的分析问题转化为计算离 散值值的代数问题,从而使问题获得了实质性的简化。然而随之带来的困难是,由于数据量往往很大,差分方法所归结出的可能是个大规模的代数方程组。 【实验环境】 1.硬件环境 22软件环境 MATLAB7.0 、实验内容:

【实验过程】(实验步骤) (一)实验任务 描述某种化学反应过程的方程,利用显性和隐形 Eualar 方法求解下列一阶线性 微分方程组的近似数值解: y i (0) 5(0) 0, y a (0) 0 (二)求解过程 Eular 方法: 一阶线性微分方程初值问题 y' f (x,y ),a x b y (a ) y 。 a x 0 x., .... x n b ( 1) X n x nh, h 为步长 方程离散化:差分和差商 y'g y1 y0 y1 y0 x 1 x 0 h 愀必)y/0 h y 1 y ° hf (x °,y °) (2) y n 1 y n hf (X °,y °) 通过初始值y ,依据递推公式(2)逐步算出Y 1,Y 2,....,y n 就为显性的Eular 方 法。 隐形Eular 方法: y 1 y ° hf(X 1,yJ y n 1 y n hf(X n1,y n1) 公式(3)即为隐式Eular 公式 (3) 4 0.04y 1 10 y 1y 2 0.04% 104 y-i y 2 3 1O 7y 2

微分方程常用的两种数值解法:欧拉方法和龙格库塔法

某师X大学本科毕业论文 微分方程常用的两种数值解法:欧拉方法与龙 格—库塔法 学生某XXX 院系名称数学与软件科学学院 专业名称信息与计算科学 班级2006级 4 班 学号20060640XX 指导教师Xxx 某师X大学教务处 二○一○年五月

微分方程常用的两种数值解法:欧拉方法与龙格—库塔法 学生某:xxx 指导教师:xx 【内容摘要】微分方程是最有生命力的数学分支,在自然科学的许多领域中,都 会遇到常微分方程的求解问题。当前计算机的发展为常微分方程的应用及理论研究提供了非常有力的工具,利用计算机解微分方程主要使用数值方法,欧拉方法和龙格——库塔方法是求解微分方程最典型常用的数值方法。本文详细研究了这两类数值计算方法的构造过程,分析了它们的优缺点,以及它们的收敛性,相容性,及稳定性。讨论了步长的变化对数值方法的影响和系数不同的同阶龙格—库塔方法的差别。通过编制C程序在计算机上实现这两类方法及对一些典型算例的结果分析比较,能更深切体会它们的功能,优缺点及适用场合,从而在实际应用中能对不同类型和不同要求的常微分方程会选取适当的求解方法。 关键词:显式单步法欧拉(Euler)方法龙格—库塔(Runge—Kutta)方法截断误差收敛性 Two monly used numerical solution of differential equations:Euler method and Runge - Kutta method Student Name: Xiong Shiying Tutor:Zhang Li 【Abstract】The differential equation is the most vitality branch in mathematics. In many domains of natural science, we can meet the ordinary differentialequation solution question. Currently, the development of puter has provided the extremely powerful tool for the ordinary differential equation application and the fundamental research, the puter solving differential equation mainly uses value method.The Euler method and the Runge—Kutta method are the most typical monly value method to solve the differential equation. This article dissects the structure process of these two kinds of values monly value method to solve the analyses their good and bad points, to their astringency, the patibility, and the stability has made the proof. At the same time, the article discuss the length of stride to the numerical method changing influence and the difference of the coefficient different same step Runge—kutta method. Through establishing C program on the puter can realize these two kind of methods, Anglicizing some models of calculate example result can sincerely realize their function, the advantage and disadvantage points and the suitable situation, thus the suitable solution method can be selected to solve the different type and the different request ordinary

常微分方程欧拉算法完整版

常微分方程欧拉算法 Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】

常微分方程欧拉算法 摘要:本文主要论述了常微分方程的欧拉算法的算法原理,误差分析,实例,程序,以及算法比较等内容。 关键词:常微分方程 显式欧拉法 隐式欧拉法 引言:微分方程初值问题模型是常见的一类数学模型。对于一些简单而典型的微分方程模型,譬如线性方程、某些特殊的一阶非线性方程等是可以设法求出其解析解的,并有理论上的结果可资利用。但在数学建模中碰到的常微分方程初值问题模型,通常很难,甚至根本无法求出其解析解,而只能求其近似解。因此,研究其数值方法,以便快速求得数值鳃有其重大意义。 一、欧拉算法原理 对于微分方程初值问题 的解在xy 平面上是一条曲线,称为该微分方程的积分曲线。积分曲线上一点(),x y 的切线斜率等于函数f 在点(),x y 的值,从初始点()000,P x y 出发,向该点的切线方向推进到下一个点()111,P x y ,然后依次做下去,得到后面的未知点。一般地,若知道(),n n n P x y 依上述方法推进到点()111,n n n P x y +++,则两点的坐标关系为: 即 这种方法就是欧拉(Euler )方法(也叫显式欧拉法或向前欧拉法)。当初值0y 已知,则n y 可以逐步算出 对微分方程()=x y dy f dx ,从n x 到1n x +积分,那么有 现在用左矩形公式()(),n n hf x y x 代替()()1 ,n n x x f t y t dt +?,n y 代替()n y x ,1n y +代替 ()1n y x +就得到了欧拉方法。如果用右矩形公式()()11,n n hf x y x ++去代替右端积 分,则得到另外一个公式,该方法就称为隐式欧拉法(或后退欧拉法),其公式为 欧拉公式与隐式欧拉公式的区别在于欧拉公式是关于1n y +的一个直接计算公式,然而隐式欧拉公式右端含有1n y +,所以它实际上是关于1n y +的一个函数方程。 二、实例

常微分方程的差分方法-欧拉法

常微分方程的差分方法-欧拉法 一、摘要:人类社会已迈进电子计算机时代。在今天,熟练地 运用计算机进行科学计算,已成为广大科技工作者和学者的一项基 本技能,数值分析的基本内容是数值算法的设计与分析,科学技术 当中常常需要求解常微分方程的定解问题,本文中主要以解决此问 题最简单形式(一阶方程的初值问题)来求解微分方程。虽然求解 常微分方程有各种各样的解析方法,但解析方法只能用来求解一些 特殊类型的方程,求解从实际问题中归结出来的微分方程主要主要 靠数值解法,本文就数值解法中的差分方法进行求解微分方程。 二、关键词:差分方法、初值问题、数值解法、MATLAB 三、引言:科学计算不应当将计算方法片面的理解为各种算法 的简单罗列和堆积,它也是一门内容丰富、思想方法深刻而有着自 身理论体系的数学学科。微积分的发明是人类智慧的伟大发展。求 解常微分方程有各种各样的解析方法,但解析方法只能用来求解一 些特殊类型的方程,求解从实际问题中归结出来的微分方程主要主 要靠数值解法。怎样应用数值解法求解从实际问题中归结出来的微 分方程呢? 四、正文 y′=f x,y (1) y(x0)=y0 (2) 方程(1)中含有导数项y′(x),这是微分方程的本质特征,也正 是它难以求解的症结所在。 数值解法的第一步就是设法消除其导数项,这项手续称离散化。由于差分是微分的近似运算,实现离散化的基本途径是用差商替代 导数。 譬如,若在点x n列出方程(1): y′(x n)=f(x n,y(x n)) 替代其中的导数项y′(x n),结果有:并用差商y x n+1?y(x n) h y(x n+1)≈y(x n)+hf(x n,y(x n))

欧拉近似方法求常微分方程

欧拉近似方法求常微分方程 朱翼 1、编程实现以下科学计算算法,并举一例使用之。 “欧拉近似方法求常微分方程” 算法说明: 欧拉法是简单有效的常微分方程数值解法,欧拉法有多种形式的算法,其中简单欧拉法是一种单步递推算法。其基本原理为对简单的一阶方程的初值问题: y’=f(x,y) 其中y(x0 )=y0 欧拉法等同于将函数微分转换为数值微分,由欧拉公式可得 y n+1 =y n+hf(x n ,y n) 程序代码: function [tout,yout]=myeuler(ypfun,t0,tfinal,y0,tol,trace) %初始化 pow=1/3; if nargin<5,tol=1.e-3;end if nargin<6,trace=0;end t=t0; hmax=(tfinal-t)/16; h=hmax/8; y=y0(:);

chunk=128; tout=zeros(chunk,1); yout=zeros(chunk,length(y)); k=1; tout(k)=t; yout(k,:)=y.'; if trace %绘图 clc,t,h,y end while (tt) %主循环if t+h>tfinal,h=tfinal-t;end % Compute the slopes f=feval(ypfun,t,y);f=f(:); %估计误差并设定可接受误差 delta=norm(h*f,'inf'); tau=tol*max(norm(y,'inf'),1.0); %当误差可接受时重写解 if delta<=tau t=t+h; y=y+h*f; k=k+1; if k>length(tout)

相关文档
最新文档