一阶微分方程基础学习#

学习图形学中的Volume Rendering时碰到了微分方程。
所以找到托马斯微积分[THOMAS' CALCULUS -FOURTEENTH EDITION IN SI UNITS]学一下第16章一阶微分方程。
对我来说细节非常多,记录一下。

1. Solutions, Slope Fields, and Euler’s Method#

一般一阶微分方程的定义和解#

一阶微分方程的形式

\({\Large y' = \frac{dy}{dx} = f(x, y)}\)

例如:

\({\Large y' = x + y}\)

\({\Large y' = x / y}\)

微分方程的解:
是一个可微的关于x的函数\(a(x)\),满足\(a'(x) = f(x, a(x))\)
比如对于上面第一个方程,要满足\(a'(x) = x + a(x)\)。也就是求y。

微分方程是要求一个函数,涉及到通用解general solution,总是会带一个常数C。 所以实际有无数个解。

验证某个a(x)是否是一个particular solution。按定义左边求导,右边代入,看是否相等即可。

如果给定一个initial condition(初始条件),也就是一组(x0, y0)值,那么可以确定C,得到一个确定的曲线。

其实我们学基本的微积分时,早就在解微分方程了,只是解的都是简单问题,等式右边不带y。
\({\Large y'=g(x)}\)

而现在要学的是带y的一般形式 \({\Large y'=g(x, y)}\)


slope fields#

例如对于微分方程\(y' = y - x\),方程直接就定义了y的slope,等式右边就是slope。
那么把x,y平面上的每一个点作为initial condition,并画出此点上的斜率,就得到了slope fields。见图16.2。
可以自己手算体会一下。
对于例子中的\(y' = y - x\),xy平面上每个点的slope值其实就是该点上的y-x。也就是y’。

那么对于每个微分方程,可以直接画出它的slope fields。 如果再给定一个初始条件。就能顺着slope fields大致找到一条曲线。 这条曲线就是给定初始条件下的微分方程的解!

slope fields可以看出微分方程解的走向,非常有实用价值。


Euler’s Method#

如果我们无法或不需要马上得到一个准确的解,我们可以算出一个近似的数值表(numerical solution)。这叫numerical method。

如果给定微分方程和初始条件

\({\Large y' = \frac{dy}{dx} = f(x, y)}\)

\({\Large y(x_0) = y_0}\)

那么正好可以算线性近似

\({\Large L(x)=y(x_0) + y'(x_0)(x-x_0)}\)

\({\Large L(x)=y(x_0) + f(x_0, y_0)(x-x_0)}\)

从初始点开始,从前一个点算后一个点,持续往后算,得到近似解的图形。
有误差,误差会累积,但仍然是不错的近似。
每次跨度越小误差越小。

线性近似见托马斯微积分第3.9章。


2. First-Order Linear Equations#

一阶线性微分方程的标准形式:

\({\Large \frac{dy}{dx} + p(x)y = q(x)}\)

p和q都是关于x的连续函数。

解Linear Equation#

先把一个微分方程整理成标准形式

\({\Large \frac{dy}{dx} + p(x)y = q(x)}\)

构造一个\(v(x)\)乘到两边

\({\Large v(x)\frac{dy}{dx} + v(x)p(x)y = v(x)q(x)}\)

如果\({\Large v(x)}\)的构造遵循 \({\Large \frac{d}{dx}vy = vy' + vpy}\)

那么可以替代微分方程左边,方程变为

\({\Large \frac{d}{dx}vy = v(x)q(x)}\)

两边都对x积分

\({\Large v(x)y = \int v(x)q(x)dx + C}\)

得到最后的y

\({\LARGE y = \frac{\int v(x)q(x)dx + C}{v(x)} }\)

再看v(x)的构造

从结果

\({\Large \frac{d}{dx}vy = vy' + vpy}\)

反算v

左边按乘法规则

\({\Large v'y + vy' = vy' + vpy}\)

\({\Large v' = vp}\)

\({\Large \frac{dv}{dx} = vp}\)

\({\Large \int\frac{dv}{v} = \int pdx}\)

(这种操作不少见,这里为什么能把求导分离再积分,是有理论依据的,见下一节的说明)

\({\Large ln(v) = \int pdx + C}\)

\({\Large e^{ln(v)} = e^C e^{\int pdx}}\) (两边给e上指数)

得到v的构造

\({\Large v = e^Ce^{\int pdx}}\)

因为v是可以任意构造的,只要符合构造逻辑 \({\Large v' = vp}\) 即可。所以可以选方便的C=0

\({\Large v = e^{\int pdx}}\)

而且实际算v的积分时,一样可以把生成的C都忽略。
因为即使都忽略掉,仍然符合构造的逻辑,那么我们采用一个最好算的v就行。
可以验证一下

\({\Large v = e^{\int pdx} = e^P}\) (小p积分得到大P,积分后不要C)

\({\Large v' = e^Pp = vp}\) (符合要求)

这些操作对我是重要的,开始没仔细看,后续碰到实际问题很难受,逻辑上总是感觉缺东西。 一般教材里好像也没有详细说明。

那么已经得到了一阶线性微分方程的解法。
- 方程转成标准形式 - 算v - vq对x积分 - 再除以v

一些微积分基础操作#

上一节的疑问,为什么能把求导拆开再积分。

积分中的替换#

见托马斯微积分第5.5章

如果有

\({\Large \int f(g(x))g'(x)dx}\)

可以设\({\Large u=g(x)}\),把整个积分替换为

\({\Large \int f(u)du}\)

\({\Large \int f(u)\frac{du}{dx}dx = \int f(u)du}\)

证明:

设F为f的积分,有

\({\Large \frac{d}{dx}F(g(x)) = f(g(x))g'(x)}\)

两边对x积分,左右换一下,回到问题

\({\Large \int f(g(x))g'(x)dx = \int \frac{d}{dx}F(g(x))dx}\)

\({\Large = F(g(x)) + C}\) (右边F先求导再积出来肯定还是本身)

\({\Large = F(u) + C}\)

\({\Large = \int F'(u)du}\) (先回到关于u的函数,再进积分,就得到了du)

\({\Large = \int f(u)du}\)

反过来操作也成立,即做成展开。

\({\Large \int f(u)du = \int f(u)\frac{du}{dx}dx}\)


一种微分方程的变量分离#

见托马斯微积分第7.4章,或[Calculus Early Transcendental Functions, 7th Edition]6.3章,大多数书都应该会讲。

\({\Large \frac{dy}{dx} = g(x)h(y)}\)

给定这种形式的方程,可以推出一个等式,把x相关和y相关的量各放一边,各自积分结果相等。

\({\Large \int \frac{1}{h(y)}dy = \int g(x)dx}\)

用上一节的替换方法可证明

\({\Large \int \frac{1}{h(y)}dy = \int \frac{1}{h(y)}\frac{dy}{dx}dx}\)

\({\Large = \int \frac{1}{h(y)}g(x)h(y)dx}\) (代入)

\({\Large = \int g(x)dx}\)


3. 应用#

与速度成正比的阻力下的运动#

设物体质量m,距离函数s,速度v,时刻t。

力 = 质量 x 加速度 = \({\Large m\frac{dv}{dt}}\)

阻力与速度成正比

\({\Large m\frac{dv}{dt} = -kv}\)

\({\Large \frac{dv}{dt} = -\frac{k}{m}v}\)

此时如果按上述的方法会解出v=0。
按托马斯微积分7.4节,可解出非零解。

\({\Large \frac{1}{v} \frac{dv}{dt} = -\frac{k}{m}}\) (v!=0,两边可除以v)

\({\Large \int\frac{1}{v} \frac{dv}{dt} dt = \int -\frac{k}{m} dt}\) (两边对t积分)

\({\Large ln(|v|) = -\frac{kt}{m} + C}\)

\({\Large |v| = e^{-\frac{kt}{m} + C}}\)

\({\Large v = \pm e^Ce^{-\frac{kt}{m}}}\)

\({\Large v = Ae^{-\frac{kt}{m}}}\)

其中\({\Large A=\pm e^C}\)

那么这个不定的常数A是什么意思?理论上取任何值都是正确的。
这样想,如果我们取t=0得到的是什么,是\(v_0\),也就是初始速度。
得到\(v_0=A\),然后这个A就是我们可以自定的初始速度,可取任意值。

\({\Large v = v_0e^{(-k/m)t}}\)

可以从这个公式看出一些信息。如果质量m很大,那么需要很多时间速度才能降下来。

如果和距离关联

\({\Large \frac{ds}{dt} = v_0e^{(-k/m)t}}\)

两边积分得

\({\Large s = -\frac{v_0m}{k}e^{(-k/m)t} + C}\)

此时可以给定初始条件t=0,s=0。得

\({\Large C = \frac{v_0m}{k}}\)

代入s得

\({\Large s(t) = \frac{v_0m}{k}(1- e^{(-k/m)t})}\)

得到了距离和时间得关系。如果想知道物体最多能滑行多远,t取无穷大。得

\({\Large \lim_{t->\infty}s(t) = \frac{v_0m}{k}(1-0) = \frac{v_0m}{k}}\)

到此如果已知质量和摩擦系数,可以求速度1变化到速度2的时间。可以求某个初始速度下滑行的最大距离。


不准确的人口的指数增长#

\({\Large \frac{dP}{dt} = kP}\)

和上一节的例子相似,假设当前人口变化率为当前总人口乘一个常系数k(相对增长率)。

任意时刻的总人口P为

\({\Large P = P_0e^{kt}}\)

从1980-1989世界人口数据来看,k接近一个常数0.017,而1980年人口为4454m。那么

\({\Large P = P_0e^{kt} = 4454e^{0.017t}}\)

取t=28即算2008年的人口,得7169m。但实际人口为6707m。

为什么不准,因为建模太简单,没考虑其他各种因素。实际上k是会变化的。


4. 几种形式#

对于微分方程的标准形式

\({\Large \frac{dy}{dx} + p(x)y = q(x)}\)


如果q=0且p为常数k,就是上面的摩擦力例子。

\({\Large \frac{dy}{dx} + ky = 0}\)

\({\Large \frac{dy}{dx} = - ky}\)

\({\Large \int \frac{1}{y} dy = \int -k dx}\) (变量分离积分)

\({\Large ln(y) = -kx + C}\)

\({\Large y = e^{- kx + C}}\)

\({\Large y = Ce^{- kx}}\)


如果q=0

\({\Large \frac{dy}{dx} + p(x)y = 0}\)

\({\Large \frac{dy}{dx} = -p(x)y}\)

\({\Large \int \frac{dy}{y} = \int -p(x)dx}\) (变量分离积分)

\({\Large ln(y) = -P(x) + C}\)

\({\Large y = Ce^{-P(x)}}\)


完整形式

\({\LARGE y = \frac{\int v(x)q(x)dx + C}{v(x)} }\)


5.The Fundamental Theorem of Calculus 相关#

微积分基本定理第一部分(见托马斯微积分5.4章)有

\({\Large \frac{d}{dx}\int_{a}^{x} f(t)dt = f(x)}\)

两边对x积分

\({\Large \int_{a}^{x} f(t)dt = \int f(x)dx + C}\)

a可以取任意值。这样可以重写积分。比如微分方程的解

\({\LARGE y = \frac{\int v(x)q(x)dx + C}{v(x)} }\)

可以写成

\({\LARGE y = \frac{\int_{a}^{x} v(t)q(t)dt + C}{v(x)} }\)

这样重写是合法的,可以验证,把v(x)乘回去,两边对x求导,能还原到上一步的

\({\Large \frac{d}{dx}vy = v(x)q(x)}\)

这在某些情况下有用。

此时a仍然可以选定任意值。

中文好像称为”变上限积分”之类。


这里有一个对新手比较重要的思想

\({\Large \int f(x)dx =\int_{a}^{x} f(t)dt + C}\)

就是这样替换之后的积分变量t到底是啥意思,有什么意义?

t可以说已经没什么具体意义了,单纯是一个算积分的变量,跟具体问题已经没关系了。
具体问题的变量是x,已经挪到了积分上限。
t可以写成除了x和a的任何字母,而且在推导过程中可以随意换,不要在视觉上冲突即可。

甚至可以直接不要t,简写成

\({\Large \int f(x)dx =\int_{a}^{x} f + C}\)

最初看一些具体问题的推导,他们随意换这个t,都懵了。这样理解的话可以想通了。
要点在于问题的变量x和函数f,而不是t的表示。
这里还有个问题。
对于某些具体问题(比如初始值问题),需要求C,也就是确定一个特殊解。
可能需要先选定一个a。这里一旦选定了某个a,并在此基础上计算,a就确定了,不能再随意更改。

另外对于v(x),也可以转换

\({\Large v(x) = e^{\int pdx} = e^{\int_{a}^{x}p(t')dt' + C} = e^{\int_{a}^{x}p(t')dt'} }\) (同样可以不要C)

同样可以验证

\({\Large v(x) = e^{\int_{a}^{x}p(t')dt'} = e^{P(x) - P(a)} }\)

\({\Large v'(x) = e^{P(x) - P(a)}\frac{d}{dx} (P(x) - P(a)) = e^{P(x) - P(a)} p(x) = vp }\)

这样v里面原本的变量x可以放到积分上限了。
而且更加可以体现出,a可以选任意值,无论选哪个数结果都一样。
有的资料把积分下限a也省略了,不知道是不是正规的写法
意思应该是积分时不要算下限,同时积分完了也不要C。
这种操作同样也可以得到验证。

\({\Large v(x) = e^{\int_{}^{x}p(t')dt'} = e^{P(x)} }\)

\({\Large v'(x) = e^{P(x)}\frac{d}{dx} P(x) = e^{P(x)} p(x) = vp }\)


然后对于微分方程的解可以做进一步的操作。

因为解的积分变量x换成了t,那么下面的v(x)对于t可看作常数,可以除进去。

\({\LARGE \frac{v(t)}{v(x)} = \frac{e^{\int_{a}^{t}p(t')dt'}}{e^{\int_{a}^{x}p(t')dt'}} = e^{\int_{a}^{t}p(t')dt' - \int_{a}^{x}p(t')dt'} = e^{\int_{x}^{t}p(t')dt'}}\)

那么

\({\LARGE y = \frac{\int_{a}^{x} v(t)q(t)dt + C}{v(x)} }\)

\({\LARGE = \int_{a}^{x} \frac{v(t)}{v(x)}q(t)dt + \frac{C}{v(x)} }\)

\({\LARGE = \int_{a}^{x} e^{\int_{x}^{t}p(t')dt'} q(t)dt + Ce^{-\int_{a}^{x}p(t')dt'} }\)

历尽千辛万苦得到这个结果,它包含一个二重积分。

仍然要记着之前说的,dt和dt’并不重要,积分域和f重要。

算具体值的时候,首先x是给定的。
然后按细分求和的思想来看,对于a到x中的每个t,都要算一个里面的积分

\({\LARGE e^{\int_{x}^{t}p(t')dt'}}\)

而此时x,t,p都是已知,求积分,原理上完全没有问题。

做成从t积到x更舒服一些。

\({\LARGE y = \int_{a}^{x} e^{-\int_{t}^{x}p(t')dt'} q(t)dt + Ce^{-\int_{a}^{x}p(t')dt'} }\)

此时仍有a选任何值方程都成立。
可以大胆地选定一个方便的a=0,再结合y(x=0)构建初始值,可算出C

\({\Large y_0=C}\)

(a选0就是为了方便算,以及含义更清晰和通用。你也可以选3选999来算。本质一样,但混乱。)

那么带初始值的解变为

\({\LARGE y(x) = \int_{0}^{x} e^{-\int_{t}^{x}p(t')dt'} q(t)dt + y_0e^{-\int_{0}^{x}p(t')dt'} }\)

其中p,q,y0都是问题的已知数据。

这个实际上是体渲染方程,用来渲染比如烟雾、透光材质等。

例如眼睛在位置0处,看向物体的表面某点,点在x处。眼睛和物体都处于雾霾中。

这个方程就是算这条光路一共对眼睛打过去多少光能,也就是眼睛最后看到的颜色。

\({\LARGE e^{\int_{x}^{t}p(t')dt'}}\)是x到t的衰减比例。
其中p是衰减函数,如果p是常数,就相当于之间例子中的简单系数k,可以一步算出来。
对于复杂的介质,需要较复杂的函数来定义。
左边0到x的积分意思是眼睛到物体之间所有的点,都会考虑进来,每个点做一次计算。
每个点都会带一个初始能量q(t),然后算到眼睛的衰减。
积分就是所有点的能量加起来。

右边的y0是特殊的交点,物体的那一点初始能量就是y0,直接算衰减即可。