Bootstrap

数学模型与python基础——微分方程数学模型(1)

数学模型与python基础(3.1)

第一章讲了什么是数学模型,介绍了传染病学的sir模型。那么我们就趁热打铁从微分方程相关的数学模型以及相关的数学计算过程开始介绍。

微分方程数学模型

因为有很多系统虽然很难直接描述变量之间的关系,但是很容易描述变量和其微小增量或变化率的关系式,因此可以通过微分方程构件系统的数学模型。建模时,我们需要根据建模目的和问题分析做出简化假设,并且按照内在规律或类比法建立微分方程。

数学建模是有固定步骤的,必须要按照相应的步骤来才能高效地解决问题。步骤如下:
(1)问题的提出

(2)模型假设

(3)模型建立与求解

(4)结果分析

(5)模型评价与推广

数学建模的论文也应该以此作为行文顺序撰写,以下将以几个实际的例子来说明,不过由于具体的结果分析和模型评价与推广要基于具体问题和大量图表,在接下来的例子中就不涉及了。

火箭发射

(1)问题的提出

采用运载火箭把人造卫星发射到高空轨道上运行,为什么不能用一级火箭而必须用多级火箭系统?

(2)模型假设

A.卫星轨道为过地球中心某一平面的圆,卫星在此轨道上以地球引力做为向心力绕地球做平面圆周运动

B.地球是固定于空间中的均匀球体,其它星球对卫星引力忽略不记。地球半径为R,中心为O,地球质量看成集中于球心(认为地球是均匀球体)。

曲线 C C C为地球表面, C ′ C' C为卫星轨道,其半径为 r r r,卫星质量为 m m m

根据牛顿定律,地球对卫星的引力为:
F = G × m r 2 F=G\times \frac{m}{r^2} F=G×r2m
其中G为引力常数,可根据卫星在地面的重量算出,​
G m R 2 = m g , G = g R 2 \frac{Gm}{R^2}=mg,G=gR^2 R2Gm=mg,G=gR2
因此
F = m g × ( R r ) 2 F=mg\times (\frac{R}{r})^2 F=mg×(rR)2
由于卫星所受引力为其做匀速圆周运动时的向心力
F = m × v 2 r F=m\times \frac{v^2}{r} F=m×rv2
卫星速度为
v = R × g r v=R\times \sqrt{\frac{g}{r}} v=R×rg
假定需要将卫星送入600km的高空轨道,即 r − R = 600 k m r-R=600km rR=600km,取地球半径 R = 6400 k m R=6400km R=6400km,取重力加速度 g = 9.81 m / s 2 g=9.81m/s^2 g=9.81m/s2,那么计算可得 v = 7.6 k m / s v=7.6km/s v=7.6km/s

C.火箭在喷气推动下做近似直线运动,空气阻力不记

D.火箭喷出同种气体相对火箭的速度是不变的,假设目前的技术条件,火箭喷出气体相对火箭的速度 u = 3 k m / s u=3km/s u=3km/s

(3)模型建立与求解
单级火箭模型

由于燃料燃烧会喷出气体,所以火箭质量不是始终恒定不变的,假定火箭喷出气体相对火箭的速度为 u u u,则气体相对地球运动的速度为 v ( t ) − u v(t)-u v(t)u

对火箭飞行过程中的质量变化进行泰勒展开可得
m ( t + Δ t ) − m ( t ) = d m d t Δ t + o ( Δ t 2 ) m(t+\Delta t)-m(t)=\frac{dm}{dt}\Delta t+o(\Delta t^2) m(t+Δt)m(t)=dtdmΔt+o(Δt2)
v ( t + Δ t ) − v ( t ) = d v d t Δ t + o ( Δ t 2 ) v(t+\Delta t)-v(t)=\frac{dv}{dt}\Delta t+o(\Delta t^2) v(t+Δt)v(t)=dtdvΔt+o(Δt2)

Δ t \Delta t Δt前后动量守恒可得
m ( t ) v ( t ) = m ( t + Δ t ) v ( t + Δ t ) − ( d m d t Δ t + o ( Δ t 2 ) ) ( v ( t ) − u ) m(t) v(t)=m(t+\Delta t) v(t+\Delta t)-\left(\frac{d m}{d t} \Delta t+o\left(\Delta t^{2}\right)\right)(v(t)-u) m(t)v(t)=m(t+Δt)v(t+Δt)(dtdmΔt+o(Δt2))(v(t)u)

