用Python学《微积分B》(微分方程)


  什么是微分方程(Differential Equation)?微分方程有什么用?如何解微分方程?这是本节需要重点理解的问题。


一、微分方程简介


  除了wiki,在math is fun上搜索“differential equation”,可以找到几个关于“微分方程”的话题。这些话题对微分方程的介绍非常有趣,在此借用它们来阐述我对微分方程的理解。
1,什么是微分方程
  联系函数及其导函数的方程就是微分方程,例如:

y+dydx=5x

2,微分方程有什么用
  一句话:微分方程就是用来求出函数关系的。怎么理解呢?
  在实际工程应用中,我们有时候并不能直接找出两个物理量(y-x)的函数关系,但是我们可以很轻易地找出它们之间的变化关系( dydx d2ydx2 )。此时,我们可以先将它们之间的变化关系列出一个方程,这就是“微分方程”,然后通过求解这个微分方程,得出它们之间的函数关系。
3,微分方程的基本概念
  举个例子:列出在平直线路上以 20m/s (相当于72km/h)的速度行驶;当制动时列车获得加速度 0.4m/s2 。 问开始制动后多少时间列出才能停住以及列车在这段时间里行驶了多少路程?
分析:本题要求时间 t 和路程 s ,而已知的是速度 dsdt 和加速度 d2sdt2
解:先列加速度方程
d2sdt2=0.4

升维(降阶),两边同时做不定积分
dsdt=(0.4)dt=0.4t+C1

再次升维(降阶)
s=(0.4t+C1)dt=0.4t2+C1t+C2

通过上面的两次不定积分,已经找到了 s-t 之间的函数关系。但是这个函数关系不是一条曲线,而是无穷多条曲线,即“曲线族”“函数族”。现在我们需要做得是通过一些“已知点”(也称为“初始值”)从曲线族中筛选出符合我们需要的那条曲线。
这个例子中,有两个初始值和一个终止值:
s0=0,v0=20,vf=0

先将 t=0,v0=20 代入速度方程,解出
C1=20,v=0.4t+20

再将 t=0,s0=0 代入后面那个方法,解出
C2=0,s=0.4t2+20t

最后将终止值代入速度公式,解出t,然后通过路程公式计算s。
注1:为什么要先列加速度方程,而不是直接列速度方程?这是因为在整个过程中,只有加速度是不变的,而速度也是变化的。从这个例子也可以看出,越是高阶的量(高阶导数),越稳定。因此,在列微分方程的时候,我们一般列其中最高阶的方程关系。
通过这个例子,我们来认识一下微分方程的一些基本概念:
1)微分方程的阶(Order)和度(Degree)—— 微分方程中包含的导函数的最高阶和导函数的最高次幂。参考math is fun
2)微分方程的通解 —— 包含常数的解
3)初始值(特殊点) —— 各阶都可以有特殊点,用于从曲线族中筛选特殊的一条曲线。回到“不定积分”那一节,在“水龙头与水缸”的例子中,C表示存量的水。
4)微分方程的特解 —— 满足特定初值的解,最终的函数关系
5)微分方程的积分曲线 —— 微分方程通过不定积分,最终求解出来的一个函数是一条曲线,这个曲线就叫“微分方程的积分曲线”。


二、解微分方程


  微分方程实际上是一种过渡关系(或者“浓缩关系”),我们最终需要的还是从微分方程得到一般的函数关系。所以,解微分方程与列微分方程一样重要。
1,微分方程分类
  再尝试求解微分方程之前,我们要先对微分方程进行分类,因为前人已经总结了一些不同类型的微分方程的不同解法。分类之后,我们就知道了待求解的微分方程能不能解,要按哪种方法解。
  一般来说,可以从这么几个方面来分类:微分方程的阶和度(Order and Degree)、线性(Linear)。
1)ODE VS PDE
  ”Ordinary Differential Equations” (ODEs) have a single independent variable (like y).
  ”Partial Differential Equations” (PDEs) have two or more independent variables.
2)Linear
关于线性,可以参考math is fun:
  It is Linear when the variable(and its derivates) has no exponent or other function put on it.
    So no y2,y3,(y),sin(y),ln(y), etc, just plain y (or whatever the variable is)
  More normally a Linear Differential Equation is in the form :

dydx+P(x)y=Q(x)

2,几种简单的微分方程解法
  根据解微分方程的难度,一般的排名是:可分离变量微分方程、(线性)齐次微分方程、线性非齐次微分方程、非线性微分方程。其中,对于“线性非齐次微分方程”,可以先求出对应的“齐次微分方程的通解”,再根据“常数变易法”求解。
