数学建模预备知识——微分方程

微分方程建模

微分方程是数学建模的重要方法,因为许多实际问题的数学描述将导致求解微分方程的定解问题。 把实际问题化为求解微分方程的定解问题,大体上可以分为以下步骤

  • 根据实际要求确定要研究的量(自变量,未知函数,必要参数)并确定坐标系
  • 找出这些量所满足的基本规律
  • 运用这些规律列出方程和定解条件

列方程常见的方法有以下几种

  1. 按规律直接列方程。
  2. 微元分析法与任意区域上取积分的方法
  3. 模拟近似法

发射卫星为什么要用三级火箭

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

火箭是一个复杂的系统,为了使问题简单明了,只从动力系统和整体结构上分析,并假设引擎是足够强大的。

为什么不能用以及火箭发射人造卫星

下面用三个数学模型回答

  1. 卫星进入 600 k m 600km 600km 高空轨道的时候,火箭必需的最低速度

    首先将问题理想化,并假设:

    (1)卫星轨道是以地球中心为圆心的某个平面上的圆周,卫星在此轨道上以地球引力作为向心力围绕地球做平面匀速圆周运动。

    (2)地球是固定于空间中的一个均匀球体,其质量集中于球心

    (3)其他星球对卫星的引力忽略不计

    建模与求解:

    设地球半径为 R R R ,质量为 M M M ,卫星轨道半径为 r r r ,卫星质量为 m m m

    根据假设(2)和(3),卫星只受地球引力,由牛顿万有引力定律可知,其引力大小为
    F = G M m r 2 (1) F=\frac{GMm}{r^2} \tag{1} F=r2GMm(1)
    式中: G G G 为引力常数

    为了消去常数 G G G ,可以利用 m g = G M m r 2 mg=\frac{GMm}{r^2} mg=r2GMm

    经过化简后得到
    F = m g ( R r ) 2 (2) F=mg(\frac{R}{r})^2 \tag{2} F=mg(rR)2(2)
    式中: g = 9.81 ( m / s 2 ) g=9.81(m/s^2) g=9.81(m/s2) 为重力加速度

    根据假设(1),若卫星围绕地球做匀速圆周运动的速度为 v v v ,则其向心力为 m ω 2 / r m\omega^2/r mω2/r ,因为卫星所受的地球引力就是它做匀速运动的向心力,因此
    m g = ( R r ) 2 = m v 2 r mg=(\frac{R}{r})^2=\frac{mv^2}{r} mg=(rR)2=rmv2
    由此推得卫星据地面距离为 ( r − R ) k m (r-R)km (rR)km ,必需得最低速度的数学模型为
    v = R g r (3) v=R\sqrt{\frac{g}{r}} \tag{3} v=Rrg (3)
    代入数据: R = 6400 k m , r − R = 600 k m R=6400km,r-R=600km R=6400km,rR=600km 得到
    v ≈ 7.6 k m / s v\approx 7.6km/s v7.6km/s
    即要把卫星送入离地面 600 k m 600km 600km 的轨道,火箭的末速度最低为 7.6 k m / s 7.6km/s 7.6km/s

  2. 火箭推进力及升空速度

    火箭的简单模型是由一台发动机和一个燃料舱组成的。燃料燃烧产生大量的气体从火箭末端喷出,给火箭一个向前的推进力。火箭飞行要受到地球引力、空气阻力、地球自转与公转等影响,使火箭升空后做曲线运动。

    为使问题简化,假设:

    (1)火箭在喷气推动下做直线运动,火箭所受的重力与空气阻力忽略不计

    (2)在 t t t 时刻火箭的质量为 m ( t ) m(t) m(t) ,速度为 v ( t ) v(t) v(t),且均为时间 t t t 的连续可微函数

    (3)从火箭末端喷出的气体的速度(相对于火箭本身)为常数 u u u

    建模与分析:

    由于火箭在运动的过程中不断喷出气体,使其质量不断减小,在 ( t , t + Δ t ) (t,t+\Delta t) (t,t+Δt) 内的减少量可由泰勒展开式表示为
    m ( t + Δ t ) − m ( t ) = d m d t Δ t + o ( Δ t ) (4) m(t+\Delta t)-m(t)=\frac{dm}{dt}\Delta t+o(\Delta t) \tag{4} m(t+Δt)m(t)=dtdmΔt+o(Δt)(4)
    因为喷出的气体相对于地球的速度为 v ( t ) − u v(t)-u v(t)u ,则由动量守恒定律,有
    m ( t ) v ( t ) = m ( t + Δ t ) v ( t + Δ t ) − [ d m d t Δ t + o ( t ) ] [ v ( t ) − u ] (5) m(t)v(t)=m(t+\Delta t)v(t+\Delta t)-[\frac{dm}{dt}\Delta t+o(t)][v(t)-u] \tag{5} m(t)v(t)=m(t+Δt)v(t+Δt)[dtdmΔt+o(t)][v(t)u](5)
    从式(4)和(5)可以得到火箭推进力的数学模型为
    m d v d t = − u d m d t (6) m\frac{dv}{dt}=-u\frac{dm}{dt} \tag{6} mdtdv=udtdm(6)
    t = 0 t=0 t=0 时, v ( 0 ) = v 0 , m ( 0 ) = m 0 v(0)=v_0,m(0)=m_0 v(0)=v0,m(0)=m0,求式(6),得到火箭升空速度模型为
    v ( t ) = v 0 + u ln ⁡ m 0 m ( t ) (7) v(t)=v_0+u\ln \frac{m_0}{m(t)} \tag{7} v(t)=v0+ulnm(t)m0(7)
    式(6)表明火箭所受推力等于燃料的消耗速度与喷气速度的成绩。式(7)表明,在 v 0 , m 0 v_0,m_0 v0,m0 一定的条件下,升空速度 v ( t ) v(t) v(t) 由喷气速度 u u u 以及质量比 m 0 m ( t ) \frac{m_0}{m(t)} m(t)m0 决定。这为提高火箭速度找到了正确的途径:从燃料上设法提高 u u u 的值;从结构上设法减少 m ( t ) m(t) m(t)

  3. 一级火箭末速度上限

    火箭-卫星系统的质量可以分为三部分: m p m_p mp(有效负载), m F m_F mF(燃料质量), m s m_s ms(结构质量)。

    一级火箭末速度上限主要是受目前技术条件的限制,假设:

    (1)目前技术条件为:相对火箭的喷气速度为 u = 3 k m / s u=3km/s u=3km/s
    m s m F + m s ≥ 1 9 \frac{m_s}{m_F+m_s}\geq\frac{1}{9} mF+msms91
    (2)初速度 v 0 v_0 v0 忽略不计,即 v 0 = 0 v_0=0 v0=0

    建模与求解:

    因为升空火箭的最终质量为 m p + m s m_p+m_s mp+ms,所以由(7)以及假设(2)得到末速度为
    v = u ln ⁡ m 0 m p + m s (8) v=u\ln \frac{m_0}{m_p+m_s} \tag{8} v=ulnmp+msm0(8)
    m s = λ ( m F + m s ) = λ ( m 0 − m p ) m_s=\lambda(m_F+m_s)=\lambda(m_0-m_p) ms=λ(mF+ms)=λ(m0mp),带入式(8)可以得到
    v = u ln ⁡ m 0 λ m 0 + ( 1 − λ ) m p (9) v=u\ln \frac{m_0}{\lambda m_0+(1-\lambda)m_p} \tag{9} v=ulnλm0+(1λ)mpm0(9)
    于是,当卫星脱离火箭的时候,即 m p = 0 m_p=0 mp=0 时,便得到火箭末速度上限的数学模型为
    v 0 = u ln ⁡ 1 λ v^0=u\ln \frac{1}{\lambda} v0=ulnλ1
    由假设(1),取 u = 3 k m , λ = 1 9 u=3km,\lambda=\frac{1}{9} u=3km,λ=91,便得到火箭的速度上限为
    v 0 = 3 ln ⁡ 9 ≈ 6.6 k m / s v^0=3\ln 9\approx6.6km/s v0=3ln96.6km/s