带入泰勒展开并忽略高阶小项
m ( t ) v ( t ) = [ m ( t ) + d m d t Δ t ] [ v ( t ) + d v d t Δ t ] − d m d t Δ t v ( t ) + d m d t Δ t u m(t) v(t)=[m(t)+\frac{dm}{dt}\Delta t][v(t)+\frac{dv}{dt}\Delta t]-\frac{d m}{d t} \Delta tv(t)+\frac{d m}{d t} \Delta tu m(t)v(t)=[m(t)+dtdmΔt][v(t)+dtdvΔt]dtdmΔtv(t)+dtdmΔtu

m ( t ) v ( t ) = m ( t ) v ( t ) + m ( t ) d v d t Δ t + d m d t Δ t v ( t ) + d m d t Δ t d v d t Δ t − d m d t Δ t v ( t ) + d m d t Δ t u m(t) v(t)=m(t) v(t)+m(t)\frac{dv}{dt}\Delta t+\frac{dm}{dt}\Delta tv(t)+\frac{dm}{dt}\Delta t\frac{dv}{dt}\Delta t-\frac{d m}{d t} \Delta tv(t)+\frac{d m}{d t} \Delta tu m(t)v(t)=m(t)v(t)+m(t)dtdvΔt+dtdmΔtv(t)+dtdmΔtdtdvΔtdtdmΔtv(t)+dtdmΔtu

忽略 Δ t 2 \Delta t^2 Δt2
0 = m ( t ) d v d t Δ t + d m d t Δ t v ( t ) − d m d t Δ t v ( t ) + d m d t Δ t u 0=m(t)\frac{dv}{dt}\Delta t+\frac{dm}{dt}\Delta tv(t)-\frac{d m}{d t} \Delta tv(t)+\frac{d m}{d t} \Delta tu 0=m(t)dtdvΔt+dtdmΔtv(t)dtdmΔtv(t)+dtdmΔtu

m d v d t Δ t = − u d m d t Δ t m \frac{d v}{d t}\Delta t =-u \frac{d m}{d t}\Delta t mdtdvΔt=udtdmΔt

m d v d t = − u d m d t m \frac{d v}{d t} =-u \frac{d m}{d t} mdtdv=udtdm

解微分方程。我知道有很多人已经忘掉,或者也没怎么会过微分方程的解法,这没关系,我们有python。

python有一个sympy科学计算库,具有大量符号计算的功能,解方程、求导、求极限、表达式求值之类的都能干。别的功能用到再说,这篇讲一下它怎么解常微分方程。

求解这个微分方程的代码如下

import sympy as sy
u, t, m0, v0 = sy.symbols('u, t, m_0, v_0')  # 为变量定义符号
v = sy.Function('v')  # 定义函数
m = sy.Function('m')  # 定义函数
# 定义微分方程,其中diff(v(t),t,1)表示v(t)对t求1阶导
ode = m(t)*sy.diff(v(t), t, 1)+u*sy.diff(m(t), t, 1)
# 上式中的微分方程表示m(t)*dv(t)/dt+u*dm(t)/d(t)=0
ode_sol = sy.dsolve(ode, v(t))  # 用dsolve函数解微分方程,且求解的是v(t)的表达式
sy.pprint(ode_sol)  # pretty print,美化打印,输出v(t)的通解
ics = {v(0): v0, m(0): m0}  # 定义微分方程的初始条件
# 将微分方程的初始条件带入通解,构建关于常数的方程,并用solve函数求解
# subs为替换函数用值或表达式替换原式中的值或表达式
C_sol = sy.solve(ode_sol.subs(t, 0).subs(ics))
sy.pprint(ode_sol.subs(C_sol[0]))  # 输出v(t)的特解

输出如下

v(t) = C₁ - u⋅log(m(t))
v(t) = u⋅log(m₀) - u⋅log(m(t)) + v₀

第一个输出为v(t)的通解,第二个输出为v(t)的特解,所以我们知道在该数学模型中
v ( t ) = v 0 + u ⋅ ln ⁡ ( m 0 m ( t ) ) v(t)=v_{0}+u \cdot \ln \left(\frac{m_{0}}{m(t)}\right) v(t)=v0+uln(m(t)m0)
通过该式我们得知,当 v 0 v_0 v0 m 0 m_0 m0一定的情况下,火箭速度 v ( t ) v(t) v(t)由火箭喷出气体相对火箭运动速度 u u u以及初始质量与当前质量的比值 m 0 m ( t ) \frac{m_0}{m(t)} m(t)m0。因此提升火箭速度可以通过提升u或者减少m(t)达到,由于 u u u不是本题所讨论的对象,因此仅对火箭质量m进行建模。

火箭质量 m ( t ) m(t) m(t)由三部分构成,即火箭负载 m p m_p mp,燃料质量 m F m_F mF,结构质量 m s m_s ms

假如用一级火箭发射卫星,当燃料耗尽时,即 m F = 0 m_F=0 mF=0时, m ( t ) = m p + m s m(t)=m_p+m_s m(t)=mp+ms,火箭初始速度 v 0 = 0 v_0=0 v0=0,则
v = u ⋅ ln ⁡ ( m 0 m p + m s ) v=u \cdot \ln \left(\frac{m_{0}}{m_{p}+m_{s}}\right) v=uln(mp+msm0)
为了满足在 u = 3 k m / s u=3km/s u=3km/s的情况下让 v > 7.6 k m / s v>7.6km/s v>7.6km/s,需要 ln ⁡ ( m 0 m p + m s ) ≥ 2.53 \ln \left(\frac{m_{0}}{m_{p}+m_{s}}\right) \ge 2.53 ln(mp+msm0)2.53了解技术条件发现, m s m F + m s ≥ 1 9 \frac{m_{s}}{m_{F}+m_{s}} \geq \frac{1}{9} mF+msms91

假设
m s = λ ( m F + m s ) = λ ( m 0 − m F ) m_{s}=\lambda\left(m_{F}+m_{s}\right) = \lambda\left(m_{0}-m_{F}\right) ms=λ(mF+ms)=λ(m0mF)

v ( t ) = u ⋅ ln ⁡ m 0 λ m 0 + ( 1 − λ ) m p v(t)=u \cdot \ln \frac{m_{0}}{\lambda m_{0}+(1-\lambda) m_{p}} v(t)=ulnλm0+(1λ)mpm0
假设火箭无负载,取 λ = 1 9 \lambda = \frac{1}{9} λ=91,则 v = u ⋅ l n 1 λ = u ⋅ l n 9 ≈ 6.6 k m / s < 7.6 k m / s v=u \cdot ln\frac{1}{\lambda} = u \cdot ln9 \approx 6.6km/s<7.6km/s v=ulnλ1=uln96.6km/s<7.6km/s无法送入距地600km的高空轨道

由此我们可以知道,仅用一级火箭在空载的情况下都无法进入高空轨道,更无法将卫星送入了,但是建模到这一步还并没有完成,还需要论证为什么多级可以。

理想火箭模型

多级火箭的模型相对而言复杂,因此先构件理想火箭模型,认为火箭每时每刻都会抛弃一部分无用结构来减轻自身重量。假设每时每刻理想火箭损失的质量中有一部分为无用的结构质量,还有一部分为消耗的燃料质量,这两部分的比值为 α 1 − α \frac{\alpha}{1-\alpha} 1αα,因此根据动量定理可得下式
m ( t ) v ( t ) = m ( t + Δ t ) v ( t + Δ t ) − α d m d t Δ t ⋅ v ( t ) − ( 1 − α ) d m d t Δ t ⋅ ( v ( t ) − u ) + o ( Δ t ) m(t) v(t)=m(t+\Delta t) v(t+\Delta t)-\alpha \frac{d m}{d t} \Delta t \cdot v(t) -(1-\alpha) \frac{d m}{d t} \Delta t \cdot(v(t)-u)+o(\Delta t) m(t)v(t)=m(t+Δt)v(t+Δt)αdtdmΔtv(t)(1α)dtdmΔt(v(t)u)+o(Δt)
带入泰勒展开并忽略高阶小项
0 = m ( t ) d v d t Δ t + d m d t Δ t v ( t ) + d m d t Δ t d v d t Δ t − α d m d t Δ t ⋅ v ( t ) − ( 1 − α ) d m d t Δ t ⋅ ( v ( t ) − u ) 0=m(t)\frac{dv}{dt}\Delta t+\frac{dm}{dt}\Delta tv(t)+\frac{dm}{dt}\Delta t\frac{dv}{dt}\Delta t-\alpha \frac{d m}{d t} \Delta t \cdot v(t) -(1-\alpha) \frac{d m}{d t} \Delta t \cdot(v(t)-u) 0=m(t)dtdvΔt+dtdmΔtv(t)+dtdmΔtdtdvΔtαdtdmΔtv(t)(1α)dtdmΔt(v(t)u)
消去 Δ t \Delta t Δt且忽略 Δ t 2 \Delta t^2 Δt2
0 = m ( t ) d v d t + d m d t v ( t ) − α d m d t ⋅ v ( t ) − ( 1 − α ) d m d t ⋅ ( v ( t ) − u ) 0=m(t)\frac{dv}{dt}+\frac{dm}{dt}v(t)-\alpha \frac{d m}{d t} \cdot v(t) -(1-\alpha) \frac{d m}{d t} \cdot(v(t)-u) 0=m(t)dtdv+dtdmv(t)αdtdmv(t)(1α)dtdm(v(t)u)

− m ( t ) d v d t = d m d t v ( t ) − α d m d t ⋅ v ( t ) − d m d t ⋅ ( v ( t ) − u ) + α d m d t ⋅ ( v ( t ) − u ) -m(t)\frac{dv}{dt}=\frac{dm}{dt}v(t)-\alpha \frac{d m}{d t} \cdot v(t) -\frac{d m}{d t} \cdot(v(t)-u)+\alpha\frac{d m}{d t} \cdot(v(t)-u) m(t)dtdv=dtdmv(t)αdtdmv(t)dtdm(v(t)u)+αdtdm(v(t)u)

− m ( t ) d v d t = d m d t ⋅ u − α d m d t ⋅ u -m(t)\frac{dv}{dt}= \frac{d m}{d t} \cdot u-\alpha\frac{d m}{d t} \cdot u m(t)dtdv=dtdmuαdtdmu


m ( t ) d v ( t ) d t = ( α − 1 ) d m d t ⋅ u m(t) \frac{d v(t)}{d t}=(\alpha - 1) \frac{d m}{d t} \cdot u m(t)dtdv(t)=(α1)dtdmu
修改刚才的代码,求解

import sympy as sy
u, t, m0, v0, a = sy.symbols('u, t, m_0, v_0, a')  # 为变量定义符号
v = sy.Function('v')  # 定义函数
m = sy.Function('m')  # 定义函数
# 定义微分方程,其中diff(v(t),t,1)表示v(t)对t求1阶导
ode = m(t)*sy.diff(v(t), t, 1)+(1-a)*u*sy.diff(m(t), t, 1)
# 上式中的微分方程表示m(t)*dv(t)/dt+(1-a)*u*dm(t)/d(t)=0
ode_sol = sy.dsolve(ode, v(t))  # 用dsolve函数解微分方程,且求解的是v(t)的表达式
sy.pprint(ode_sol)  # pretty print,美化打印,输出v(t)的通解
ics = {v(0): v0, m(0): m0}  # 定义微分方程的初始条件
# 将微分方程的初始条件带入通解,构建关于常数的方程,并用solve函数求解
# subs为替换函数用值或表达式替换原式中的值或表达式
C_sol = sy.solve(ode_sol.subs(t, 0).subs(ics))
sy.pprint(ode_sol.subs(C_sol[0]))  # 输出v(t)的特解

输出为

v(t) = C₁ + u⋅(a - 1)⋅log(m(t))
v(t) = -a⋅u⋅log(m₀) + u⋅(a - 1)⋅log(m(t)) + u⋅log(m₀) + v₀


v ( t ) = v 0 + ( 1 − α ) u ln ⁡ m 0 m ( t ) v(t)=v_0 + (1-\alpha) u \ln \frac{m_{0}}{m(t)} v(t)=v0+(1α)ulnm(t)m0
v ( 0 ) = 0 v(0)=0 v(0)=0
v ( t ) = ( 1 − α ) u ln ⁡ m 0 m ( t ) v(t)=(1-\alpha) u \ln \frac{m_{0}}{m(t)} v(t)=(1α)ulnm(t)m0
在这种模型下,想要达到 v ( t ) v(t) v(t)只需要一个足够大的 m 0 m_0 m0即可

多级火箭模型

理想火箭模型确实是很好的假设,但是现在的技术无法实现,因此构件多级火箭模型。假定多级火箭的工作模式为火箭由每级质量为 m i m_i mi的多级火箭构成, 当第i级燃料烧尽时,第i +1级火箭立即自动点火,并抛弃已经无用的第i级。假设每级火箭的总质量比结构质量的比值 λ \lambda λ是相同的,则每级火箭的结构质量为 λ m i \lambda m_i λmi,燃料质量为 ( 1 − λ ) m i (1-\lambda)m_i (1λ)mi认为火箭喷出燃料的速度始终相对火箭速度为u,且假设每一级的初始质量与其负载质量(该级火箭的负载包括所有火箭的负载,如卫星等,以及未工作的火箭质量)之比为 k i k_i ki。若多级火箭可行的话,求解k使得 m 0 m p \frac{m_0}{m_p} mpm0最小,则是我们的多级火箭方案。

定义
w 1 = m 0 = m 1 + m 2 + ⋯ + m n + m p w 2 = m 2 + ⋯ + m n + m p ⋯ w n + 1 = m p \begin{aligned} w_{1}=& m_{0}=m_{1}+m_{2}+\cdots+m_{n}+m_{p} \\ w_{2}=& m_{2}+\cdots+m_{n}+m_{p} \\ & \cdots \\ w_{n+1} &=m_{p} \end{aligned} w1=w2=wn+1m0=m1+m2++mn+mpm2++mn+mp=mp
则根据上文定义
k 1 = w 1 w 2 , ⋯   , k n = w n w n + 1 k_{1}=\frac{w_{1}}{w_{2}}, \cdots, k_{n}=\frac{w_{n}}{w_{n+1}} k1=w2w1,,kn=wn+1wn
第i级的末速度为
v 1 = u ln ⁡ m 1 + m 2 + m p λ m 1 + m 2 + m p = u ln ⁡ k 1 + 1 λ k 1 + 1 v 2 = v 1 + u ln ⁡ m 2 + m p λ m 2 + m p = u ln ⁡ k 1 + 1 λ k 1 + 1 + u ln ⁡ k 2 + 1 λ k 2 + 1 = u l n ( k 1 + 1 λ k 1 + 1 ⋅ k 2 + 1 λ k 2 + 1 ) … v 末  = u ln ⁡ ( w 1 λ m 1 + w 2 ⋯ w n λ m n + w n + 1 ) \begin{array}{c} v_{1}=u \ln \frac{m_{1}+m_{2}+m_{p}}{\lambda m_{1}+m_{2}+m_{p}}=u \ln \frac{k_1+1}{\lambda k_1+1} \\ v_{2}=v_{1}+u \ln \frac{m_{2}+m_{p}}{\lambda m_{2}+m_{p}}=u \ln \frac{k_1+1}{\lambda k_1+1}+ u \ln \frac{k_2+1}{\lambda k_2+1}=uln(\frac{k_1+1}{\lambda k_1+1}\cdot \frac{k_2+1}{\lambda k_2+1})\\ \dots\\ v_{\text {末 }}=u \ln \left(\frac{w_{1}}{\lambda m_{1}+w_{2}} \cdots \frac{w_{n}}{\lambda m_{n}+w_{n+1}}\right) \end{array} v1=ulnλm1+m2+mpm1+m2+mp=ulnλk1+1k1+1v2=v1+ulnλm2+mpm2+mp=ulnλk1+1k1+1+ulnλk2+1k2+1=uln(λk1+1k1+1λk2+1k2+1)v =uln(λm1+w2w1λmn+wn+1wn)

将速度和 m 0 m p \frac{m_0}{m_p} mpm0均写为k的表达式
m 1 = w 1 − w 2 , m 2 = w 2 − w 3 , ⋯   , m n = w n − w n + 1 v 末  = u ln ⁡ ( k 1 λ ( k 1 − 1 ) + 1 ⋯ k n λ ( k n − 1 ) + 1 ) m 0 m p = k 1 k 2 ⋯ k n \begin{array}{c} m_{1}=w_{1}-w_{2}, \quad m_{2}=w_{2}-w_{3}, \cdots, \quad m_{n}=w_{n}-w_{n+1} \\ v_{\text {末 }}=u \ln \left(\frac{k_{1}}{\lambda\left(k_{1}-1\right)+1} \cdots \frac{k_{n}}{\lambda\left(k_{n}-1\right)+1}\right) \\ \frac{m_{0}}{m_{p}}=k_{1} k_{2} \cdots k_{n} \end{array} m1=w1w2,m2=w2w3,,mn=wnwn+1v =uln(λ(k11)+1k1λ(kn1)+1kn)mpm0=k1k2kn
则问题的数学表述为,求解最小的 k 1 k 2 . . . k n k_1k_2...k_n k1k2...kn使得
k 1 λ ( k 1 − 1 ) + 1 ⋯ k n λ ( k n − 1 ) + 1 = e v 末  u \frac{k_{1}}{\lambda\left(k_{1}-1\right)+1} \cdots \frac{k_{n}}{\lambda\left(k_{n}-1\right)+1}=e^{\frac{v_{\text {末 }}}{u }} λ(k11)+1k1λ(kn1)+1kn=euv 
推知当各级k均相同时, m 0 m p = k 1 k 2 ⋯ k n \frac{m_{0}}{m_{p}}=k_{1} k_{2} \cdots k_{n} mpm0=k1k2kn最小

假如是二级火箭的话,即
m 1 m 2 + m p = m 2 m p = k \frac{m_1}{m_2+m_p}=\frac{m_2}{m_p}=k m2+mpm1=mpm2=k
第一级、第二级火箭燃烧完时,速度分别为
v 1 = u ln ⁡ m 1 + m 2 + m p λ m 1 + m 2 + m p = u ln ⁡ k + 1 λ k + 1 v 2 = v 1 + u ln ⁡ m 2 + m p λ m 2 + m p = 2 u ln ⁡ k + 1 λ k + 1 \begin{array}{c} v_{1}=u \ln \frac{m_{1}+m_{2}+m_{p}}{\lambda m_{1}+m_{2}+m_{p}}=u \ln \frac{k+1}{\lambda k+1} \\ v_{2}=v_{1}+u \ln \frac{m_{2}+m_{p}}{\lambda m_{2}+m_{p}}=2 u \ln \frac{k+1}{\lambda k+1} \end{array} v1=ulnλm1+m2+mpm1+m2+mp=ulnλk+1k+1v2=v1+ulnλm2+mpm2+mp=2ulnλk+1k+1
λ = 0.1 \lambda = 0.1 λ=0.1 u = 3 k m / s u=3km/s u=3km/s且综合考虑空气阻力等因素之后,认为我们需要让第二级火箭速度 v 2 = 10.5 k m / s v_2=10.5km/s v2=10.5km/s
6 ln ⁡ k + 1 0.1 k + 1 = 10.5 k = 11.2 , m 0 m p = m 1 + m 2 + m p m p = ( k + 1 ) 2 ≈ 149 \begin{array}{c} 6 \ln \frac{k+1}{0.1 k+1}=10.5 \\ k=11.2, \\ \frac{m_{0}}{m_{p}}=\frac{m_{1}+m_{2}+m_{p}}{m_{p}}=(k+1)^{2} \approx 149 \end{array} 6ln0.1k+1k+1=10.5k=11.2,mpm0=mpm1+m2+mp=(k+1)2149
若为3级火箭,则
v 3 = 3 u ln ⁡ k + 1 λ k + 1 v_{3}=3 u \ln \frac{k+1}{\lambda k+1} v3=3ulnλk+1k+1
同样的条件下求得 k = 3.25 k=3.25 k=3.25 m 0 m p = 77 \frac{m_0}{m_p}=77 mpm0=77

在此条件下计算多级火箭的 m 0 m p \frac{m_0}{m_p} mpm0,列表

级数12345 ∞ \infty
m 0 m p \frac{m_0}{m_p} mpm0X14977656050

可以发现从第二级至第三级 m 0 m p \frac{m_0}{m_p} mpm0减小明显,之后便不太明显了,由于技术复杂性,四级及以上的火箭反而不合算,实际上三级火箭是最好的。

;