一阶常微分方程:从斜率找回函数 假设我们知道一个量怎样变化,却不知道它在每一刻的数值。能不能从变化规则找回这个量 ?变化率 、导数和 y ′ y' y ′ 这些记号来自导数页面,第 01 节会把它们重新交代一遍。先用一个小的数学例子看清楚:对 y = x 2 y=x^{2} y = x 2 求导,得到 y ′ = 2 x y'=2x y ′ = 2 x 。现在把问题倒过来 ,如果已知 y ′ = 2 x y'=2x y ′ = 2 x ,y y y 可以是什么函数?这里要找的是一整个函数 ,不是单独一个数。
我们会把这个小问题的答案代回原式检查 ,看看怎样判断一个函数是否符合要求。处理同时含有输入和未知函数 的规则时,还需要一些微积分工具,我们会在用到的地方逐步说明。找到精确解后,图中会保留它作比较。把不同位置的斜率画成短线场 ,就能研究怎样沿这些方向逐步求数值近似 。
01 · 先找到一个解 02 · 建立求解工具 03 · 分离变量 04 · 凑出一个乘积 05 · 求解与检验 06 · 从解回看斜率 07 · 逐步求近似值 函数给每个允许的输入一个对应输出。用 x 表示输入,y ( x ) y(x) y ( x ) 表示输出。例如 y ( x ) = x 2 y(x)=x^2 y ( x ) = x 2 ,输入 2 时输出是 4。导数 说的是另一件事:在当前输入附近,输出变化得多快 。反过来寻找函数 以前,我们先把这个意思找回来。
固定一个输入 x x x ,把它改为 x + h x+h x + h ,其中 h h h 是非零的输入变化 。输出就从 x 2 x^2 x 2 变为 ( x + h ) 2 (x+h)^2 ( x + h ) 2 。展开这个平方 后,减去旧输出,就得到输出变化;把它除以输入变化 ,得到:
( x + h ) 2 = ( x + h ) ( x + h ) = x 2 + 2 x h + h 2 ( x + h ) 2 − x 2 h = 2 x h + h 2 h = 2 x + h h ≠ 0 \begin{gathered}\begin{aligned}(x+h)^2&=(x+h)(x+h)\\&=x^2+2xh+h^2\end{aligned}\\\begin{aligned}\frac{(x+h)^2-x^2}{h}&=\frac{2xh+h^2}{h}\\&=2x+h\end{aligned}\\h\ne0\end{gathered} ( x + h ) 2 = ( x + h ) ( x + h ) = x 2 + 2 x h + h 2 h ( x + h ) 2 − x 2 = h 2 x h + h 2 = 2 x + h h = 0 这个商是在该区间内,输入每变化一个单位,输出平均变化多少 。让 h h h 从正、负两边趋向零,2 x + h 2x+h 2 x + h 都趋向 2 x 2x 2 x 。这个极限给出的局部变化率叫导数 ,写成 y ′ ( x ) = 2 x y'(x)=2x y ′ ( x ) = 2 x ,也写成 d y / d x = 2 x dy/dx=2x d y / d x = 2 x 。撇号和 d / d x d/dx d / d x 都表示对 x x x 求导。我们 没有把 h = 0 h=0 h = 0 代入分式。
把问题倒过来 现在只给出 y ′ = 2 x y'=2x y ′ = 2 x 。我们要找一个可求导的函数,使它在所研究区间的每个输入处,导数都等于 2 x 2x 2 x 。这样通过导数来要求一个未知函数的方程,叫微分方程 。这里最高只出现一阶导数,所以是一阶 ;独立输入只有 x x x 一个,因此叫常微分方程 ,与含有多个独立输入的情形区别开来。
刚才的计算已经给出一个解:y = x 2 y=x^2 y = x 2 。再加上一个常数 C C C ,也就是当 x x x 改变时保持不变的数。新输出的差是 [ ( x + h ) 2 + C ] − [ x 2 + C ] [(x+h)^2+C]-[x^2+C] [( x + h ) 2 + C ] − [ x 2 + C ] ,两个 C C C 抵消,导数仍然是 2 x 2x 2 x 。因此,每个 y = x 2 + C y=x^2+C y = x 2 + C 都满足方程。常数 改变高度,却不改变这个变化率。
会不会还漏掉了另一类解?从任意一个解中减去 x 2 x^2 x 2 ,把差记作 D ( x ) = y ( x ) − x 2 D(x)=y(x)-x^2 D ( x ) = y ( x ) − x 2 ,它的差商等于原来两个差商之差,分别取极限就得到 D ′ = 2 x − 2 x = 0 D'=2x-2x=0 D ′ = 2 x − 2 x = 0 。一个可求导的函数若在整个区间上导数为零,就在这个区间上保持常数 。下面说明为什么这能排除其他解 ,而不只是检查几个画出的例子。
导数处处为零,为什么只能是常数? 任取两个输入 a < b a<b a < b 。假设它们的高度不同,连接两点的直线就有非零斜率 m = [ D ( b ) − D ( a ) ] / ( b − a ) m=[D(b)-D(a)]/(b-a) m = [ D ( b ) − D ( a )] / ( b − a ) 。把这条直线从 D D D 中减去,所得函数记作 R R R ,两端都满足 R ( a ) = R ( b ) = 0 R(a)=R(b)=0 R ( a ) = R ( b ) = 0 。如果 R R R 不处处为零,由于它连续,就会在内部取得一个正的最大值或负的最小值。在这个内部转折处,导数只能为零:左、右差商符号相反,而可求导要求它们趋向同一个值。若 R R R 处处为零,它的导数当然也为零。但是 R ′ = D ′ − m = − m R\prime=D\prime-m=-m R ′ = D ′ − m = − m ,如果 m ≠ 0 m\ne0 m = 0 ,导数就不可能为零。这是矛盾,所以两端高度必须相同。两个输入可以任取,因此整个区间内 D D D 是常数。
所以全部解组成了 y = x 2 + C y=x^2+C y = x 2 + C 这一族函数。要选出其中一个,还需要知道一个函数值。例如 y ( 0 ) = 3 y(0)=3 y ( 0 ) = 3 表示输入 0 时输出必须是 3。代入得到 3 = 0 2 + C 3=0^2+C 3 = 0 2 + C ,因此 C = 3 C=3 C = 3 ,答案是 y = x 2 + 3 y=x^2+3 y = x 2 + 3 。检查两项要求:导数是 2 x 2x 2 x ,在 0 处的值是 3。新增的函数值条件叫初始条件 ,它给的是高度 ,不是另一个导数。
下面的图中,水平位置是输入 x,竖直高度是输出 y。连接两个图像点的直线,其斜率等于高度变化除以水平变化 ,也就是刚才算的差商。把每个高度都加 C,会将曲线上下平移 ,却不改变这个商。比较这些曲线,并打开初始条件,看看哪一条经过要求的点。
x 平方加上不同常数的函数 -1 0 1 2 -2 0 2 4 6 8 x y 青色是当前函数。金线连接它上面的两个点,斜率是在非零区间上的平均变化率。灰线保留其他函数,方便比较。
下一个方程不仅涉及导数,还会涉及未知函数本身的值。在使用新微积分规则前,我们先从能写下来的变化建立它。始终区分两件事:导数给出局部变化率 ,原函数则是在反过来寻找求导以前的函数 。
1 · 撤销求导 如果 A ′ ( x ) = a ( x ) A'(x) = a(x) A ′ ( x ) = a ( x ) ,就把 A A A 叫作 a a a 的原函数 ,写作 ∫ a ( x ) d x = A ( x ) + C \int a(x)\,dx = A(x) + C ∫ a ( x ) d x = A ( x ) + C 。例如 ( x 2 ) ′ = 2 x (x^{2})' = 2x ( x 2 ) ′ = 2 x ,所以 ∫ 2 x d x = x 2 + C \int 2x\,dx = x^{2} + C ∫ 2 x d x = x 2 + C 。有常数 C C C ,是因为给一个函数加上常数并不改变它的斜率 。我们要用的关键事实是反过来的:如果两个函数在一个区间上处处有相同的导数 ,它们在这个区间上只相差一个常数 。
下一个目标是 y ′ = 2 x y y'=2xy y ′ = 2 x y 。与单独的 2 x 2x 2 x 不同,右边还含有未知的 y y y 。若在 y y y 非零的地方除以它,会得到 y ′ / y = 2 x y'/y=2x y ′ / y = 2 x 。因此我们需要认出一个由 y y y 本身组成的表达式的导数。把一个函数的输出作为另一个函数的输入,叫复合 。例如 y ( x ) = 3 x + 1 y(x)=3x+1 y ( x ) = 3 x + 1 、H ( u ) = u 2 H(u)=u^2 H ( u ) = u 2 ,那么 H ( y ( x ) ) = ( 3 x + 1 ) 2 H(y(x))=(3x+1)^2 H ( y ( x )) = ( 3 x + 1 ) 2 :输出 3 x + 1 3x+1 3 x + 1 被送入平方规则,成为新的输入 。
原函数记号中的积分号表示反过来寻找求导以前的函数,d x dx d x 则说明这里使用的输入变量是 x x x 。例如,x 2 x^2 x 2 对 x x x 的导数是 2 x 2x 2 x ,反过来就得到 x 2 x^2 x 2 加任意常数。如果输入变量改叫 u u u ,相应就写 d u du d u 。
2 · 链式法则 如果把函数 H H H 作用在 y ( x ) y(x) y ( x ) 上,那么 x x x 改变时,H ( y ( x ) ) H(y(x)) H ( y ( x )) 只是因为 y y y 改变才跟着改变。它的斜率等于 H H H 在当前 y y y 处的斜率, 乘以 y y y 的斜率:
d d x H ( y ( x ) ) = H ′ ( y ( x ) ) y ′ ( x ) \frac{d}{dx}H(y(x)) = H'(y(x))\,y'(x) d x d H ( y ( x )) = H ′ ( y ( x )) y ′ ( x ) 在一个能展开的例子上检验:取 H ( u ) = u 2 H(u) = u^{2} H ( u ) = u 2 、y = 3 x + 1 y = 3x + 1 y = 3 x + 1 ,展开得到 ( 3 x + 1 ) 2 = 9 x 2 + 6 x + 1 (3x + 1)^{2} = 9x^{2} + 6x + 1 ( 3 x + 1 ) 2 = 9 x 2 + 6 x + 1 ,导数是 18 x + 6 18x + 6 18 x + 6 ;链式法则给出 2 ( 3 x + 1 ) × 3 = 18 x + 6 2(3x + 1) \times 3 = 18x + 6 2 ( 3 x + 1 ) × 3 = 18 x + 6 ,相同。因子 y ′ ( x ) y'(x) y ′ ( x ) ,这里是 3 3 3 ,正是后面最重要的部分。
内层某次没有变化时,链式法则为什么仍然成立? 导数的定义说,差商趋向一个确定的值。把差商与这个极限之间的差记为 r,差商就等于导数加 r,而 r 趋向零。再乘上输入变化,输出变化就写成“线性部分加上较小的误差”。下面对内层、外层函数各使用一次这个写法。
两个变化率为什么相乘?把输入的小变化记为 δ \delta δ ,由此产生的 y y y 的变化记为 k = y ( x + δ ) − y ( x ) k=y(x+\delta)-y(x) k = y ( x + δ ) − y ( x ) 。可求导意味着 k = y ′ ( x ) δ + δ r ( δ ) k=y'(x)\delta+\delta r(\delta) k = y ′ ( x ) δ + δ r ( δ ) ,其中 r ( δ ) r(\delta) r ( δ ) 趋向零。同样,H H H 的变化可写成 H ′ ( y ) k + k s ( k ) H'(y)k+k s(k) H ′ ( y ) k + k s ( k ) ,其中 s ( k ) s(k) s ( k ) 趋向零,并令 s ( 0 ) = 0 s(0)=0 s ( 0 ) = 0 。用后一式除以非零的 δ \delta δ 。因为 k / δ k/\delta k / δ 趋向 y ′ ( x ) y'(x) y ′ ( x ) ,它保持有界;多出的 s ( k ) k / δ s(k)k/\delta s ( k ) k / δ 因而趋向零。剩下的就是 H ′ ( y ) y ′ ( x ) H'(y)y'(x) H ′ ( y ) y ′ ( x ) 。即使某次 k = 0 k=0 k = 0 ,也没有除以 k k k ,所以论证仍然成立。
3 · 构造对数,再寻找它的逆运算 要得到 y ′ / y y'/y y ′ / y ,链式法则提示我们寻找一个函数 H H H ,使它在 u u u 处的导数为 1 / u 1/u 1/ u 。对正的 u u u ,可以用累积的有向面积 来构造它:从 1 开始,记下正曲线 1 / u 1/u 1/ u 下方直到 z z z 的面积;若 z < 1 z<1 z < 1 ,就取从 z z z 到 1 的面积的相反数,让向后移动也把变化反过来。把这个函数记为 L ( z ) L(z) L ( z ) ,起点有 L ( 1 ) = 0 L(1)=0 L ( 1 ) = 0 。
把端点从 z z z 移到 z + δ z+\delta z + δ ,增加的面积是一条细条。用这份有向面积除以带符号的宽度 δ \delta δ ,结果夹在细条内 1 / u 1/u 1/ u 的最小高度和最大高度之间,也就是 1 / z 1/z 1/ z 与 1 / ( z + δ ) 1/(z+\delta) 1/ ( z + δ ) 之间。当 δ → 0 \delta\to0 δ → 0 ,两者都趋向 1 / z 1/z 1/ z ,所以 L ′ ( z ) = 1 / z L'(z)=1/z L ′ ( z ) = 1/ z 。这个面积函数叫 自然对数,记作 ln z \ln z ln z 。它不是为了套方程而猜出的一条规则;细条的计算说明了导数从哪里来 。
1/u 曲线下的面积与端点处增加的细条 1 2 3 0 1 2 3 u 1/u 横坐标这里表示 u,曲线高度是 1/u。青色标出 1 与 z 之间的面积;金色标出 z 与 z + δ 之间的小细条。
观察夹住平均高度的两个值 端点 z1.500
δ = 0.2 δ = 0.05 δ = -0.05
较低的端点高度 : 0.588 0.588 0.588 细条的平均高度 : 0.626 0.626 0.626 较高的端点高度 : 0.667 0.667 0.667 0.588 ≤ 0.626 ≤ 0.667 0.588\le 0.626\le 0.667 0.588 ≤ 0.626 ≤ 0.667 L ( z + δ ) − L ( z ) δ ≈ 0.626 \frac{L(z+\delta)-L(z)}{\delta}\approx 0.626 δ L ( z + δ ) − L ( z ) ≈ 0.626 高度保留三位小数。 向右移动时,增加的面积和宽度都为正。面积除以宽度就是平均高度,夹在两端高度之间。
L(z) 记录从 1 到端点积累的面积。改变 δ 是检查它在 z 处的变化率,不会改变参考起点 1。
重置细条 接着要能撤销对数。先看为什么可以:向右移动端点会增加一块正的面积,所以随着 z z z 增加,值严格增加。固定一个正数 b b b ,由链式法则,对 a a a 求导得到 [ ln ( a b ) ] ′ = 1 / a [\ln(ab)]\prime=1/a [ ln ( ab )] ′ = 1/ a ,与 ln a \ln a ln a 的导数相同。两者的差因此不随 a a a 改变;取 a = 1 a=1 a = 1 ,差就是 ln b \ln b ln b ,所以 ln ( a b ) = ln a + ln b \ln(ab)=\ln a+\ln b ln ( ab ) = ln a + ln b 。
重复使用这条规则,得到 ln ( 2 n ) = n ln 2 \ln(2^n)=n\ln2 ln ( 2 n ) = n ln 2 。再取 a a a 和 1 / a 1/a 1/ a ,有 ln a + ln ( 1 / a ) = ln 1 = 0 \ln a+\ln(1/a)=\ln1=0 ln a + ln ( 1/ a ) = ln 1 = 0 ,所以 ln ( 2 − n ) = − n ln 2 \ln(2^{-n})=-n\ln2 ln ( 2 − n ) = − n ln 2 。从 1 到 2 的面积为正,所以 ln 2 > 0 \ln2>0 ln 2 > 0 。让正整数 n n n 增大,上述数值向正、负两个方向都没有上限。由于对数连续且严格增加,每个实数输出 v v v 恰好对应一个正输入。把这个输入记为 E ( v ) E(v) E ( v ) ,定义就是 ln ( E ( v ) ) = v \ln(E(v))=v ln ( E ( v )) = v 。
对数的加法规则给出 ln ( E ( u ) E ( v ) ) = u + v \ln(E(u)E(v))=u+v ln ( E ( u ) E ( v )) = u + v ,因此 E ( u + v ) = E ( u ) E ( v ) E(u+v)=E(u)E(v) E ( u + v ) = E ( u ) E ( v ) ,而且 E ( 0 ) = 1 E(0)=1 E ( 0 ) = 1 。把 E ( 1 ) E(1) E ( 1 ) 这个数命名为 e e e ,重复相乘就得到整数处的 E ( n ) = e n E(n)=e^n E ( n ) = e n 。因此写作 E ( v ) = e v E(v)=e^v E ( v ) = e v ,称为指数函数 。这样就有 e ln z = z e^{\ln z}=z e l n z = z (z > 0 z>0 z > 0 )以及 e u + v = e u e v e^{u+v}=e^ue^v e u + v = e u e v 。
求它的导数时,记 z = E ( v ) z=E(v) z = E ( v ) ,让 v v v 改变非零的 Δ v \Delta v Δ v 。对数的差商 Δ v / Δ z \Delta v/\Delta z Δ v /Δ z 趋向 1 / z 1/z 1/ z ,取倒数就得到 Δ z / Δ v → z \Delta z/\Delta v\to z Δ z /Δ v → z 。因此 ( e v ) ′ = e v (e^v)'=e^v ( e v ) ′ = e v 。若里面再放一个函数 P ( x ) P(x) P ( x ) ,由链式法则 得到下面的式子。
d d x e P ( x ) = e P ( x ) P ′ ( x ) , d d x e x 2 = e x 2 ⋅ 2 x . \frac{d}{dx}e^{P(x)}=e^{P(x)}P\prime(x),\qquad \frac{d}{dx}e^{x^2}=e^{x^2}\cdot2x. d x d e P ( x ) = e P ( x ) P ′ ( x ) , d x d e x 2 = e x 2 ⋅ 2 x . 最后,后面的解可能为负。若 z < 0 z<0 z < 0 ,绝对值 ∣ z ∣ = − z > 0 |z|=-z>0 ∣ z ∣ = − z > 0 ,因此可以对 − z -z − z 取对数。链式法则给出 ( ln ( − z ) ) ′ = ( 1 / ( − z ) ) ( − 1 ) = 1 / z (\ln(-z))\prime=(1/(-z))(-1)=1/z ( ln ( − z )) ′ = ( 1/ ( − z )) ( − 1 ) = 1/ z 。所以对所有 z ≠ 0 z\ne0 z = 0 都有 ( ln ∣ z ∣ ) ′ = 1 / z (\ln|z|)\prime=1/z ( ln ∣ z ∣ ) ′ = 1/ z 。零仍然不能包括,因为不能除以零,对数在零处也没有定义。
现在我们精确地解 y ′ = 2 x y y' = 2xy y ′ = 2 x y ,初始条件 y ( 0 ) = 3 y(0) = 3 y ( 0 ) = 3 。思路是把方程整理到两边都是某个已知函数的导数 ,再用工具 1。我们一步一步地来。
第 1 步 · 先找常数解 我们马上要除以 y y y ,而不能除以零,所以先问:y = 0 y = 0 y = 0 是不是一个解?常数函数 y = 0 y = 0 y = 0 的斜率是 0 0 0 ,规则给出 2 x × 0 = 0 2x \times 0 = 0 2 x × 0 = 0 。两边相等,所以 y = 0 y = 0 y = 0 是一个解。现在就把它记下来,因为下一步的除法会悄悄地把它丢掉。
第 2 步 · 在 y y y 不为零的地方除以 y y y y ′ ( x ) y ( x ) = 2 x \frac{y'(x)}{y(x)} = 2x y ( x ) y ′ ( x ) = 2 x 第 3 步 · 认出左边是一个导数 取函数 H ( u ) = ln ∣ u ∣ H(u)=\ln|u| H ( u ) = ln ∣ u ∣ ,它在 u ≠ 0 u\ne0 u = 0 时的导数是 H ′ ( u ) = 1 / u H'(u)=1/u H ′ ( u ) = 1/ u 。把 y ( x ) y(x) y ( x ) 放进去,链式法则告诉我们,ln ∣ y ( x ) ∣ \ln|y(x)| ln ∣ y ( x ) ∣ 的导数是 ( 1 / y ( x ) ) y ′ ( x ) (1/y(x))y'(x) ( 1/ y ( x )) y ′ ( x ) ,正好是左边。右边 2 x 2x 2 x 是 x 2 x^2 x 2 的导数。因此方程说的是:两个函数的导数相同 :
d d x ln ∣ y ( x ) ∣ = d d x x 2 \frac{d}{dx}\ln|y(x)| = \frac{d}{dx}\,x^{2} d x d ln ∣ y ( x ) ∣ = d x d x 2 第 4 步 · 撤销求导 根据工具 1,导数相同的两个函数只相差一个常数,记作 C 1 C_1 C 1 :
ln ∣ y ( x ) ∣ = x 2 + C 1 \ln|y(x)| = x^{2} + C_1 ln ∣ y ( x ) ∣ = x 2 + C 1 第 5 步 · 撤销对数 两边都取指数,并用 e u + v = e u e v e^{u + v} = e^{u}e^{v} e u + v = e u e v :
∣ y ( x ) ∣ = e x 2 + C 1 = e C 1 e x 2 |y(x)| = e^{x^{2} + C_1} = e^{C_1}\,e^{x^{2}} ∣ y ( x ) ∣ = e x 2 + C 1 = e C 1 e x 2 第 6 步 · 去掉绝对值,再把 y = 0 y = 0 y = 0 放回来 y y y 要么是 + e C 1 e x 2 +e^{C_1}e^{x^{2}} + e C 1 e x 2 ,要么是 − e C 1 e x 2 -e^{C_1}e^{x^{2}} − e C 1 e x 2 。它不能从一个跳到另一个,因为连续函数要跳过去就必须经过 0 0 0 ,而我们是在 y y y 不为零的地方讨论的。所以 y = C e x 2 y = Ce^{x^{2}} y = C e x 2 ,其中 C C C 代表 ± e C 1 \pm e^{C_1} ± e C 1 ,可以是除 0 0 0 以外的任何数。再允许 C = 0 C = 0 C = 0 ,就把第 1 步的解找了回来 。把这些解合写成
y = C e x 2 y = C e^{x^{2}} y = C e x 2 这里 C C C 可以是任意实数,包括零。
第 7 步 · 用初始条件 代入 x = 0 x = 0 x = 0 :y ( 0 ) = C e 0 = C y(0) = Ce^{0} = C y ( 0 ) = C e 0 = C ,而我们要求 y ( 0 ) = 3 y(0) = 3 y ( 0 ) = 3 ,所以 C = 3 C = 3 C = 3 ,y = 3 e x 2 y = 3e^{x^{2}} y = 3 e x 2 。
第 8 步 · 检验 用工具 3 求导:y ′ = 3 e x 2 × 2 x = 2 x × ( 3 e x 2 ) = 2 x y y' = 3e^{x^{2}} \times 2x = 2x \times (3e^{x^{2}}) = 2xy y ′ = 3 e x 2 × 2 x = 2 x × ( 3 e x 2 ) = 2 x y ,规则成立;y ( 0 ) = 3 e 0 = 3 y(0) = 3e^{0} = 3 y ( 0 ) = 3 e 0 = 3 ,起始值也成立。两个检验都需要:一个检验斜率规则,另一个检验起点。
你会经常看到第 2 步到第 4 步写成一种简写:「d y y = 2 x d x \dfrac{dy}{y} = 2x\,dx y d y = 2 x d x ,两边积分,ln ∣ y ∣ = x 2 + C 1 \ln|y| = x^{2} + C_1 ln ∣ y ∣ = x 2 + C 1 」。这只是我们刚才所做事情的压缩记录,不是新的规则。左边和右边一样,都是对 x x x 积分的;能把它写成关于 y y y 的式子,靠的是链式法则。每当这种简写看起来神秘,就回到第 3 步。
形如 y ′ = a ( x ) g ( y ) y'=a(x)g(y) y ′ = a ( x ) g ( y ) 的方程叫可分离变量方程 ,因为右边能拆成 x x x 的函数与 y y y 的函数相乘。在 g ( y ( x ) ) g(y(x)) g ( y ( x )) 始终非零、被积函数连续的区间上,相除得到 y ′ / g ( y ) = a ( x ) y'/g(y)=a(x) y ′ / g ( y ) = a ( x ) 。选原函数 G ′ = 1 / g G'=1/g G ′ = 1/ g 、A ′ = a A'=a A ′ = a ,链式法则给出 G ( y ( x ) ) = A ( x ) + C G(y(x))=A(x)+C G ( y ( x )) = A ( x ) + C 。这已经是描述解的关系;能单独解出 y y y 时再解出来,然后使用初始条件并检验 。使 g ( y ) = 0 g(y)=0 g ( y ) = 0 的常数值,要另代入原方程检查 。
现在看 y ′ + 2 y = 4 y' + 2y = 4 y ′ + 2 y = 4 。作为斜率规则,y ′ = 4 − 2 y y' = 4 - 2y y ′ = 4 − 2 y :高度低于 2 2 2 时斜率为正,高于 2 2 2 时为负,在 y = 2 y = 2 y = 2 处图像保持水平。我们本可以再次分离变量,但这里用它来学第二种方法,这种方法在不能分离变量时也管用:形如 y ′ + p ( x ) y = q ( x ) y' + p(x)\,y = q(x) y ′ + p ( x ) y = q ( x ) 的方程,叫作一阶线性方程 ,因为 y y y 和 y ′ y' y ′ 都只出现一次方。
我们想把左边变成一个能够撤销的导数,乘积也许能帮忙。先算清乘积的导数。记 Δ h = h ( x + δ ) − h ( x ) \Delta h=h(x+\delta)-h(x) Δ h = h ( x + δ ) − h ( x ) 、Δ y = y ( x + δ ) − y ( x ) \Delta y=y(x+\delta)-y(x) Δ y = y ( x + δ ) − y ( x ) 。展开新乘积再减去旧乘积,得到 ( h + Δ h ) ( y + Δ y ) − h y = h Δ y + y Δ h + Δ h Δ y (h+\Delta h)(y+\Delta y)-hy=h\Delta y+y\Delta h+\Delta h\Delta y ( h + Δ h ) ( y + Δ y ) − h y = h Δ y + y Δ h + Δ h Δ y 。除以非零的 δ \delta δ ,再让 δ \delta δ 趋向零。前两项分别趋向 h y ′ hy' h y ′ 、h ′ y h'y h ′ y ;最后一项是 Δ h ( Δ y / δ ) \Delta h(\Delta y/\delta) Δ h ( Δ y / δ ) ,因为 Δ h → 0 \Delta h\to0 Δ h → 0 而 Δ y / δ → y ′ \Delta y/\delta\to y' Δ y / δ → y ′ ,所以趋向零。因此 ( h y ) ′ = h y ′ + h ′ y (hy)'=hy'+h'y ( h y ) ′ = h y ′ + h ′ y 。我们的方程 y ′ + 2 y = 4 y'+2y=4 y ′ + 2 y = 4 也含有导数项和函数值项。能否找一个乘数 ,让左边恰好成为这个乘积的导数 ?
把整个方程乘以 h h h :h y ′ + 2 h y = 4 h hy' + 2hy = 4h h y ′ + 2 h y = 4 h 。要让左边成为 ( h y ) ′ = h y ′ + h ′ y (hy)' = hy' + h'y ( h y ) ′ = h y ′ + h ′ y ,需要 h ′ = 2 h h' = 2h h ′ = 2 h 。函数 h = e 2 x h = e^{2x} h = e 2 x 正好满足,因为由工具 3,( e 2 x ) ′ = e 2 x × 2 (e^{2x})' = e^{2x} \times 2 ( e 2 x ) ′ = e 2 x × 2 。它永远不为零,所以乘以它不会丢失任何解。现在按步骤做:
e 2 x y ′ + 2 e 2 x y = 4 e 2 x , ( e 2 x y ) ′ = 4 e 2 x , e 2 x y = 2 e 2 x + C , y = 2 + C e − 2 x . \begin{aligned}e^{2x}y'+2e^{2x}y&=4e^{2x},\\(e^{2x}y)'&=4e^{2x},\\e^{2x}y&=2e^{2x}+C,\\y&=2+Ce^{-2x}.\end{aligned} e 2 x y ′ + 2 e 2 x y ( e 2 x y ) ′ e 2 x y y = 4 e 2 x , = 4 e 2 x , = 2 e 2 x + C , = 2 + C e − 2 x . 第三步是撤销求导:2 e 2 x 2e^{2x} 2 e 2 x 的导数是 4 e 2 x 4e^{2x} 4 e 2 x ,所以两边相差一个常数 C C C 。最后一步除以 e 2 x e^{2x} e 2 x 。由 y ( 0 ) = 1 y(0) = 1 y ( 0 ) = 1 :1 = 2 + C 1 = 2 + C 1 = 2 + C ,所以 C = − 1 C = -1 C = − 1 ,y = 2 − e − 2 x y = 2 - e^{-2x} y = 2 − e − 2 x 。检验:y ′ = 2 e − 2 x y' = 2e^{-2x} y ′ = 2 e − 2 x ,y ′ + 2 y = 2 e − 2 x + 4 − 2 e − 2 x = 4 y' + 2y = 2e^{-2x} + 4 - 2e^{-2x} = 4 y ′ + 2 y = 2 e − 2 x + 4 − 2 e − 2 x = 4 。C = 0 C = 0 C = 0 时是水平解 y = 2 y = 2 y = 2 。在模型里,左图显示 y y y ,右图显示乘积 Y = e 2 x y Y = e^{2x}y Y = e 2 x y :无论起始高度是多少,在同一个 x x x 处每条 Y Y Y 曲线的斜率都是 4 e 2 x 4e^{2x} 4 e 2 x ,所以它们只相差常数,正如第三步所说。
原来的高度 y y y y′ + 2y = 4 的解 y 0 0.5 1 1.5 0 1 2 3 4 x y 灰色曲线分别取 y ( 0 ) = 0 y(0) = 0 y ( 0 ) = 0 、1、2、3、4。青色表示我们选定的初值。 新的高度 Y = e 2 x y Y = e^{2x}y Y = e 2 x y 新的曲线 Y = e²ˣy 0 0.5 1 1.5 0 10 20 30 40 x Y 右图的纵轴数字表示 Y Y Y ,不是原来的 y y y 。在同一个 x x x 处,这些曲线的导数都是 4 e 2 x 4e^{2x} 4 e 2 x ;高度只相差常数。 x = 0.500 , y ≈ 1.632 , h = e 2 x ≈ 2.718 x=0.500,\quad y\approx1.632,\quad h=e^{2x}\approx2.718 x = 0.500 , y ≈ 1.632 , h = e 2 x ≈ 2.718 h y ′ = h ( 4 − 2 y ) ≈ 2.000 hy'=h(4-2y)\approx2.000 h y ′ = h ( 4 − 2 y ) ≈ 2.000 h ′ y = 2 h y ≈ 8.873 h'y=2hy\approx8.873 h ′ y = 2 h y ≈ 8.873 ( h y ) ′ = h y ′ + h ′ y = 4 h ≈ 10.873 (hy)'=hy'+h'y=4h\approx10.873 ( h y ) ′ = h y ′ + h ′ y = 4 h ≈ 10.873 小数保留三位;符号等式保留精确的抵消关系。
保持 x x x 不变,只改变初始高度。两个单独的项会改变,但它们的和仍然是 4 h 4h 4 h ,因为 − 2 h y + 2 h y = 0 -2hy + 2hy = 0 − 2 h y + 2 h y = 0 。两张图使用刚才推导的精确公式;图像帮助我们看清等式,乘积法则的计算才说明它为什么成立。
现在看方程 y ′ + p ( x ) y = q ( x ) y'+p(x)y=q(x) y ′ + p ( x ) y = q ( x ) ,其中 p ( x ) p(x) p ( x ) 、q ( x ) q(x) q ( x ) 是所研究区间内已知的连续函数。为了与乘积法则匹配,需要 h ′ = p h h'=ph h ′ = p h 。选一个原函数 P ′ = p P'=p P ′ = p ,再令 h = e P ( x ) h=e^{P(x)} h = e P ( x ) ,由链式法则有 h ′ = e P P ′ = p h h'=e^P P'=ph h ′ = e P P ′ = p h ,正好符合要求,而且 h h h 始终为正。这个乘数叫积分因子 。整式相乘得到 ( e P y ) ′ = e P q (e^Py)'=e^Pq ( e P y ) ′ = e P q ,撤销求导,再除以非零的 e P e^P e P ,得到:
y = e − P ( x ) ( ∫ e P ( x ) q ( x ) d x + C ) P ′ = p \begin{gathered}y=e^{-P(x)}\left(\int e^{P(x)}q(x)\,dx+C\right)\\P'=p\end{gathered} y = e − P ( x ) ( ∫ e P ( x ) q ( x ) d x + C ) P ′ = p 现在回到前面的方程 y ′ = 2 x y y\prime=2xy y ′ = 2 x y ,检查是否遗漏了某一段为零、另一段不为零的解。对乘积 e − x 2 y e^{-x^2}y e − x 2 y 求导,得到 e − x 2 ( y ′ − 2 x y ) = 0 e^{-x^2}(y\prime-2xy)=0 e − x 2 ( y ′ − 2 x y ) = 0 ,最后一步用了原方程。所以该乘积在整个区间内都是同一个常数,包括可能的零点,因而这里的全部解确实都是 y = C e x 2 y=Ce^{x^2} y = C e x 2 。刚才推导的乘积法则,使这次检查在 y 为零的地方仍然成立。
解 y ′ + y x = x y' + \dfrac{y}{x} = x y ′ + x y = x ,y ( 1 ) = 1 y(1) = 1 y ( 1 ) = 1 。因为 1 / x 1/x 1/ x 在 0 0 0 处没有定义,而起点的 x = 1 x = 1 x = 1 ,所以只在 x > 0 x > 0 x > 0 上讨论。这里 p = 1 / x p = 1/x p = 1/ x ,所以 P = ln x P = \ln x P = ln x ,积分因子是 e ln x = x e^{\ln x} = x e l n x = x 。乘以 x x x 得到 x y ′ + y = x 2 xy' + y = x^{2} x y ′ + y = x 2 ,由乘积法则,左边就是 ( x y ) ′ (xy)' ( x y ) ′ 。撤销求导(用 ( x 3 / 3 ) ′ = x 2 (x^{3}/3)' = x^{2} ( x 3 /3 ) ′ = x 2 ),再除以 x x x :
( x y ) ′ = x 2 x y = x 3 3 + C y = x 2 3 + C x \begin{aligned}(xy)'&=x^2\\xy&=\frac{x^3}{3}+C\\y&=\frac{x^2}{3}+\frac Cx\end{aligned} ( x y ) ′ x y y = x 2 = 3 x 3 + C = 3 x 2 + x C 在 x = 1 x = 1 x = 1 处:1 = 1 3 + C 1 = \tfrac{1}{3} + C 1 = 3 1 + C ,所以 C = 2 3 C = \tfrac{2}{3} C = 3 2 ,y = x 2 3 + 2 3 x y = \dfrac{x^{2}}{3} + \dfrac{2}{3x} y = 3 x 2 + 3 x 2 。检验:y ′ = 2 x 3 − 2 3 x 2 y' = \dfrac{2x}{3} - \dfrac{2}{3x^{2}} y ′ = 3 2 x − 3 x 2 2 ,y x = x 3 + 2 3 x 2 \dfrac{y}{x} = \dfrac{x}{3} + \dfrac{2}{3x^{2}} x y = 3 x + 3 x 2 2 ;相加时含 x 2 x^{2} x 2 的分数抵消,剩下 2 x 3 + x 3 = x \dfrac{2x}{3} + \dfrac{x}{3} = x 3 2 x + 3 x = x 。在 x = 2 x = 2 x = 2 处,解的值是 4 3 + 1 3 = 5 3 \tfrac{4}{3} + \tfrac{1}{3} = \tfrac{5}{3} 3 4 + 3 1 = 3 5 。
试一试 第一题:解 y ′ = x y y' = xy y ′ = x y ,y ( 0 ) = − 2 y(0) = -2 y ( 0 ) = − 2 。第二题:解 y ′ + y = 3 y' + y = 3 y ′ + y = 3 ,y ( 0 ) = 5 y(0) = 5 y ( 0 ) = 5 。每一题都检验方程和起始值,再打开答案。
第一题答案:分离变量 第 1 步:y = 0 y = 0 y = 0 是一个解。第 2 到 4 步:y ′ y = x \dfrac{y'}{y} = x y y ′ = x ,所以 ln ∣ y ∣ = x 2 2 + C 1 \ln|y| = \dfrac{x^{2}}{2} + C_1 ln ∣ y ∣ = 2 x 2 + C 1 ,因为 ( x 2 2 ) ′ = x \left(\dfrac{x^{2}}{2}\right)' = x ( 2 x 2 ) ′ = x 。第 5、6 步:y = C e x 2 / 2 y = Ce^{x^{2}/2} y = C e x 2 /2 ,C C C 为任意实数。第 7 步:y ( 0 ) = C = − 2 y(0) = C = -2 y ( 0 ) = C = − 2 ,所以 y = − 2 e x 2 / 2 y = -2e^{x^{2}/2} y = − 2 e x 2 /2 。第 8 步:y ′ = − 2 e x 2 / 2 × x = x y y' = -2e^{x^{2}/2} \times x = xy y ′ = − 2 e x 2 /2 × x = x y ,y ( 0 ) = − 2 y(0) = -2 y ( 0 ) = − 2 。负的答案没有问题:符号保留在 C C C 里。
第二题答案:积分因子 这里 p = 1 p = 1 p = 1 ,所以 P = x P = x P = x ,因子是 e x e^{x} e x 。相乘:e x y ′ + e x y = 3 e x e^{x}y' + e^{x}y = 3e^{x} e x y ′ + e x y = 3 e x ,也就是 ( e x y ) ′ = 3 e x (e^{x}y)' = 3e^{x} ( e x y ) ′ = 3 e x 。撤销求导:e x y = 3 e x + C e^{x}y = 3e^{x} + C e x y = 3 e x + C ,所以 y = 3 + C e − x y = 3 + Ce^{-x} y = 3 + C e − x 。由 y ( 0 ) = 5 y(0) = 5 y ( 0 ) = 5 :5 = 3 + C 5 = 3 + C 5 = 3 + C ,所以 C = 2 C = 2 C = 2 ,y = 3 + 2 e − x y = 3 + 2e^{-x} y = 3 + 2 e − x 。检验:y ′ + y = − 2 e − x + 3 + 2 e − x = 3 y' + y = -2e^{-x} + 3 + 2e^{-x} = 3 y ′ + y = − 2 e − x + 3 + 2 e − x = 3 ,y ( 0 ) = 3 + 2 = 5 y(0) = 3 + 2 = 5 y ( 0 ) = 3 + 2 = 5 。
在精确解法中,我们把方程整理成一个认得出的表达式的导数,再撤销求导。链式法则说明分离变量为何有效,乘积法则说明积分因子为何有效。接下来回到已经求出的解,逐点观察它的局部斜率,再看看怎样直接按照这些斜率构造近似路径。
我们已经求解并检验了 y ′ = 2 x y y'=2xy y ′ = 2 x y 。现在回到同一个方程,换一个问题:它怎样规定解在某一点的方向?读懂这个局部信息,不需要再发明一个求解方法。
把它读成一条关于斜率的规则 :在我们要找的图像上的任意一点 ( x , y ) (x, y) ( x , y ) ,斜率必须等于 2 2 2 乘 x x x 再乘 y y y 。不知道图像,也可以在某一点使用这条规则:在 ( 0.5 , 1 ) (0.5, 1) ( 0.5 , 1 ) 处,斜率必须是 2 × 0.5 × 1 = 1 2 \times 0.5 \times 1 = 1 2 × 0.5 × 1 = 1 ;在 ( 1 , 2 ) (1, 2) ( 1 , 2 ) 处,必须是 2 × 1 × 2 = 4 2 \times 1 \times 2 = 4 2 × 1 × 2 = 4 ;在直线 x = 0 x = 0 x = 0 上的任何地方,斜率都必须是 0 0 0 。像这样把未知函数和它的导数联系起来的方程,叫作微分方程。我们的方程里只有一阶导数,所以是一阶微分方程。
在模型里移动点 P P P ,看它的短斜线。再打开其他点的斜率:整幅由小短线组成的图叫作斜率场 。一个解,就是一条在经过的每一点都和那里的小短线相切的曲线 。
我们已经求出 y = C e x 2 y=Ce^{x^2} y = C e x 2 。若选定点 ( x 0 , y 0 ) (x_0,y_0) ( x 0 , y 0 ) ,代入得到 y 0 = C e x 0 2 y_0=Ce^{x_0^2} y 0 = C e x 0 2 。指数函数为正,可以相除,得到 C = y 0 e − x 0 2 C=y_0e^{-x_0^2} C = y 0 e − x 0 2 。因此经过这个点的解是 y ( x ) = y 0 e x 2 − x 0 2 y(x)=y_0e^{x^2-x_0^2} y ( x ) = y 0 e x 2 − x 0 2 。这就说明模型为何能在选定一点后画出整条曲线:它使用了已推导的解,不是从十三个点猜出曲线。
选定点的斜率与逐点画出的 y′ = 2xy 解曲线 -1 0 1 -3 -2 -1 0 1 2 3 x y P 金色:P P P 和具有规定斜率的短直线。青色:已记录的点与按公式画出的解曲线。显示灰色短线后,每条短线表示所在点规定的斜率。
注意,适合这个斜率场的曲线有很多条,每个起点一条。要从中挑出一条,还要给一个起始值,比如 y ( 0.5 ) = 1 y(0.5) = 1 y ( 0.5 ) = 1 :曲线必须经过点 ( 0.5 , 1 ) (0.5, 1) ( 0.5 , 1 ) 。这样的起始值叫作初始条件 。它给的是某个 x x x 处的高度,而不是另一个斜率。
我们已经知道 y ′ = 2 x y y'=2xy y ′ = 2 x y 经过 ( 0 , 1 ) (0,1) ( 0 , 1 ) 的精确解是 y = e x 2 y=e^{x^2} y = e x 2 。图中保留它作比较,我们来试一种只使用斜率规则的构造。在 ( 0 , 1 ) (0,1) ( 0 , 1 ) ,斜率是 2 × 0 × 1 = 0 2\times0\times1=0 2 × 0 × 1 = 0 ;沿这点的切线横向走 h = 0.2 h=0.2 h = 0.2 ,高度仍是 1。在新的近似点 ( 0.2 , 1 ) (0.2,1) ( 0.2 , 1 ) ,规则给出的斜率是 2 × 0.2 × 1 = 0.4 2\times0.2\times1=0.4 2 × 0.2 × 1 = 0.4 ;继续走 0.2,高度增加 0.4 × 0.2 = 0.08 0.4\times0.2=0.08 0.4 × 0.2 = 0.08 ,得到 1.08。每一步中,我们都用区间起点的斜率代替了区间内不断变化的斜率 :
起点斜率 = 2 x y y new = y + 2 x y Δ x \begin{gathered}\text{起点斜率}=2xy\\y_{\text{new}}=y+2xy\,\Delta x\end{gathered} 起点斜率 = 2 x y y new = y + 2 x y Δ x 在模型里一次走一步,把近似点和同一个输入处的精确高度比较。这叫欧拉法 ,是一种基础的数值方法。对这里的例子和这些正步长,减小步长会使近似更接近精确解 ;这不是对任意方程、任意步长的保证。还有其他精度更高的数值方法。这里先把欧拉法每一步究竟作了什么近似 看清楚。
按斜率规则一小步一小步地走 0 0.4 0.8 1.2 0 1 2 3 4 5 x y 青色:由一段段直线组成的路径,每一段的斜率都是规则在这段起点给出的斜率。灰色:精确解 y = e x 2 y = e^{x^2} y = e x 2 ,前面已经推导过它。
沿着斜率走 再走一步 上一步 走完所有步 重新开始
现在只记录了起点 ( 0 , 1 ) (0,1) ( 0 , 1 ) 。走第一步,才会使用它的斜率。 这里的 start 表示最近一步开始时的近似点,new 表示这一步的终点。显示的小数保留三位,计算时仍保留未舍入的数值。
在当前输入处,比较欧拉法的高度与精确高度:x = 0.000 , y E u l e r ≈ 1.000 , e x 2 ≈ 1.000 x=0.000,\quad y_{\mathrm{Euler}}\approx1.000,\quad e^{x^2}\approx1.000 x = 0.000 , y Euler ≈ 1.000 , e x 2 ≈ 1.000
用同一个输入处的精确高度减去欧拉法的高度:e x 2 − y E u l e r ≈ 0.000 e^{x^2}-y_{\mathrm{Euler}}\approx0.000 e x 2 − y Euler ≈ 0.000