理想火箭模型

从前面对问题的假设和分析可以看出,火箭推进力自始至终在加速整个火箭,然而随着燃料的不断消耗,所出现的无用结构质量也随之不断加速,做无用功,因而效益低,浪费大。

所谓理想火箭模型,就是能够随着燃料的不断燃烧抛弃火箭的无用结构。下面建立其数学模型

假设在 ( t , t + Δ t ) (t,t+\Delta t) (t,t+Δt) 时段丢弃的结构质量与烧掉的燃料质量以 α \alpha α 1 − α 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{dm}{dt}\Delta t\cdot v(t)-(1-\alpha)\frac{dm}{dt}\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)
由上式可以得到理想火箭的数学模型为
− m ( t ) d v ( t ) d t = ( 1 − α ) d m d t ⋅ u (10) -m(t)\frac{dv(t)}{dt}=(1-\alpha)\frac{dm}{dt}\cdot u \tag{10} m(t)dtdv(t)=(1α)dtdmu(10)
代入初始条件 v ( 0 ) = v 0 , m ( 0 ) = m 0 v(0)=v_0,m(0)=m_0 v(0)=v0,m(0)=m0

解得
v ( t ) = ( 1 − α ) u ln ⁡ m 0 m ( t ) (11) v(t)=(1-\alpha)u\ln \frac{m_0}{m(t)} \tag{11} v(t)=(1α)ulnm(t)m0(11)
由上式可知,当燃料耗尽,结构质量抛弃完时,便只剩下卫星的质量 m p m_p mp ,从而最终速度的数学模型为
v ( t ) = ( 1 − α ) u ln ⁡ m 0 m p (12) v(t)=(1-\alpha)u\ln \frac{m_0}{m_p} \tag{12} v(t)=(1α)ulnmpm0(12)

多级火箭卫星模型

理想火箭时假设把无用结构质量连续抛弃以达到最佳的升空速度,虽然在目前的技术条件下办不到,但是他的确为发展火箭技术指明了奋斗目标。目前已经商业化的多级火箭卫星系统便是朝着这种目标迈进的第一步。多级火箭时自末级开始,逐级燃烧,当第 i i i 级燃料烧尽的时候,第 i + 1 i+1 i+1 级火箭立即自动点火,并抛弃已经无用的第 i i i 级。用 m i m_i mi 表示第 i i i 级火箭质量, m p m_p mp 表示有效负载。为了简单起见,先做以下假设:

(1)设各级火箭具有相同的 λ \lambda λ λ m i \lambda m_i λmi 表示第 i i i 级的结构质量, ( 1 − λ ) m i (1-\lambda)m_i (1λ)mi 表示第 i i i 级的燃料质量。

(2)喷气相对火箭的速度 u u u 相同,燃烧级的初始质量与其负载质量之比保持不变,该比值记为 k k k

先考虑二级火箭。由式(7),当第一级火箭燃烧完时,其速度为
v 1 = u ln ⁡ m 1 + m 2 + m p λ m 1 + m 2 + m p = u ln ⁡ k + 1 λ k + 1 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} v1=ulnλm1+m2+mpm1+m2+mp=ulnλk+1k+1
在第二级火箭燃烧完时,其速度为
v 2 = v 1 + u ln ⁡ m 2 + m p λ m 2 + m p = 2 u ln ⁡ k + 1 λ k + 1 (13) v_2=v_1+u\ln \frac{m_2+m_p}{\lambda m_2+m_p}=2u\ln \frac{k+1}{\lambda k+1} \tag{13} v2=v1+ulnλm2+mpm2+mp=2ulnλk+1k+1(13)
仍取 u = 3 k m / s , λ = 0.1 u=3km/s,\lambda =0.1 u=3km/s,λ=0.1 考虑到阻力等因素,为了达到第一宇宙速度 7.9 k m / s 7.9km/s 7.9km/s ,对于耳机火箭,欲使 V 2 = 10.5 k m / s V_2=10.5km/s V2=10.5km/s ,由式(13)得
6 ln ⁡ k + 1 0.1 k + 1 = 10.5 6\ln {\frac{k+1}{0.1k+1}}=10.5 6ln0.1k+1k+1=10.5
解得
k = 11.2 k=11.2 k=11.2
这时
m 0 m p = m 1 + m 2 + m p m p = ( k + 1 ) 2 ≈ 149 \frac{m_0}{m_p}=\frac{m_1+m_2+m_p}{m_p}=(k+1)^2\approx 149 mpm0=mpm1+m2+mp=(k+1)2149
同理可以推出三级火箭
v 3 = 3 u ln ⁡ k + 1 λ k + 1 v_3=3u\ln \frac{k+1}{\lambda k+1} v3=3ulnλk+1k+1
欲使 v 3 = 10.5 k m / s v_3=10.5km/s v3=10.5km/s ,应该 k ≈ 3.25 k\approx 3.25 k3.25,从而有 m 0 m p ≈ 77 \frac{m_0}{m_p}\approx 77 mpm077

与二级火箭相比,在达到相同效果的情况下,三级火箭的质量几乎节省了一半。

现记 n n n 级火箭的总质量(包含有效负载 m p m_p mp)为 m 0 m_0 m0 ,在相同的假设下( u = 3 k m / s u=3km/s u=3km/s, v 末 = 10.5 k m / s v_末=10.5km/s v=10.5km/s λ = 0.1 \lambda=0.1 λ=0.1),可以算出相应的 m 0 m p \frac{m_0}{m_p} mpm0 的值,将计算结果列于下表

n n n/级数12345 ⋯ \cdots ∞ \infin
m 0 m p \frac{m_0}{m_p} mpm0x149776560 ⋯ \cdots 50

人口模型

Malthus模型

该模型于1789年,由英国神父Malthus提出

模型假设:

(1)设 x ( t ) x(t) x(t) 表示 t t t 时刻的人口数,且 x ( t ) x(t) x(t) 连续可微

(2)人口的增长率 r r r 是常数(增长率=出生率-死亡率)

(3)人口数量的变化是封闭的,即人口数量的增加与减少值取决于人口中个体的生育和死亡,且每一个体都具有同样的生育能力与死亡率

建模与求解:

