用Python学《微积分B》(微分方程)
什么是微分方程(Differential Equation)?探讨其应用价值是什么?介绍解决方法有哪些?这些是本节的核心问题在于掌握其求解方法的关键点。
一、微分方程简介
除了wikipedia,在Math is fun网站上查找与differential equation相关的资料,则能找到几个相关的主题。这些主题对于理解differential equation非常有帮助,并可作为学习该领域基本概念的重要资源。以这些主题为基础进行阐述,则有助于更好地理解differential equation的概念。
- 微分方程的用途是什么
一句话:微分方程的作用是用来确定两个变量之间的函数关系。理解起来是怎样的呢?
在实际工程应用中,在很多情况下我们无法直接找到两个物理量(y-x)之间的具体函数关系式(\frac{\mathrm{d}y}{\mathrm{d}x}或\frac{\mathrm{d}^2y}{\mathrm{d}x^2}),但是我们能够较为容易地建立它们之间的变化规律(\frac{\mathrm{d}y}{\mathrm{d}x}或\frac{\mathrm{d}^2y}{\mathrm{d}x^2})。接着我们可以先列出它们之间变化规律的方程式——这就是所谓的“微分方程”,然后通过求解这个微分方程来确定它们之间的具体函数关系式(y关于x的表达式)。 - 微分方程的基本概念
举个例子:假设在平直的铁轨上有一列火车正以 20m/s(即72km/h)的速度匀速行驶;当开始制动时列车获得加速度 -0.4m/s^2 。 问题是在开始制动后多少时间才能使列车完全停下来以及在这段时间内列车行驶了多少路程?
分析:这个问题要求的是时间 t 和路程 s ,而已知的是速度 \frac{\mathrm{d}s}{\mathrm{dt}} 和加速度 \frac{\mathrm{d}^2s}{\mathrm{dt}^2} 。
解:首先建立加速度的运动学公式
升维(降阶),两边同时做不定积分
再次升维(降阶)
通过上面两次不定积分已经确定了s-t之间的函数关系
二、解微分方程
微分方程实际上是一种过渡关系(或者“浓缩关系”),我们最终需要的还是从微分方程得到一般的函数关系。所以,解微分方程与列微分方程一样重要。
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 y^2,\; y^3, \; \sqrt(y), \; sin(y), \; ln(y), \; etc, just plain y (or whatever the variable is)
More normally a Linear Differential Equation is in the form :
2,几种简单的微分方程解法
根据解微分方程的难度,一般的排名是:可分离变量微分方程、(线性)齐次微分方程、线性非齐次微分方程、非线性微分方程。其中,对于“线性非齐次微分方程”,可以先求出对应的“齐次微分方程的通解”,再根据“常数变易法”求解。
1)Separation of Variables
关于分离变量法,我用一个例子来探讨它的意义:
第一步分离变量
第二步,两边分别(不定)积分
第三步,化简
在这一系列的过程中,核心步骤就是对两边分别进行积分运算——这一步骤的关键性不言而喻。
上式的意义是:左边的导函数等于右边的导函数。而我们的目标是
也就是说,我们的目标是通过导函数相等来推导出原函数之间的关系
2)Solving First-Order Linear Differential Equations
3)齐次微分方程
注:关于如何求解微分方程,请参阅:solve differential equation
三、python解微分方程
Sympy->Solvers->dsolve函数能够非常方便地解决Ordinary Differential Equation(ODE)的问题。具体流程如下:
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)
#Derivatives of f(x) are unevaluated.
f(x).diff(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
#To solve the ODE, pass it and the function to solve for to dsolve.
dsolve(diffeq, f(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))
The arbitrary constants resulting from dsolve are referred to as symbols of the form C_1, C_2, C_3, et cetera.
例:求解
解:设 y=uv ,代入得
提取公因子v
找u,分离变量法解下面的方程
分离变量法解上面的方程,得
代入
分离变量法解上面的方程,得
最后代入y,得
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')
四、微分方程的幂级数解法
例:求方程 \frac{\mathrm{d} y}{\mathrm{d} x} = x + y^2 满足 y|_{x=0}=0 的特解
解: x_0 = 0, \; y_0 = 0 ,故设
将 y 、 y’ 的幂级数展开式代入原方程,得
上式左右两边为恒等式,x的各次幂的系数相等,故
于是,该微分方程的解为:
