一阶模型:从真实情境到方程
上一章里,我们学会了在还没有求出公式时,先问解是否唯一,再沿着相线判断它会往哪里走。人口会不会趋近某个平衡值,温度会不会越过室温,这些问题已经可以用方程回答。现在我们往前退一步:面对一杯咖啡、一只正在换水的水槽,甚至一只追着目标移动的小车,那个方程究竟是怎么来的?
这一步和算积分很不一样。题目不会自动告诉你该用可分离变量还是积分因子,甚至不会替你选好未知函数。我们要先决定跟踪什么,再把“为什么会变化”说清楚,最后才轮到求解。公式是我们对现象作出的具体判断,每一项都应该能翻译回一句有含义的话。
本章的数值情境都是为练习建模设置的例子,并非真实实验记录。我们会用这些设例走完同一条路:从现象写出方程,用初值和测量值确定一次具体过程,再回到情境里检查答案。
先说明变量、单位和假设,再把变化机制写成方程,最后检查解回答了什么问题。
先找要记的那一本账
想象你负责观察一只装有盐水的水槽。屏幕上可以显示水量、盐量、浓度,也可以显示进水管每分钟送来多少盐。这些数都在变,可它们并不是同一种东西。水量和盐量是槽里“此刻有多少”,流入速率是“每分钟增加多少”,浓度则是盐量除以水量。
如果我们想给盐记账,最直接的一句话就是:槽里盐量的变化率,等于流入盐量的速率减去流出盐量的速率。这个时候选总盐量作未知函数,方程里的每一项都有明确去处。若直接选浓度,就还要处理体积变化带来的稀释;并非不能做,只是这本账会多一道换算。
一般地,设 y ( t ) y(t) y ( t ) 是我们要跟踪的状态,就想找到
y ′ = F ( t , y ) , y ( 0 ) = y 0 . y'=F(t,y),\qquad y(0)=y_0. y ′ = F ( t , y ) , y ( 0 ) = y 0 .
初值 y 0 y_0 y 0 说的是开始时有多少,右端 F F F 说的是处在某个状态时怎样变化。它们来自不同的信息:称量能给出初始盐量,管道流量和充分混合的假设才能给出变化规律。只有一个初值,通常还无法确定变化规律中的参数。
单位是写方程时随手可用的检查工具。若 y y y 以千克计、t t t 以分钟计,那么 y ′ y' y ′ 就是千克每分钟;右边每一项也必须是千克每分钟。把“每分钟流入 3 升”直接写成盐量的导数,错误就出在这里:体积流量还要乘上每升含盐多少,才能成为盐的流入速率。
建模中的假设要能在推导里找到用途。“充分混合”用来确定出口浓度,“室温恒定”用来决定环境温度是否依赖时间,“阻力与速度成正比”用来确定力的表达式。说不清假设用在哪里,往往意味着方程还有一处没有想透。
我们先从最简单的账本开始:没有管道,也没有外部输入,数量本身决定它增加得多快。
细菌越多,为什么还要问资源够不够
一个培养皿里,如果每单位时间平均每个细菌贡献的净增量相同,那么细菌越多,总新增量就越多。设 P ( t ) P(t) P ( t ) 是种群数量,t t t 以小时计,把单位个体的净增长率记为 r r r ,就得到
P ′ = r P , P ( 0 ) = P 0 . P'=rP,\qquad P(0)=P_0. P ′ = r P , P ( 0 ) = P 0 .
r r r 的单位是 h − 1 \mathrm{h}^{-1} h − 1 。这里的“净”已经把繁殖和死亡的作用合并了;若还存在迁入迁出,必须另写来源,不能假装它们自动包含在一个固定比例里。数量本来是整数,我们却用连续函数表示它,这是把个体很多时的总体变化作连续近似。
在 P 0 > 0 P_0>0 P 0 > 0 时,把前面学过的分离变量用上:
d P P = r d t , ln P ( t ) P 0 = r t , P ( t ) = P 0 e r t . \frac{dP}{P}=r\,dt,
\qquad
\ln\frac{P(t)}{P_0}=rt,
\qquad
P(t)=P_0e^{rt}. P d P = r d t , ln P
写成 ln ( P / P 0 ) \ln(P/P_0) ln ( P / P 0 ) 还有一个好处:对数里是无单位的数量比。P 0 = 0 P_0=0 P 0 = 0 时不能用除以 P P P 的推导,但直接代回原式就知道 也是解。
设例:某培养物起初有 200 个计数单位,3 小时后有 400 个。若暂时接受指数增长假设,代入解式可得
400 = 200 e 3 r , r = ln 2 3 ≈ 0.2310 h − 1 . 400=200e^{3r},\qquad r=\frac{\ln2}{3}\approx0.2310\ \mathrm{h}^{-1}. 400 = 200 e 3 r , r = 3 ln 2 ≈
于是 P ( t ) = 200 ⋅ 2 t / 3 P(t)=200\cdot2^{t/3} P ( t ) = 200 ⋅ 2 t /3 ,9 小时后模型预测为 1600 个计数单位。不要把 r ≈ 0.2310 r\approx0.2310 r ≈ 0.2310 读成“每小时恰好增加 23.10%”:它是瞬时相对增长率,一整小时的增长倍数是 e r ≈ 1.2599 e^r\approx1.2599 e 。微分方程在每一刻都用更新后的数量继续增长。
同一结构也能描述衰减。若某种物质每单位时间损失的比例固定,写成 M ′ = − k M M'=-kM M ′ = − k M ,其中 k > 0 k>0 k > 0 ,就有 M = M 0 e − k t M=M_0e^{-kt} M = M 。设例中若半衰期是 6 小时,则 ,所以 ;18 小时后剩下 。半衰期固定,说的是每过同样长的时间剩余量减半,并不是每次减少同样多的质量。
把“拥挤会降低人均增长率”放进模型
刚才的培养物到 9 小时后真能达到 1600 吗?只凭两次计数无法回答。指数模型默认营养、空间和环境都没有因为数量增多而明显改变。要让资源限制进入方程,可以先修改最初那句人话:每个个体的净增长率会随着总数量上升而下降。
一个简单选择是让这个人均增长率线性下降,在 P = K P=K P = K 时变为零:
P ′ P = r ( 1 − P K ) . \frac{P'}{P}=r\left(1-\frac{P}{K}\right). P P ′ = r ( 1 − K
这里 r > 0 r>0 r > 0 是低密度时的增长参数,K > 0 K>0 K > 0 和 P P P 具有相同单位。乘回 P P P ,得到 Logistic 方程:
P ′ = r P ( 1 − P K ) . P'=rP\left(1-\frac{P}{K}\right). P ′ = r P ( 1 − K P ) .
K K K 叫环境容量或承载量,意思是这套固定环境假设下的平衡数量。它不是一道禁止跨越的硬墙。初始数量完全可以超过 K K K ,只是此时模型给出的净增长率为负,数量会下降。
先用上一章的相线检查:P = 0 P=0 P = 0 和 P = K P=K P = K 是平衡解;在 0 < P < K 0<P<K 0 < P < K 时 P ′ > 0 P'>0 P ,在 时 。对正初值, 是渐近稳定平衡值。右端是关于 的多项式,局部唯一性保证非平衡解不会在有限时刻撞上平衡解后再穿过去。
求公式时,要先记住这两个常数解,再对 P ≠ 0 , K P\ne0,K P = 0 , K 分离变量:
K P ( K − P ) d P = r d t . \frac{K}{P(K-P)}\,dP=r\,dt. P ( K − P ) K d P = r d t .
拆分分式以后,左边的积分就很熟悉了:
K P ( K − P ) = 1 P + 1 K − P , ln ∣ P K − P ∣ = r t + C . \frac{K}{P(K-P)}=\frac1P+\frac1{K-P},
\qquad
\ln\left|\frac{P}{K-P}\right|=rt+C. P ( K − P ) K = P
利用初值整理,可得对 P 0 > 0 P_0>0 P 0 > 0 有效的表达式
P ( t ) = K 1 + ( K P 0 − 1 ) e − r t , t ≥ 0. P(t)=\frac{K}{1+\left(\frac{K}{P_0}-1\right)e^{-rt}},\qquad t\ge0. P ( t ) = 1 + ( P 0
若 P 0 > K P_0>K P 0 > K ,括号里的系数虽然是负数,但大于 − 1 -1 − 1 ;对 t ≥ 0 t\ge0 t ≥ 0 ,分母仍为正,所以不会出现人口在未来某个时刻突然发散的问题。P 0 = K P_0=K P 代入公式也能恢复平衡解, 则仍应单独保留。
设例:某封闭培养环境取 K = 1200 K=1200 K = 1200 个计数单位,r = 0.4 h − 1 r=0.4\ \mathrm{h}^{-1} r = 0.4 h − 1 ,起初 P 0 = 200 P_0=200 P 0 = 。则
P ( t ) = 1200 1 + 5 e − 0.4 t . P(t)=\frac{1200}{1+5e^{-0.4t}}. P ( t ) = 1 + 5 e − 0.4 t 1200 .
数量达到 600 时,分母应等于 2,所以
5 e − 0.4 t = 1 , t = ln 5 0.4 ≈ 4.02 h . 5e^{-0.4t}=1,
\qquad
t=\frac{\ln5}{0.4}\approx4.02\ \mathrm h. 5 e − 0.4 t = 1 , t = 0.4 ln 5 ≈ 4.02
为什么特意问 600?因为总增长速率可写成
P ′ = r P ( 1 − P K ) = r K 4 − r K ( P − K 2 ) 2 . P'=rP\left(1-\frac PK\right)
=\frac{rK}{4}-\frac rK\left(P-\frac K2\right)^2. P ′ = r P ( 1 − K P )
它在 P = K / 2 P=K/2 P = K /2 时最大,本例最大速率为 120 120 120 个计数单位每小时。数量很少时,资源充足但繁殖者也少;接近容量时,繁殖者很多但人均净增长率很低。最快增长出现在两者之间。对应地,从 P 0 < K / 2 P_0<K/2 P 0 < K /2 起步的增长曲线先向上弯,再向下弯;若初值已经在 K / 2 K/2 K /2 上方,就不会在未来再经历前半段。
使用交互时,可以先让两个模型采用相同的初值与低密度增长参数,看它们早期为何接近,再观察数量增大后怎样分开。还要分清“已知参数后比较曲线”和“从数据估计参数”:两次很早期的计数通常不足以可靠确定 r r r 与 K K K ,因为此时 P / K P/K P / K 很小,不同的 K K K 可能给出相近预测。若环境随季节改变,或出生到繁殖有明显时滞,这个固定 r , K r,K r , K 的模型也需要调整。
咖啡冷却:先减去室温,再谈指数衰减
咖啡刚倒出来时凉得快,接近室温后却慢了下来。要把这个观察写成变化率,我们先问:驱动散热的到底是什么?如果把一杯同样温度的咖啡放进更暖的房间,它就不会以同样的速度降温。真正相关的是咖啡与周围环境的温差。
设咖啡温度为 T ( t ) T(t) T ( t ) ,环境温度为常数 T a T_a T a 。把“温差越大,温度变化越快”近似为正比关系,就得到牛顿冷却模型
T ′ = − k ( T − T a ) , k > 0. T'=-k(T-T_a),\qquad k>0. T ′ = − k ( T − T a ) , k > 0.
t t t 若用分钟,k k k 的单位就是 m i n − 1 \mathrm{min}^{-1} min − 1 。温差用摄氏度或开尔文表示时,数值相同;绝对温度的零点不同,不影响这个温差关系。
负号可以直接检查。咖啡比房间热时,T − T a > 0 T-T_a>0 T − T a > 0 ,方程给出 T ′ < 0 T'<0 T ′ < 0 ;冰箱里取出的冷金属比房间冷时,T − T a < 0 T-T_a<0 ,同一方程就给出 。它描述的是向环境温度靠近。
先跟踪物体与环境的温差,温度变化的方向就容易判断了。
令 θ = T − T a \theta=T-T_a θ = T − T a ,因为环境温度固定,有 θ ′ = T ′ \theta'=T' θ ′ = T ,原方程变成 。于是
θ ( t ) = ( T 0 − T a ) e − k t , T ( t ) = T a + ( T 0 − T a ) e − k t . \theta(t)=(T_0-T_a)e^{-kt},
\qquad
T(t)=T_a+(T_0-T_a)e^{-kt}. θ ( t ) = ( T 0 − T a )
指数衰减的是温差,不是咖啡温度本身。如果忘掉 T a T_a T a 而写成 T = T 0 e − k t T=T_0e^{-kt} T = T 0 e − k t ,模型会把温度拉向 0 ∘ ,无论房间有多暖,这显然答错了问题。
用一次测量估计参数,再作一次预测
设例:室温为 20 ∘ C 20^\circ\mathrm C 2 0 ∘ C ,咖啡起初是 84 ∘ C 84^\circ\mathrm C 8 4 ∘ C ,8 分钟后测得 60 ∘ C 60^\circ\mathrm C 6 0 ∘ C 。先认为室温稳定、杯内温度近似均匀、杯子和散热条件没有改变。初值给出
T ( t ) = 20 + 64 e − k t . T(t)=20+64e^{-kt}. T ( t ) = 20 + 64 e − k t .
8 分钟时温差由 64 降到 40,因此
e − 8 k = 40 64 = 5 8 , k = 1 8 ln 8 5 ≈ 0.05875 m i n − 1 . e^{-8k}=\frac{40}{64}=\frac58,
\qquad
k=\frac18\ln\frac85\approx0.05875\ \mathrm{min}^{-1}. e − 8 k = 64 40 =
若问咖啡什么时候降到 44 ∘ C 44^\circ\mathrm C 4 4 ∘ C ,对应温差为 24,故
24 = 64 e − k t , t = ln ( 8 / 3 ) k = 8 ln ( 8 / 3 ) ln ( 8 / 5 ) ≈ 16.69 m i n . 24=64e^{-kt},
\qquad
t=\frac{\ln(8/3)}{k}
=\frac{8\ln(8/3)}{\ln(8/5)}\approx16.69\ \mathrm{min}. 24 = 64 e − k t , t = k
这是从刚开始计时起的时间。若人在第 8 分钟才开始等,还需等待约 8.69 8.69 8.69 分钟。这里保留 k k k 的对数表达式再计算,能避免过早四舍五入带来的误差。
还能提出一个不用重新拟合的检验:第二个 8 分钟里,温差应继续乘以 5 / 8 5/8 5/8 ,所以模型预测
T ( 16 ) = 20 + 64 ( 5 8 ) 2 = 45 ∘ C . T(16)=20+64\left(\frac58\right)^2=45^\circ\mathrm C. T ( 16 ) = 20 + 64 ( 8 5 ) 2 = 4
如果真实测量系统性地偏离这个结果,我们就该检查散热条件,而不是只重复计算 k k k 。盖上盖子、搅拌、加入牛奶或把杯子移到风口,都可能改变模型参数或状态。用一条测量值确定一个参数,只说明模型能经过那条数据,不能证明它会准确预测所有后来时刻。
更一般地,在物体始终位于室温同一侧时,两个测量时刻满足
k = 1 t 2 − t 1 ln ∣ T ( t 1 ) − T a ∣ ∣ T ( t 2 ) − T a ∣ . k=\frac{1}{t_2-t_1}
\ln\frac{|T(t_1)-T_a|}{|T(t_2)-T_a|}. k = t 2 − t 1
多次测量应当给出大致一致的衰减参数。若温差已经很小,相同大小的测温误差会在比例里占更大分量,因此接近室温的数据并不天然更适合估计 k k k 。
本节把整杯咖啡当成一个均匀温度的对象,也把复杂散热近似成固定比例关系。如果内部温差很大,就不能用一个 T ( t ) T(t) T ( t ) 代表整个物体;如果室温随时间变化,应写成 T ′ + k T = k T a ( t ) T'+kT=kT_a(t) T ′ + k T = k T a ( t ) ,用一阶线性方程处理。此时 的导数是 ,不能再悄悄省去后一项。
在恒定室温模型里,只要初始温差非零,有限时刻的 e − k t e^{-kt} e − k t 就不会等于零,所以物体不会恰好达到或越过室温。实验仪器显示“已经等于室温”,通常只说明温差小到仪器分辨不出来。
混合罐:盐量的账和水量的账要一起算
冷却模型盯住的是温差。回到开头那只水槽,我们要找的是流入、流出各带走多少盐。设 A ( t ) A(t) A ( t ) 是槽内盐量,单位为千克,V ( t ) V(t) V ( t ) 是溶液体积,单位为升。入口浓度为 c i n c_{\mathrm{in}} c in 千克每升,流入和流出的体积流量分别为 q i n q_{\mathrm{in}} q 、 升每分钟。
先假设盐始终完全溶解、槽内充分混合,没有另外的盐生成或消失,并忽略蒸发。每分钟进来的盐就是“每升多少盐”乘“每分钟多少升”;出口浓度则由槽内此刻状态决定,是 A / V A/V A / V 。所以
A ′ = q i n c i n − q o u t A V ( t ) , A ( 0 ) = A 0 . A'=q_{\mathrm{in}}c_{\mathrm{in}}
-q_{\mathrm{out}}\frac{A}{V(t)},
\qquad A(0)=A_0. A ′ = q in c in
这条方程里,入口浓度是外部给定的,出口浓度是随解变化的。若误把流出项也写成 q o u t c i n q_{\mathrm{out}}c_{\mathrm{in}} q out c in ,就等于假设刚开始出口已经和入口一样浓,完全跳过了混合过程。
水量还有自己的一本账。在流量恒定且尚未装满或排空时,
V ′ = q i n − q o u t , V ( t ) = V 0 + ( q i n − q o u t ) t . V'=q_{\mathrm{in}}-q_{\mathrm{out}},
\qquad
V(t)=V_0+(q_{\mathrm{in}}-q_{\mathrm{out}})t. V ′ = q in − q
先用体积平衡得到 V ( t ) V(t) V ( t ) ,再用盐量平衡得到 A ( t ) A(t) A ( t ) ,最后才取比值得到浓度。
进出一样快:先把恒体积过程算完
设例:槽内起初有 100 升盐水和 10 千克盐,入口浓度为 0.2 0.2 0.2 千克每升,进出流量都为 5 升每分钟。假设这些浓度下盐都能完全溶解。由于体积一直为 100 升,模型是
A ′ = 5 × 0.2 − 5 A 100 = 1 − A 20 , A ( 0 ) = 10. A'=5\times0.2-5\frac A{100}
=1-\frac A{20},
\qquad A(0)=10. A ′ = 5 × 0.2 − 5 100 A = 1
每分钟进入 1 千克盐,流出量却不是固定数,它随着槽内盐量变化。整理成线性方程后,积分因子为 e t / 20 e^{t/20} e t /20 ,因此
( e t / 20 A ) ′ = e t / 20 , A = 20 + C e − t / 20 . \left(e^{t/20}A\right)'=e^{t/20},
\qquad
A=20+Ce^{-t/20}. ( e t /20 A ) ′ = e t /20 , A
初值给出 C = − 10 C=-10 C = − 10 ,所以
A ( t ) = 20 − 10 e − t / 20 k g , c ( t ) = A ( t ) 100 = 0.2 − 0.1 e − t / 20 k g / L . A(t)=20-10e^{-t/20}\ \mathrm{kg},
\qquad
c(t)=\frac{A(t)}{100}=0.2-0.1e^{-t/20}\ \mathrm{kg/L}. A ( t ) = 20 − 10 e − t /20 kg , c ( t )
若问什么时候达到入口浓度的 90%,要解的是 c = 0.18 c=0.18 c = 0.18 ,不是 A = 0.18 A=0.18 A = 0.18 。代入得 e − t / 20 = 0.2 e^{-t/20}=0.2 e − t /20 = 0.2 ,故 t = 20 ln 5 ≈ 32.19 t=20\ln5\approx32.19 t 分钟。
长期盐量趋近 20 千克,浓度趋近 0.2 0.2 0.2 千克每升。达到平衡不表示管道停了:每分钟仍进入 1 千克盐,也流出 1 千克盐,净变化才等于零。咖啡的温差会衰减,这里“入口浓度减槽内浓度”的差也会衰减,熟悉的指数形式来自相似的变化机制。
进得比出得快:公式能延长,罐子不能无限装
换一组设例:水槽容量为 120 升,初始装有 60 升溶液和 3 千克盐。入口浓度为 0.1 0.1 0.1 千克每升,流入 4 升每分钟,流出 2 升每分钟。此时
V ( t ) = 60 + 2 t , A ′ = 0.4 − 2 A 60 + 2 t = 0.4 − A 30 + t , A ( 0 ) = 3. V(t)=60+2t,
\qquad
A'=0.4-\frac{2A}{60+2t}
=0.4-\frac{A}{30+t},
\qquad A(0)=3. V ( t ) = 60 + 2 t , A ′ = 0.4 −
算积分前就该检查容量:60 + 2 t = 120 60+2t=120 60 + 2 t = 120 给出装满时刻 t = 30 t=30 t = 30 分钟。所以我们目前写下的是 0 ≤ t < 30 0\le t<30 0 ≤ t < 30 上的模型,到 30 分钟可以取填满前的连续极限值。
方程的积分因子可以取 t + 30 t+30 t + 30 ;这里 t t t 表示以分钟为单位的数值,若给积分因子作无量纲规范,也可取 ( t + 30 ) / 30 (t+30)/30 ( t + 30 ) /30 ,只差一个不影响结果的常数倍。于是
( ( t + 30 ) A ) ′ = 0.4 ( t + 30 ) , ( t + 30 ) A = 0.2 ( t + 30 ) 2 + C . \bigl((t+30)A\bigr)'=0.4(t+30),
\qquad
(t+30)A=0.2(t+30)^2+C. ( ( t + 30 ) A ) ′ = 0.4 ( t + 30 ) , ( t +
代入 A ( 0 ) = 3 A(0)=3 A ( 0 ) = 3 得 90 = 180 + C 90=180+C 90 = 180 + C ,所以
A ( t ) = 0.2 ( t + 30 ) − 90 t + 30 , c ( t ) = A ( t ) 2 ( t + 30 ) = 0.1 − 45 ( t + 30 ) 2 . A(t)=0.2(t+30)-\frac{90}{t+30},
\qquad
c(t)=\frac{A(t)}{2(t+30)}
=0.1-\frac{45}{(t+30)^2}. A ( t ) = 0.2 ( t + 30 ) − t + 30
装满前一刻,A ( 30 ) = 10.5 A(30)=10.5 A ( 30 ) = 10.5 千克,浓度为 10.5 / 120 = 0.0875 10.5/120=0.0875 10.5/120 = 0.0875 千克每升。它仍低于入口浓度,因为最初较淡的盐水尚未被充分替换。
若把公式继续算到 60 分钟,会得到一个数学数值,但那已经不是题设水槽的状态:水槽容不下 180 升。要继续建模,就必须规定装满后是关闭进水、降低流量还是允许溢流。如果假设多出的每分钟 2 升也以槽内浓度溢出,总流出就变为每分钟 4 升,之后的新方程应为
A ′ = 0.4 − 4 A 120 , A ( 30 ) = 10.5. A'=0.4-\frac{4A}{120},
\qquad A(30)=10.5. A ′ = 0.4 − 120 4 A , A ( 30 ) = 10.5.
因此这一新增假设下,t ≥ 30 t\ge30 t ≥ 30 时
A ( t ) = 12 − 1.5 e − ( t − 30 ) / 30 . A(t)=12-1.5e^{-(t-30)/30}. A ( t ) = 12 − 1.5 e − ( t − 30 ) /30 .
它在切换时刻接上原来的盐量,再逐渐趋近 12 千克。接着解一个现实过程,常常意味着接着写一个新模型,而不是无限延长旧公式。
反过来,若流出大于流入,形式上的排空时间为 V 0 / ( q o u t − q i n ) V_0/(q_{\mathrm{out}}-q_{\mathrm{in}}) V 0 / ( q out − q in ) 。模型只能用在体积为正的阶段;排空之后 没有意义,保持原有流出速率的假设通常也不再成立。
浓度可以直接建模,但要带上乘积法则
我们并非只能选盐量。若想直接研究浓度 c = A / V c=A/V c = A / V ,从 A = c V A=cV A = c V 出发,乘积法则给出
A ′ = V c ′ + c V ′ . A'=Vc'+cV'. A ′ = V c ′ + c V ′ .
把两本账代入,得到
V c ′ + c ( q i n − q o u t ) = q i n c i n − q o u t c , Vc'+c(q_{\mathrm{in}}-q_{\mathrm{out}})
=q_{\mathrm{in}}c_{\mathrm{in}}-q_{\mathrm{out}}c, V c ′ + c ( q in − q
整理后恰好是
c ′ = q i n V ( t ) ( c i n − c ) . c'=\frac{q_{\mathrm{in}}}{V(t)}(c_{\mathrm{in}}-c). c ′ = V ( t ) q in
流出项抵消了,因为充分混合的液体流出时,盐和水按同一比例减少,流出本身不立即改变浓度。但 q o u t q_{\mathrm{out}} q out 仍会通过 V ( t ) V(t) V ( t ) 影响后来浓度变化的速度,不能说它对整个过程“没有影响”。
观察模拟时,要同时看体积、盐量和浓度。盐量上升并不必然意味着浓度上升,因为水可能增加得更快;任何越过容量或排空时刻的轨迹,都需要额外说明后续机制。
这里单独画出进出流量同为 q 的恒体积情形。充分混合使出口浓度等于 A/V,流量乘浓度才是盐的流入或流出速率。
RC 电路:电容上的电压为什么慢慢追上电源
混合罐有输入,也有随着当前状态增大而增强的输出。电路里有一个很相近的过程:电源给电容充电,电容积累的电荷越多,它两端的电压越高,留给电阻的电压就越少,充电电流随之减小。
考虑理想电压源、电阻与电容串联的回路,电源电压记为 E E E ,电阻为 R > 0 R>0 R > 0 ,电容为 C > 0 C>0 C > 0 ,暂不考虑电感、漏电或参数随温度变化。设电容指定极板上的电荷为 q ( t ) q(t) q ( t ) ,把流入该极板的方向取作电流正方向,则
i = q ′ , v C = q C . i=q',\qquad v_C=\frac qC. i = q ′ , v C = C q
电流是每秒送来多少电荷,单位安培等于库仑每秒。电容关系 q = C v C q=Cv_C q = C v C 表示电容越大,建立同样电压需要积累的电荷越多。沿回路作电压平衡,电阻上的 R i Ri R i 加上电容电压应等于电源电压:
R i + v C = E . Ri+v_C=E. R i + v C = E .
代入上面的关系,便得到
R q ′ + q C = E , q ′ = C E − q R C . Rq'+\frac qC=E,
\qquad
q'=\frac{CE-q}{RC}. R q ′ + C q = E , q
现在每一项都能检查:R q ′ Rq' R q ′ 是欧姆乘安培,等于伏特;q / C q/C q / C 也是伏特。电路方程并不是多背了一条特殊公式,而是把电荷变化率和电压平衡接在一起。
若 q ( 0 ) = q 0 q(0)=q_0 q ( 0 ) = q 0 ,一阶线性方程给出
q ( t ) = C E + ( q 0 − C E ) e − t / ( R C ) , i ( t ) = C E − q 0 R C e − t / ( R C ) . q(t)=CE+(q_0-CE)e^{-t/(RC)},
\qquad
i(t)=\frac{CE-q_0}{RC}e^{-t/(RC)}. q ( t ) = C E + ( q 0 − C
也可以直接写电容电压:
v C ( t ) = E + ( v C ( 0 ) − E ) e − t / ( R C ) . v_C(t)=E+(v_C(0)-E)e^{-t/(RC)}. v C ( t ) = E + ( v C ( 0 ) −
乘积 τ = R C \tau=RC τ = R C 的单位是秒,叫时间常数。经过一个 τ \tau τ ,电容电压与最终值的差缩小到原来的 e − 1 ≈ 36.8 % e^{-1}\approx36.8\% e − 1 ≈ 36.8% 。若从零电压开始充电,就完成了最终电压的约 63.2 % 63.2\% 63.2% ;这不是“已经充满”。
设例:取 E = 9 V E=9\ \mathrm V E = 9 V 、R = 3000 Ω R=3000\ \Omega R = 3000 Ω 、C = 200 μ F = 2 × 10 − 4 F C=200\ \mu\mathrm F=2\times10^{-4}\ \mathrm F C = 200 μ F = 2 × ,电容起初没有电荷。先算
τ = R C = 0.6 s , C E = 1.8 × 10 − 3 C . \tau=RC=0.6\ \mathrm s,
\qquad
CE=1.8\times10^{-3}\ \mathrm{C}. τ = R C = 0.6 s , C E = 1.8 × 1 0 − 3 C .
这里最后的 C \mathrm C C 是库仑单位,与表示电容的变量 C C C 要区分。因此
q ( t ) = 1.8 × 10 − 3 ( 1 − e − t / 0.6 ) C , i ( t ) = 0.003 e − t / 0.6 A . q(t)=1.8\times10^{-3}(1-e^{-t/0.6})\ \mathrm C,
\qquad
i(t)=0.003e^{-t/0.6}\ \mathrm A. q ( t ) = 1.8 × 1 0 − 3 ( 1 − e
初始电流为 3 毫安,随后逐渐减小。电容电压达到电源电压的 95% 时,剩余差为 5%,所以
e − t / 0.6 = 0.05 , t = 0.6 ln 20 ≈ 1.80 s . e^{-t/0.6}=0.05,
\qquad
t=0.6\ln20\approx1.80\ \mathrm s. e − t /0.6 = 0.05 , t = 0.6 ln 20 ≈ 1.80 s .
若改成经电阻放电,必须说明闭合的放电回路如何形成。把电源设为零且保留电阻与电容的闭合回路,就有 R q ′ + q / C = 0 Rq'+q/C=0 R q ′ + q / C = 0 ,从切换时刻开始指数衰减;若只是把回路断开,理想模型中的电流为零,不能继续套同一个放电方程。
咖啡温差、恒体积混合罐的浓度差、电容电压与电源电压的差,都满足“差越大,消除差的速度越快”的关系。它们的参数意义不同,却都把前面学过的线性方程变成了具体可测的过程。
运动模型:速度大小和速度方向要分开想
到这里,我们跟踪的都是一个量。运动问题常让人一开始就想求位置,可如果力只依赖时间和速度,先跟踪速度会更直接。
设物体在近地面竖直运动,取向下为正,质量为常数 m m m 。重力向下,大小为 m g mg m g ;再假设介质阻力与速度大小成正比,而且总与运动方向相反,就可以统一写成阻力 − b v -bv − b v ,其中 b > 0 b>0 b > 0 。物体向下时 v > 0 v>0 v > 0 ,阻力为负;物体向上时 v < 0 v<0 ,阻力为正,两个方向都对。
牛顿第二定律说“合力等于质量乘加速度”,而加速度就是 v ′ v' v ′ ,所以
m v ′ = m g − b v , v ′ + b m v = g . mv'=mg-bv,
\qquad
v'+\frac bm v=g. m v ′ = m g − b v , v ′ + m
b b b 的单位是 k g / s \mathrm{kg/s} kg/s ,使得 b v bv b v 的单位为牛顿。线性方程的解为
v ( t ) = m g b + ( v 0 − m g b ) e − b t / m . v(t)=\frac{mg}{b}+\left(v_0-\frac{mg}{b}\right)e^{-bt/m}. v ( t ) = b m g + ( v 0
平衡速度 v ∗ = m g / b v_*=mg/b v ∗ = m g / b 叫终端速度。此时重力和阻力平衡,速度不再变化,物体却仍在运动。它与水槽中“盐量不变但仍有盐进出”类似:导数为零不等于过程里所有事情都停止了。
设例:取 m = 2 k g m=2\ \mathrm{kg} m = 2 kg 、b = 1 k g / s b=1\ \mathrm{kg/s} b = 1 kg/s 、g = 9.8 m / s 2 g=9.8\ \mathrm{m/s^2} g = 9.8 m/ s ,从静止释放,设向下位移 。则
v ( t ) = 19.6 ( 1 − e − t / 2 ) m / s . v(t)=19.6(1-e^{-t/2})\ \mathrm{m/s}. v ( t ) = 19.6 ( 1 − e − t /2 ) m/s .
速度达到终端速度的 90% 时,e − t / 2 = 0.1 e^{-t/2}=0.1 e − t /2 = 0.1 ,所以 t = 2 ln 10 ≈ 4.61 t=2\ln10\approx4.61 t = 2 ln 10 ≈ 4.61 秒。若还想知道走了多远,再把速度积分:
z ( t ) = ∫ 0 t 19.6 ( 1 − e − u / 2 ) d u = 19.6 [ t − 2 ( 1 − e − t / 2 ) ] . z(t)=\int_0^t19.6(1-e^{-u/2})\,du
=19.6\bigl[t-2(1-e^{-t/2})\bigr]. z ( t ) = ∫ 0 t 19.6 ( 1 − e
代回 t = 0 t=0 t = 0 得零,对 z z z 求导也回到 v v v ,初值和运动关系都对上了。不过这些公式只适用于碰到地面或其他边界之前,不能让物体在撞地之后继续穿下去;线性阻力也只是一定条件下的近似,若用平方阻力,统一方向的形式应为 − b v ∣ v ∣ -bv|v| − b v ∣ v ∣ ,不能在速度可能变号时一律写 − b v 2 -bv^2 − b v 。
追踪者每一刻到底朝哪里走
再想象一辆理想化的小车,它以固定速率追逐一个移动标记。控制规则是“始终朝标记现在的位置前进”。这句话已经说明速度方向,却还没有说明轨迹会是什么形状。
为了不把位置和本章的人口记号 P P P 混淆,记目标位置为 r ( t ) \mathbf r(t) r ( t ) ,追踪者位置为 x ( t ) \mathbf x(t) x ( t ) ,追踪速率为 s > 0 s>0 s > 0 。从追踪者指向目标的向量是 r − x \mathbf r-\mathbf x r − x ;除以距离,就得到长度为 1 的方向向量。因此
x ′ ( t ) = s r ( t ) − x ( t ) ∥ r ( t ) − x ( t ) ∥ . \mathbf x'(t)=s\frac{\mathbf r(t)-\mathbf x(t)}{\|\mathbf r(t)-\mathbf x(t)\|}. x ′ ( t ) = s ∥ r ( t ) − x ( t ) ∥ r ( t
这里用到的只是平面向量:分子负责方向,分母去掉距离带来的长度,外面的 s s s 再规定速度大小。若不除以距离,追踪者就会“离得越远跑得越快”,那是另一套规则;若把分子写反,它则会一直逃离目标。
设例:目标沿直线运动,位置为 r ( t ) = ( 0 , 2 t ) \mathbf r(t)=(0,2t) r ( t ) = ( 0 , 2 t ) 米,追踪者从 ( 6 , 0 ) (6,0) ( 6 , 0 ) 米出发,速率为每秒 3 米。写 x = ( x , y ) \mathbf x=(x,y) x = ( x , y ) ,两个坐标的变化率为
x ′ = − 3 x x 2 + ( 2 t − y ) 2 , y ′ = 3 ( 2 t − y ) x 2 + ( 2 t − y ) 2 , ( x ( 0 ) , y ( 0 ) ) = ( 6 , 0 ) . x'=-\frac{3x}{\sqrt{x^2+(2t-y)^2}},
\qquad
y'=\frac{3(2t-y)}{\sqrt{x^2+(2t-y)^2}},
\qquad (x(0),y(0))=(6,0). x ′ = −
起始时目标在原点,所以 x ′ ( 0 ) = − 3 x'(0)=-3 x ′ ( 0 ) = − 3 、y ′ ( 0 ) = 0 y'(0)=0 y ′ ( 0 ) = 0 :追踪者先向左走。随着目标向上移动,视线方向改变,追踪者的速度也不断转向。只要还没有重合,平方相加就能验证
( x ′ ) 2 + ( y ′ ) 2 = 9 , (x')^2+(y')^2=9, ( x ′ ) 2 + ( y ′ ) 2 = 9 ,
说明追踪者的速率确实一直是 3 米每秒。我们暂时不需要掌握系统求解方法,也能检查这组方程有没有忠实表达原来的运动规则。
固定目标的情形可以完整算出来。若目标一直停在原点,追踪者从 ( 6 , 0 ) (6,0) ( 6 , 0 ) 出发,则它始终沿横轴向左,碰到目标前有
x ( t ) = 6 − 3 t , y ( t ) = 0 , 0 ≤ t < 2. x(t)=6-3t,\qquad y(t)=0,\qquad 0\le t<2. x ( t ) = 6 − 3 t , y ( t ) = 0 , 0 ≤ t < 2.
距离在 2 秒时降到零,这给出了到达时间。到达时原方程分母为零,已不能决定接下来怎么办。如果规定到达后停车,可以另外接上 x = ( 0 , 0 ) \mathbf x=(0,0) x = ( 0 , 0 ) ,但这段停车规则是新增的,不是原来分式自动给出的结论。
移动目标的例子也能先作一个有用判断。记距离为 d = ∥ r − x ∥ d=\|\mathbf r-\mathbf x\| d = ∥ r − x ∥ ,视线单位向量为 u = ( r − x ) / d \mathbf u=(\mathbf r-\mathbf x)/d u = ( r − x ) / d ,在 d > 0 d>0 d > 0 时由求导得到
d ′ = u ⋅ ( r ′ − x ′ ) = u ⋅ r ′ − s . d'=\mathbf u\cdot(\mathbf r'-\mathbf x')
=\mathbf u\cdot\mathbf r'-s. d ′ = u ⋅ ( r ′ − x ′ ) =
本例目标速率为 2,所以它沿视线拉开距离的分量最多为 2,得到 d ′ ≤ 2 − 3 = − 1 d'\le2-3=-1 d ′ ≤ 2 − 3 = − 1 。初始距离为 6 米,因此在这套无障碍、可持续运动的理想规则下,不可能超过 6 秒仍保持正距离。这是对接近时间的上界判断,并没有声称已经求出了弯曲的追踪路线。
这个模型假设追踪者能连续获知目标当前位置、没有反应延迟、没有转弯速率限制,也不受障碍物影响。真实车辆通常不能瞬间调整方向,所以用它预测实际车辆轨迹前,必须把控制规则和运动限制补进去。追踪只是“朝现在的位置跑”;如果提前估计未来交会点,那叫拦截策略,方程会有所不同。
把结果交回原来的问题
写出并解出方程之后,还差最后一段工作。人口解是连续量,我们要解释它代表总体近似;冷却时间要说明从哪个时刻算起;混合罐要检查容量;电路要说明开关改变后回路是否仍然闭合;追踪模型则要说明到达目标时原方程停止适用。
可以用一个共同形式把其中几种过程连起来。咖啡、恒体积混合罐、恒压 RC 电路和线性阻力速度模型,都能写成
y ′ = y ∗ − y τ , τ > 0. y'=\frac{y_*-y}{\tau},\qquad \tau>0. y ′ = τ y ∗ − y , τ
y ∗ y_* y ∗ 是平衡值,τ \tau τ 是时间常数,解为
y ( t ) = y ∗ + ( y 0 − y ∗ ) e − t / τ . y(t)=y_*+(y_0-y_*)e^{-t/\tau}. y ( t ) = y ∗ + ( y 0 − y
这个相同形式能帮助我们理解曲线,但不能替代建模。变体积水槽的系数随时间改变,Logistic 模型的增长率随人口改变,追踪模型的方向随两个位置改变,都需要回到各自的变化机制来处理。
下面的练习继续沿着“解释机制、求出结果、检查适用范围”这条路走。所有数值仍为设例。
练习:两次计数告诉了我们什么
某培养物起初有 150 个计数单位,4 小时后有 300 个。假设指数增长,求 r r r 、P ( 10 ) P(10) P ( 10 ) 和再增加一倍所需的时间。仅凭这两次计数,能否断定以后一直指数增长?
显示答案 模型为 P ′ = r P P'=rP P ′ = r P 、P ( 0 ) = 150 P(0)=150 P ( 0 ) = 150 ,所以 300 = 150 e 4 r 300=150e^{4r} 300 = 150 e ,得到 。解为 ,于是 个计数单位。连续模型给出的不是必须为整数的实测计数。
练习:超过承载量的初值
设 P ′ = 0.3 P ( 1 − P / 900 ) P'=0.3P(1-P/900) P ′ = 0.3 P ( 1 − P /900 ) ,时间单位为小时,P ( 0 ) = 1200 P(0)=1200 P ( 0 ) = 1200 。求解,并求第一次下降到 1000 的时刻,说明它会不会继续下降到 800。
显示答案 代入 Logistic 初值公式得
P ( t ) = 900 1 − 1 4 e − 0.3 t . P(t)=\frac{900}{1-\frac14e^{-0.3t}}. P ( t ) = 1 − 4 1 e − 0.3 t
练习:同一个冷却方程也能升温
一块金属起初为 5 ∘ C 5^\circ\mathrm C 5 ∘ C ,放在 25 ∘ C 25^\circ\mathrm C 2 5 ∘ C 的室内,10 分钟后升到 15 ∘ C 15^\circ\mathrm C 1 5 ∘ C 。假设牛顿冷却模型成立,求 k k k 和达到 的时刻。
显示答案 初始温差为 − 20 ∘ C -20^\circ\mathrm C − 2 0 ∘ C ,所以 T ( t ) = 25 − 20 e − k t T(t)=25-20e^{-kt} T ( t ) = 25 − 20 e − k t 。由 15 = 25 − 20 e − 10 k 15=25-20e^{-10k} 得 ,于是 。
练习:盐水越来越少,浓度会不会变
槽内起初有 40 升盐水和 4 千克盐,纯水以每分钟 1 升流入,充分混合的盐水以每分钟 3 升流出。求体积、盐量和浓度,并写清有效时间。
显示答案 体积为 V = 40 − 2 t V=40-2t V = 40 − 2 t ,所以模型的物理时间范围是 0 ≤ t < 20 0\le t<20 0 ≤ t < 20 分钟。没有盐流入,盐量满足
A ′ = − 3 A 40 − 2 t , A ( 0 ) = 4. A'=-\frac{3A}{40-2t},\qquad A(0)=4. A
练习:电容经电阻放电
一只电容为 100 μ F 100\ \mu\mathrm F 100 μ F 的电容器初始电压为 8 伏,经 5000 Ω 5000\ \Omega 5000 Ω 电阻形成闭合放电回路,无外加电源。求电容电压、电荷和降至 1 伏所需的时间。
显示答案 时间常数为 R C = 5000 × 10 − 4 = 0.5 RC=5000\times10^{-4}=0.5 R C = 5000 × 1 0 − 4 = 0.5 秒。设 q q q 为原带正电极板上的电荷,则 R q ′ + q / C = 0 Rq'+q/C=0 R q , 库仑。因此
练习:终端速度不等于停止
设向下为正,物体满足 v ′ = 10 − 2 v v'=10-2v v ′ = 10 − 2 v 、v ( 0 ) = 8 v(0)=8 v ( 0 ) = 8 ,时间以秒计,速度以米每秒计。求 v ( t ) v(t) v ( t ) ,判断物体是在上升还是下降、是在加速还是减速,并求前 2 秒的向下位移。
显示答案 平衡速度为 5,线性方程解为 v ( t ) = 5 + 3 e − 2 t v(t)=5+3e^{-2t} v ( t ) = 5 + 3 e − 2 t 。它始终为正,所以物体向下运动;导数 v ′ = − 6 e − 2 t < 0 v'=-6e^{-2t}<0 v ′ = − 6 ,所以速率在减小。物体从高于终端速度的一侧趋近每秒 5 米,并不停止。
练习:用当前位置检查追踪方向
某时刻追踪者在 ( 1 , 1 ) (1,1) ( 1 , 1 ) 米,目标在 ( 4 , 5 ) (4,5) ( 4 , 5 ) 米,追踪者速率为每秒 2 米。求纯追踪规则下这一刻的速度。若目标固定在 ( 4 , 5 ) (4,5) ( 4 , 5 ) ,从这一刻开始多久可以到达?到达后原方程还有效吗?
显示答案 指向目标的向量为 ( 3 , 4 ) (3,4) ( 3 , 4 ) ,距离为 5 米,故单位方向是 ( 3 / 5 , 4 / 5 ) (3/5,4/5) ( 3/5 , 4/5 ) ,速度为 ( 6 / 5 , 8 / 5 ) (6/5,8/5) ( 6/5 , 8/5 ) 米每秒。其长度为 36 / 25 + 64 / 25 = 2 \sqrt{36/25+64/25}=2 ,方向和速率都正确。
经过这些例子,我们已经能把一段具体描述变成带单位、带初值、带适用范围的变化规律。不过,方程写对之后,积分未必都像本章这样顺利。若咖啡的散热系数随温度变化,入口浓度来自一段复杂的时间记录,或我们真想算出移动目标的追踪路线,就很可能得不到方便的显式解。
下一章会从本章留下的这个问题开始:已知当前状态和当前变化率,能不能先估计一小段时间之后的状态,再一步步把轨迹算出来?我们将学习 Euler 方法、改进 Euler 方法和 Runge–Kutta 方法,并用步长与误差检查,判断算出来的曲线究竟有多可信。