由假设, t t t 时刻到 t + Δ t t+\Delta t t+Δt 时刻人口的增量为
x ( t + Δ t ) − x ( t ) = r x ( t ) Δ t x(t+\Delta t)-x(t)=rx(t)\Delta t x(t+Δt)x(t)=rx(t)Δt
于是有
{ d x d t = r x x ( 0 ) = x 0 (14) \begin{cases} \frac{dx}{dt}=rx\\ x(0)=x_0 \end{cases} \tag{14} {dtdx=rxx(0)=x0(14)
其解为
x ( t ) = x 0 e r t (15) x(t)=x_0e^{rt} \tag{15} x(t)=x0ert(15)
模型评价:

考虑近百年来的人口增长的实际情况,1961年世界人口总数为 3.06 × 1 0 9 3.06\times10^9 3.06×109,在1961年到1970年这段时间内,每年平均的人口自然增长率为 2 2% 2,则式(15)可以写为
x ( t ) = 3.06 × 1 0 9 ⋅ e 0.02 ( t − 1961 ) (16) x(t)=3.06\times 10^9\cdot e^{0.02(t-1961)} \tag{16} x(t)=3.06×109e0.02(t1961)(16)
根据1700—1961年间世界人口统计数据,发现这些数据与式(16)的计算结果基本吻合。

但是随着时间的增加,人口数量已知在增加,会达到一个不符合实际的数量,因此,对 r r r 是常数的假设提出质疑

阻滞增长模型(Logistic模型)

如何对增长率 r r r 进行修正?在人口比较少的时候,可以把增长率 r r r 看作一个常数,当人口增加到一定数量之后,就应当视 r r r 为一个随着人口数量增加而减少的量,即增长率 r r r 表示为人口 x ( t ) x(t) x(t) 的函数,且 r ( x ) r(x) r(x) x x x 的减函数。

模型假设:

  1. r ( x ) r(x) r(x) x x x 的线性函数, r ( x ) = r − s x r(x)=r-sx r(x)=rsx
  2. 自然资源与环境条件所能容纳的最大人口数为 x m x_m xm ,即当 x = x m x=x_m x=xm 时,增长率 r ( x m ) = 0 r(x_m)=0 r(xm)=0

建模与求解:

由假设可知 r ( x ) = r ( 1 − x x m ) r(x)=r(1-\frac{x}{x_m}) r(x)=r(1xmx) ,于是有
{ d x d t = r ( 1 − x x m ) x x ( t 0 ) = x 0 (17) \begin{cases} \frac{dx}{dt}=r(1-\frac{x}{x_m})x\\ x(t_0)=x_0 \end{cases} \tag{17} {dtdx=r(1xmx)xx(t0)=x0(17)
此微分方程的解为
x ( t ) = x m 1 + ( x m x 0 − 1 ) e − r ( t − t 0 ) (18) x(t)=\frac{x_m}{1+(\frac{x_m}{x_0}-1)e^{-r(t-t_0)}} \tag{18} x(t)=1+(x0xm1)er(tt0)xm(18)
模型检验:

由式(17)可知
d 2 x d t 2 = r 2 ( 1 − x x m ) ( 1 − 2 x x m ) x (19) \frac{d^2x}{dt^2}=r^2(1-\frac{x}{x_m})(1-\frac{2x}{x_m})x \tag{19} dt2d2x=r2(1xmx)(1xm2x)x(19)
所以人口总数 x ( t ) x(t) x(t) 由如下规律:

  1. lim ⁡ t → + ∞ x ( t ) = x m \lim \limits_{t \to+\infin}x(t)=x_m t+limx(t)=xm ,即无论人口初值 x 0 x_0 x0 如何,人口总数都以 x m x_m xm 为极限。
  2. 0 < x 0 < x m 0<x_0<x_m 0<x0<xm 时, d x d t = r ( 1 − x x m ) x > 0 \frac{dx}{dt}=r(1-\frac{x}{x_m})x>0 dtdx=r(1xmx)x>0 ,说明 x ( t ) x(t) x(t) 是单调增加的。由又式(19)可知,当 x < x m 2 x<\frac{x_m}{2} x<2xm 时, d 2 x d t 2 > 0 , x = x ( t ) \frac{d^2x}{dt^2}>0,x=x(t) dt2d2x>0x=x(t) 为凹函数;当 x > x m 2 x>\frac{x_m}{2} x>2xm 时, d 2 x d t 2 < 0 , x = x ( t ) \frac{d^2x}{dt^2}<0,x=x(t) dt2d2x<0x=x(t) 为凸函数。
  3. 人口变化率 d x d t \frac{dx}{dt} dtdx x = x m 2 x=\frac{x_m}{2} x=2xm 时取得最大值,即人口数达到极限值的一半以前时加速增长状态,超过一半之后,是减速增长状态。
模型推广

可以从另一个角度推导出阻滞增长模型,在 Malthus 模型的基础上增加一个竞争项 − b x 2 ( b > 0 ) -bx^2(b>0) bx2(b>0) ,他的作用是使纯增长率减小。建立方程
{ d x d t = x ( a − b x ) a , b > 0 x ( t 0 ) = x 0 (20) \begin{cases} \frac{dx}{dt}=x(a-bx)\quad a,b>0\\ x(t_0)=x_0 \end{cases} \tag{20} {dtdx=x(abx)a,b>0x(t0)=x0(20)
其解为
x ( t ) = a x 0 b x 0 + ( a − b x 0 ) e − a ( t − t 0 ) (21) x(t)=\frac{ax_0}{bx_0+(a-bx_0)e^{-a(t-t_0)}} \tag{21} x(t)=bx0+(abx0)ea(tt0)ax0(21)
由式(21)可得到
d 2 x d t 2 = ( a − 2 b x ) ( a − b x ) x (22) \frac{d^2x}{dt^2}=(a-2bx)(a-bx)x \tag{22} dt2d2x=(a2bx)(abx)x(22)
对以上三式进行分析

  1. 对任意 t > t 0 t>t_0 t>t0 ,有 x ( t ) > 0 x(t)>0 x(t)>0 ,且 lim ⁡ t → + ∞ x ( t ) = a b \lim \limits _{t \to +\infin}x(t)=\frac{a}{b} t+limx(t)=ba
  2. 0 < x < a b 0<x<\frac{a}{b} 0<x<ba 时, d x d t > 0 \frac{dx}{dt}>0 dtdx>0 x ( t ) x(t) x(t) 递增;当 x > a b x>\frac{a}{b} x>ba 时, d x d t < 0 \frac{dx}{dt}<0 dtdx<0 x ( t ) x(t) x(t) 递减。
  3. 0 < x < a 2 b 0<x<\frac{a}{2b} 0<x<2ba时, d 2 x d t 2 > 0 \frac{d^2x}{dt^2}>0 dt2d2x>0 x ( t ) x(t) x(t) 为凹函数;当 x > a 2 b x>\frac{a}{2b} x>2ba时, d 2 x d t 2 < 0 \frac{d^2x}{dt^2}<0 dt2d2x<0 x ( t ) x(t) x(t) 为凸函数。

令式(20)第一个方程右侧等于0,得到 x 1 = 0 , x 2 = a b x_1=0,x_2=\frac{a}{b} x1=0,x2=ba ,称为微分方程的平衡解。易知 lim ⁡ t → + ∞ x ( t ) = a b \lim \limits _{t\to +\infin}x(t)=\frac{a}{b} t+limx(t)=ba ,故又称 a b \frac{a}{b} ba 为式(20)的稳定平衡解。因此,无论人口初值为多少,经过相当长的时间后,人口总数将维持在 a b \frac{a}{b} ba

例:美国人口预报模型。利用下表中的数据,建立人口预测模型,并预报2010年的人口数量。

请添加图片描述

建模与求解

x ( t ) x(t) x(t) 为第 t t t 年的人口数量,设人口年增长率 r ( x ) r(x) r(x) x x x 的线性函数, r ( x ) = r − s x r(x)=r-sx r(x)=rsx 。自然资源与环境条件所能容纳的最大人口数量为 x m x_m xm,即当 x = x m x=x_m x=xm 时,增长率 r ( x m ) = 0 r(x_m)=0 r(xm)=0,可得 r ( x ) = r ( 1 − x x m ) r(x)=r(1-\frac{x}{x_m}) r(x)=r(1xmx),建立 Logistixc 人口模型
{ d x d t = r ( 1 − x x m ) x x ( t 0 ) = x 0 \begin{cases} \frac{dx}{dt}=r(1-\frac{x}{x_m})x\\ x(t_0)=x_0 \end{cases} {dtdx=r(1xmx)xx(t0)=x0
其解为
x ( t ) = x m 1 + ( x m x 0 − 1 ) e − r ( t − t 0 ) (23) x(t)=\frac{x_m}{1+(\frac{x_m}{x_0}-1)e^{-r(t-t_0)}} \tag{23} x(t)=1+(x0xm1)er(tt0)xm(23)
参数估计

采用线性最小二乘法估计参数
1 x ⋅ d x d t = r − s x , s = r x m (24) \frac{1}{x}\cdot \frac{dx}{dt}=r-sx,s=\frac{r}{x_m} \tag{24} x1dtdx=rsx,s=xmr(24)
利用向后差分得到差分方程
1 x ( k ) ⋅ x ( k ) − x ( k − 1 ) Δ t = r − s x ( k ) (25) \frac{1}{x(k)}\cdot \frac{x(k)-x(k-1)}{\Delta t}=r-sx(k) \tag{25} x(k)1Δtx(k)x(k1)=rsx(k)(25)
其中,取步长 Δ t = 10 \Delta t=10 Δt=10

下面拟合参数 r r r s s s ,具体代码如下

x=[3.9 5.3 7.8 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0 92.0 106.5 123.2 131.7 150.7 179.3 204.0 226.5 251.4 281.4]';
t=[1790:10:2000]';
a=[ones(21,1),-x(2:end)];
b=diff(x)./x(2:end)/10;
cs=a\b;
r=cs(1),xm=cs(2);

解得 x m = 373.5135 , r = 0.0247 x_m=373.5135,r=0.0247 xm=373.5135,r=0.0247

Matlab求解微分方程的符号解

在Matlab中,符号运算工具箱提供了功能强大的求解常微分方程的运算命令 dsolve

在Matlab中求解常微分方程的符号解,首先要定义符号变量,然后调用命令 dsolve

具体调用格式如下
[ y 1 , ⋯   , y N ] = d s o l v e ( e q n s , c o n d s , N a m e , V a l u e ) [y1,\cdots ,yN]=dsolve(eqns,conds,Name,Value) [y1,,yN]=dsolve(eqns,conds,Name,Value)
其中:eqns 为符号微分方程或者符号微分方程组;conds 为初值条件或者边界条件;NameValue 为可选用的成对参数。

试求解常微分方程的通解

试解常微分方程
x 2 + y + ( x − 2 y ) y ′ = 0 x^2+y+(x-2y)y'=0 x2+y+(x2y)y=0

syms y(x)
dsolve(x^2+y+(x-2*y)*diff(y)==0)
求解常微分方程的初值问题

试解常微分方程
y ′ ′ ′ − y ′ ′ = x , y ( 1 ) 8 , y ( 1 ) ′ = 7 , y ( 2 ) ′ ′ = 4 y'''-y''=x,y(1)8,y(1)'=7,y(2)''=4 yy=x,y(1)8,y(1)=7,y(2)=4

syms y(x)
dy=diff(y);
d2y=diff(y,2);
y=dsolve(diff(y,3)-diff(y,2)==x,y(1)==8,dy(1)==7,d2y(4)==4)
y=simplify(y);
求解常微分方程组

试求解常微分方程组
{ f ′ ′ + 3 g = sin ⁡ x g ′ + f ′ = cos ⁡ x \begin{cases} f''+3g=\sin{x}\\ g'+f'=\cos{x} \end{cases} {f+3g=sinxg+f=cosx
的通解和在初值边界条件为 f ′ ( 2 ) = 0 , f ( 3 ) = 3 , g ( 5 ) = 1 f'(2)=0,f(3)=3,g(5)=1 f(2)=0,f(3)=3,g(5)=1 的解

syms f(x) g(x)
df= diff(f);
[f1,g1]=dsolve(diff(f,2)+3*diff(g)==sin(x),diff(g)+diff(f)==cos(x));
f1=simplify(f1),g1=simplify(g1);
[f2,g2]=dsolve(diff(f,2)+3**diff(g)==sin(x),diff(g)+diff(f)==cos(x),df(2)==0,f(3)==3,g(5)==1);
f2=simplify(f2),g2=simplify(g2);
求解线性常微分方程组
  • 一阶齐次线性微分方程组
    X ′ = A X , X = [ x 1 ⋮ x n ] , A = [ a 11 ⋯ a 1 n ⋮ ⋱ ⋮ x n 1 ⋯ a n n ] \mathbf{X}'=\mathbf{AX}, \mathbf{X}=\left[\begin{matrix}x_1\\\vdots\\x_n\end{matrix}\right],\mathbf{A}= \left[\begin{matrix} a_{11}&\cdots&a_{1n}\\ \vdots&\ddots&\vdots\\ x_{n1}&\cdots&a_{nn}\\ \end{matrix}\right] X=AX,X=x1xn,A=a11xn1a1nann
    其解为
    X ( t ) = e A ( t − t 0 ) X 0 \mathbf{X(t)}=e^{\mathbf{A}(t-t_0)}\mathbf{X_0} X(t)=eA(tt0)X0

    试解初值问题
    X ′ = [ 2 1 3 0 2 − 1 0 0 2 ] X , X ( 0 ) = [ 1 2 1 ] X'= \left[\begin{matrix} 2&1&3\\ 0&2&-1\\ 0&0&2\\ \end{matrix}\right]X, X(0)= \left[\begin{matrix} 1\\2\\1 \end{matrix}\right] X=200120312X,X(0)=121
    具体程序如下

    syms x(t),y(t),z(t)
    A=[2 1 3;0 2 -1;0 0 2];
    b=[1;2;1];
    X=[x;y;z];
    [x,y,z]=dsolve(diff(X)==A*X,X(0)==B);
    
  • 非齐次线性微分方程组

    有参数变易法可求得初值问题
    X ′ = A X + f ( t ) , X ( t 0 ) = X 0 X'=AX+f(t),X(t_0)=X_0 X=AX+f(t),X(t0)=X0
    的解为
    X ( t ) = e A ( t − t 0 ) X 0 + ∫ t 0 t e A ( t − s ) f ( s ) d s X(t)=e^{A(t-t_0)}X_0+\int_{t_0}^t e^{A(t-s)}f(s)ds X(t)=eA(tt0)X0+t0teA(ts)f(s)ds

    试解初值问题
    X ′ = [ 1 0 0 2 1 − 2 3 2 1 ] X + [ 0 0 e t cos ⁡ 2 t ] , X ( 0 ) = [ 0 1 1 ] X'= \left[\begin{matrix} 1&0&0\\ 2&1&-2\\ 3&2&1\\ \end{matrix}\right]X+ \left[\begin{matrix} 0\\0\\e^t\cos{2t} \end{matrix}\right], X(0)=\left[\begin{matrix} 0\\1\\1 \end{matrix}\right] X=123012021X+00etcos2t,X(0)=011
    具体程序如下

    syms x(t) y(t) z(t)
    A=[1 0 0;2 1 -2;3 2 1];
    B=[0;0;exp(t)*cos(2*t)];
    X=[x;y;z];
    x0=[0;1;1];
    [x,y,z]=dsolve(diff(X)==A*X+B,X(0)==x0);
    

放射性废料的处理

问题的提出

美国原子能委员会以往处理浓缩的放射性废料的方法,一直是把它们装入密封的圆筒例,然后扔到水深为90米的海底。生态学家和科学家担心圆筒下沉到海底时与海底发生碰撞而破裂,从而造成核污染。为此,工程师进行了碰撞试验,发现当圆筒以超过 12.2 m / s 12.2m/s 12.2m/s 的速度与海底相撞的时候,圆筒就可能发生破裂。为了避免圆筒破裂,需要计算一下圆筒沉到海底的速度为多少。已知圆筒的质量 m = 239.46 k g m=239.46kg m=239.46kg,体积 V = 0.2058 m 3 V=0.2058m^3 V=0.2058m3,海水密度 ρ = 1035.71 k g / m 3 \rho=1035.71kg/m^3 ρ=1035.71kg/m3,若圆筒速度小于 12.2 m / s 12.2m/s 12.2m/s 就说明这种方法时安全可靠的,否则就要禁止使用这种方法。假设水的阻力与速度大小成正比例,其正比例系数为 k = 0.6 k=0.6 k=0.6。先要求建立合理的数学模型,解决如下问题:

  1. 判断这种处理废料的方法时候合理。
  2. 一般情况下, v v v 大, k k k 也大。当 v v v 很大的时候,常用 k v kv kv 来代替 k k k ,那么这时的速度与时间的关系如何?并求出当速度不超过 12.2 m / s 12.2m/s 12.2m/s 时,圆筒的运动时间 t t t 和位移 s s s 应不超过多少
模型的建立与求解
  1. 问题一的模型

    以海平面上的一点为为坐标原点,垂直向下为坐标轴的正向建立坐标系。由于圆桶在运动过程中受到本身的重力以及水的浮力 H H H 和水的阻力 f f f 的作用,所以根据牛顿运动定律得到圆桶受到的合力 F F F 满足
    F = G − H − f (1) F=G-H-f \tag{1} F=GHf(1)
    又因为 F = m a = m d v d t = m d 2 v d t 2 , G = m g , H = ρ g V F=ma=m \frac{dv}{dt}=m\frac{d^2v}{dt^2},G=mg,H=\rho g V F=ma=mdtdv=mdt2d2v,G=mg,H=ρgV 以及 f = k v = k d s d t f=kv=k\frac{ds}{dt} f=kv=kdtds,所以圆桶的位移和速度分别满足以下微分方程
    m d 2 s d t 2 = m g − ρ g V − k d s d t (2) m\frac{d^2s}{dt^2}=mg-\rho gV-k\frac{ds}{dt} \tag{2} mdt2d2s=mgρgVkdtds(2)

    m d v d t = m g − ρ g V − k v (3) m\frac{dv}{dt}=mg-\rho gV-kv \tag{3} mdtdv=mgρgVkv(3)

    由方程(2)加上初始条件 d s d t ∣ t = 0 = s ∣ t = 0 = 0 \frac{ds}{dt}|_{t=0}=s|_{t=0}=0 dtdst=0=st=0=0,求得位移函数为
    s ( t ) = − 171511.0 + 429.744 t + 171511.0 e − 0.00250564 t (4) s(t)=-171511.0+429.744t+171511.0e^{-0.00250564t} \tag{4} s(t)=171511.0+429.744t+171511.0e0.00250564t(4)
    由方程(3)加上初始条件 v ∣ t = 0 = 0 v|_{t=0}=0 vt=0=0,求得速度函数为
    v ( t ) = 429.744 − 429.744 e − 0.00250564 t (5) v(t)=429.744-429.744e^{-0.00250564t} \tag{5} v(t)=429.744429.744e0.00250564t(5)
    s ( t ) = 90 s(t)=90 s(t)=90,求得圆桶到达水深为 90 m 90m 90m 的海底需要时间 t = 12.994 s t=12.994s t=12.994s,再把他带入方程(5)求出圆桶到达海底的速度为 v = 13.7720 m / s v=13.7720m/s v=13.7720m/s

    具体代码如下

    syms m V rho g k s(t) v(t)
    ds=diff(s);
    s=dsolve(m*diff(s,2)==m*g-rho*g*V-k*diff(s),s(0)==0,ds(s)==0);
    s=subs(s,{m,V,rho,g,k},{239.46,0.2058,1035.71,9.8,0.6});
    s=simply(s);
    s=vpa(s,6);
    v=dsolve(m*diff(v)==m*g-rho*g*V-k*v,v(0)==0);
    v=subs(v,{m,V,rho,g,k},{239.46,0.2058,1035.71,9.8,0.6});
    v=simply(v);
    v=vpa(v,6);
    y=s-90;
    tt=solve(y);
    tt=double(tt);
    vv=subs(v,tt);
    vv=double(vv);
    
  2. 问题二的模型

    在假设条件下,圆桶受到的阻力应该改为 f = k v 2 = k ( d s d t ) 2 f=kv^2=k(\frac{ds}{dt})^2 f=kv2=k(dtds)2,类似问题一的模型,可以的到圆桶的速度满足如下微分方程
    m d v d t = m g − ρ g V − k v 2 (6) m\frac{dv}{dt}=mg-\rho gV-kv^2 \tag{6} mdtdv=mgρgVkv2(6)
    根据方程(6),加上初始条件 v ∣ t = 0 = 0 v|_{t=0}=0 vt=0=0,求得圆桶的速度为
    v ( t ) = 20.7303 tanh ⁡ ( 0.0519 t ) v(t)=20.7303\tanh(0.0519t) v(t)=20.7303tanh(0.0519t)
    这时若速度要小于 12.2 m / s 12.2m/s 12.2m/s,经计算可得圆桶的运动时间就不能超过 T = 13.0025 s T=13.0025s T=13.0025s,利用 s ( T ) = ∫ 0 T v ( t ) d t s(T)=\int _0 ^Tv(t)dt s(T)=0Tv(t)dt,计算得到的位移不能超过 84.8439 m 84.8439m 84.8439m

    通过这个模型计算,也可以得到处理核废料的方法是不合理的。

    具体代码如下

    syms m V rho g k v(t)
    v=dsolve(m*diff(v)==m*g-rho*g*V-k*v^2,v(0)==0);
    v=subs(v,{m,V,rho,g,k},{239.46,0.2058,1035.71,9.8,0.6});
    v=simply(v);
    v=vpa(v,6);
    T=solve(v-12.2);
    T=double(T);
    s=int(v,0,T);
    

初值问题的Matlab数值解

Matlab的工具箱提供了几个解常微分方程的功能函数,如ode45ode23ode113。其中,ode45 采用四五阶龙格库塔方法RK方法),是解非刚性微分方程的首选方法;ode23 采用二三阶RK方法ode113 采用多步法,效率较高。

在化学工程或者自动化控制等领域中,所涉及的常微分方程组初值问题常常是所谓的刚性问题。具体说就是对于一阶微分方程组,有
d y d x = A y + Φ ( x ) (1) \frac{dy}{dx}=\mathbf{A}y+\Phi(x) \tag{1} dxdy=Ay+Φ(x)(1)
式中, y , Φ ∈ R m y,\Phi \in \mathbf{R}^m y,ΦRm A \mathbf{A} A m m m 阶方阵。

若矩阵 A \mathbf{A} A 的特征值为 λ i ( i = 1 , 2 ⋯   , m ) \lambda_i(i=1,2\cdots,m) λi(i=1,2,m) 满足关系
R e   λ i < 0 , i = 1 , 2 , ⋯   , m max ⁡ 1 ≤ i ≤ m ∣ R e   λ i ∣ ≫ min ⁡ 1 ≤ i ≤ m ∣ R e   λ i ∣ Re\ \lambda_i <0,\quad i=1,2,\cdots ,m\\ \max _{1\leq i \leq m}|Re\ \lambda_i| \gg \min _{1\leq i\leq m}|Re\ \lambda_i| Re λi<0,i=1,2,,m1immaxRe λi1imminRe λi
则称方程式(1)为刚性方程组或者Stiff方程组,称数
s = max ⁡ 1 ≤ i ≤ m ∣ R e   λ i ∣ / min ⁡ 1 ≤ i ≤ m ∣ R e   λ i ∣ s=\max_{1\leq i\leq m}|Re\ \lambda_i|/\min _{1\leq i\leq m}|Re\ \lambda_i| s=1immaxRe λi/1imminRe λi
刚性比。理论上的分析表明,求解刚性问题所选用的数值方法最好是对步长 h h h 不做任何限制。

Matlab工具箱提供了几个求解刚性常微分方程的功能函数,如ode15sode23sode23tode23tb

ode23ode45ode113的使用

对于简单的一阶方程的初值问题
{ y ′ = f ( x , y ) y ( x 0 ) = y 0 \begin{cases} y'=f(x,y)\\ y(x_0)=y_0 \end{cases} {y=f(x,y)y(x0)=y0
Matlab的函数形式为
[ t , y ] = s o l v e r ( ′ F ′ , t s p a n , y 0 ) [t,y]=solver('F',tspan,y0) [t,y]=solver(F,tspan,y0)
这里solverode23ode45ode113,输入的参数 F 是用.m文件定义的微分方程 y ′ = f ( x , y ) y'=f(x,y) y=f(x,y) 右端的函数。 t s p a n = [ t 0 , t f i n a l ] tspan=[t0,tfinal] tspan=[t0,tfinal] 为求解的区间。y0为初始值列向量。

注意: 函数 s o l v e r ( ′ F ′ , t s p a n , y 0 ) solver('F',tspan,y0) solver(F,tspan,y0) 也可以返回一个值,返回一个值的时候,返回的是结构数组,利用Matlab的命令 deval 和返回的结构数组,可以计算任一点的函数值。

例:用RK方法求解
y ′ = − 2 y + 2 x 2 + 2 x , 0 ≤ x ≤ 0.5 , y ( 0 ) = 1 y'=-2y+2x^2+2x,\quad0\leq x\leq 0.5,\quad y(0)=1 y=2y+2x2+2x,0x0.5,y(0)=1
解:

编写Matlab代码如下

yx=@(x,y) -2*x+2*x^2+2*x;
[x,y]=ode45(yx,[0,0.5],1);
sol=ode45(yx,[0,0.5],1);
y2=deval(sol,x);
高阶微分方程 y ( n ) = f ( t , y , y ′ , ⋯   , y ( n − 1 ) ) y^{(n)}=f(t,y,y',\cdots,y^{(n-1)}) y(n)=f(t,y,y,,y(n1)) 和一阶微分方程组的解法

高阶常微分方程,必需做变量替换,化为一阶常微分方程组,才能使用Matlab求数值解。

一阶微分方程组的解法和简单的一阶方程解法是一样的。

例1:考虑初值问题
y ′ ′ ′ − 3 y ′ ′ − y ′ y = 0 , y ( 0 ) = 0 , y ′ ( 0 ) = 1 , y ′ ′ ( 0 ) = − 1 y'''-3y''-y'y=0,\quad y(0)=0,\quad y'(0)=1,\quad y''(0)=-1 y3yyy=0,y(0)=0,y(0)=1,y(0)=1
解:

(1)设 y 1 = y , y 2 = y ′ , y 3 = y ′ ′ y_1=y,y_2=y',y_3=y'' y1=y,y2=y,y3=y,则有
{ y 1 ′ = y 2 , y 1 ( 0 ) = 0 y 2 ′ = y 3 , y 2 ( 0 ) = 1 y 3 ′ = 3 y 3 + y 1 y 2 , y 3 ( 0 ) = − 1 \begin{cases} y_1'=y2,\quad y_1(0)=0\\ y_2'=y3,\quad y_2(0)=1\\ y_3'=3y_3+y_1y_2,\quad y_3(0)=-1 \end{cases} y1=y2,y1(0)=0y2=y3,y2(0)=1y3=3y3+y1y2,y3(0)=1
初值问题可以写成 Y ′ = F ( t , Y ) , Y ( 0 ) = Y 0 Y'=F(t,Y),Y(0)=Y_0 Y=F(t,Y),Y(0)=Y0 的形式,其中 Y = [ y 1 , y 2 , y 3 ] T Y=[y_1,y_2,y_3]^T Y=[y1,y2,y3]T

(2)把一阶方程组写成接受两个参数t和y,返回一个列向量的.m文件

function dy=F(t,y);
dy=[y(2);y(3);3*y(3)+y(1)*y(2)];

(3)利用Matlab求解此问题的函数为

[T,Y]=ode45('F',[0,1],[0;1;-1]);

例2:求解 van der Pol 方程
{ y ′ ′ − 1000 ( 1 − y 2 ) y ′ + y = 0 y ( 0 ) = 2 y ′ ( 0 ) = 0 \begin{cases} y''-1000(1-y^2)y'+y=0\\ y(0)=2\\ y'(0)=0 \end{cases} y1000(1y2)y+y=0y(0)=2y(0)=0
的数值解,这里是刚性微分方程

解:

(1)先化为常微分方程组,令 y 1 = y , y 2 = y ′ y_1=y,y_2=y' y1=y,y2=y,则
{ y 1 ′ = y 2 , y 1 ( 0 ) = 2 y 2 ′ = 1000 ( 1 − y 1 2 ) y 2 − y 1 , y 2 ( 0 ) = 0 \begin{cases} y_1'=y_2,\quad y_1(0)=2\\ y_2'=1000(1-y_1^2)y_2-y_1,\quad y_2(0)=0 \end{cases} {y1=y2,y1(0)=2y2=1000(1y12)y2y1,y2(0)=0
(2)求解数值解,并利用图形输出解的结果。

dy=@(t,y) [y(2);1000*(1-y(1)^2)*y(2)-y(1)];
[t,y]=ode15s(dy,[0 3000],[2;0]);
plot(t,y(:,1),'*');
5.2

例3:Lorenz方程是一个三阶的非线性系统,它是由描述大气动力系统的Navier-Stoker偏微分方程演化而来的。自由系统如下:
{ x ˙ = σ ( y − x ) y ˙ = β x − y − x z z ˙ = − λ z + x y \begin{cases} \dot{x}=\sigma (y-x)\\ \dot{y}=\beta x-y-xz\\ \dot{z}=-\lambda z+xy \end{cases} x˙=σ(yx)y˙=βxyxzz˙=λz+xy
若系统参数 σ , β , λ \sigma,\beta,\lambda σ,β,λ 在一定范围内,系统就出现混沌,如 σ = 10 , β = 28 , λ = 8 / 3 \sigma=10,\beta=28,\lambda=8/3 σ=10,β=28,λ=8/3 时,出现混沌现象。求在初值条件 [ x ( 0 ) , y ( 0 ) , z ( 0 ) ] T = [ 5 , 13 , 17 ] T [x(0),y(0),z(0)]^T=[5,13,17]^T [x(0),y(0),z(0)]T=[5,13,17]T 时,方程组的数值解,并画出解的图像

解:

sigma=10,beta=28,lambda=8/3;
f=@(t,Y)[sigma*(Y(2)-Y(1));beta*Y(1)-Y(2)-Y(1)*Y(3);-lambda*Y(3)+Y(1)*Y(2)];
[t,y]=ode45(f,[0 30],[5;13;17]);
subplot(2,2,1)
plot(t,y(:,1),'*')
subplot(2,2,2)
plot(t,y(:,2),'+')
subplot(2,2,3)
plot(t,y(:,3),'o')
subplot(2,2,4)
plot3(y(:,1),y(:,2),y(:,3))
5.3

边值问题的Matlab数值解

Matlab中用 bvp4cbvpinit 命令求解常微分方程的两点边值问题,微分方程的标准形式为
y ′ = f ( x , y ) , b c ( y ( a ) , y ( b ) ) = 0 y'=f(x,y),\quad bc(y(a),y(b))=0 y=f(x,y),bc(y(a),y(b))=0
或者是
y ′ = f ( x , y , p ) , b c ( y ( a ) , y ( b ) , p ) = 0 y'=f(x,y,p),\quad bc(y(a),y(b),p)=0 y=f(x,y,p),bc(y(a),y(b),p)=0
式中:p 为有关的参数; yf 可以为向量函数;[a,b]为求解的区间 ;``bc`为边界条件

一般来说,边值问题在计算上比初值问题困难得多,特别是由于边值问题的解可能是多值,bvp4c需要提供猜测的初始值。

一般的,bvp4c 的调用格式如下
s o l = b v p 4 c ( @ o d e f u n , @ b c f u n , s o l i n i t , o p t i o n s , p 1 , p 2 , ⋯   ) ; sol=bvp4c(@ odefun,@ bcfun,solinit,options,p1,p2,\cdots); sol=bvp4c(@odefun,@bcfun,solinit,options,p1,p2,);
函数 odefun 的格式如下
y p r i m e = o d e f u n ( x , y , p 1 , p 2 , ⋯   ) ; yprime=odefun(x,y,p1,p2,\cdots); yprime=odefun(x,y,p1,p2,);
函数 bcfun 的格式如下
r e s = b c f u n ( y a , y b , p 1 , p 2 , ⋯   ) ; res=bcfun(ya,yb,p1,p2,\cdots); res=bcfun(ya,yb,p1,p2,);
下面首先给出一个简单的例子。

例1:考察描述在水平面上一个小水滴横截面形状的标量方程
d 2 d x 2 h ( x ) + [ 1 − h ( x ) ] { 1 + [ d d x h ( x ) ] 2 } 3 2 = 0 , h ( − 1 ) = h ( 1 ) = 0 \frac{d^2}{dx^2}h(x)+[1-h(x)]\{1+[\frac{d}{dx}h(x)]^2\}^\frac{3}{2}=0,\quad h(-1)=h(1)=0 dx2d2h(x)+[1h(x)]{1+[dxdh(x)]2}23=0,h(1)=h(1)=0
式中: h ( x ) h(x) h(x) x x x 处水滴的高度

解:

y 1 ( x ) = h ( x ) , y 2 ( x ) = h ′ ( x ) y_1(x)=h(x),y_2(x)=h'(x) y1(x)=h(x),y2(x)=h(x) ,把上述微分方程写成两个一阶微分方程组,即
{ d d x y 1 ( x ) = y 2 ( x ) d d x y 2 ( x ) = [ y 1 ( x ) − 1 ] [ 1 + y 2 ( x ) 2 ] 3 2 \begin{cases} \frac{d}{dx}y_1(x)=y_2(x)\\ \frac{d}{dx}y_2(x)=[y_1(x)-1][1+y_2(x)^2]^\frac{3}{2} \end{cases} {dxdy1(x)=y2(x)dxdy2(x)=[y1(x)1][1+y2(x)2]23
上述微分方程组可由如下函数表示

function yprime=drop(x,y);
yprime=[y(2);(y(1)-1)*(1+y(2)^2)^(3/2)];

边界条件通过残差函数指定,边界条件通过如下函数表示

function res=dropbc(ya,yb);
res=[ya(1);yb(1)];

如,使用 y 1 ( x ) = 1 − x 2 y_1(x)=\sqrt{1-x^2} y1(x)=1x2 y 2 ( x ) = − x 0.1 + 1 − x 2 y_2(x)=\frac{-x}{0.1+\sqrt{1-x^2}} y2(x)=0.1+1x2 x 作为初始猜测解,由如下函数定义

function yinit=dropinit(x);
yinit=[sqrt(1-x.^2);-x./(0.1+sqrt(1-x.^2))];

利用如下程序求解微分方程的边值问题并画出图像

solinit=bvpinit(linspace(-1,1,20),@ dropinit);
sol=bvp4c(@ drop,@ dropbc,solinit);
fill(sol.x,sol.y(1,:),[0.7,0.7,0.7]);
xlabel('x','Fontsize',12);
ylabel('h','Rotation',0,'Fontsize',12);
5.4

这里通过调用函数bvpinit,计算区间 [ − 1 , 1 ] [-1,1] [1,1] 上等间距的20个点的数据,然后调用函数 bvp4c ,得到数值解的结构 sol

初始猜测结构 solinit 由两个域,solinit.x 提供初始猜测的 x x x 值,排列顺序为从左到右排列,其中 solinit.x(1)solinit.x(end) 分别表示 a a a b b b。对应的,solinit.y(:,i) 给出点 solinit.x(i) 处的初始猜测解。

输出参数 sol 时包含数值解的一个结构,其中 sol.x 给出计算数值解的 x x x 点,sol.x(i) 处的数值解由 sol.y(:,i) 给出,类似的,sol.x(i) 处数值解的一阶导数由 sol.yp(:,i) 给出。

可以把上面的所有函数放在一个文件中

function sol=example;
solinit=bvpinit(linspace(-1,1,20),@ dropinit);
sol=bvp4c(@ drop,@ dropbc,solinit);
fill(sol.x,sol.y(1,:).[0.7 0.7 0.7]);
xlabel('x','Fontsize',12);
ylabel('h','Rotation',0,'Fontsize',12);

function yprime=drop(x,y);
yprime=[y(2);(y(1)-1)*(1+y(2)^2)^(3/2)];

function res=dropbc(ya,yb);
res=[ya(1);yb(1)];

function yinit=dropinit(x);
yinit=[sqrt(1-x.^2);-x./(0.1+sqrt(1-x.^2))];

也可以使用匿名函数的形式

yprime=@ (x,y) [y(2);(y(1)-1)*(1+y(2)^2)^(3/2)];
res=@ (ya,yb) [ya(1);yb(1)];
yinit=@ (x) [sqrt(1-x.^2);-x./(0.1+sqrt(1-x.^2))];
solinit=bvpinit(linspace(-1,1,20),yinit);
sol=bvp4c(yprime,res,solinit);
fill(sol.x,sol.y(1,:).[0.7 0.7 0.7]);
xlabel('x','Fontsize',12);
ylabel('h','Rotation',0,'Fontsize',12);

例2:描述 x = 0 x=0 x=0 处固定, x = 1 x=1 x=1 处有弹性支持,沿着 x x x 轴平衡位置以均匀角速度旋转的绳的位移方程
d 2 d x 2 y ( x ) + μ y ( x ) = 0 \frac{d^2}{dx^2}y(x)+\mu y(x)=0 dx2d2y(x)+μy(x)=0
具有边界条件
y ( 0 ) = 0 , [ d d x y ( x ) ] ∣ x = 0 = 1 , [ y ( x ) + d d x y ( x ) ] ∣ x = 1 = 0 y(0)=0,\quad [\frac{d}{dx}y(x)]|_{x=0}=1,\quad [y(x)+\frac{d}{dx}y(x)]|_{x=1}=0 y(0)=0,[dxdy(x)]x=0=1,[y(x)+dxdy(x)]x=1=0
解:这个边值问题是一个特征问题,必需找到参数 μ \mu μ 的值使得方程的解存在。如果提供参数 μ \mu μ 的猜测值和对应解的猜测值,可以利用函数 bvp4c 求解特征问题。上述微分方程可以写成下面的微分方程组:
{ d d x y 1 ( x ) = y 2 ( x ) d d x y 2 ( x ) = − μ y 1 ( x ) \begin{cases} \frac{d}{dx}y_1(x)=y_2(x)\\ \frac{d}{dx}y_2(x)=-\mu y_1(x) \end{cases} {dxdy1(x)=y2(x)dxdy2(x)=μy1(x)
使用 μ = 5 , y 1 ( x ) = sin ⁡ x , y 2 ( x ) = cos ⁡ x \mu=5,y_1(x)=\sin{x},y_2(x)=\cos{x} μ=5,y1(x)=sinx,y2(x)=cosx 作为初始猜测解,编写程序如下

eq=@ (x,y,mu) [y(2);-mu*y(1)];
bd=@ (ya,yb,mu) [ya(1);ya(2)-1;yb(1)+yb(2)]
guess=@ (x) [sin(x);cos(x)];
guess_structure=bvpinit(linspace(0,1,10),guess,5);
sol=bvp4c(eq,bd,guess_structure);
plot(sol.x,sol.y(1,:),'-',sol.x,sol.yp(1,:),'--','LineWidth',2);
xlabel('x','Fontsize',12);
legend('y_1','y_2');
5.5

例3:求解微分方程组
{ u ′ = 0.5 u ( w − u ) / v v ′ = − 0.5 ( w − u ) w ′ = [ 0.9 − 100 ( w − y ) − 0.5 w ( w − u ) ] / z z ′ = 0.5 ( w − u ) y ′ = − 100 ( y − w ) \begin{cases} u'=0.5u(w-u)/v\\ v'=-0.5(w-u)\\ w'=[0.9-100(w-y)-0.5w(w-u)]/z\\ z'=0.5(w-u)\\ y'=-100(y-w) \end{cases} u=0.5u(wu)/vv=0.5(wu)w=[0.9100(wy)0.5w(wu)]/zz=0.5(wu)y=100(yw)
边界条件为 u ( 0 ) = v ( 0 ) = w ( 0 ) = 1 , z ( 0 ) = − 10 , w ( 1 ) = y ( 1 ) u(0)=v(0)=w(0)=1,z(0)=-10,w(1)=y(1) u(0)=v(0)=w(0)=1,z(0)=10,w(1)=y(1)

解:

使用如下猜测
{ u ( x ) = 1 v ( x ) = 1 w ( x ) = − 4.5 x 2 + 8.91 x + 1 z ( x ) = − 10 y ( x ) = − 4.5 x 2 + 9 x + 0.91 \begin{cases} u(x)=1\\ v(x)=1\\ w(x)=-4.5x^2+8.91x+1\\ z(x)=-10\\ y(x)=-4.5x^2+9x+0.91 \end{cases} u(x)=1v(x)=1w(x)=4.5x2+8.91x+1z(x)=10y(x)=4.5x2+9x+0.91
编写程序如下

eq=@ (x,y) [0.5*y(1)*(y(3)-y(1))/y(2)
-0.5*(y(3)-y(1))
(0.9-1000*(y(3)-y(5))-0.5*y(3)*(y(3)-y(1)))/y(4)
0.5*(y(3)-y(1))
100*(y(3)-y(5))];
bd=@ (ya,yb) [ya(1)-1;ya(2)-1;ya(3)-1;ya(4)+10;yb(3)-yb(5)];
guess=@ (x) [1;1;-4.5*x^2+8.91*x+1;-10;-4.5*x^2+9*x+0.91];
guess_structure=bvpinit(linspace(0,1,5),guess);
sol=bvp4c(eq,bd,guess_structure);
plot(sol.x,sol.y(1,:),'-*',sol.x,sol.y(2,:),'-D',sol.x,sol.y(3,:),':S',sol.x,sol.y(4,:),'-.O',sol.x,sol.y(5,:),'--P');
legend('u','v','w','z','y','Location','southwest');
5.6
  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值