1)Separation of Variables
  关于分离变量法,我用一个例子来探讨它的意义:
dydx=5xy

第一步分离变量
dyy=5xdx

第二步,两边分别(不定)积分
dyy=5xdxln(y)+C1=2.5x2+C2

第三步,化简
y=e2.5x2+C

  整个过程中,关键的就是第二步——两边分别积分。我想问的是:为什么能够两边分别积分?后者说两边分别积分后真的相等吗?
先来看积分前的式子:左边是y的微分,右边是x的微分,可以变形为
f(y)dy=g(x)dxd[F(y)]=d[G(x)]

上式的意义是:左边的导函数等于右边的导函数。而我们的目标是
F(y)=G(x)+C

也就是说,我们的目标是“从导函数相等推导出原函数的关系”。
涉及到导函数与原函数,很容易联想到“变上限积分”和“面积法”。左边表示“f-y”坐标系,右边表示“g-x”坐标系,f(y)和g(x)是位于不同坐标系中的两条曲线,但是它们经过y(x)映射后,应该是相同的。那么,这两条曲线的积分,并不会改变它们之间的映射关系。事实上,求不定积分的“换元法”也是基于这一原理。
此外,简单类比记忆(逆运算):
y=x(y)2=(x)2

lny=lnxelny=elnx

2)Solve First Order Linear Differential Equations
3)Hamogeneous Differential Equations
注:关于如何解微分方程,可以参考:solve differential equation


三、python解微分方程


  Sympy->Solvers->dsolve函数可以很方便求解ODE —— Ordinary Differential Equation。大致步骤如下:

from sympy import *
init_printing()
x = Symbol('x')
#First, create an undefined function by passing cls=Function to the symbols function.
f, g = symbols('f g', cls=Function)
#f and g are now undefined functions. We can call f(x), and it will represent an unknown function.
f(x)

f(x)

#Derivatives of f(x) are unevaluated.
f(x).diff(x)

ddxf(x)

#To represent the differential equation  f ′′ (x) − 2f ′ (x) + f(x) = sin(x), we would thus use
diffeq = Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x))
diffeq

扫描二维码关注公众号,回复: 129350 查看本文章
f(x)2ddxf(x)+d2dx2f(x)=sin(x)

#To solve the ODE, pass it and the function to solve for to dsolve.
dsolve(diffeq, f(x))

f(x)=(C1+C2x)ex+12cos(x)

#dsolve returns an instance of Eq. This is because in general, solutions to differential equations cannot be
#solved explicitly for the function.
dsolve(f(x).diff(x)*(1 - sin(f(x))), f(x))

f(x)+cos(f(x))=C1

The arbitrary constants in the solutions from dsolve are symbols of the form C1, C2, C3, and so on.

例:求解

dydx2yx+1=(x+1)52

解:设 y=uv ,代入得
udvdx+vdudx2uvx+1=(x+1)52

提取公因子v
udvdx+v(dudx2ux+1)=(x+1)52

找u,分离变量法解下面的方程
dudx2ux+1=0

分离变量法解上面的方程,得
u=C1(x2+2x+1)=C1(x+1)2

代入
udvdx=(x+1)52

分离变量法解上面的方程,得
v=1C1[23(x+1)32+C2]

最后代入y,得
y=(x+1)2[23(x+1)32+C]

from sympy import *
init_printing()
x = Symbol('x')
f, g = symbols('f g', cls=Function)
diffeq = Eq(f(x).diff(x) - 2 * f(x) / (x + 1), (x + 1) ** (5 / 2))
dsolve(diffeq, f(x), hint='1st_linear')

f(x)=(C1+23(x+1)32)(x+1)2

四、微分方程的幂级数解法

例:求方程 dydx=x+y2 满足 y|x=0=0 的特解
解: x0=0,y0=0 ,故设

y=a1x+a2x2+a3x3+a4x4+a5x5+

将 y 、 y’ 的幂级数展开式代入原方程,得
a1+2a2x+3a3x2+4a4x3+5a5x4+=x+(a1x+a2x2+a3x3+a4x4+a5x5+)2=x+a21x2+2a1a2x3+(a22+2a1a2)x4+

上式左右两边为恒等式,x的各次幂的系数相等,故
a1=0,a2=12,a3=0,a4=0,a5=120,

于是,该微分方程的解为:
y=12x2+120x5+

猜你喜欢

转载自blog.csdn.net/sagittarius_warrior/article/details/78212378