Free Essay

Matlab

In:

Submitted By li95
Words 57838
Pages 232
第一章

线性规划

§1

线性规划
在人们的生产实践中,
经常会遇到如何利用现有资源来安排生产,
以取得最大经济
效益的问题。此类问题构成了运筹学的一个重要分支—数学规划,而线性规划(Linear
Programming 简记 LP)则是数学规划的一个重要分支。自从 1947 年 G. B. Dantzig 提出
求解线性规划的单纯形方法以来,
线性规划在理论上趋向成熟,
在实用中日益广泛与深
入。
特别是在计算机能处理成千上万个约束条件和决策变量的线性规划问题之后,
线性
规划的适用领域更为广泛了,已成为现代管理中经常采用的基本方法之一。
1.1 线性规划的实例与定义
例 1 某机床厂生产甲、
乙两种机床,
每台销售后的利润分别为 4000 元与 3000 元。
生产甲机床需用 A、B 机器加工,加工时间分别为每台 2 小时和 1 小时;生产乙机床
需用 A、B、C 三种机器加工,
加工时间为每台各一小时。
若每天可用于加工的机器时
数分别为 A 机器 10 小时、 B 机器 8 小时和 C 机器 7 小时,问该厂应生产甲、乙机床各
几台,才能使总利润最大?
上述问题的数学模型:
设该厂生产 x1 台甲机床和 x 2 乙机床时总利润最大, x1 , x2

应满足
(目标函数) max z = 4 x1 + 3 x2
(1)

⎧2 x1 + x2 ≤ 10
⎪x + x ≤ 8
⎪ 1 2
s.t.(约束条件) ⎨
⎪ x2 ≤ 7
⎪ x1 , x2 ≥ 0


(2)

(1)式被称为问题的目标函数,
(2)中的几个不等式
这里变量 x1 , x 2 称之为决策变量,
是问题的约束条件,记为 s.t.(即 subject to)。由于上面的目标函数及约束条件均为线性
函数,故被称为线性规划问题。
总之,
线性规划问题是在一组线性约束条件的限制下,
求一线性目标函数最大或最
小的问题。
在解决实际问题时,
把问题归结成一个线性规划数学模型是很重要的一步,
但往往
也是困难的一步,模型建立得是否恰当,直接影响到求解。而选适当的决策变量,是我
们建立有效模型的关键之一。
1.2 线性规划的 Matlab 标准形式
线性规划的目标函数可以是求最大值,
也可以是求最小值,
约束条件的不等号可以
是小于号也可以是大于号。为了避免这种形式多样性带来的不便,Matlab 中规定线性
规划的标准形式为

min cT x x ⎧ Ax ≤ b

s.t. ⎨ Aeq ⋅ x = beq
⎪lb ≤ x ≤ ub

其中 c 和 x 为 n 维列向量, A 、 Aeq 为适当维数的矩阵, b 、 beq 为适当维数的列向
量。
-1-

例如线性规划

Ax ≥ b

max cT x s.t. x 的 Matlab 标准型为

min − cT x s.t. x − Ax ≤ −b

1.3 线性规划问题的解的概念
一般线性规划问题的(数学)标准型为
n

z = ∑cj xj

max

(3)

j =1

s.t.

可行解

⎧n
⎪∑ aij x j = bi i = 1,2, L, m
⎨ j =1
⎪ x ≥ 0 j = 1,2,L, n
⎩ j

(4)

满足约束条件
(4)
的解 x = ( x1 , x2 , L , xn ) ,
称为线性规划问题的可行解,

而使目标函数(3)达到最大值的可行解叫最优解。
可行域 所有可行解构成的集合称为问题的可行域,记为 R 。
1.4 线性规划的图解法
10
2 x1 + x2 = 1 0

9
8
7

x2 = 7
(2 ,6 )

6
5
4
3
2

x1 + x2 = 8

1 z= 1 2
0
0

2

4

6

8

10

图 1 线性规划的图解示意图

图解法简单直观,
有助于了解线性规划问题求解的基本原理。
我们先应用图解法来
求解例 1。对于每一固定的值 z ,使目标函数值等于 z 的点构成的直线称为目标函数等
位线,当 z 变动时,我们得到一族平行直线。对于例 1,显然等位线越趋于右上方,其
上的点具有越大的目标函数值。不难看出,本例的最优解为 x* = ( 2,6) ,最优目标值
T

z* = 26 。
从上面的图解过程可以看出并不难证明以下断言:
(1)可行域 R 可能会出现多种情况。 R 可能是空集也可能是非空集合,当 R 非空
时,
它必定是若干个半平面的交集
(除非遇到空间维数的退化) R 既可能是有界区域,

也可能是无界区域。
(2) R 非空时,

线性规划既可以存在有限最优解,
也可以不存在有限最优解
(其
目标函数值无界)

-2-

(3)若线性规划存在有限最优解,
则必可找到具有最优目标函数值的可行域 R 的
“顶点”

上述论断可以推广到一般的线性规划问题,
区别只在于空间的维数。
在一般的 n 维 n 空间中,满足一线性等式

∑a x i =1

n

i

= b 的点集被称为一个超平面,而满足一线性不等式

n

i =1

i

i =1

∑ ai xi ≤ b (或 ∑ ai xi ≥ b )的点集被称为一个半空间(其中 (a1 , L, an ) 为一 n 维行
向量, b 为一实数)
。若干个半空间的交集被称为多胞形,有界的多胞形又被称为多面
体。易见,线性规划的可行域必为多胞形(为统一起见,空集 Φ 也被视为多胞形)

在一般 n 维空间中,要直接得出多胞形“顶点”概念还有一些困难。二维空间中的顶点
可以看成为边界直线的交点,
但这一几何概念的推广在一般 n 维空间中的几何意义并不
十分直观。为此,我们将采用另一途径来定义它。
定义 1

称 n 维空间中的区域 R 为一凸集,若 ∀x , x ∈ R 及 ∀λ ∈ (0,1) ,有
1

2

λx1 + (1 − λ ) x 2 ∈ R 。
定义 2

设 R 为 n 维空间中的一个凸集, R 中的点 x 被称为 R 的一个极点,若不

存在 x 、x ∈ R 及 λ ∈ (0,1) ,使得 x = λx + (1 − λ ) x 。
定义 1 说明凸集中任意两点的连线必在此凸集中;而定义 2 说明,若 x 是凸集 R
的一个极点,则 x 不能位于 R 中任意两点的连线上。不难证明,多胞形必为凸集。同
样也不难证明,二维空间中可行域 R 的顶点均为 R 的极点( R 也没有其它的极点)

1.5 求解线性规划的 Matlab 解法
单纯形法是求解线性规划问题的最常用、最有效的算法之一。这里我们就不介绍
单纯形法,
有兴趣的读者可以参看其它线性规划书籍。
下面我们介绍线性规划的 Matlab
解法。
Matlab 中线性规划的标准型为
1

2

1

2

min cT x x ⎧ Ax ≤ b

s.t. ⎨ Aeq ⋅ x = beq
⎪lb ≤ x ≤ ub

还有其它的一些函数调用形
基本函数形式为 linprog(c,A,b),它的返回值是向量 x 的值。
式(在 Matlab 指令窗运行 help linprog 可以看到所有的函数调用形式)
,如:
[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS)
这里 fval 返回目标函数的值, 和 UB 分别是变量 x 的下界和上界,x0 是 x 的初始值,
LB
OPTIONS 是控制参数。
例 2 求解下列线性规划问题

max z = 2 x1 + 3x2 − 5 x3
s.t. x1 + x2 + x3 = 7
2 x1 − 5 x2 + x3 ≥ 10 x1 + 3 x2 + x3 ≤ 12 x1 , x2 , x3 ≥ 0
-3-

解 (i)编写 M 文件 c=[2;3;-5]; a=[-2,5,-1;1,3,1]; b=[-10;12]; aeq=[1,1,1]; beq=7; x=linprog(-c,a,b,aeq,beq,zeros(3,1)) value=c'*x
(ii)将M文件存盘,并命名为example1.m。
(iii)在Matlab指令窗运行example1即可得所求结果。
例3 求解线性规划问题

min z = 2 x1 + 3x2 + x3
⎧ x1 + 4 x2 + 2 x3 ≥ 8

⎨3x1 + 2 x 2 ≥ 6
⎪x , x , x ≥ 0
⎩ 1 2 3
解 编写Matlab程序如下: c=[2;3;1]; a=[1,4,2;3,2,0]; b=[8;6]; [x,y]=linprog(c,-a,-b,[],[],zeros(3,1))
1.6 可以转化为线性规划的问题
很多看起来不是线性规划的问题也可以通过变换变成线性规划的问题来解决。如:
例4 规划问题为

min | x1 | + | x2 | + L + | x n |
s. t.
Ax ≤ b
T
其中 x = [ x1 L x n ] , A 和 b 为相应维数的矩阵和向量。
要把上面的问题变换成线性规划问题,只要注意到事实:对任意的 xi ,存在

ui , vi > 0 满足 xi = ui − vi , | xi |= ui + vi
| x | − xi x + | xi |
事实上,我们只要取 ui = i
, vi = i
就可以满足上面的条件。
2
2
T
T
这样,记 u = [u1 L un ] , v = [v1 L v n ] ,从而我们可以把上面的问题
变成
n

min

∑ (u

i

+ vi )

i =1

⎧ A(u − v ) ≤ b
s. t. ⎨
⎩u, v ≥ 0
例 5 min{max | ε i |} xi yi

其中 ε i = xi − yi 。
对于这个问题,如果我们取 x0 = max | ε i | ,这样,上面的问题就变换成 yi -4-

x0 x1 − y1 ≤ x0 , L , xn − y n ≤ x0

min
s. t.

此即我们通常的线性规划问题。
§2

运输问题(产销平衡)
例 6 某商品有 m 个产地、 n 个销地,各产地的产量分别为 a1 , L , am ,各销地的

需求量分别为 b1 , L , bn 。若该商品由 i 产地运到 j 销地的单位运价为 cij ,问应该如何调
运才能使总运费最省?
解:引入变量 xij ,其取值为由 i 产地运往 j 销地的该商品数量,数学模型为 m n

∑∑ c x

min

i =1 j =1

ij ij

⎧n
⎪∑ xij = ai , i = 1, L , m
⎪ j =1
⎪m
⎨∑ xij = b j , j = 1,2, L , n
⎪ i =1
⎪ xij ≥ 0



s.t.

显然是一个线性规划问题,当然可以用单纯形法求解。
对产销平衡的运输问题,由于有以下关系式存在:
m
⎛ n
⎞ n ⎛ m
⎞ m b j = ∑ ⎜ ∑ xij ⎟ = ∑ ⎜ ∑ xij ⎟ = ∑ ai
∑ i=1 ⎜ j=1 ⎟ j=1 ⎝ i=1 ⎠ i=1 j =1

⎠ n 其约束条件的系数矩阵相当特殊,
可用比较简单的计算方法,
习惯上称为表上作业法
(由
康托洛维奇和希奇柯克两人独立地提出,简称康—希表上作业法)

§3

指派问题
3.1 指派问题的数学模型
例 7 拟分配 n 人去干 n 项工作,每人干且仅干一项工作,若分配第 i 人去干第 j

项工作,需花费 cij 单位时间,问应如何分配工作才能使工人花费的总时间最少?
容易看出,要给出一个指派问题的实例,只需给出矩阵 C = ( cij ) , C 被称为指派
问题的系数矩阵。
引入变量 xij ,若分配 i 干 j 工作,则取 xij = 1 ,否则取 xij = 0 。上述指派问题的
数学模型为
n

n

∑∑ c x

min

i =1 j =1

n

s.t.

∑x j =1

ij

ij ij

=1

-5-

n

∑x i =1

ij

=1

xij = 0 或 1
上述指派问题的可行解可以用一个矩阵表示,其每行每列均有且只有一个元素为
1,其余元素均为 0;可以用 1, L, n 中的一个置换表示。
问题中的变量只能取 0 或 1,从而是一个 0-1 规划问题。一般的 0-1 规划问题求解
极为困难。但指派问题并不难解,其约束方程组的系数矩阵十分特殊(被称为全单位模
矩阵,
其各阶非零子式均为 ± 1 ) 其非负可行解的分量只能取 0 或 1,

故约束 xij = 0或1
可改写为 xij ≥ 0 而不改变其解。此时,指派问题被转化为一个特殊的运输问题,其中

m = n , ai = b j = 1 。
3.2 求解指派问题的匈牙利算法
由于指派问题的特殊性,又存在着由匈牙利数学家 Konig 提出的更为简便的解法
—匈牙利算法。算法主要依据以下事实:如果系数矩阵 C = ( cij ) 一行(或一列)中每
一元素都加上或减去同一个数,得到一个新矩阵 B = (bij ) ,则以 C 或 B 为系数矩阵的
指派问题具有相同的最优指派。
例 8 求解指派问题,其系数矩阵为

⎡16
⎢17
C=⎢
⎢24

⎣17

15
21
22
19

19
19
18
22

22⎤
18 ⎥

17 ⎥

16 ⎦

解 将第一行元素减去此行中的最小元素 15,同样,第二行元素减去 17,第三行
元素减去 17,最后一行的元素减去 16,得

⎡1
⎢0
B1 = ⎢
⎢7

⎣1

0
4
5
3

4
2
1
6

7⎤
1⎥

0⎥

0⎦

再将第 3 列元素各减去 1,得

⎡ 1 0* 3 7 ⎤
⎢ *

0 4 1 1⎥
B2 = ⎢
⎢ 7 5 0* 0 ⎥

*⎥
⎣1 3 5 0 ⎦
以 B2 为系数矩阵的指派问题有最优指派

⎛1 2 3 4⎞

⎜ 2 1 3 4⎟



由等价性,它也是例 7 的最优指派。
有时问题会稍复杂一些。
例 9 求解系数矩阵 C 的指派问题
-6-

⎡12 7 9 7 9 ⎤
⎢8 9 6 6 6⎥


C = ⎢ 7 17 12 14 12⎥


⎢15 14 6 6 10⎥
⎢ 4 10 7 10 6 ⎥


解:先作等价变换如下

−7
−6
−7
−6
−4

0
⎡12 7 9 7 9 ⎤
⎡ 5 0* 2
⎢8 9 6 6 6⎥
⎢2
3 0 0*



⎢ 7 17 12 14 12⎥ → ⎢0 * 10 5 7



8 0* 0
⎢15 14 6 6 10⎥
⎢9
⎢ 4 10 7 10 6 ⎥
⎢0
6
3 6





2⎤
0⎥

5⎥ ∨

4⎥
2⎥ ∨


容易看出,
从变换后的矩阵中只能选出四个位于不同行不同列的零元素, n = 5 ,

最优指派还无法看出。此时等价变换还可进行下去。步骤如下:
(1) 对未选出 0 元素的行打 ∨ ;
(2) 对 ∨ 行中 0 元素所在列打 ∨ ;
(3) 对 ∨ 列中选中的 0 元素所在行打 ∨ ;
重复(2)(3)直到无法再打 ∨ 为止。

可以证明,若用直线划没有打 ∨ 的行与打 ∨ 的列,就得到了能够覆盖住矩阵中所
有零元素的最少条数的直线集合,找出未覆盖的元素中的最小者,令 ∨ 行元素减去此
数, ∨ 列元素加上此数,则原先选中的 0 元素不变,而未覆盖元素中至少有一个已转
变为 0,且新矩阵的指派问题与原问题也等价。上述过程可反复采用,直到能选取出足
够的 0 元素为止。例如,对例 5 变换后的矩阵再变换,第三行、第五行元素减去 2,第
一列元素加上 2,得

⎡7
⎢4

⎢0

⎢11
⎢0


0
3
8
8
4

2
0
3
0
1

0
0
5
0
4

2⎤
0⎥

3⎥

4⎥
0⎥


⎛ 1 2 3 4 5⎞
⎟。

⎝ 2 4 1 3 5⎠

现在已可看出,最优指派为 ⎜

§4

对偶理论与灵敏度分析
4.1 原始问题和对偶问题
考虑下列一对线性规划模型:

max

cT x

s.t.

Ax ≤ b, x ≥ 0

(P)

AT y ≥ c, y ≥ 0

(D)



min bT y

s.t.

-7-

称(P)为原始问题,
(D)为它的对偶问题。
不太严谨地说,对偶问题可被看作是原始问题的“行列转置”

(1) 原始问题中的第 j 列系数与其对偶问题中的第 j 行的系数相同;
(2) 原始目标函数的各个系数行与其对偶问题右侧的各常数列相同;
(3) 原始问题右侧的各常数列与其对偶目标函数的各个系数行相同;
(4) 在这一对问题中,不等式方向和优化方向相反。
考虑线性规划:

min c T x

s.t.

Ax = b, x ≥ 0

把其中的等式约束变成不等式约束,可得

⎡ A⎤
⎡b⎤
s.t. ⎢ ⎥ x ≥ ⎢ ⎥, x ≥ 0
⎣− A⎦
⎣ − b⎦

min c T x
它的对偶问题是

⎡y ⎤
− AT ⎢ 1 ⎥ ≤ c
⎣ y2 ⎦

其中 y1 和 y 2 分别表示对应于约束 Ax ≥ b 和 − Ax ≥ −b 的对偶变量组。 y = y1 − y 2 ,

[b

max

T

⎡y ⎤
− bT ⎢ 1 ⎥
⎣ y2 ⎦

]

[

s.t. AT

]

则上式又可写成

max bT y

s.t.

AT y ≤ c

原问题和对偶的对偶约束之间的关系:

min
⎧≥ 0

⎨≤ 0
⎪无限制

⎧≥ 0

⎨≤ 0
⎪= 0


变量

行约束

行约束

变量

max
⎧≤ 0

⎨≥ 0
⎪= 0

⎧≥ 0

⎨≤ 0
⎪无限制


4.2 对偶问题的基本性质
1o 对称性:对偶问题的对偶是原问题。
2o 弱 对 偶 性 : 若 x 是 原 问 题 的 可 行 解 , y 是 对 偶 问 题 的 可 行 解 。 则 存 在

c T x ≤ bT y 。
3o 无界性:若原问题(对偶问题)为无界解,则其对偶问题(原问题)无可行解。
ˆ
ˆ
4o 可行解是最优解时的性质:设 x 是原问题的可行解, y 是对偶问题的可行解,

ˆ
ˆ
ˆ ˆ
当 c x = b y 时, x, y 是最优解。 o 5 对偶定理:若原问题有最优解,那么对偶问题也有最优解;且目标函数值相同。
ˆ ˆ
6o 互补松弛性:若 x, y 分别是原问题和对偶问题的最优解,则
T

T

ˆ
ˆ
y T ( Ax − b) = 0,
例 10

ˆ
ˆ
x T ( AT y − c ) = 0

已知线性规划问题

min ω = 2 x1 + 3x 2 + 5 x3 + 2 x 4 + 3x5 x1 + x 2 + 2 x3 + x 4 + 3x5 ≥ 4
s.t.
-8-

2 x1 − x 2 + 3x3 + x 4 + x5 ≥ 3 x j ≥ 0, j = 1,2,L,5
已知其对偶问题的最优解为 y1 =
*

4 * 3
, y 2 = ; z = 5 。试用对偶理论找出原问题的最优
5
5

解。


先写出它的对偶问题

max z = 4 y1 + 3 y 2 y1 + 2 y 2 ≤ 2 y1 − y 2 ≤ 3
2 y1 + 3 y3 ≤ 5

y1 + y 2 ≤ 2
3 y1 + y 2 ≤ 3 y1 , y 2 ≥ 0
*







*

将 y1 , y 2 的 值 代 入 约 束 条 件 , 得 ② , ③ , ④ 为 严 格 不 等 式 ; 由 互 补 松 弛 性 得
*
*
*
*
*
x2 = x3 = x4 = 0 。因 y1 , y 2 > 0 ;原问题的两个约束条件应取等式,故有
*
* x1 + 3x5 = 4
*
*
2 x1 + x5 = 3

求解后得到 x1 = 1, x5 = 1 ;故原问题的最优解为
*

*

X * = [1 0 0 0 1]' ; ω * = 5 。
4.3 灵敏度分析
但实际上这些系数往往是估
在以前讨论线性规划问题时,
假定 aij , bi , c j 都是常数。
计值和预测值。如市场条件一变,c j 值就会变化;aij 往往是因工艺条件的改变而改变;

bi 是根据资源投入后的经济效果决定的一种决策选择。因此提出这样两个问题:当这
些系数有一个或几个发生变化时,
已求得的线性规划问题的最优解会有什么变化;
或者
这些系数在什么范围内变化时,
线性规划问题的最优解或最优基不变。
这里我们就不讨
论了。
4.4 参数线性规划
参数线性规划是研究 aij , bi , c j 这些参数中某一参数连续变化时,
使最优解发生变化
的各临界点的值。
即把某一参数作为参变量,
而目标函数在某区间内是这参变量的线性
函数,
含这参变量的约束条件是线性等式或不等式。
因此仍可用单纯形法和对偶单纯形
法进行分析参数线性规划问题。
§5

投资的收益和风险
5.1 问题提出
市场上有 n 种资产 si ( i = 1,2, L, n )可以选择,现用数额为 M 的相当大的资金

风险损失率为
作一个时期的投资。 n 种资产在这一时期内购买 si 的平均收益率为 ri ,


qi ,投资越分散,总的风险越少,总体风险可用投资的 si 中最大的一个风险来度量。
-9-

购买 si 时要付交易费,
(费率 pi )
,当购买额不超过给定值 ui 时,交易费按购买 ui
计算。另外,假定同期银行存款利率是 r0 ,既无交易费又无风险。 r0 = 5% )

已知 n = 4 时相关数据如表 1。
表1

si

ri (%)

qi

pi (%)

ui (元)

s1 s2 s3

28

2.5

1

103

21

1.5

2

198

23

5.5

4.5

52

s4

25

2.6

6.5

40

试给该公司设计一种投资组合方案,即用给定资金 M ,有选择地购买若干种资产
或存银行生息,使净收益尽可能大,使总体风险尽可能小。
5.2 符号规定和基本假设
符号规定:
si :第 i 种投资项目,如股票,债券

ri , pi , qi :分别为 si 的平均收益率,交易费率,风险损失率 ui : si 的交易定额 r0 :同期银行利率 xi :投资项目 si 的资金 a :投资风险度
Q :总体收益
基本假设:
1. 投资数额 M 相当大,为了便于计算,假设 M = 1 ;
2. 投资越分散,总的风险越小;
3. 总体风险用投资项目 si 中最大的一个风险来度量;
4. n 种资产 si 之间是相互独立的;
5. 在投资的这一时期内, ri , pi , qi , r0 为定值,不受意外因素影响;
6. 净收益和总体风险只受 ri , pi , qi 影响,不受其它因素干扰。
5.3 模型的分析与建立
1. 总体风险用所投资的 si 中最大的一个风险来衡量,即

max{qi xi | i = 1,2,L, n}
2.购买 si 所付交易费是一个分段函数,即

⎧ pi xi ,
⎩ pi ui ,

交易费 = ⎨

xi > ui xi ≤ ui

而题目所给定的定值 ui (单位:元)相对总投资 M 很少, pi ui 更小,可以忽略不
计,这样购买 si 的净收益为 (ri − pi ) xi 。
3. 要使净收益尽可能大,总体风险尽可能小,这是一个多目标规划模型:
-10-

目标函数为 n ⎧ max ∑ (ri − pi ) xi

⎨ i =0
⎪min max{q x } i i


约束条件为

⎧n
⎪∑ (1 + pi ) xi = M
⎨ i =0
⎪ x ≥ 0, i = 0,1,L, n
⎩ i
4. 模型简化
a) 在实际投资中,投资者承受风险的程度不一样,若给定风险一个界限 a ,使最
大的一个风险
性规划。
模型一

qi xi
≤a,
可找到相应的投资方案。
这样把多目标规划变成一个目标的线
M
固定风险水平,优化收益
n

max ∑ (ri − pi ) xi i =0

⎧ qi xi
⎪ M ≤a

s.t. ⎨ n
⎪∑ (1 + pi ) xi = M ,
⎪ i =0


xi ≥ 0, i = 0,1, L , n

b) 若投资者希望总盈利至少达到水平 k 以上,在风险最小的情况下寻求相应的投
资组合。
模型二 固定盈利水平,极小化风险

min {max {qi xi }}
⎧n
⎪∑ (ri − pi ) xi ≥ k
⎪ i =0
s.t. ⎨ n ⎪ (1 + p ) x = M , i i
⎪∑
⎩ i =0

xi ≥ 0, i = 0,1,L, n

c) 投资者在权衡资产风险和预期收益两方面时,希望选择一个令自己满意的投资
组合。因此对风险、收益分别赋予权重 s ( 0 < s ≤ 1 )和 (1 − s ) , s 称为投资偏好系数。 n 模型三

min s{max{qi xi }} − (1 − s )∑ (ri − pi ) xi i =0

n

s.t.

∑ (1 + p ) x i =0

i

i

= M,

xi ≥ 0, i = 0,1,2, L, n

5.4 模型一的求解
模型一为:

min f = (−0.05,−0.27,−0.19,−0.185,−0.185)( x0 , x1 , x2 , x3 , x4 )T
-11-

s.t.

⎧ x0 + 1.01x1 + 1.02 x2 + 1.045 x3 + 1.065 x4 = 1
⎪0.025 x ≤ a
1


⎪0.015 x2 ≤ a

⎪0.055 x3 ≤ a
⎪0.026 x4 ≤ a

⎪ xi ≥ 0 (i = 0,1, L,4)


到底怎样没有一个准则,
不同的投资者有不同的风险
由于 a 是任意给定的风险度,
度。我们从 a = 0 开始,以步长 Δa = 0.001 进行循环搜索,编制程序如下: clc,clear a=0; hold on while a 0 j = 1,2,3 .
Pj = ⎨
当x j = 0
⎪0,

在构成目标函数时,为了统一在一个问题中讨论,现引入 0 − 1 变量 y j ,令

⎧1, 当采用第j种生产方式,即x j > 0时,

yj = ⎨
⎪0, 当不采用第j种生产方式,即x j = 0时.


(3)

于是目标函数

min z = ( k1 y1 + c1 x1 ) + ( k 2 y 2 + c2 x 2 ) + ( k 3 y 3 + c3 x3 )
(3)式这个规定可表为下述 3 个线性约束条件:

y jε ≤ x j ≤ y j M ,

j = 1,2,3

(4)

其中 ε 是一个充分小的正常数, M 是个充分大的正常数。
(4)式说明,当 x j > 0 时 y j
必须为 1;当 x j = 0 时只有 y j 为 0 时才有意义,所以(4)式完全可以代替(3)式。
3.2 0 − 1 型整数规划解法之一(过滤隐枚举法)
解 0 − 1 型整数规划最容易想到的方法,和一般整数规划的情形一样,就是穷举法,
即检查变量取值为 0 或 1 的每一种组合,
比较目标函数值以求得最优解,
这就需要检查
变量取值的 2 个组合。对于变量个数 n 较大(例如 n > 100 )
,这几乎是不可能的。因
此常设计一些方法,只检查变量取值的组合的一部分,就能求到问题的最优解。这样的
方法称为隐枚举法(Implicit Enumeration)
,分枝定界法也是一种隐枚举法。当然,对
n

-20-

有些问题隐枚举法并不适用,所以有时穷举法还是必要的。
下面举例说明一种解 0 − 1 型整数规划的隐枚举法。
例 6 Max z = 3 x1 − 2 x 2 + 5 x3

⎧ x1 + 2 x 2 − x3 ≤ 2
⎪x + 4x + x ≤ 4
2
3
⎪ 1

x1 + x 2 ≤ 3

⎪4 x + x ≤ 6
3
⎪ 2
⎪ x1 , x2 , x3 = 0或1

求解思路及改进措施:
(i) 先试探性求一个可行解,易看出 ( x1 , x 2 , x3 ) = (1,0,0) 满足约束条件,故为一
个可行解,且 z = 3 。
(ii) 因为是求极大值问题,故求最优解时,凡是目标值 z < 3 的解不必检验是否
满足约束条件即可删除,
因它肯定不是最优解,
于是应增加一个约束条件
(目标值下界)

(iii) 改进过滤条件。
(iv) 由于对每个组合首先计算目标值以验证过滤条件,
故应优先计算目标值 z 大
的组合,这样可提前抬高过滤门槛,以减少计算量。
§4 蒙特卡洛法(随机取样法)
前面介绍的常用的整数规划求解方法,
主要是针对线性整数规划而言,
而对于非线
性整数规划目前尚未有一种成熟而准确的求解方法,
因为非线性规划本身的通用有效解
法尚未找到,更何况是非线性整数规划。
然而,
尽管整数规划由于限制变量为整数而增加了难度;
然而又由于整数解是有限
个,于是为枚举法提供了方便。当然,当自变量维数很大和取值范围很宽情况下,企图
用显枚举法(即穷举法)计算出最优值是不现实的,但是应用概率理论可以证明,在一
定的计算量的情况下,完全可以得出一个满意解。
例 7 已知非线性整数规划为:
2
2
2
2
Max z = x12 + x 2 + 3x3 + 4 x 4 + 2 x5

− 8 x1 − 2 x 2 − 3x3 − x 4 − 2 x5
⎧0 ≤ xi ≤ 99 (i = 1,L,5)
⎪ x + x + x + x + x ≤ 400
2
3
4
5
⎪ 1

+ 2 x 2 + 2 x3 + x 4 + 6 x5 ≤ 800
⎨ x1
⎪2 x + x + 6 x ≤ 200
2
3
⎪ 1
⎪ x 3 + x 4 + 5 x5 ≤ 200

如果用显枚举法试探,共需计算 (100) = 10 个点,其计算量非常之大。然而应
5

10

6

用蒙特卡洛去随机计算 10 个点,便可找到满意解,那么这种方法的可信度究竟怎样
呢?
6

下面就分析随机取样采集 10 个点计算时,应用概率理论来估计一下可信度。
不失一般性,假定一个整数规划的最优点不是孤立的奇点。
6

假设目标函数落在高值区的概率分别为 0.01,0.00001,则当计算 10 个点后,有
-21-

任一个点能落在高值区的概率分别为

1 − 0.991000000 ≈ 0.99 L 99(100多位)

1000000
1 − 0.99999
≈ 0.999954602 。
解 (i)首先编写 M 文件 mente.m 定义目标函数 f 和约束向量函数 g,程序如下: function [f,g]=mengte(x); f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)-8*x(1)-2*x(2)-3*x(3)-... x(4)-2*x(5); g=[sum(x)-400 x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800
2*x(1)+x(2)+6*x(3)-200
x(3)+x(4)+5*x(5)-200];
(ii)编写M文件mainint.m如下求问题的解:
rand('state',sum(clock)); p0=0; tic for i=1:10^6 x=99*rand(5,1); x1=floor(x);x2=ceil(x);
[f,g]=mengte(x1);
if sum(g 0 ,令 k := 0 。
0

2°求梯度向量。计算 ∇f ( x ) ,若 ∇f ( x ) ≤ ε ,停止迭代,输出 x 。否则, k k

k

进行 3°。
−1

3°构造 Newton 方向。计算 [∇ f ( x )] ,取
2

k

p k = −[∇ 2 f ( x k )]−1 ∇f ( x k ) . k +1
= x k + p k , k := k + 1 ,转 2°。
4° 求下一迭代点。令 x
例5

用 Newton 法求解,

4
2
min f ( x ) = x14 + 25 x 2 + x12 x 2
0
T
选取 x = ( 2,2) 。
3
2
3
2
T
解:
(i) ∇f ( x ) = [4 x1 + 2 x1 x 2 100 x 2 + 2 x1 x 2 ]
2
⎡12 x 2 + 2 x2
∇2 f = ⎢ 1
⎣ 4 x1 x2



300 x + 2 x ⎦
4 x1 x2
2
2

2
1

(ii)编写 M 文件 nwfun.m 如下: function [f,df,d2f]=nwfun(x); f=x(1)^4+25*x(2)^4+x(1)^2*x(2)^2; df=[4*x(1)^3+2*x(1)*x(2)^2;100*x(2)^3+2*x(1)^2*x(2)]; d2f=[2*x(1)^2+2*x(2)^2,4*x(1)*x(2) 4*x(1)*x(2),300*x(2)^2+2*x(1)^2];
(III)编写主程序文件 example5.m 如下: clc x=[2;2];
[f0,g1,g2]=nwfun(x);
while norm(g1)>0.00001 p=-inv(g2)*g1; x=x+p;
-40-

[f0,g1,g2]=nwfun(x); end x, f0

如果目标函数是非二次函数,一般地说,用 Newton 法通过有限轮迭代并不能保证
可求得其最优解。
为了提高计算精度,
我们在迭代时可以采用变步长计算上述问题,
编写主程序文件 example5_2 如下: clc,clear x=[2;2];
[f0,g1,g2]=nwfun(x);
while norm(g1)>0.00001 p=-inv(g2)*g1;p=p/norm(p); t=1.0;f=nwfun(x+t*p); while f>f0 t=t/2;f=nwfun(x+t*p); end x=x+t*p; [f0,g1,g2]=nwfun(x); end x,f0
Newton 法的优点是收敛速度快;缺点是有时不好用而需采取改进措施,此外,当
−1

维数较高时,计算 − [∇ f ( x )] 的工作量很大。
2.3.1.3 变尺度法
变尺度法(Variable Metric Algorithm)是近 20 多年来发展起来的,它不仅是求解
无约束极值问题非常有效的算法,
而且也已被推广用来求解约束极值问题。
由于它既避
免了计算二阶导数矩阵及其求逆过程,
又比梯度法的收敛速度快,
特别是对高维问题具
有显著的优越性,
因而使变尺度法获得了很高的声誉。
下面我们就来简要地介绍一种变
尺度法—DFP 法的基本原理及其计算过程。这一方法首先由 Davidon 在 1959 年提出,
后经 Fletcher 和 Powell 加以改进。
2

k

−1

我们已经知道,牛顿法的搜索方向是 − [∇ f ( x )] ∇f ( x )
2

k

k

,为了不计算二阶

导数矩阵 [∇ f ( x )] 及其逆阵,我们设法构造另一个矩阵,用它来逼近二阶导数矩阵 k 2

−1


的逆阵 [∇ f ( x )] ,这一类方法也称拟牛顿法(Quasi-Newton Method)
2

k

(k )

下面研究如何构造这样的近似矩阵,并将它记为 H 。我们要求:每一步都能以
现有的信息来确定下一个搜索方向;每做一次选代,目标函数值均有所下降;这些近似
矩阵最后应收敛于解点处的 Hesse 阵的逆阵。 k 当 f ( x ) 是二次函数时, Hesse 阵为常数阵 A ,

任两点 x 和 x

∇f ( x

k +1

) − ∇f ( x ) = A( x k k +1

k +1

处的梯度之差为

−x ) k 或

x k +1 − x k = A−1 [∇f ( x k +1 ) − ∇f ( x k )]
对于非二次函数,仿照二次函数的情形,要求其 Hesse 阵的逆阵的第 k + 1 次近似
矩阵 H

( k +1)

x

k +1

满足关系式

− x k = H ( k +1) [∇f ( x k +1 ) − ∇f ( x k )]

(7)
-41-

这就是常说的拟 Newton 条件。
若令

⎧ΔG ( k ) = ∇f ( x k +1 ) − ∇f ( x k )
⎨ k k +1 k ⎩Δx = x − x

(8)

则式(7)变为

Δx k = H ( k +1) ΔG ( k ) ,
(9)
(k )
( k +1)
(k )
( k +1)
现假定 H 已知,用下式求 H
(设 H 和 H
均为对称正定阵)

( k +1)
(k )
(k )
H
= H + ΔH
(10)
(k )
( k +1)
其中 ΔH 称为第 k 次校正矩阵。显然, H
应满足拟 Newton 条件(9)
,即要求
k
(k )
(k )
(k )
Δx = ( H + ΔH ) ΔG


ΔH ( k ) ΔG ( k ) = Δx k − H ( k ) ΔG ( k )
由此可以设想, ΔH

ΔH
其中 Q

(k )

(k )

和W

(k )

的一种比较简单的形式是

= Δx (Q ( k ) ) T − H ( k ) ΔG ( k ) (W ( k ) ) T k (k )

Δx (Q

(12)

为两个待定列向量。

将式(12)中的 ΔH k (11)

) ΔG

(k ) T

(k )

(k )

代入(11)
,得

− H ( k ) ΔG ( k ) (W ( k ) ) T ΔG ( k ) = Δx k − H ( k ) ΔG ( k )

这说明,应使

(Q ( k ) ) T ΔG ( k ) = (W ( k ) ) T ΔG ( k ) = 1
(k )
考虑到 ΔH 应为对称阵,最简单的办法就是取
⎧Q ( k ) = η k Δx k

⎨ (k )
⎪W = ξ k H ( k ) ΔG ( k )


(13)

(14)

由式(13)得

ηk ( Δx k )T ΔG ( k ) = ξ k ( ΔG ( k ) )T H ( k ) ΔG ( k ) = 1
若 ( Δx ) ΔG k T

) H ( k ) ΔG ( k ) 不等于零,则有
1
1

⎪η k = ( Δx k ) T ΔG ( k ) = ( ΔG ( k ) ) T Δx k


1
⎪ξ k =
(k ) T

( ΔG ) H ( k ) ΔG ( k )


(k )

和 ( ΔG

(15)

(k ) T

(16)

于是,得校正矩阵

ΔH ( k ) =

H ( k ) ΔG ( k ) (G ( k ) ) T ΔH ( k )
Δx k ( Δx k ) T

( ΔG ( k ) ) T Δx k
( ΔG ( k ) ) T H ( k ) ΔG ( k )

(17)

从而得到

H ( k ) ΔG ( k ) (G ( k ) ) T ΔH ( k )
Δx k ( Δx k ) T
(18)

( ΔG ( k ) ) T Δx k
( ΔG ( k ) ) T H ( k ) ΔG ( k )
(0)
上述矩阵称为尺度矩阵。通常,我们取第一个尺度矩阵 H 为单位阵,以后的尺度矩
H ( k +1) = H ( k ) +

-42-

阵按式(18)逐步形成。可以证明: k (i)当 x 不是极小点且 H

(k )

按式(18)产生下一个尺度矩阵 H

正定时,式(17)右端两项的分母不为零,从而可
( k +1)



(k )

(ii)若 H 为对称正定阵,则由式(18)产生的 H
(iii)由此推出 DFP 法的搜索方向为下降方向。
现将 DFP 变尺度法的计算步骤总结如下。

( k +1)

也是对称正定阵;

1°给定初始点 x 及梯度允许误差 ε > 0 。
0

2°若 ∇f ( x ) ≤ ε ,则 x 即为近似极小点,停止迭代,否则,转向下一步。
0

0

3°令

H ( 0 ) = I (单位矩阵)

0
( 0)
0
p = − H ∇f ( x )
在 p 方向进行一维搜索,确定最佳步长 λ0 :
0

min f ( x 0 + λp 0 ) = f ( x 0 + λ0 p 0 ) λ 如此可得下一个近似点

x1 = x 0 + λ0 p 0
4°一般地,设已得到近似点 x ,算出 ∇f ( x ) ,若 k k

∇f ( x 0 ) ≤ ε k 则 x 即为所求的近似解,停止迭代;否则,计算 H k −1 T



Δx ( Δx )
H
ΔG ( k −1) (G ( k −1) ) T ΔH ( k −1)

( ΔG ( k −1) ) T Δx k −1
( ΔG ( k −1) ) T H ( k −1) ΔG ( k −1) k (k ) k k
并令 p = − H ∇f ( x ) ,在 p 方向上进行一维搜索,得 λk ,从而可得下一个近似点
H ( k ) = H ( k −1) +

k −1

(k )

( k −1)

x k +1 = x k + λk p k k +1

k +1

5°若 x 满足精度要求,则 x 即为所求的近似解,否则,转回 4°,直到求
出某点满足精度要求为止。
2.3.2 直接法
在无约束非线性规划方法中,遇到问题的目标函数不可导或导函数的解析式难以
表示时,人们一般需要使用直接搜索方法。同时,由于这些方法一般都比较直观和易于
理解,因而在实际应用中常为人们所采用。下面我们介绍 Powell 方法。
这个方法主要由所谓基本搜索、加速搜索和调整搜索方向三部分组成,具体步骤
如下:
0

1° 选取初始数据。选取初始点 x , n 个线性无关初始方向,组成初搜索方向组

{ p 0 , p1 ,L, p n −1 } 。给定终止误差 ε > 0 ,令 k := 0 。
0
k
0
1 n −1
2°进行基本搜索。令 y := x ,依次沿 { p , p ,L, p } 中的方向进行一维搜
1
2 n 索。对应地得到辅助迭代点 y , y ,L, y ,即 y j = y j −1 + t j −1 p j −1 f ( y j −1 + t j −1 p j −1 ) = min f ( y j −1 + tp j −1 ), t ≥0

j = 1, L , n
-43-

3°构造加速方向。令 p = y − y ,若 p n n

0

n

≤ ε ,停止迭代,输出 x k +1 = y n 。

否则进行 4°。
4°确定调整方向。按下式

f ( y m −1 ) − f ( y m ) = max{ f ( y j −1 ) − f ( y j ) | 1 ≤ j ≤ n}
找出 m 。若

f ( y 0 ) − 2 f ( y n ) + f ( 2 y n − y 0 ) < 2[ f ( y m −1 ) − f ( y m )]
成立,进行 5°。否则,进行 6°。
5°调整搜索方向组。令

x k +1 = y n + t n p n : f ( y n + t n p n ) = min f ( y n + tp n ) . t ≥0

同时,令

{ p 0 , p1 ,L, p n +1 }k +1 := { p 0 ,L, p m −1 , p m +1 ,L, p n −1 , p n } , k := k + 1 ,转 2°。 k +1 n 6°不调整搜索方向组。令 x := y , k := k + 1 ,转 2°。
2.4 Matlab 求无约束极值问题
在 Matlab 工具箱中,用于求解无约束极值问题的函数有 fminunc 和 fminsearch,用
法介绍如下。
求函数的极小值

min f ( x) , x 其中 x 可以为标量或向量。
Matlab 中 fminunc 的基本命令是
[X,FVAL]=FMINUNC(FUN,X0,OPTIONS,P1,P2, ...)
其中的返回值 X 是所求得的极小点,
FVAL 是函数的极小值,
其它返回值的含义参见相
关的帮助。
FUN 是一个 M 文件, FUN 只有一个返回值时,

它的返回值是函数 f (x ) ;
当 FUN 有两个返回值时,它的第二个返回值是 f (x ) 的梯度向量;当 FUN 有三个返回
值时,它的第三个返回值是 f (x ) 的二阶导数阵(Hessian 阵)
。X0 是向量 x 的初始值,
OPTIONS 是优化参数,可以使用缺省参数。P1,P2 是可以传递给 FUN 的一些参数。
例 6 求函数 f ( x) = 100( x 2 − x1 ) + (1 − x1 ) 的最小值。
解:编写 M 文件 fun2.m 如下: function [f,g]=fun2(x); f=100*(x(2)-x(1)^2)^2+(1-x(1))^2; g=[-400*x(1)*(x(2)-x(1)^2)-2*(1-x(1));200*(x(2)-x(1)^2)];
编写主函数文件example6.m如下:
options = optimset('GradObj','on');
[x,y]=fminunc('fun2',rand(1,2),options)
即可求得函数的极小值。
在求极值时,也可以利用二阶导数,编写 M 文件 fun3.m 如下: function [f,df,d2f]=fun3(x); f=100*(x(2)-x(1)^2)^2+(1-x(1))^2; df=[-400*x(1)*(x(2)-x(1)^2)-2*(1-x(1));200*(x(2)-x(1)^2)]; d2f=[-400*x(2)+1200*x(1)^2+2,-400*x(1) -400*x(1),200];
2 2

-44-

2

编写主函数文件example62.m如下: options = optimset('GradObj','on','Hessian','on');
[x,y]=fminunc('fun3',rand(1,2),options)
即可求得函数的极小值。
求多元函数的极值也可以使用 Matlab 的 fminsearch 命令,其使用格式为:
[X,FVAL,EXITFLAG,OUTPUT]=FMINSEARCH(FUN,X0,OPTIONS,P1,P2,...)
例 7 求函数 f ( x) = sin( x) + 3 取最小值时的 x 值。
解 编写 f (x) 的 M 文件 fun4.m 如下: function f=fun4(x); f=sin(x)+3; 编写主函数文件example7.m如下: x0=2; [x,y]=fminsearch(@fun4,x0)
即求得在初值 2 附近的极小点及极小值。
约束极值问题
带有约束条件的极值问题称为约束极值问题,也叫规划问题。
求解约束极值问题要比求解无约束极值问题困难得多。
为了简化其优化工作,
可采
用以下方法:将约束问题化为无约束问题;将非线性规划问题化为线性规划问题,以及
能将复杂问题变换为较简单问题的其它方法。
库恩—塔克条件是非线性规划领域中最重要的理论成果之一,
是确定某点为最优点
的必要条件,
但一般说它并不是充分条件
(对于凸规划,
它既是最优点存在的必要条件,
同时也是充分条件)

3.1 二次规划
若某非线性规划的目标函数为自变量 x 的二次函数,
约束条件又全是线性的,
就称
这种规划为二次规划。
Matlab 中二次规划的数学模型可表述如下:
§3

1 T x Hx + f T x,
2
⎧ Ax ≤ b
s.t. ⎨
⎩ Aeq ⋅ x = beq
这里 H 是实对称矩阵, f , b 是列向量, A 是相应维数的矩阵。 min Matlab 中求解二次规划的命令是
[X,FVAL]= QUADPROG(H,f,A,b,Aeq,beq,LB,UB,X0,OPTIONS)
(具体细节可以参
返回值 X 是决策向量 x 的值,返回值 FVAL 是目标函数在 x 处的值。
看在 Matlab 指令中运行 help quadprog 后的帮助)

例 8 求解二次规划

⎧ min f ( x) = 2 x12 − 4 x1 x2 + 4 x2 2 − 6 x1 − 3 x2

x1 + x2 ≤ 3


4 x1 + x2 ≤ 9

⎪ x1 , x2 ≥ 0



编写如下程序:
-45-

h=[4,-4;-4,8]; f=[-6;-3]; a=[1,1;4,1]; b=[3;9]; [x,value]=quadprog(h,f,a,b,[],[],zeros(2,1))
求得

⎡1.9500⎤ x=⎢ ⎥ , Min f ( x ) = −11.0250 。
⎣1.0500⎦
3.2 罚函数法
利用罚函数法,可将非线性规划问题的求解,转化为求解一系列无约束极值问题,
因而也称这种方法为序列无约束最小化技术,简记为 SUMT (Sequential Unconstrained
Minization Technique)。
罚函数法求解非线性规划问题的思想是,利用问题中的约束函数作出适当的罚函
数,由此构造出带参数的增广目标函数,把问题转化为无约束非线性规划问题。主要有
两种形式,一种叫外罚函数法,另一种叫内罚函数法,下面介绍外罚函数法。
考虑问题:

min f ( x )

⎧ g i ( x) ≤ 0, i = 1,L, r ,

s.t. ⎨h j ( x) ≥ 0, j = 1, L , s,

⎩k m ( x) = 0, m = 1,L , t
取一个充分大的数 M > 0 ,构造函数 r s

t

i =1

i =1

i =1

P( x, M ) = f ( x ) + M ∑ max( g i ( x ),0) − M ∑ min(hi ( x ),0) +M ∑ | k i ( x ) |


⎛ G ( x) ⎞ ⎞
⎛ H ( x) ⎞ ⎞
⎟ ⎟ − Msum⎜ min⎜
⎟⎟
⎟⎟
⎜ 0 ⎟ ⎟ + M || K ( x) ||


⎠⎠
⎝ 0 ⎠⎠



这里 G ( x ) = [g1 ( x) L g r ( x )] , H ( x) = [h1 ( x) L hs ( x)] ,
(或 P ( x, M ) = f ( x ) + Msum⎜ max⎜


K ( x) = [k1 ( x) L k t (t )] ,Matlab 中可以直接利用 max 、 min 和 sum 函数。
)则以
增广目标函数 P ( x, M ) 为目标函数的无约束极值问题 min P( x, M )
的最优解 x 也是原问题的最优解。
例9

求下列非线性规划

⎧min f ( x) = x12 + x2 2 + 8

2 x1 − x2 ≥ 0


2
⎪ − x1 − x2 + 2 = 0
⎪ x , x ≥ 0.
1
2

解 (i)编写 M 文件 test.m function g=test(x);
M=50000;
f=x(1)^2+x(2)^2+8; g=f-M*min(x(1),0)-M*min(x(2),0)-M*min(x(1)^2-x(2),0)+... -46-

M*abs(-x(1)-x(2)^2+2);
或者是利用Matlab的求矩阵的极小值和极大值函数编写test.m如下:
function g=test(x);
M=50000;
f=x(1)^2+x(2)^2+8; g=f-M*sum(min([x';zeros(1,2)]))-M*min(x(1)^2-x(2),0)+... M*abs(-x(1)-x(2)^2+2);
我们也可以修改罚函数的定义,编写test.m如下:
function g=test(x);
M=50000;
f=x(1)^2+x(2)^2+8; g=f-M*min(min(x),0)-M*min(x(1)^2-x(2),0)+M*(-x(1)-x(2)^2+2)^2; (ii)在 Matlab 命令窗口输入
[x,y]=fminunc('test',rand(2,1))
即可求得问题的解。

3.3 Matlab 求约束极值问题
在 Matlab 优化工具箱中,用于求解约束最优化问题的函数有:fminbnd、fmincon、 quadprog、fseminf、fminimax,上面我们已经介绍了函数 fmincon 和 quadprog。
3.3.1 fminbnd 函数
求单变量非线性函数在区间上的极小值

min f ( x) , x ∈ [ x1 , x 2 ] x Matlab 的命令为
[X,FVAL] = FMINBND(FUN,x1,x2,OPTIONS),
它的返回值是极小点 x 和函数的极小值。
这里 fun 是用 M 文件定义的函数或 Matlab 中
的单变量数学函数。
例 10 求函数 f ( x) = ( x − 3) − 1, x ∈ [0,5] 的最小值。
解 编写 M 文件 fun5.m function f=fun5(x); f=(x-3)^2-1; 在 Matlab 的命令窗口输入
[x,y]=fminbnd('fun5',0,5)
即可求得极小点和极小值。
3.3.2 fseminf 函数

2

min {F ( x) | C ( x) ≤ 0, Ceq( x) = 0, PHI ( x, w) ≤ 0} x ⎧A* x ≤ B
s.t. ⎨
⎩ Aeq * x = Beq
其中 C ( x), Ceq ( x), PHI ( x, w) 都是向量函数; w 是附加的向量变量, w 的每个分量都
限定在某个区间内。
上述问题的 Matlab 命令格式为
X=FSEMINF(FUN,X0,NTHETA,SEMINFCON,A,B,Aeq,Beq)
其中 FUN 用于定义目标函数 F ( x) ;X0 为 x 的初始值;NTHETA 是半无穷约束

PHI ( x, w) 的个数;函数 SEMINFCON 用于定义非线性不等式约束 C (x) ,非线性等
-47-

式约束 Ceq (x) 和半无穷约束 PHI ( x, w) 的每一个分量函数,
函数 SEMINFCON 有两个
输入参量 X 和 S,S 是推荐的取样步长,也许不被使用。
求函数 f ( x) = ( x1 − 0.5) + ( x 2 − 0.5) + ( x3 − 0.5) 取最小值时的 x 值,
2

例 11

2

2

约束为:

1
( w1 − 50) 2 − sin( w1 x3 ) − x3 ≤ 1
1000
1
K 2 ( x, w2 ) = sin( w2 x 2 ) cos( w2 x1 ) −
( w2 − 50) 2 − sin( w2 x3 ) − x3 ≤ 1
1000
1 ≤ w1 ≤ 100 , 1 ≤ w2 ≤ 100
K 1 ( x, w1 ) = sin( w1 x1 ) cos( w1 x 2 ) −

解 (1)编写 M 文件 fun6.m 定义目标函数如下: function f=fun6(x,s); f=sum((x-0.5).^2); (2)编写 M 文件 fun7.m 定义约束条件如下: function [c,ceq,k1,k2,s]=fun7(x,s); c=[];ceq=[]; if isnan(s(1,1)) s=[0.2,0;0.2 0]; end %取样值 w1=1:s(1,1):100; w2=1:s(2,1):100;
%半无穷约束
k1=sin(w1*x(1)).*cos(w1*x(2))-1/1000*(w1-50).^2-sin(w1*x(3))-x(3)-1; k2=sin(w2*x(2)).*cos(w2*x(1))-1/1000*(w2-50).^2-sin(w2*x(3))-x(3)-1; %画出半无穷约束的图形 plot(w1,k1,'-',w2,k2,'+'); (3)调用函数 fseminf
在 Matlab 的命令窗口输入
[x,y]=fseminf(@fun6,rand(3,1),2,@fun7)
即可。
3.3.3

fminimax 函数

求解 min ⎧max F ( x) ⎫



⎩ Fi

⎧A* x ≤ b
⎪ Aeq * x = Beq


s.t. ⎨C ( x) ≤ 0
⎪Ceq( x) = 0


⎩ LB ≤ x ≤ UB x 其中 F ( x) = {F1 ( x),L , Fm ( x)} 。
上述问题的 Matlab 命令为
X=FMINIMAX(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON)
-48-

例 12

求函数族 { f 1 ( x), f 2 ( x), f 3 ( x), f 4 ( x), f 5 ( x)} 取极大极小值时的 x 值。
其中:

2
⎧ f1 ( x) = 2 x12 + x 2 − 48 x1 − 40 x 2 + 304

2
2
⎪ f 2 ( x) = − x1 − 3 x 2

⎨ f 3 ( x) = x1 + 3 x 2 − 18
⎪ f ( x) = − x − x
1
2
⎪ 4
⎪ f 5 ( x) = x1 + x 2 − 8


解 (1)编写 M 文件 fun8.m 定义向量函数如下: function f=fun8(x); f=[2*x(1)^2+x(2)^2-48*x(1)-40*x(2)+304 -x(1)^2-3*x(2)^2 x(1)+3*x(2)-18 -x(1)-x(2) x(1)+x(2)-8]; (2)调用函数 fminimax
[x,y]=fminimax(@fun8,rand(2,1))
3.3.4

利用梯度求解约束优化问题

例 13

已知函数 f ( x) = e 1 ( 4 x1 + 2 x 2 + 4 x1 x 2 + 2 x 2 + 1) ,且满足非线性约束: x 2

2

⎧ x1 x 2 − x1 − x 2 ≤ −1.5

⎩ x1 x 2 ≥ −10
求 min f ( x) x 分析:当使用梯度求解上述问题时,效率更高并且结果更准确。
题目中目标函数的梯度为:
2
⎡e x1 (4 x12 + 2 x 2 + 4 x1 x 2 + 8 x1 + 6 x 2 + 1)⎤

⎢ x1

⎢e (4 x1 + 4 x 2 + 2)



解 (1)编写 M 文件 fun9.m 定义目标函数及梯度函数: function [f,df]=fun9(x); f=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1); df=[exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+8*x(1)+6*x(2)+1);exp(x(1))*(4*x(2)
+4*x(1)+2)];
(2)编写 M 文件 fun10.m 定义约束条件及约束条件的梯度函数: function [c,ceq,dc,dceq]=fun10(x); c=[x(1)*x(2)-x(1)-x(2)+1.5;-x(1)*x(2)-10]; dc=[x(2)-1,-x(2);x(1)-1,-x(1)]; ceq=[];dceq=[]; (3)调用函数 fmincon,编写主函数文件 example13.m 如下:
%采用标准算法
options=optimset('largescale','off');
%采用梯度
options=optimset(options,'GradObj','on','GradConstr','on');
[x,y]=fmincon(@fun9,rand(2,1),[],[],[],[],[],[],@fun10,options)
-49-

3.4 Matlab 优化工具箱的用户图形界面解法
Matlab 优化工具箱中的 optimtool 命令提供了优化问题的用户图形界面解法。 optimtool 可应用到所有优化问题的求解,计算结果可以输出到 Matlab 工作空间中。

图1

优化问题用户图形界面解法示意图

例 14 用 optimtool 重新求解例 1。
利用例 1 已经定义好的函数 fun1 和 fun2。在 Matlab 命令窗口运行 optimtool,就打
开图形界面,如图 1 所示,填入有关的参数,未填入的参数取值为空或者为默认值,然
后用鼠标点一下“start”按钮,就得到求解结果,再使用“file”菜单下的“Export to
Workspace…”选项,把计算结果输出到 Matlab 工作空间中去。
§4

飞行管理问题
在约 10,000m 高空的某边长 160km 的正方形区域内,经常有若干架飞机作水平
飞行。区域内每架飞机的位置和速度向量均由计算机记录其数据,以便进行飞行管理。
当一架欲进入该区域的飞机到达区域边缘时,
记录其数据后,
要立即计算并判断是否会
与区域内的飞机发生碰撞。如果会碰撞,则应计算如何调整各架(包括新进入的)飞机
飞行的方向角,以避免碰撞。现假定条件如下:
1)不碰撞的标准为任意两架飞机的距离大于 8km;
2)飞机飞行方向角调整的幅度不应超过 30 度;
3)所有飞机飞行速度均为每小时 800km;
4)进入该区域的飞机在到达区域边缘时,与区域内飞机的距离应在 60km 以上;
5)最多需考虑 6 架飞机;
6)不必考虑飞机离开此区域后的状况。
请你对这个避免碰撞的飞行管理问题建立数学模型,
列出计算步骤,
对以下数据进
行计算(方向角误差不超过 0.01 度)
,要求飞机飞行方向角调整的幅度尽量小。
设该区域 4 个顶点的座标为(0,0),(160,0),(160,160),(0,160)。记录数据见表 1。
-50-

飞机编号

表1
横座标 x

1
2
3
4
5
新进入

飞行记录数据
纵座标

150
85
150
145
130
0

y

方向角(度)

140
85
155
50
150
0

243
236
220.5
159
230
52

注:方向角指飞行方向与 x 轴正向的夹角。
为方便以后的讨论,我们引进如下记号:
D 为飞行管理区域的边长;
Ω 为飞行管理区域,取直角坐标系使其为 [0, D] × [0, D] ;

a 为飞机飞行速度, a = 800 km/h;
( xi0 , yi0 ) 为第 i 架飞机的初始位置;

( xi (t ), yi (t )) 为第 i 架飞机在 t 时刻的位置;

θ i0 为第 i 架飞机的原飞行方向角,即飞行方向与 x 轴夹角, 0 ≤ θ i0 < 2π ; π π
Δθ i 为第 i 架飞机的方向角调整, − ≤ Δθ i ≤ ;
6

6

θ i = θ + Δθ i 为第 i 架飞机调整后的飞行方向角。
0
i

4.1 模型一
根据相对运动的观点在考察两架飞机 i 和 j 的飞行时,可以将飞机 i 视为不动而飞
机 j 以相对速度

vij = v j − vi = (a cos θ j − a cos θ i , a sin θ j − a sin θ i )
相对于飞机 i 运动,对(19)式进行适当的化约可得 θ − θi θ + θi θ + θi v = 2a sin j
(− sin j
, cos j
)
2
2
2 θ − θi π θ + θi π θ + θi
= 2a sin j
(cos( + j
), cos( + j
))
2
2
2
2
2 π θi + θ j
,见图 2。
不妨设 θ j ≥ θ i ,此时相对飞行方向角为 β ij = +
2
2

(19)

(20)

图 2 相对飞行方向角

由于两架飞机的初始距离为

rij (0) = ( xi0 − x 0 ) 2 + ( yi0 − y 0 ) 2 j j

(21)

-51-

0 α ij = arcsin

8 rij (0)

(22)

则只要当相对飞行方向角 β ij 满足
0
0 α ij < β ij < 2π − α ij

(23)

时,两架飞机不可能碰撞(见图 2)

记 β ij 为调整前第 j 架飞机相对于第 i 架飞机的相对速度(矢量)与这两架飞机连
0

线(从 j 指向 i 的矢量)的夹角(以连线矢量为基准,逆时针方向为正,顺时针方向为
负)
。则由式(23)知,两架飞机不碰撞的条件为

1
2

0 β ij0 + (Δθ i + Δθ j ) > α ij

(24)

其中
0
β mn =相对速度 vmn 的幅角-从 n 指向 m 的连线矢量的幅角

= arg

e iθ n − e iθ m
( xm + iym ) − ( xn + iyn )

(注意 β mn 表达式中的 i 表示虚数单位)这里我们利用复数的幅角,可以很方便地计算
0

角度 β mn ( m, n = 1,2, L ,6 )

0

本问题中的优化目标函数可以有不同的形式:如使所有飞机的最大调整量最小;
所有飞机的调整量绝对值之和最小等。
这里以所有飞机的调整量绝对值之和最小为目标
函数,可以得到如下的数学规划模型:
6

min

∑ Δθ i =1

s.t.

i

1
2
Δθ i ≤ 30o ,

0 β ij0 + (Δθ i + Δθ j ) > α ij , i, j = 1,2, L ,6 , i ≠ j

i = 1,2, L ,6

利用如下的程序: clc,clear x0=[150 85 150 145 130 0]; y0=[140 85 155 50 150 0]; q=[243 236 220.5 159 230 52]; xy0=[x0; y0]; d0=dist(xy0); %求矩阵各个列向量之间的距离 d0(find(d0==0))=inf; a0=asind(8./d0) %以度为单位的反函数 xy1=x0+i*y0 xy2=exp(i*q*pi/180) for m=1:6 for n=1:6 if n~=m b0(m,n)=angle((xy2(n)-xy2(m))/(xy1(m)-xy1(n))); end
-52-

end end b0=b0*180/pi; dlmwrite('txt1.txt',a0,'delimiter', '\t','newline','PC'); fid=fopen('txt1.txt','a'); fwrite(fid,'~','char');
%往纯文本文件中写 LINGO 数据的分割符 dlmwrite('txt1.txt',b0,'delimiter', '\t','newline','PC','-append','roffset', 1)
求得 α ij 的值如表 2 所示。
0

表2

0 α ij 的值

1

2

3

4

5

6

0
5.39119
32.23095
5.091816
20.96336
2.234507

1
2
3
4
5
6

5.39119
0
4.804024
6.61346
5.807866
3.815925

32.23095
4.804024
0
4.364672
22.83365
2.125539

5.091816
6.61346
4.364672
0
4.537692
2.989819

20.96336
5.807866
22.83365
4.537692
0
2.309841

2.234507
3.815925
2.125539
2.989819
2.309841
0

求得 β ij 的值如表 3 所示。
0

表3

β ij0 的值

1
1
2
3
4
5
6

2

3

4

5

6

0
109.26
-128.25
24.18
173.07
14.475

109.26
0
-88.871
-42.244
-92.305
9

-128.25
-88.871
0
12.476
-58.786
0.31081

24.18
-42.244
12.476
0
5.9692
-3.5256

173.07
-92.305
-58.786
5.9692
0
1.9144

14.475
9
0.31081
-3.5256
1.9144
0

上述飞行管理的数学规划模型可如下输入 LINGO 求解: model: sets: plane/1..6/:delta; link(plane,plane):alpha,beta; endsets data: alpha=@file('txt1.txt'); !需要在alpha的数据后面加上分隔符"~"; beta=@file('txt1.txt'); enddata min=@sum(plane:@abs(delta)); @for(plane:@bnd(-30,delta,30));
@for(link(i,j)|i#ne#j:@abs(beta(i,j)+0.5*delta(i)+0.5*delta(j))>a
lpha(i,j)); end 求得的最优解为 Δθ 3 = 2.83858 , Δθ 5 = −21.0138 , Δθ 6 = 0.7908 ,其它调整 o o

o

角度为 0。
4.2 模型二
-53-

两架飞机 i, j 不发生碰撞的条件为

( xi (t ) − x j (t )) 2 + ( yi (t ) − y j (t )) 2 > 64

(25)

1 ≤ i ≤ 5 , i + 1 ≤ j ≤ 6 , 0 ≤ t ≤ min{Ti , T j }
其中 Ti , T j 分别表示第 i, j 架飞机飞出正方形区域边界的时刻。这里

xi (t ) = xi0 + at cos θ i , yi (t ) = yi0 + at sin θ i , i = 1,2,L, n ;

θ i = θ i0 + Δθ i , | Δθ i |≤

π

6

, i = 1,2,L, n ;

下面我们把约束条件(25)加强为对所有的时间 t 都成立,记

~
~
~ li , j = ( xi (t ) − x j (t )) 2 + ( yi (t ) − y j (t )) 2 − 64 = a (i, j )t 2 + b (i, j )t + c (i, j )

~
其中 a (i, j ) = 4a sin
2

2

θi − θ j



2
~
b (i, j ) = 2a[( xi (0) − x j (0))(cos θ i − cos θ j ) + ( yi (0) − y j (0))(sin θ i − sin θ j )]
~
c (i, j ) = ( x (0) − x (0)) 2 + ( y (0) − y (0)) 2 − 64 i j

i

j

则两架 i, j 飞机不碰撞的条件是

~
~
~
Δ(i, j ) = b (i, j ) 2 − 4a (i, j )c (i, j ) < 0

(26)

这样我们建立如下的非线性规划模型
6

∑ (Δθ ) i =1

2

i

s.t. Δ (i, j ) < 0 , 1 ≤ i ≤ 5 , i + 1 ≤ j ≤ 6

Δθ i ≤

π
6

, i = 1,2, L ,6

习 题 三
1. 用最速下降法(梯度法)求函数:
2
f ( x) = 4 x1 + 6 x 2 − 2 x12 − 2 x1 x 2 − 2 x 2
0
T
的极大点。给定初始点 x = (1,1) 。

2. 试用牛顿法求解:

min f ( x) = −

1
2
x + x2 + 2
2
1

取初始点 x = ( 4,0) ,并将采用变步长和采用固定步长 λ = 1.0 时的情形做比较。
3. 某工厂向用户提供发动机,按合同规定,其交货数量和日期是:第一季度末交
40 台,第二季末交 60 台,第三季末交 80 台。工厂的最大生产能力为每季 100 台,每
( 0)

T

季的生产费用是 f ( x ) = 50 x + 0.2 x (元)
,此处 x 为该季生产发动机的台数。若工厂
生产的多,多余的发动机可移到下季向用户交货,这样,工厂就需支付存贮费,每台发
动机每季的存贮费为 4 元。问该厂每季应生产多少台发动机,才能既满足交货合同,又
使工厂所花费的费用最少(假定第一季度开始时发动机无存货)

4. 用 Matlab 的非线性规划命令 fmincon 求解飞行管理问题的模型二。
5. 用罚函数法求解飞行管理问题的模型二。
2

-54-

6. 求下列问题的解
2
max f ( x ) = 2 x1 + 3 x12 + 3 x 2 + x 2 + x 3

s.t.

2 x1 + 2 x12 + x2 + 2 x2 + x3 ≤ 10
2
x1 + x12 + x2 + x2 − x3 ≤ 50

2 x1 + x12 + 2 x2 + x3 ≤ 40 x12 + x3 = 2 x1 + 2 x2 ≥ 1 x1 ≥ 0, x2 , x3不约束
7.

图3

影院剖面示意图

视角 α 是
图 3 为影院的剖面示意图,座位的满意程度主要取决于视角 α 和仰角 β 。
观众眼睛到屏幕上、下边缘视线的夹角,α 越大越好;仰角 β 是观众眼睛到屏幕上边缘
视线与水平线的夹角, β 太大使人的头部过分上仰,引起不舒服感,一般要求 β 不超过

30 o 。

记影院屏幕高 h ,上边缘距地面高 H ,地板线倾角 θ ,第一排和最后一排座位与屏
幕水平距离分别为 d 和 D ,
观众平均座高为 c
(指眼睛到地面的距离)已知参数 h = 1.8 ,

H = 5 , d = 4.5 , D = 19 , c = 1.1 (单位:m)

(1)地板线倾角 θ = 10 ,问最佳座位在什么地方? o o

(2)求地板线倾角(一般不超过 20 )
,使所有观众的平均满意程度最大。
(3)地板线设计成什么形状可以进一步提高观众的满意程度。

-55-

第四章

动态规划

§1

引言
1.1 动态规划的发展及研究内容
动态规划
(dynamic programming)
是运筹学的一个分支,
是求解决策过程
(decision
process)最优化的数学方法。20 世纪 50 年代初 R. E. Bellman 等人在研究多阶段决策过
程(multistep decision process)的优化问题时,提出了著名的最优性原理(principle of optimality) ,把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程
优化问题的新方法—动态规划。1957 年出版了他的名著《Dynamic Programming》
,这
是该领域的第一本著作。
动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广
泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动
态规划方法比用其它方法求解更为方便。
虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,
但是一些与时
间无关的静态规划(如线性规划、非线性规划)
,只要人为地引进时间因素,把它视为
多阶段决策过程,也可以用动态规划方法方便地求解。
应指出,动态规划是求解某类问题的一种方法,是考察问题的一种途径,而不是
一种特殊算法(如线性规划是一种算法)
。因而,它不象线性规划那样有一个标准的数
学表达式和明确定义的一组规则,而必须对具体问题进行具体分析处理。因此,在学习
时,除了要对基本概念和方法正确理解外,应以丰富的想象力去建立模型,用创造性的
技巧去求解。
例 1 最短路线问题
图 1 是一个线路网,
连线上的数字表示两点之间的距离
(或费用) 试寻求一条由 A

到 G 距离最短(或费用最省)的路线。

图1

最短路线问题

例 2 生产计划问题
工厂生产某种产品,每单位(千件)的成本为 1(千元)
,每次开工的固定成本为 3
(千元)
,工厂每季度的最大生产能力为 6(千件)
。经调查,市场对该产品的需求量第
一、二、三、四季度分别为 2,3,2,4(千件)
。如果工厂在第一、二季度将全年的需
求都生产出来,自然可以降低成本(少付固定成本费)
,但是对于第三、四季度才能上
市的产品需付存储费,每季每千件的存储费为 0.5(千元)
。还规定年初和年末这种产品
均无库存。试制定一个生产计划,即安排每个季度的产量,使一年的总费用(生产成本
和存储费)最少。
1.2 决策过程的分类
根据过程的时间变量是离散的还是连续的,分为离散时间决策过程(discrete-time
-56-

decision process)和连续时间决策过程(continuous-time decision process)
;根据过程的
演变是确定的还是随机的,分为确定性决策过程(deterministic decision process)和随
机性决策过程(stochastic decision process)
,其中应用最广的是确定性多阶段决策过程。
基本概念、基本方程和计算方法
2.1 动态规划的基本概念和基本方程
一个多阶段决策过程最优化问题的动态规划模型通常包含以下要素。
2.1.1 阶段
阶段(step)是对整个过程的自然划分。通常根据时间顺序或空间顺序特征来划分阶
段,以便按阶段的次序解优化问题。阶段变量一般用 k = 1,2,L, n 表示。在例 1 中由 A

§2

出发为 k = 1 ,由 Bi (i = 1,2) 出发为 k = 2 ,依此下去从 Fi (i = 1,2) 出发为 k = 6 ,共

n = 6 个阶段。在例 2 中按照第一、二、三、四季度分为 k = 1,2,3,4 ,共四个阶段。
2.1.2 状态
状态(state)表示每个阶段开始时过程所处的自然状况。它应能描述过程的特征并
且无后效性,
即当某阶段的状态变量给定时,
这个阶段以后过程的演变与该阶段以前各
阶段的状态无关。通常还要求状态是直接或间接可以观测的。
描述状态的变量称状态变量(state variable)
。变量允许取值的范围称允许状态集合
(set of admissible states)。用 xk 表示第 k 阶段的状态变量,它可以是一个数或一个向量。
用 X k 表示第 k 阶段的允许状态集合。在例 1 中 x2 可取 B1 , B2 ,或将 Bi 定义为

i (i = 1,2) ,则 x 2 = 1 或 2 ,而 X 2 = {1,2} 。 n 个阶段的决策过程有 n + 1 个状态变量, n +1 表示 xn 演变的结果。 x 在例 1 中 x7 取
G ,或定义为 1 ,即 x7 = 1 。
根据过程演变的具体情况,
状态变量可以是离散的或连续的。
为了计算的方便有时
将连续变量离散化;为了分析的方便有时又将离散变量视为连续的。
状态变量简称为状态。
2.1.3 决策
当一个阶段的状态确定后,
可以作出各种选择从而演变到下一阶段的某个状态,

种选择手段称为决策(decision)
,在最优控制问题中也称为控制(control)

描述决策的变量称决策变量(decision variable)
,变量允许取值的范围称允许决策
集合(set of admissible decisions)
。用 u k ( x k ) 表示第 k 阶段处于状态 xk 时的决策变量,

在例 1 中 u2 ( B1 ) 可取 C1 ,C 2 或 C 3 ,
它是 xk 的函数, U k ( x k ) 表示 xk 的允许决策集合。
可记作 u 2 (1) = 1,2,3 ,而 U 2 (1) = {1,2,3} 。
决策变量简称决策。
2.1.4 策略
决策组成的序列称为策略(policy)
。由初始状态 x1 开始的全过程的策略记作

p1n ( x1 ) ,即 p1n ( x1 ) = {u1 ( x1 ), u2 ( x 2 ),L, un ( x n )} .
由第 k 阶段的状态 xk 开始到终止状态的后部子过程的策略记作 p kn ( x k ) ,即 pkn ( x k ) = {uk ( x k ),L, un ( x n )} , k = 1,2, L , n − 1 .
类似地,由第 k 到第 j 阶段的子过程的策略记作
-57-

pkj ( x k ) = {uk ( xk ),L, u j ( x j )} .
可供选择的策略有一定的范围,称为允许策略集合(set of admissible policies),用
P1n ( x1 ), Pkn ( x k ), Pkj ( x k ) 表示。
2.1.5. 状态转移方程
在确定性过程中,一旦某阶段的状态和决策为已知,下阶段的状态便完全确定。用
状态转移方程(equation of state transition)表示这种演变规律,写作 x k +1 = Tk ( x k , uk ), k = 1,2,L, n.
(1)
在例 1 中状态转移方程为 x k +1 = uk ( x k ) 。

2.1.6. 指标函数和最优值函数
指标函数(objective function)是衡量过程优劣的数量指标,
它是定义在全过程和所有
后部子过程上的数量函数,用 Vk ,n ( x k , u k , x k +1 , L , x n +1 ) 表示, k = 1,2,L, n 。指标函
数应具有可分离性,即 Vk ,n 可表为 x k , u k , Vk +1, n 的函数,记为

Vk ,n ( x k , u k , x k +1 ,L, x n +1 ) = ϕ k ( x k , u k ,Vk +1,n ( x k +1 , u k +1 , L, x n +1 ))
并且函数 ϕ k 对于变量 Vk +1, n 是严格单调的。
过程在第 j 阶段的阶段指标取决于状态 x j 和决策 u j ,用 v j ( x j , u j ) 表示。指标函
数由 v j ( j = 1,2,L, n ) 组成,常见的形式有:
阶段指标之和,即
n

Vk ,n ( x k , u k , x k +1 , L , x n +1 ) = ∑ v j ( x j , u j ) , j =k

阶段指标之积,即 n Vk ,n ( x k , u k , x k +1 ,L, x n +1 ) = ∏ v j ( x j , u j ) , j =k

阶段指标之极大(或极小)
,即

Vk ,n ( x k , u k , x k +1 , L , x n +1 ) = max (min)v j ( x j , u j ) . k ≤ j≤n

这些形式下第 k 到第 j 阶段子过程的指标函数为 Vk , j ( x k , u k , L, x j +1 ) 。
根据状态转移方程指标函数 Vk , n 还可以表示为状态 xk 和策略 p kn 的函数,即

(optimal value
Vk ,n ( x k , p kn ) 。 xk 给定时指标函数 Vk ,n 对 p kn 的最优值称为最优值函数 function) ,记为 f k ( x k ) ,即

f k ( xk ) =

opt Vk ,n ( x k , p kn ) ,

pkn ∈Pkn ( xk )

其中 opt 可根据具体情况取 max 或 min 。
2.1.7 最优策略和最优轨线
使指标函数 Vk ,n 达到最优值的策略是从 k 开始的后部子过程的最优策略,记作
*
*
*
*
。从初始
pkn = {uk ,L, un } 。 p1n 是全过程的最优策略,简称最优策略(optimal policy)

状 态 x1 ( = x1 ) 出 发 , 过 程 按 照 p1n 和 状 态 转 移 方 程 演 变 所 经 历 的 状 态 序 列
*

*

*
*
*
{x1 , x 2 ,L, x n +1 } 称最优轨线(optimal trajectory)


-58-

2.1.8 递归方程
如下方程称为递归方程

⎧ f n +1 ( x n +1 ) = 0或1

(2)
⎨ f ( x ) = opt {v ( x , u ) ⊗ f ( x )}, k = n,L,1 k k k k +1 k +1
⎪ k k u k ∈U k ( x k )

在上述方程中,当 ⊗ 为加法时取 f n+1 ( xn+1 ) = 0 ;当 ⊗ 为乘法时,取 f n+1 ( xn+1 ) = 1 。动
态规划递归方程是动态规划的最优性原理的基础,即:最优策略的子策略,构成最优子
策略。用状态转移方程(1)和递归方程(2)求解动态规划的过程,是由 k = n + 1 逆
推至 k = 1 ,故这种解法称为逆序解法。当然,对某些动态规划问题,也可采用顺序解
法。这时,状态转移方程和递归方程分别为:

x k = Tkr ( x k +1 , u k ), k = 1, L, n



=
⎧ f 0 ( x1) 0或1

⎨ f k ( x k +1 ) = opt {v k ( x k +1 , u k ) ⊗ f k −1 ( x k )}, k = 1,L, n r ⎪ u k ∈U k +1 ( xk +1 )

例 3 用 lingo 求解例 1 最短路线问题。 model: Title Dynamic Programming; sets: vertex/A,B1,B2,C1,C2,C3,C4,D1,D2,D3,E1,E2,E3,F1,F2,G/:L; road(vertex,vertex)/A B1,A B2,B1 C1,B1 C2,B1 c3,B2 C2,B2 C3,B2 C4,
C1 D1,C1 D2,C2 D1,C2 D2,C3 D2,C3 D3,C4 D2,C4 D3,
D1 E1,D1 E2,D2 E2,D2 E3,D3 E2,D3 E3,
E1 F1,E1 F2,E2 F1,E2 F2,E3 F1,E3 F2,F1 G,F2 G/:D; endsets data:
D=5 3 1 3 6 8 7 6
6 8 3 5 3 3 8 4
2 2 1 2 3 3
3 5 5 2 6 6 4 3;
L=0,,,,,,,,,,,,,,,;
enddata
@for(vertex(i)|i#GT#1:L(i)=@min(road(j,i):L(j)+D(j,i)));
end
纵上所述,如果一个问题能用动态规划方法求解,那么,我们可以按下列步骤,首
先建立起动态规划的数学模型:
(i)将过程划分成恰当的阶段。
(ii)正确选择状态变量 xk ,使它既能描述过程的状态,又满足无后效性,同时确
定允许状态集合 X k 。
(iii)选择决策变量 uk ,确定允许决策集合 U k ( x k ) 。
(iv)写出状态转移方程。
(v)确定阶段指标 vk ( xk , uk ) 及指标函数 Vkn 的形式(阶段指标之和,阶段指标之
积,阶段指标之极大或极小等)

(vi)写出基本方程即最优值函数满足的递归方程,以及端点条件。
§3

逆序解法的计算框图
-59-

以自由终端、固定始端、指标函数取和的形式的逆序解法为例给出计算框图,其它
情况容易在这个基础上修改得到。
一般化的自由终端条件为
(3)
f n +1 ( x n +1, i ) = ϕ ( x n +1, i ), i = 1,2,L , nn +1
其中 ϕ 为已知。固定始端条件可表示为 X 1 = {x1 } = {x1 } 。
*

如果状态 xk 和决策 uk 是连续变量,用数值方法求解时需按照精度要求进行离散
化。设状态 xk 的允许集合为

X k = {x ki | i = 1,2,L, nk }, i = 1,2,L, nk , k = 1,2,L, n .
决策 u ki ( x ki ) 的允许集合为
(
U ki = {ukij ) | j = 1,2,L, nki }, i = 1,2,L, nk , k = 1,2,L, n .
( j)

状态转移方程和阶段指标应对 xk 的每个取值 xki 和 uki 的每个取值 uki 计算,即
(
(
Tk = Tk ( x ki , ukij ) ) , v k = v ( x ki , u kij ) ) 。最优值函数应对 xk 的每个取值 xki 计算。基本方

程可以表为
(
( f k( j ) ( x ki ) = v k ( x ki , u kij ) ) + f k +1 (Tk ( x ki , u kij ) )),

f k ( x ki ) = opt f k( j ) ( x ki ), j j = 1,2,L, n ki , i = 1,2,L, n k , k = n,L,2,1.

图2

-60-

解法框图

(4)

*

按照(3)(4)逆向计算出 f 1 ( x1 ) ,为全过程的最优值。记状态 xki 的最优决策为

*
*
*
*
uki ( x ki ) ,由 x1 和 uki ( x ki ) 按照状态转移方程计算出最优状态,记作 xk 。并得到相应的
*

*

*

*

*

*

*

*

最优决策,记作 u k ( x k ) 。于是最优策略为 {u1 ( x1 ), u 2 ( x 2 ),L, u n ( x n )} 。
算法程序的框图如图 2 所示。
*

图的左边部分是函数序列的递推计算,可输出全过程最优值 f 1 ( x1 ) ,如果需要还
*

可以输出后部子过程最优值函数序列 f k ( x ki ) 和最优决策序列 u k ( x ki ) 。计算过程中存
*
f k ( x ki ) 是备计算 f k −1 之用,在 f k −1 算完后可用 f k −1 将 f k 替换掉;存 uk ( x ki ) 是备右边
*

*

部分读 u k ( x k ) 之用。
图的右边部分是最优状态和最优决策序列的正向计算,可输出最优策略
*
1

*
*
*
*
*
*
*
*
{u ( x1 ), u2 ( x 2 ),L, u n ( x n )} 和最优轨线 {x1 , x 2 ,L, x n } 。

动态规划与静态规划的关系
动态规划与静态规划
(线性和非线性规划等)
研究的对象本质上都是在若干约束条
件下的函数极值问题。两种规划在很多情况下原则上可以相互转换。
动态规划可以看作求决策 u1 , u 2 ,L, u n 使指标函数 V1n ( x1 , u1,u2 ,L, un ) 达到最优
§4

(最大或最小)的极值问题,状态转移方程、端点条件以及允许状态集、允许决策集等
是约束条件,原则上可以用非线性规划方法求解。
一些静态规划只要适当引入阶段变量、状态、决策等就可以用动态规划方法求解。
下面用例子说明。
例 4 用动态规划解下列非线性规划 n ∑g

max

k

(u k ) ;

k =1

n

s.t.

∑u k =1

k

= a, uk ≥ 0 .

其中 g k (uk ) 为任意的已知函数。


按变量 uk 的序号划分阶段,看作 n 段决策过程。设状态为 x1 , x 2 , L , x n +1 ,取

问题中的变量 u1 , u 2 ,L, u n 为决策。状态转移方程为

x1 = a, x k +1 = x k − uk , k = 1,2,L, n.

取 g k (uk ) 为阶段指标,最优值函数的基本方程为(注意到 x n +1 = 0 )

f k ( x k ) = max [ g k ( x k ) + f k +1 ( x k +1 )] ;
0 ≤ uk ≤ x k

0 ≤ x k ≤ a, k = n, n − 1,L,2,1 ; f n +1 ( 0 ) = 0 .
*

按照逆序解法求出对应于 xk 每个取值的最优决策 u k ( x k ) ,计算至 f 1 ( a ) 后即可利
*

*

*

用状态转移方程得到最优状态序列 {xk } 和最优决策序列 {uk ( x k )} 。
与静态规划相比,动态规划的优越性在于:
(i)能够得到全局最优解。由于约束条件确定的约束集合往往很复杂,即使指标
函数较简单,
用非线性规划方法也很难求出全局最优解。
而动态规划方法把全过程化为
-61-

一系列结构相似的子问题,每个子问题的变量个数大大减少,约束集合也简单得多,易
于得到全局最优解。
特别是对于约束集合、
状态转移和指标函数不能用分析形式给出的
优化问题,可以对每个子过程用枚举法求解,而约束条件越多,决策的搜索范围越小,
求解也越容易。对于这类问题,动态规划通常是求全局最优解的唯一方法。
(ii)可以得到一族最优解。与非线性规划只能得到全过程的一个最优解不同,动
态规划得到的是全过程及所有后部子过程的各个状态的一族最优解。
有些实际问题需要
这样的解族,
即使不需要,
它们在分析最优策略和最优值对于状态的稳定性时也是很有
用的。当最优策略由于某些原因不能实现时,这样的解族可以用来寻找次优策略。
(iii)能够利用经验提高求解效率。如果实际问题本身就是动态的,由于动态规划
方法反映了过程逐段演变的前后联系和动态特征,
在计算中可以利用实际知识和经验提
高求解效率。如在策略迭代法中,实际经验能够帮助选择较好的初始策略,提高收敛速
度。
动态规划的主要缺点是:
(i)没有统一的标准模型,也没有构造模型的通用方法,甚至还没有判断一个问
题能否构造动态规划模型的准则。
这样就只能对每类问题进行具体分析,
构造具体的模
型。对于较复杂的问题在选择状态、决策、确定状态转移规律等方面需要丰富的想象力
和灵活的技巧性,这就带来了应用上的局限性。
(ii)
用数值方法求解时存在维数灾
(curse of dimensionality) 若一维状态变量有 m

n

个取值,那么对于 n 维问题,状态 xk 就有 m 个值,对于每个状态值都要计算、存储函
数 f k ( x k ) ,对于 n 稍大的实际问题的计算往往是不现实的。目前还没有克服维数灾的
有效的一般方法。
若干典型问题的动态规划模型
5.1 最短路线问题
对于例 1 一类最短路线问题(shortest Path Problem)
,阶段按过程的演变划分,状
态由各段的初始位置确定,决策为从各个状态出发的走向,即有 x k +1 = u k ( x k ) ,阶段
§5

指标为相邻两段状态间的距离 d k ( x k , u k ( x k )) ,指标函数为阶段指标之和,最优值函数

f k ( x k ) 是由 xk 出发到终点的最短距离(或最小费用)
,基本方程为
f k ( x k ) = min [d k ( x k , u k ( x k )) + f k +1 ( x k +1 )], k = n,L,1; uk ( x k )

f n +1 ( x n +1 ) = 0.
相应的最短距离为 18。
利用这个模型可以算出例 l 的最短路线为 AB1C 2 D1 E 2 F2 G ,
5.2 生产计划问题
对于例 2 一类生产计划问题(Production planning problem)
,阶段按计划时间自然
划分,状态定义为每阶段开始时的储存量 xk ,决策为每个阶段的产量 uk ,记每个阶段
的需求量(已知量)为 d k ,则状态转移方程为

x k +1 = x k + uk − d k , x k ≥ 0, k = 1,2,L, n.
(5)
设每阶段开工的固定成本费为 a ,生产单位数量产品的成本费为 b ,每阶段单位数量产
品的储存费为 c ,阶段指标为阶段的生产成本和储存费之和,即
⎧a + bu k , u k > 0
(6)
v k ( x k , u k ) = cx k + ⎨
⎩0
-62-

指标函数 Vkn 为 vk 之和。最优值函数 f k ( x k ) 为从第 k 段的状态 xk 出发到过程终结的最
小费用,满足

f k ( x k ) = min [v k ( x k , u k ) + f k +1 ( x k +1 )], k = n,L,1. u k ∈U k

其中允许决策集合 U k 由每阶段的最大生产能力决定。若设过程终结时允许存储量为
0
xn +1 ,则终端条件是

0 f n +1 ( x n +1 ) = 0.

(7)

(5)~(7)构成该问题的动态规划模型。
5.3 资源分配问题
一种或几种资源(包括资金)分配给若干用户,或投资于几家企业,以获得最大的
效益。资源分配问题(resource allocating Problem)可以是多阶段决策过程,也可以是
静态规划问题,都能构造动态规划模型求解。下面举例说明。
例 5 机器可以在高、低两种负荷下生产。 u 台机器在高负荷下的年产量是 g (u ) ,
在 低 负 荷 下 的 年 产 量 是 h(u ) , 高 、 低 负 荷 下 机 器 的 年 损 耗 率 分 别 是 a1 和 b1
( 0 < b1 < a1 < 1 )
。现有 m 台机器,要安排一个 n 年的负荷分配计划,即每年初决定

多少台机器投入高、低负荷运行,使 n 年的总产量最大。如果进一步假设 g (u ) = αu ,

h ( u ) = βu ( α > β > 0 )
,即高、低负荷下每台机器的年产量分别为 α 和 β ,结果将
有什么特点。
解 年度为阶段变量 k = 1,2, L , n 。状态 xk 为第 k 年初完好的机器数,决策 uk 为
第 k 年投入高负荷运行的台数。当 xk 或 uk 不是整数时,将小数部分理解为一年中正常
工作时间或投入高负荷运行时间的比例。
机器在高、低负荷下的年完好率分别记为 a 和 b ,则 a = 1 − a1 , b = 1 − b1 ,有

a < b 。因为第 k 年投入低负荷运行的机器台数为 x k − uk ,所以状态转移方程是

xk +1 = auk + b( x k − uk )
阶段指标 v k 是第 k 年的产量,有

(8)

v k ( x k , uk ) = g (uk ) + h( x k − uk )
指标函数是阶段指标之和,最优值函数 f k ( x k ) 满足 f k ( x k ) = max [v k ( x k , uk ) + f k +1 ( x k +1 )],

(9)

0 ≤ uk ≤ x k

0 ≤ x k ≤ m, k = n, L ,2,1.

(10)

及自由终端条件

f n +1 ( x n +1 ) = 0, 0 ≤ x n +1 ≤ m.

(11)

当 v k 中的 g, h 用较简单的函数表达式给出时,对于每个 k 可以用解析方法求解极
(10)中的 [v k ( x k , uk ) + f k +1 ( x k )] 将是 uk
值问题。特别,若 g (u ) = αu ,h(u ) = βu ,
的线性函数,最大值点必在区间 0 ≤ uk ≤ x k 的左端点 uk = 0 或右端点 uk = x k 取得,
即每年初将完好的机器全部投入低负荷或高负荷运行。
§6

具体的应用实例
例 6 设某工厂有 1000 台机器,生产两种产品 A、B ,若投入 x 台机器生产 A 产
-63-

品,则纯收入为 5 x ,若投入 y 台机器生产 B 种产品,则纯收入为 4 y ,又知:生产 A 种
产品机器的年折损率为 20%,生产 B 产品机器的年折损率为 10%,问在 5 年内如何安
排各年度的生产计划,才能使总收入最高?
解 年度为阶段变量 k = 1,2,3,4,5 。
令 x k 表示第 k 年初完好机器数, u k 表示第 k 年安排生产 A 种产品的机器数,则

x k − u k 为第 k 年安排生产 B 种产品的机器数,且 0 ≤ u k ≤ x k 。
则第 k + 1 年初完好的机器数 x k +1 = (1 − 0.2)u k + (1 − 0.1)( x k − u k ) = 0.9 x k − 0.1u k
(12)
令 v k ( x k , u k ) 表示第 k 年的纯收入, f k ( x k ) 表示第 k 年初往后各年的最大利润之
和。
显然

f 6 ( x6 ) = 0

(13)



f k ( x k ) = max {v k ( x k , u k ) + f k +1 ( x k +1 )}
0≤ u k ≤ xk

= max {5u k + 4( x k − u k ) + f k +1 ( x k +1 )} = max {u k + 4 x k + f k +1 ( x k +1 )} (14)
0 ≤ u k ≤ xk

0 ≤ u k ≤ xk

(1) k = 5 时,由(13)(14)式得


f 5 ( x5 ) = max {u 5 + 4 x5 }
0 ≤u5 ≤ x5

u 5 + 4 x5 关于 u 5 求导,
知其导数大于零,
所以 u 5 + 4 x5 在 u 5 等于 x5 处取得最大值,
即 u 5 = x5 时, f 5 ( x5 ) = 5 x5 。
(2) k = 4 时,由(12)(14)式得

f 4 ( x 4 ) = max {u 4 + 4 x 4 + 5 x5 }
0≤ u 4 ≤ x4

= max {u 4 + 4 x 4 + 5(0.9 x 4 − 0.1u 4 )} = max {0.5u 4 + 8.5 x 4 }
0 ≤ u 4 ≤ x4

0≤u 4 ≤ x4

当 u 4 = x 4 时, f 4 ( x 4 ) = 9 x 4

(3) k = 3 时,

f 3 ( x3 ) = max {u 3 + 4 x3 + 9 x 4 }
0≤u3 ≤ x3

= max {u 3 + 4 x3 + 9(0.9 x3 − 0.1u 3 )} = max {0.1u 3 + 12.1x3 }
0 ≤ u 3 ≤ x3

0≤ u3 ≤ x3

当 u 3 = x3 时, f 3 ( x3 ) = 12.2 x3
(4) k = 2 时,

f 2 ( x 2 ) = max {u 2 + 4 x 2 + 12.2 x3 } = max {−0.22u 2 + 14.98 x 2 }
0≤ u 2 ≤ x2

0 ≤ u 2 ≤ x2

当 u 2 = 0 时, f 2 ( x 2 ) = 14.98 x 2 。

(5) k = 1 时,

f1 ( x1 ) = max {u1 + 4 x1 + 14.98 x 2 } = max {−0.498u1 + 17.482 x1 }
0≤u1 ≤ x1

0≤ u1 ≤ x1

当 u1 = 0 时, f 1 ( x1 ) = 17.482 x1 。因为

x1 = 1000 (台)
-64-

所以由(12)式,进行回代得

x 2 = 0.9 x1 − 0.1u1 = 900 (台) x3 = 0.9 x 2 − 0.1u 2 = 810 (台)

x 4 = 0.9 x3 − 0.1u 3 = 648 (台) x5 = 0.9 x 4 − 0.1u 4 = 518.4 (台)
注: x5 = 518.4 台中的 0.4 台应理解为有一台机器只能使用 0.4 年将报废。
例7

求解下面问题
2
max z = u1u 2 u 3

⎧u1 + u 2 + u 3 = c (c > 0)

⎩u i ≥ 0 i = 1,2,3
解: 按问题的变量个数划分阶段,把它看作为一个三阶段决策问题。设状态变量
为 x1 , x 2 , x3 , x 4 ,并记 x1 = c ;取问题中的变量 u1 , u 2 , u 3 为决策变量;各阶段指标函数
按乘积方式结合。令最优值函数 f k ( x k ) 表示第 k 阶段的初始状态为 x k ,从 k 阶段到 3
阶段所得到的最大值。
设 x3 = u 3 , x3 + u 2 = x 2 , x 2 + u1 = x1 = c
则有

u 3 = x3 , 0 ≤ u 2 ≤ x 2 , 0 ≤ u1 ≤ x1
用逆推解法,从后向前依次有
* f 3 ( x3 ) = max{u 3 } = x3 及最优解 u 3 = x3 u 3 = x3

2
2
f 2 ( x 2 ) = max {u 2 f 3 ( x3 )} = max {u 2 ( x 2 − u 2 )} = max h2 (u 2 , x 2 )
0≤ u 2 ≤ x2

0≤ u 2 ≤ x2

0≤u 2 ≤ x2



dh2
2
2
= 2u 2 x 2 − 3u 2 = 0 ,得 u 2 = x 2 和 u 2 = 0 (舍去) du 2
3



d 2 h2 d 2 h2
= 2 x 2 − 6u 2 ,而
2
2 du 2 du 2

= −2 x 2 < 0 ,故 u 2 =
2
u 2 = x2
3

2 x 2 为极大值点。
3

4 3
2
* x 2 及最优解 u 2 = x 2 。
27
3
4
f1 ( x1 ) = max {u1 f 2 ( x 2 )} = max {u1
( x1 − u1 ) 3 }
0≤u1 ≤ x1
0≤ u1 ≤ x1
27
1 4
1
* x1 ,最优解 u1 = x1 。
同样利用微分法易知 f 1 ( x1 ) =
64
4
由于 x1 已知,因而按计算的顺序反推算,可得各阶段的最优决策和最优值。即
1 4
1
* c u1 = c , f1 ( x1 ) =
64
4
所以 f 2 ( x 2 ) =



1
3
* x 2 = x1 − u1 = c − c = c
4
4
-65-

所以
*
u2 =

1
2
1 x2 = c , f 2 ( x2 ) = c 3
16
3
2


*
x3 = x 2 − u 2 =

3
1
1 c− c = c
4
2
4

所以

1
1
c , f 3 ( x3 ) = c
4
4
1
1
1
*
*
*
因此得到最优解为: u1 = c , u 2 = c , u 3 = c ;
4
2
4
1 4 c 。
最大值为: max z = f 1 (c) =
64
* u3 =

习 题 四
1. 用 Matlab 编程求例 6 的解。
2. 有四个工人,要指派他们分别完成 4 项工作,每人做各项工作所消耗的时间如
表 1 所示。
表1
工作

A

B

C

D



15

18

21

24



19

23

22

18



26

17

16

19



19

21

23

17

工人

问指派哪个人去完成哪项工作,
可使总的消耗时间为最小?试对此问题用动态规划
方法求解。
3. 为保证某一设备的正常运转,需备有三种不同的零件 E1 , E 2 , E 3 。若增加备用零
件的数量,可提高设备正常运转的可靠性,但增加了费用,而投资额仅为 8000 元。已
知备用零件数与它的可靠性和费用的关系如表 2 所示。
表2
增加的可靠性
备件数
1
2
3

设备的费用(千元)

E1

E2

E3

E1

E2

E3

0.3
0.4
0.5

0.2
0.5
0.9

0.1
0.2
0.7

1
2
3

3
5
6

2
3
4

现要求在既不超出投资额的限制,又能尽量提高设备运转的可靠性的条件下,问
各种零件的备件数量应是多少为好?
4. 某工厂购进 100 台机器,准备生产 I、II 两种产品,若生产产品 I,每台机器每
年可收入 45 万元,损坏率为 65%;若生产产品 II,每台机器每年收入为 35 万元,损
坏率为 35%,估计三年后将有新型机器出现,旧的机器将全部淘汰。试问每年应如何
-66-

安排生产,使在三年内收入最多?
5.3 名商人各带 1 名随从乘船渡河,一只小船只能容纳 2 人,由他们自己划行。
随从们密约,在河的任一岸,一旦随从人数比商人多,就杀商人。此密约被商人知道,
如何乘船渡河的大权掌握在商人们手中,
商人们怎样安排每次乘船方案,
才能安全渡河
呢?
6.某一印刷厂有六项加工任务,对印刷车间和装订车间所需时间(单位:天)如
表 3 所示,试求最优的加工顺序和总加工天数。
表3
任务
车间

1

2

3

4

5

6

印刷车间
装订车间

3
8

10
12

5
9

2
6

9
5

11
2

-67-

第五章

图与网络模型及方法

§1 概论
图论起源于 18 世纪。第一篇图论论文是瑞士数学家欧拉于 1736 年发表的“哥尼
斯堡的七座桥”
。1847 年,克希霍夫为了给出电网络方程而引进了“树”的概念。1857
年,凯莱在计数烷 C n H 2 n + 2 的同分异构物时,也发现了“树”
。哈密尔顿于 1859 年提
出“周游世界”游戏,用图论的术语,就是如何找出一个连通图中的生成圈、近几十年
来,由于计算机技术和科学的飞速发展,大大地促进了图论研究和应用,图论的理论和
方法已经渗透到物理、化学、通讯科学、建筑学、运筹学,生物遗传学、心理学、经济
学、社会学等学科中。
图论中所谓的“图”是指某类具体事物和这些事物之间的联系。如果我们用点表示
这些具体事物,用连接两点的线段(直的或曲的)表示两个事物的特定的联系,就得到
了描述这个“图”的几何形象。图论为任何一个包含了一种二元关系的离散系统提供了
一个数学模型,借助于图论的概念、理论和方法,可以对该模型求解。哥尼斯堡七桥问
题就是一个典型的例子。
在哥尼斯堡有七座桥将普莱格尔河中的两个岛及岛与河岸联结
起来,问题是要从这四块陆地中的任何一块开始通过每一座桥正好一次,再回到起点。

图1

哥尼斯堡七桥问题

当然可以通过试验去尝试解决这个问题,
但该城居民的任何尝试均未成功。
欧拉为了解
决这个问题,采用了建立数学模型的方法。他将每一块陆地用一个点来代替,将每一座
桥用连接相应两点的一条线来代替,从而得到一个有四个“点”
,七条“线”的“图”

问题成为从任一点出发一笔画出七条线再回到起点。欧拉考察了一般一笔画的结构特
点,给出了一笔画的一个判定法则:这个图是连通的,且每个点都与偶数线相关联,将
这个判定法则应用于七桥问题,得到了“不可能走通”的结果,不但彻底解决了这个问
题,而且开创了图论研究的先河。
图与网络是运筹学(Operations Research)中的一个经典和重要的分支,所研究的
问题涉及经济管理、工业工程、交通运输、计算机科学与信息技术、通讯与网络技术等
诸多领域。下面将要讨论的最短路问题、最大流问题、最小费用流问题和匹配问题等都
是图与网络的基本问题。
我们首先通过一些例子来了解网络优化问题。
例 1 最短路问题(SPP-shortest path problem)
一名货柜车司机奉命在最短的时间内将一车货物从甲地运往乙地。
从甲地到乙地的
公路网纵横交错,
因此有多种行车路线,
这名司机应选择哪条线路呢?假设货柜车的运
行速度是恒定的,那么这一问题相当于需要找到一条从甲地到乙地的最短路。
例 2 公路连接问题
某一地区有若干个主要城市,
现准备修建高速公路把这些城市连接起来,
使得从其
-68-

中任何一个城市都可以经高速公路直接或间接到达另一个城市。
假定已经知道了任意两
个城市之间修建高速公路的成本,
那么应如何决定在哪些城市间修建高速公路,
使得总
成本最小?
例 3 指派问题(assignment problem)
一家公司经理准备安排 N 名员工去完成 N 项任务,每人一项。由于各员工的特点
不同,
不同的员工去完成同一项任务时所获得的回报是不同的。
如何分配工作方案可以
使总回报最大?
例 4 中国邮递员问题(CPP-chinese postman problem)
一名邮递员负责投递某个街区的邮件。
如何为他
(她)
设计一条最短的投递路线
(从
邮局出发,经过投递区内每条街道至少一次,最后返回邮局)?由于这一问题是我国管
梅谷教授 1960 年首先提出的,所以国际上称之为中国邮递员问题。
例 5 旅行商问题(TSP-traveling salesman problem)
一名推销员准备前往若干城市推销产品。如何为他(她)设计一条最短的旅行路线
(从驻地出发,经过每个城市恰好一次,最后返回驻地)?这一问题的研究历史十分悠
久,通常称之为旅行商问题。
例 6 运输问题(transportation problem)
某种原材料有 M 个产地,
现在需要将原材料从产地运往 N 个使用这些原材料的工
厂。假定 M 个产地的产量和 N 家工厂的需要量已知,单位产品从任一产地到任一工厂
的运费已知,那么如何安排运输方案可以使总运输成本最低?
上述问题有两个共同的特点:
一是它们的目的都是从若干可能的安排或方案中寻求
某种意义下的最优安排或方案,数学上把这种问题称为最优化或优化(optimization)
问题;
二是它们都易于用图形的形式直观地描述和表达,
数学上把这种与图相关的结构
称为网络(network)
。与图和网络相关的最优化问题就是网络最优化或称网络优化
(netwok optimization)问题。所以上面例子中介绍的问题都是网络优化问题。由于多
数网络优化问题是以网络上的流(flow)为研究的对象,因此网络优化又常常被称为网
络流(network flows)或网络流规划等。
下面首先简要介绍图与网络的一些基本概念。
§2 图与网络的基本概念
2.1 无向图
一个无向图(undirected graph) G 是由一个非空有限集合 V (G ) 和 V (G ) 中某些元素
的 无 序 对 集 合 E (G ) 构 成 的 二 元 组 , 记 为 G = (V (G ), E (G )) 。 其 中

V (G ) = {v1 , v 2 ,L, v n } 称为图 G 的顶点集(vertex set)或节点集(node set) V (G ) 中


的 每 一 个 元 素 vi (i = 1,2,L, n ) 称 为 该 图 的 一 个 顶 点 ( vertex ) 或 节 点 ( node )
E (G ) = {e1 , e2 ,L, em } 称为图 G 的边集
(edge set) E (G ) 中的每一个元素 ek (即 V (G )

中某两个元素 vi , v j 的无序对) 记为 ek = ( vi , v j ) 或 ek = vi v j = v j vi ( k = 1,2,L, m) ,
被称为该图的一条从 vi 到 v j 的边(edge)

当边 ek = vi v j 时,称 vi , v j 为边 ek 的端点,并称 v j 与 vi 相邻(adjacent)
;边 ek 称
为与顶点 vi , v j 关联(incident)
。如果某两条边至少有一个公共端点,则称这两条边在
图 G 中相邻。
边上赋权的无向图称为赋权无向图或无向网络(undirected network)
。我们对图和
网络不作严格区分,因为任何图总是可以赋权的。
-69-

一个图称为有限图,如果它的顶点集和边集都有限。图 G 的顶点数用符号 |V | 或

ν (G ) 表示,边数用 | E | 或 ε (G ) 表示。
当讨论的图只有一个时,总是用 G 来表示这个图。从而在图论符号中我们常略去
字母 G ,例如,分别用 V , E ,ν 和 ε 代替 V (G ), E (G ),ν (G ) 和 ε (G ) 。
端点重合为一点的边称为环(loop)。
一个图称为简单图(simple graph),如果它既没有环也没有两条边连接同一对顶点。
2.2 有向图
定义 一个有向图
(directed graph 或 digraph)G 是由一个非空有限集合 V 和 V 中
某些元素的有序对集合 A 构成的二元组,记为 G = (V , A) 。其中 V = {v1 , v 2 ,L, v n } 称
为图 G 的顶点集或节点集, V 中的每一个元素 vi (i = 1,2,L, n ) 称为该图的一个顶点


或节点; A = {a1 , a 2 ,L, a m } 称为图 G 的弧集(arc set) A 中的每一个元素 ak (即 V 中
某两个元素 vi , v j 的有序对) 记为 a k = ( vi , v j ) 或 a k = vi v j ( k = 1,2,L, n ) ,被称为该图
的一条从 vi 到 v j 的弧(arc)

当弧 a k = vi v j 时,称 vi 为 ak 的尾(tail) v j 为 ak 的头(head)

,并称弧 ak 为 vi 的
出弧(outgoing arc)
,为 v j 的入弧(incoming arc)

对应于每个有向图 D ,可以在相同顶点集上作一个图 G ,使得对于 D 的每条弧,
G 有一条有相同端点的边与之相对应。
这个图称为 D 的基础图。
反之,
给定任意图 G ,
对于它的每个边,给其端点指定一个顺序,从而确定一条弧,由此得到一个有向图,这
样的有向图称为 G 的一个定向图。
以下若未指明“有向图”三字,
“图”字皆指无向图。
2.3 完全图、二分图
每一对不同的顶点都有一条边相连的简单图称为完全图(complete graph)。n 个顶点
的完全图记为 K n 。
若 V (G ) = X U Y , X I Y = Φ , | X || Y |≠ 0 (这里 | X | 表示集合 X 中的元素个
数) X 中无相邻顶点对, Y 中亦然,则称 G 为二分图(bipartite graph);特别地,若

∀x ∈ X , ∀y ∈ Y ,则 xy ∈ E (G ) ,则称 G 为完全二分图,记成 K | X |,|Y | 。
2.4 子图

图 H 叫 做 图 G 的 子 图 ( subgraph ) 记 作 H ⊂ G , 如 果 V ( H ) ⊂ V (G ) ,

E ( H ) ⊂ E (G ) 。若 H 是 G 的子图,则 G 称为 H 的母图。
G 的支撑子图(spanning subgraph,又成生成子图)是指满足 V ( H ) = V (G ) 的子
图H 。
2.5 顶点的度
设 v ∈ V (G ) , G 中与 v 关联的边数(每个环算作两条边)称为 v 的度(degree),记
作 d (v ) 。若 d (v ) 是奇数,称 v 是奇顶点(odd point); d (v ) 是偶数,称 v 是偶顶点(even point)。关于顶点的度,我们有如下结果: (i)

∑ d (v ) = 2ε v∈V (ii) 任意一个图的奇顶点的个数是偶数。
2.6 图与网络的数据结构
-70-

网络优化研究的是网络上的各种优化模型与算法。
为了在计算机上实现网络优化的
算法,
首先我们必须有一种方法
(即数据结构)
在计算机上来描述图与网络。
一般来说,
算法的好坏与网络的具体表示方法,
以及中间结果的操作方案是有关系的。
这里我们介
绍计算机上用来描述图与网络的 5 种常用表示方法:
邻接矩阵表示法、
关联矩阵表示法、
弧表表示法、邻接表表示法和星形表示法。在下面数据结构的讨论中,我们首先假设
G = (V , A) 是一个简单有向图,V |= n, | A |= m ,
|
并假设 V 中的顶点用自然数 1,2,L, n
表示或编号, A 中的弧用自然数 1,2,L, m 表示或编号。对于有多重边或无向网络的情
况,我们只是在讨论完简单有向图的表示方法之后,给出一些说明。
(i)邻接矩阵表示法
邻接矩阵表示法是将图以邻接矩阵(adjacency matrix)的形式存储在计算机中。图
G = (V , A) 的邻接矩阵是如下定义的: C 是一个 n × n 的 0 − 1 矩阵,即

C = ( cij ) n ×n ∈ {0,1}n ×n ,

⎧1, (i, j ) ∈ A, cij = ⎨
⎩0, (i, j ) ∉ A.
也就是说,如果两节点之间有一条弧,则邻接矩阵中对应的元素为 1;否则为 0。
2

可以看出,
这种表示法非常简单、
直接。
但是,
在邻接矩阵的所有 n 个元素中,
只有 m
个为非零元。如果网络比较稀疏,这种表示法浪费大量的存储空间,从而增加了在网络
中查找弧的时间。

图2

例7

有向图

对于图 2 所示的有向图,可以用邻接矩阵表示为

⎡0
⎢0

⎢0

⎢0
⎢0


1
0
1
0
0

1
0
0
1
1

0
1
0
0
1

0⎤
0⎥

0⎥

1⎥
0⎥


同样,对于网络中的权,也可以用类似邻接矩阵的 n × n 矩阵表示。只是此时一条
弧所对应的元素不再是 1,而是相应的权而已。如果网络中每条弧赋有多种权,则可以
用多个矩阵表示这些权。
(ii)关联矩阵表示法
关联矩阵表示法是将图以关联矩阵(incidence matrix)的形式存储在计算机中.图
G = (V , A) 的关联矩阵 B 是如下定义的: B 是一个 n × m 的矩阵,即

B = (bik ) n ×m ∈ {−1,0,1}n ×m ,
-71-

⎧1, ∃j ∈ V , k = (i, j ) ∈ A,

bik = ⎨− 1, ∃j ∈ V , k = ( j, i ) ∈ A,
⎪0, 其它.

也就是说,在关联矩阵中,每行对应于图的一个节点,每列对应于图的一条弧。如
果一个节点是一条弧的起点,则关联矩阵中对应的元素为 1;如果一个节点是一条弧的
终点,则关联矩阵中对应的元素为 − 1 ;如果一个节点与一条弧不关联,则关联矩阵中
对应的元素为 0。对于简单图,关联矩阵每列只含有两个非零元(一个 + 1 ,一个 − 1 )

可以看出,这种表示法也非常简单、直接。但是,在关联矩阵的所有 nm 个元素中,只
有 2m 个为非零元。如果网络比较稀疏,这种表示法也会浪费大量的存储空间。但由于
关联矩阵有许多特别重要的理论性质,因此它在网络优化中是非常重要的概念。
例 8 对于例 7 所示的图,如果关联矩阵中每列对应弧的顺序为(1,2),(1,3),(2,4),
(3,2),(4,3),(4,5),(5,3)和(5,4),则关联矩阵表示为

1
0
0 0
0 0
0⎤
⎡1
⎢− 1 0 1 − 1 0
0 0
0⎥


⎢ 0 −1 0 1 −1 0 −1 0 ⎥


0 −1 0 1
1
0 − 1⎥
⎢0
⎢0
0 0
0 0 −1 1
1⎥


同样,对于网络中的权,也可以通过对关联矩阵的扩展来表示。例如,如果网络中
每条弧有一个权,
我们可以把关联矩阵增加一行,
把每一条弧所对应的权存储在增加的
行中。如果网络中每条弧赋有多个权,我们可以把关联矩阵增加相应的行数,把每一条
弧所对应的权存储在增加的行中。
(iii)弧表表示法
弧表表示法将图以弧表(arc list)的形式存储在计算机中。所谓图的弧表,也就是
图的弧集合中的所有有序对。弧表表示法直接列出所有弧的起点和终点,共需 2m 个存
储单元,因此当网络比较稀疏时比较方便。此外,对于网络图中每条弧上的权,也要对
应地用额外的存储单元表示。例如,例 7 所示的图,假设弧(1,2),(1,3),(2,4),(3,2),
(4,3),(4,5),(5,3)和(5,4)上的权分别为 8,9,6,4,0,3,6 和 7,则弧表表示如表 1
所示。
起点
终点


1
2
8

1
3
9

2
4
6

表1
3
2
4

4
3
0

4
5
3

5
3
6

5
4
7

为了便于检索,一般按照起点、终点的字典序顺序存储弧表,如上面的弧表就是按
照这样的顺序存储的。
(iv)邻接表表示法
邻接表表示法将图以邻接表(adjacency lists)的形式存储在计算机中。所谓图的
邻接表,也就是图的所有节点的邻接表的集合;而对每个节点,它的邻接表就是它的所
有出弧。
邻接表表示法就是对图的每个节点,
用一个单向链表列出从该节点出发的所有
弧,链表中每个单元对应于一条出弧。为了记录弧上的权,链表中每个单元除列出弧的
另一个端点外,
还可以包含弧上的权等作为数据域。
图的整个邻接表可以用一个指针数
组表示。例如,例 7 所示的图,邻接表表示为
-72-

这是一个 5 维指针数组,每一维(上面表示法中的每一行)对应于一个节点的邻接
表,如第 1 行对应于第 1 个节点的邻接表(即第 1 个节点的所有出弧)
。每个指针单元
的第 1 个数据域表示弧的另一个端点(弧的头)
,后面的数据域表示对应弧上的权。如
第 1 行中的“2”表示弧的另一个端点为 2(即弧为(1,2),
)“8”表示对应弧(1,2)上的
权为 8;
“3”表示弧的另一个端点为 3(即弧为(1,3))“9”表示对应弧(1,3)上的权

为 9。又如,第 5 行说明节点 5 出发的弧有(5,3)、(5,4),他们对应的权分别为 6 和 7。
对于有向图 G = (V , A) ,一般用 A(i ) 表示节点 i 的邻接表,即节点 i 的所有出弧构
成的集合或链表(实际上只需要列出弧的另一个端点,即弧的头)
。例如上面例子,
A(1) = {2,3} , A(5) = {3,4} 等。
(v)星形表示法
星形(star)表示法的思想与邻接表表示法的思想有一定的相似之处。对每个节点,
它也是记录从该节点出发的所有弧,
但它不是采用单向链表而是采用一个单一的数组表
示。也就是说,在该数组中首先存放从节点 1 出发的所有弧,然后接着存放从节点 2
出发的所有孤,依此类推,最后存放从节点 n 出发的所有孤。对每条弧,要依次存放其
起点、终点、权的数值等有关信息。这实际上相当于对所有弧给出了一个顺序和编号,
只是从同一节点出发的弧的顺序可以任意排列。
此外,
为了能够快速检索从每个节点出
发的所有弧,
我们一般还用一个数组记录每个节点出发的弧的起始地址
(即弧的编号)

在这种表示法中,
可以快速检索从每个节点出发的所有弧,
这种星形表示法称为前向星
形(forward star)表示法。
例如,在例 7 所示的图中,仍然假设弧(1,2)(l,3)(2,4)(3,2)(4,3)(4,5)






(5,3)和(5,4)上的权分别为 8,9,6,4,0,3,6 和 7。此时该网络图可以用前向
星形表示法表示为表 2 和表 3 。
表 2 节点对应的出弧的起始地址编号数组
节点号 i
起始地址

弧编号
起点
终点


1

1
1
2
8

2
1
3
9

3

4

5

6

1

point (i )

2
3

4

5

7

9

记录弧信息的数组
4
5
3
4
2
3
4
0

6
4
5
3

7
5
3
6

8
5
4
7

表3
3
2
4
6

其元素个数比图的节点数多 1
(即 n + 1 ) 且一定有 point (1) = 1 ,

在数组 point 中,

point ( n + 1) = m + 1 。对于节点 i ,其对应的出弧存放在弧信息数组的位置区间为
[ point (i ), point (i + 1) − 1] ,
如果 point (i ) = point (i + 1) ,则节点 i 没有出弧。这种表示法与弧表表示法也非常相
-73-

似,
“记录弧信息的数组”
实际上相当于有序存放的
“弧表” 只是在前向星形表示法中,

弧被编号后有序存放,并增加一个数组( point )记录每个节点出发的弧的起始编号。
前向星形表示法有利于快速检索每个节点的所有出弧,
但不能快速检索每个节点的
所有入弧。为了能够快速检索每个节点的所有入孤,可以采用反向星形(reverse star)
表示法:
首先存放进入节点 1 的所有孤,
然后接着存放进入节点 2 的所有弧,
依此类推,
最后存放进入节点 n 的所有孤。对每条弧,仍然依次存放其起点、终点、权的数值等有
关信息。同样,为了能够快速检索从每个节点的所有入弧,我们一般还用一个数组记录
每个节点的入孤的起始地址(即弧的编号)
。例如,例 7 所示的图,可以用反向星形表
示法表示为表 4 和表 5。
表4
节点号 i

节点对应的入弧的起始地址编号数组
1
2
3
4

起始地址 rpoint (i )

弧编号
终点
起点


1
2
3
4

1

6

3

6

8

9

表 5 记录弧信息的数组
3
4
5
3
3
3
1
4
5
9
0
6

2
2
1
8

1

5

6
4
5
7

7
4
2
6

8
5
4
3

如果既希望快速检索每个节点的所有出弧,也希望快速检索每个节点的所有入弧,
则可以综合采用前向和反向星形表示法。当然,将孤信息存放两次是没有必要的,可以
只用一个数组(trace)记录一条弧在两种表示法中的对应关系即可。例如,可以在采用
前向星形表示法的基础上,加上上面介绍的 rpoint 数组和如下的 trace 数组即可。这相
当于一种紧凑的双向星形表示法,如表 6 所示。
表6

j
正向法中弧编号 trace( j )
反向法中弧编号

两种表示法中的弧的对应关系
1

2

3

4

5

6

7

8

4

1

2

5

7

8

3

6

对于网络图的表示法,我们作如下说明:
① 星形表示法和邻接表表示法在实际算法实现中都是经常采用的。星形表示法的
优点是占用的存储空间较少,并且对那些不提供指针类型的语言(如 FORTRAN 语言
等)也容易实现。邻接表表示法对那些提供指针类型的语言(如 C 语言等)是方便的,
且增加或删除一条弧所需的计算工作量很少,
而这一操作在星形表示法中所需的计算工
作量较大(需要花费 O ( m ) 的计算时间)
。有关“计算时间”的观念是网络优化中需要
考虑的一个关键因素。
② 当网络不是简单图,而是具有平行弧(即多重弧)时,显然此时邻接矩阵表示
法是不能采用的。其他方法则可以很方便地推广到可以处理平行弧的情形。
③ 上述方法可以很方便地推广到可以处理无向图的情形,但由于无向图中边没有
方向,因此可能需要做一些自然的修改。例如,可以在计算机中只存储邻接矩阵的一半
信息(如上三角部分)
,因为此时邻接矩阵是对称矩阵。无向图的关联矩阵只含有元素
0 和 + 1 ,而不含有 − 1 ,因为此时不区分边的起点和终点。又如,在邻接表和星形表示
法中,每条边会被存储两次,而且反向星形表示显然是没有必要的,等等。
2.7 轨与连通
W = v0 e1v1e2 Lek v k ,其中 ei ∈ E (G ) ,1 ≤ i ≤ k ,v j ∈V (G ) ,0 ≤ j ≤ k ,ei 与
-74-

vi −1 , vi 关联,称 W 是图 G 的一条道路(walk),k 为路长,顶点 v0 和 vk 分别称为 W 的起
点和终点,而 v1 , v 2 ,L, v k −1 称为它的内部顶点。
若道路 W 的边互不相同,则 W 称为迹(trail)。若道路 W 的顶点互不相同,则 W 称
为轨(path)。
称一条道路是闭的,
如果它有正的长且起点和终点相同。
起点和终点重合的轨叫做
圈(cycle)。
若图 G 的两个顶点 u, v 间存在道路,则称 u 和 v 连通(connected)。 u, v 间的最短轨
的长叫做 u, v 间的距离。记作 d (u, v ) 。若图 G 的任二顶点均连通,则称 G 是连通图。
显然有:
(i) 图 P 是一条轨的充要条件是 P 是连通的,且有两个一度的顶点,其余顶点的度
为 2;
(ii) 图 C 是一个圈的充要条件是 C 是各顶点的度均为 2 的连通图。
§3 应用—最短路问题
3.1 两个指定顶点之间的最短路径
问题如下:
给出了一个连接若干个城镇的铁路网络,
在这个网络的两个指定城镇间,
找一条最短铁路线。
以各城镇为图 G 的顶点,
两城镇间的直通铁路为图 G 相应两顶点间的边,
得图 G 。
对 G 的每一边 e ,
赋以一个实数 w( e) —直通铁路的长度,
称为 e 的权,
得到赋权图 G 。

G 的子图的权是指子图的各边的权和。问题就是求赋权图 G 中指定的两个顶点 u0 , v0
间的具最小权的轨。这条轨叫做 u0 , v0 间的最短路,它的权叫做 u0 , v0 间的距离,亦记
作 d (u 0 , v 0 ) 。
求最短路已有成熟的算法:迪克斯特拉(Dijkstra)算法,其基本思想是按距 u0 从
近到远为顺序,依次求得 u0 到 G 的各顶点的最短路和距离,直至 v0 (或直至 G 的所有
顶点)
,算法结束。为避免重复并保留每一步的计算信息,采用了标号算法。下面是该
算法。
(i) 令 l (u0 ) = 0 ,对 v ≠ u0 ,令 l ( v ) = ∞ , S 0 = {u0 } , i = 0 。
(ii) 对每个 v ∈ S i ( S i = V \ S i )
,用

min {l ( v ), l (u ) + w(uv )} u∈Si 代 替 l ( v ) 。 计 算 min{l ( v )} , 把 达 到 这 个 最 小 值 的 一 个 顶 点 记 为 ui +1 , 令 v∈S i

Si +1 = Si U {ui +1} 。
(iii). 若 i =| V | −1 ,停止;若 i a(i,k)+a(k,j) a(i,j)=a(i,k)+a(k,j); path(i,j)=k; end end end end a, path
我们使用LINGO9.0编写的FLOYD算法如下:
model: sets: -79-

nodes/c1..c6/; link(nodes,nodes):w,path; !path标志最短路径上走过的顶点; endsets data: path=0; w=0;
@text(mydata1.txt)=@writefor(nodes(i):@writefor(nodes(j):
@format(w(i,j),' 10.0f')),@newline(1));
@text(mydata1.txt)=@write(@newline(1));
@text(mydata1.txt)=@writefor(nodes(i):@writefor(nodes(j):
@format(path(i,j),' 10.0f')),@newline(1)); enddata calc: w(1,2)=50;w(1,4)=40;w(1,5)=25;w(1,6)=10; w(2,3)=15;w(2,4)=20;w(2,6)=25; w(3,4)=10;w(3,5)=20; w(4,5)=10;w(4,6)=25;w(5,6)=55;
@for(link(i,j):w(i,j)=w(i,j)+w(j,i));
@for(link(i,j) |i#ne#j:w(i,j)=@if(w(i,j)#eq#0,10000,w(i,j)));
@for(nodes(k):@for(nodes(i):@for(nodes(j):
tm=@smin(w(i,j),w(i,k)+w(k,j)); path(i,j)=@if(w(i,j)#gt# tm,k,path(i,j));w(i,j)=tm))); endcalc end

§4


4.1 基本概念
连通的无圈图叫做树,记之为 T 。若图 G 满足 V (G ) = V (T ) , E (T ) ⊂ E (G ) ,

则称 T 是 G 的生成树。图 G 连通的充分必要条件为 G 有生成树。一个连通图的生成树
的个数很多,用 τ (G ) 表示 G 的生成树的个数,则有公式
公式
公式

(Caylay) τ ( K n ) = n

n−2



τ (G ) = τ (G − e ) + τ (G ⋅ e ) 。

其中 G − e 表示从 G 上删除边 e , G ⋅ e 表示把 e 的长度收缩为零得到的图。
树有下面常用的五个充要条件。
定理 1 (i) G 是树当且仅当 G 中任二顶点之间有且仅有一条轨道。
(ii) G 是树当且仅当 G 无圈,且 ε = ν − 1 。
(iii) G 是树当且仅当 G 连通,且 ε = ν − 1 。
(iv) G 是树当且仅当 G 连通,且 ∀e ∈ E (G ) , G − e 不连通。
(v) G 是树当且仅当 G 无圈, ∀e ∉ E (G ) , G + e 恰有一个圈。
4.2 应用—连线问题
欲修筑连接 n 个城市的铁路,已知 i 城与 j 城之间的铁路造价为 Cij ,设计一个线
路图,使总造价最低。
连线问题的数学模型是在连通赋权图上求权最小的生成树。
赋权图的具最小权的生
成树叫做最小生成树。
下面介绍构造最小生成树的两种常用算法。
4.2.1 prim 算法构造最小生成树
设置两个集合 P 和 Q ,其中 P 用于存放 G 的最小生成树中的顶点,集合 Q 存放 G
-80-

的最小生成树中的边。
令集合 P 的初值为 P = {v1 }(假设构造最小生成树时,
从顶点 v1

出发)
,集合 Q 的初值为 Q = Φ 。prim 算法的思想是,从所有 p ∈ P , v ∈V − P 的边
中,选取具有最小权值的边 pv ,将顶点 v 加入集合 P 中,将边 pv 加入集合 Q 中,如
此不断重复,直到 P = V 时,最小生成树构造完毕,这时集合 Q 中包含了最小生成树
的所有边。
prim 算法如下:
(i) P = {v1 } , Q = Φ ;
(ii)while P ~ = V
找最小边 pv ,其中 p ∈ P, v ∈ V − P

P = P + {v}
Q = Q + { pv} end 图 5 最小生成树问题

例 13 用 prim 算法求图 5 的最小生成树。
二、
终点、
权集合。
Matlab
我们用 result3×n 的第一、 三行分别表示生成树边的起点、
程序如下:
clc;clear; a=zeros(7); a(1,2)=50; a(1,3)=60; a(2,4)=65; a(2,5)=40; a(3,4)=52;a(3,7)=45; a(4,5)=50; a(4,6)=30;a(4,7)=42; a(5,6)=70; a=a+a';a(find(a==0))=inf; result=[];p=1;tb=2:length(a); while length(result)~=length(a)-1 temp=a(p,tb);temp=temp(:); d=min(temp);
[jb,kb]=find(a(p,tb)==d);
j=p(jb(1));k=tb(kb(1)); result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[]; end result 4.2.1 Kruskal 算法构造最小生成树
科茹斯克尔(Kruskal)算法是一个好算法。Kruskal 算法如下:
(i)选 e1 ∈ E (G ) ,使得 w( e1 ) = min 。
-81-

(ii)若 e1 , e2 ,L, ei 已选好,则从 E (G ) − {e1 , e2 ,L, ei } 中选取 ei +1 ,使得
① G[{e1 , e2 ,L, ei , ei +1 }] 中无圈,且

② w( ei +1 ) = min 。

(iii)直到选得 eν −1 为止。
例 14 用 Kruskal 算法构造例 3 的最小生成树。
我们用 index2× n 存放各边端点的信息,当选中某一边之后,就将此边对应的顶点序
号中较大序号 u 改记为此边的另一序号 v ,同时把后面边中所有序号为 u 的改记为 v 。
此方法的几何意义是:将序号 u 的这个顶点收缩到 v 顶点, u 顶点不复存在。后面继续
寻查时,发现某边的两个顶点序号相同时,认为已被收缩掉,失去了被选取的资格。
Matlab 程序如下: clc;clear; a(1,2)=50; a(1,3)=60; a(2,4)=65; a(2,5)=40; a(3,4)=52;a(3,7)=45; a(4,5)=50; a(4,6)=30; a(4,7)=42; a(5,6)=70;
[i,j,b]=find(a);
data=[i';j';b'];index=data(1:2,:); loop=max(size(a))-1; result=[]; while length(result) 0) 正则 2 分图,则 G 有完美对集。
所谓 k 次正则图,即每顶点皆 k 度的图。
由此推论得出下面的婚配定理:
定理 4 每个姑娘都结识 k ( k ≥ 1) 位小伙子,每个小伙子都结识 k 位姑娘,则每位
姑娘都能和她认识的一个小伙子结婚,并且每位小伙子也能和他认识的一个姑娘结婚。
人员分派问题等实际问题可以化成对集来解决。
人员分派问题:工作人员 x1 , x 2 ,L, x n 去做 n 件工作 y1 , y 2 ,L, y n ,每人适合做其
中一件或几件,
问能否每人都有一份适合的工作?如果不能,
最多几人可以有适合的工
作?
这 个 问 题 的 数 学 模 型 是 : G 是 二 分 图 , 顶 点 集 划 分 为 V (G ) = X U Y ,

X = {x1 ,L, x n } ,Y = { y1 , L, y n } ,当且仅当 xi 适合做工作 y j 时, xi y j ∈ E (G ) ,求
G 中的最大对集。

解决这个问题可以利用 1965 年埃德门兹(Edmonds)提出的匈牙利算法。
匈牙利算法:
(i)从 G 中任意取定一个初始对集 M 。
(ii)若 M 把 X 中的顶点皆许配,停止, M 即完美对集;否则取 X 中未被 M 许
配的一顶点 u ,记 S = {u} , T = Φ 。
(iii)若 N ( S ) = T ,停止,无完美对集;否则取 y ∈ N ( S ) − T 。
(iv)若 y 是被 M 许配的,设 yz ∈ M , S = S U {z} , T = T U { y} ,转(iii)


否则,取可增广轨 P (u, y ) ,令 M = ( M − E ( P )) U ( E ( P ) − M ) ,转(ii)

把以上算法稍加修改就能够用来求二分图的最大完美对集。
最优分派问题:在人员分派问题中,工作人员适合做的各项工作当中,效益未必一
致,我们需要制定一个分派方案,使公司总效益最大。
这个问题的数学模型是:在人员分派问题的模型中,图 G 的每边加了权 w( xi y j ) ≥ 0 ,表示 xi 干 y j 工作的效益,求加权图 G 上的权最大的完美对集。

解决这个问题可以用库恩—曼克莱斯(Kuhn-Munkres)算法。为此,我们要引入
可行顶点标号与相等子图的概念。
定义 若映射 l : V (G ) → R ,满足 ∀x ∈ X , y ∈ Y ,

l ( x ) + l ( y ) ≥ w( x, y ) ,
则称 l 是二分图 G 的可行顶点标号。令
El = {xy | xy ∈ E (G ), l ( x ) + l ( y ) = w( xy )} ,
称以 E l 为边集的 G 的生成子图为相等子图,记作 Gl 。
可行顶点标号是存在的。例如

l ( x ) = max w( xy ),

x∈ X;

l ( y ) = 0,

y ∈Y 。

y∈Y

定理 5

Gl 的完美对集即为 G 的权最大的完美对集。

Kuhn-Munkres 算法
-83-

(i)选定初始可行顶点标号 l ,确定 Gl ,在 Gl 中选取一个对集 M 。
停止,M 即 G 的权最大的完美对集;
否则, Gl

(ii) X 中顶点皆被 M 许配,

中未被 M 许配的顶点 u ,令 S = {u} , T = Φ 。
(iii)若 N Gl ( S ) ⊃ T ,转(iv)
;若 N Gl ( S ) = T ,取

α l = min {l ( x ) + l ( y ) − w( xy )} , x∈S , y∉T

⎧l ( v ) − α l , v ∈ S

l ( v ) = ⎨l ( v ) + α l , v ∈ T ,
⎪l ( v ),
其它
⎩ l = l , G l = Gl 。



(iv) N Gl ( S ) − T 中一顶点 y , y 已被 M 许配, yz ∈ M , S = S U {z} ,


T = T U { y} ,转(iii)
;否则,取 Gl 中一个 M 可增广轨 P (u, y ) ,令
M = ( M − E ( P )) U ( E ( P ) − M ) ,
转(ii)

其中 N Gl ( S ) 是 Gl 中 S 的相邻顶点集。
Euler 图和 Hamilton 图
6.1 基本概念
定义 经过 G 的每条边的迹叫做 G 的 Euler 迹;闭的 Euler 迹叫做 Euler 回路或 E
回路;含 Euler 回路的图叫做 Euler 图。
直观地讲,Euler 图就是从一顶点出发每边恰通过一次能回到出发点的那种图,即
不重复地行遍所有的边再回到出发点。
定理 6 (i) G 是 Euler 图的充分必要条件是 G 连通且每顶点皆偶次。
§6

( ii ) G 是 Euler 图 的 充 分 必 要 条 件 是 G 连 通 且 G =

d

UC

i

, Ci 是 圈 ,

i =1

E (C i ) I E (C j ) = Φ (i ≠ j ) 。
(iii) G 中有 Euler 迹的充要条件是 G 连通且至多有两个奇次点。
定义 包含 G 的每个顶点的轨叫做 Hamilton(哈密顿)轨;闭的 Hamilton 轨叫做
Hamilton 圈或 H 圈;含 Hamilton 圈的图叫做 Hamilton 图。
直观地讲,Hamilton 图就是从一顶点出发每顶点恰通过一次能回到出发点的那种
图,即不重复地行遍所有的顶点再回到出发点。
6.2 Euler 回路的 Fleury 算法
1921 年,Fleury 给出下面的求 Euler 回路的算法。
Fleury 算法:
1o. ∀v0 ∈ V (G ) ,令 W0 = v0 。
2o. 假设迹 Wi = v0 e1v1 L ei vi 已经选定,那么按下述方法从 E − {e1 ,L, ei } 中选取
边 ei +1 :
(i) ei +1 和 vi 相关联;
-84-

(ii)除非没有别的边可选择,否则 ei +1 不是 Gi = G − {e1 ,L, ei } 的割边(cut edge)。
(所谓割边是一条删除后使连通图不再连通的边)。
3o. 当第 2 步不能再执行时,算法停止。
6.3 应用
6.3.1 邮递员问题
中国邮递员问题
一位邮递员从邮局选好邮件去投递,
然后返回邮局,
当然他必须经过他负责投递的
每条街道至少一次,为他设计一条投递路线,使得他行程最短。
上述中国邮递员问题的数学模型是:在一个赋权连通图上求一个含所有边的回路,
且使此回路的权最小。
显然,若此连通赋权图是 Euler 图,则可用 Fleury 算法求 Euler 回路,此回路即为
所求。
对于非 Euler 图,1973 年,Edmonds 和 Johnson 给出下面的解法:
设 G 是连通赋权图。
(i)求 V0 = {v | v ∈ V (G ), d ( v ) = 1(mod 2)} 。
(ii)对每对顶点 u, v ∈ V0 ,求 d (u, v ) ( d (u, v ) 是 u 与 v 的距离,可用 Floyd 算法
求得)

(iii)构造完全赋权图 K |V0 | ,以 V0 为顶点集,以 d (u, v ) 为边 uv 的权。
(iv)求 K |V0 | 中权之和最小的完美对集 M 。
(v)求 M 中边的端点之间的在 G 中的最短轨。
(vi)在(v)中求得的每条最短轨上每条边添加一条等权的所谓“倍边”
(即共端
点共权的边)

(vii)在(vi)中得的图 G ' 上求 Euler 回路即为中国邮递员问题的解。
多邮递员问题:
邮局有 k ( k ≥ 2) 位投递员,同时投递信件,全城街道都要投递,完成任务返回邮
局,如何分配投递路线,使得完成投递任务的时间最早?我们把这一问题记成 kPP。 kPP 的数学模型如下:
G (V , E ) 是连通图, v0 ∈V (G ) ,求 G 的回路 C1 ,L, C k ,使得
(i) v0 ∈ V (Ci ) , i = 1,2,L, k ,

(ii) max
1≤ i ≤ k

∑ w(e) = min ,

e∈E ( Ci )

k

(iii)

U E (C ) = E (G ) i i =1

6.3.2 旅行商(TSP)问题
一名推销员准备前往若干城市推销产品,
然后回到他的出发地。
如何为他设计一条
最短的旅行路线(从驻地出发,经过每个城市恰好一次,最后返回驻地)?这个问题称
为旅行商问题。用图论的术语说,就是在一个赋权完全图中,找出一个有最小权的
Hamilton 圈。称这种圈为最优圈。与最短路问题及连线问题相反,目前还没有求解旅行
商问题的有效算法。所以希望有一个方法以获得相当好(但不一定最优)的解。
一个可行的办法是首先求一个 Hamilton 圈 C ,然后适当修改 C 以得到具有较小权
的另一个 Hamilton 圈。修改的方法叫做改良圈算法。设初始圈 C = v1v 2 L v n v1 。
-85-

(i)对于 1 < i + 1 < j < n ,构造新的 Hamilton 圈:

Cij = v1v2 L vi v j v j −1v j −2 L vi +1v j +1v j +2 L vn v1 ,
它 是 由 C 中 删 去 边 vi vi +1 和 v j v j +1 , 添 加 边 vi v j 和 vi +1v j +1 而 得 到 的 。 若

w( vi v j ) + w( vi +1v j +1 ) < w( vi vi +1 ) + w( v j v j +1 ) ,
则以 Cij 代替 C ,Cij 叫做 C 的改良圈。
(ii)转(i)
,直至无法改进,停止。
用改良圈算法得到的结果几乎可以肯定不是最优的。
为了得到更高的精确度,
可以
选择不同的初始圈,重复进行几次算法,以求得较精确的结果。
这个算法的优劣程度有时能用 Kruskal 算法加以说明。假设 C 是 G 中的最优圈。
则对于任何顶点 v , C − v 是在 G − v 中的 Hamilton 轨,因而也是 G − v 的生成树。由
此推知:若 T 是 G − v 中的最优树,同时 e 和 f 是和 v 关联的两条边,并使得

w( e) + w( f ) 尽可能小,则 w(T ) + w( e) + w( f ) 将是 w(C ) 的一个上界。
这里介绍的方法已被进一步发展。
圈的修改过程一次替换三条边比一次仅替换两条
边更为有效;然而,有点奇怪的是,进一步推广这一想法,就不对了。
例 15 从北京(Pe)乘飞机到东京(T)、纽约(N)、墨西哥城(M)、伦敦(L)、巴黎(Pa)
五城市做旅游,每城市恰去一次再回北京,应如何安排旅游线,使旅程最短?各城市之
间的航线距离如表 7。
表7
L
L
M
N
Pa
Pe
T

56
35
21
51
60

M
56
21
57
78
70

六城市间的距离
N
Pa
35
21
21
57
36
36
68
51
68
61

Pe
51
78
68
51
13

解:编写程序如下: function main clc,clear global a a=zeros(6); a(1,2)=56;a(1,3)=35;a(1,4)=21;a(1,5)=51;a(1,6)=60; a(2,3)=21;a(2,4)=57;a(2,5)=78;a(2,6)=70; a(3,4)=36;a(3,5)=68;a(3,6)=68; a(4,5)=51;a(4,6)=61; a(5,6)=13; a=a+a'; L=size(a,1); c1=[5 1:4 6];
[circle,long]=modifycircle(c1,L);
c2=[5 6 1:4];%改变初始圈,该算法的最后一个顶点不动
[circle2,long2]=modifycircle(c2,L);
if long20 flag=0; for m=1:L-3 for n=m+2:L-1 if a(c1(m),c1(n))+a(c1(m+1),c1(n+1))= U( K) + X ( K, J) ( N - 2) * ( 1 - X( K, J)) +
( N - 3) * X( J, K)));
! Make the X's 0/1;
@FOR( LINK: @BIN( X));
! For the first and last stop we know...;
@FOR( CITY( K)| K #GT# 1:
U( K) = 1 + ( N - 2) * X( K, 1));
END
§7

最大流问题
7.1 最大流问题的数学描述
7.1.1 网络中的流
定义 在以 V 为节点集, A 为弧集的有向图 G = (V , A) 上定义如下的权函数:

-88-

(i) L : A → R 为孤上的权函数,弧 (i, j ) ∈ A 对应的权 L(i, j ) 记为 lij ,称为孤

(i, j ) 的容量下界(lower bound)

(ii)U : A → R 为弧上的权函数,弧 (i , j ) ∈ A 对应的权 U (i , j ) 记为 uij ,称为孤
(i, j ) 的容量上界,或直接称为容量(capacity)

(iii) D : V → R 为顶点上的权函数,节点 i ∈ V 对应的权 D (i ) 记为 d i ,称为顶
点 i 的供需量(supply/demand)

此时所构成的网络称为流网络,可以记为
N = (V , A, L,U , D ) 。
由于我们只讨论 V , A 为有限集合的情况,所以对于弧上的权函数 L,U 和顶点上的
权函数 D ,可以直接用所有孤上对应的权和顶点上的权组成的有限维向量表示,因此
L,U , D 有时直接称为权向量,或简称权。由于给定有向图 G = (V , A) 后,我们总是可
以在它的弧集合和顶点集合上定义各种权函数,所以流网络一般也直接简称为网络。
在流网络中,弧 (i, j ) 的容量下界 lij 和容量上界 uij 表示的物理意义分别是:通过该
弧发送某种
“物质” 必须发送的最小数量为 lij ,
时,
而发送的最大数量为 uij 。
顶点 i ∈V
对应的供需量 d i 则表示该顶点从网络外部获得的“物质”数量( d i > 0 时)
,或从该顶
。下面我们给出严格定义。
点发送到网络外部的“物质”数量( d i < 0 时)
定义

对于流网络 N = (V , A, L,U , D ) ,其上的一个流(flow) f 是指从 N 的弧

集 A 到 R 的一个函数,即对每条弧 (i , j ) 赋予一个实数 f ij (称为弧 (i, j ) 的流量)
。如
果流 f 满足

∑f

ij j:( i , j )∈ A



∑f

ji

= d i , ∀i ∈V ,

(1)

j:( j ,i )∈ A

lij ≤ f ij ≤ uij , ∀(i, j ) ∈ A ,

(2)

则称 f 为可行流(feasible flow)
。至少存在一个可行流的流网络称为可行网络(feasible
network)
.约束(1)称为流量守恒条件(也称流量平衡条件)
,约束(2)称为容量约
束。
可见,当 d i > 0 时,表示有 d i 个单位的流量从网络外部流入该顶点,因此顶点 i 称
为供应点(supply node)或源(source)
,有时也形象地称为起始点或发点等;当 d i < 0
时,表示有 | d i | 个单位的流量从该顶点流失到网络外部(或说被该顶点吸收)
,因此顶
点 i 称为需求点(demand node)或汇(sink)
,有时也形象地称为终止点或收点等;当
d i = 0 时,顶点 i 称为转运点(transshipment node)或平衡点、中间点等。此外,根据
(1)可知,对于可行网络,必有

∑d i∈V i

=0

(3)

也就是说,所有节点上的供需量之和为 0 是网络中存在可行流的必要条件。
一般来说,
我们总是可以把 L ≠ 0 的流网络转化为 L = 0 的流网络进行研究。
所以,
,并将
除非特别说明,以后我们总是假设 L = 0 (即所有孤 (i, j ) 的容量下界 lij = 0 )

L = 0 时的流网络简记为 N = (V , A,U , D ) 。此时,相应的容量约束(2)为
0 ≤ f ij ≤ u ij , ∀(i, j ) ∈ A 。
-89-

定义

在流网络 N = (V , A,U , D ) 中,对于流 f ,如果

f ij = 0, ∀(i, j ) ∈ A ,
则称 f 为零流,否则为非零流。如果某条弧 (i, j ) 上的流量等于其容量( f ij = uij )
,则
称该弧为饱和弧(saturated arc)
;如果某条弧 (i, j ) 上的流量小于其容量( f ij < uij )

则称该弧为非饱和弧;
如果某条弧 (i, j ) 上的流量为 0 f ij = 0 ) 则称该弧为空弧


(void
arc)

7.1.2 最大流问题
考虑如下流网络 N = (V , A,U , D ) :节点 s 为网络中唯一的源点, t 为唯一的汇点,
而其它节点为转运点。如果网络中存在可行流 f ,此时称流 f 的流量(或流值,flow value)为 d s (根据(3)
,它自然也等于 − d t )
,通常记为 v 或 v ( f ) ,即

v = v( f ) = d s = −d t 。
,则网络一
对这种单源单汇的网络,如果我们并不给定 d s 和 d t (即流量不给定)
般 记 为 N = ( s, t ,V , A,U ) 。 最 大 流 问 题 ( maximum flow problem ) 就 是 在

N = ( s, t ,V , A,U ) 中找到流值最大的可行流(即最大流)
。我们将会看到,最大流问题
的许多算法也可以用来求解流量给定的网络中的可行流。
也就是说,
当我们解决了最大
流问题以后,对于在流量给定的网络中寻找可行流的问题,通常也就可以解决了。
因此,用线性规划的方法,最大流问题可以形式地描述如下:

max v
s.t.

∑f

j:( i , j )∈ A

ij





j:( j ,i )∈ A

⎧v, i = s

f ji = ⎨− v, i = t ,
⎪0, i ≠ s, t


(4)

0 ≤ f ij ≤ u ij , ∀(i, j ) ∈ A .
(5)
定义 如果一个矩阵 A 的任何子方阵的行列式的值都等于 0 , 1 或 − 1 ,则称 A 是
全幺模的(totally unimodular TU,又译为全单位模的),或称 A 是全幺模矩阵。
定理 7(整流定理) 最大流问题所对应的约束矩阵是全幺模矩阵。若所有弧容量
均为正整数,则问题的最优解为整数解。
最大流问题是一个特殊的线性规划问题。
我们将会看到利用图的特点,
解决这个问
题的方法较之线性规划的一般方法要方便、直观得多。
7.1.3 单源和单汇运输网络
实际问题往往是多源多汇网络,为了计算的规格化,可将多源多汇网络 G 化成单
源单汇网络 G ' 。设 X 是 G 的源, Y 是 G 的汇,具体转化方法如下:
(i)
在原图 G 中增加两个新的顶点 x 和 y ,
令为新图 G ' 中之单源和单汇, G 中

所有顶点 V 成为 G ' 之中间顶点集。
(ii)用一条容量为
的弧把 x 连接到 X 中的每个顶点。
的弧把 Y 中的每个顶点连接到 y 。
(iii)用一条容量为




G 和 G ' 中的流以一个简单的方式相互对应。若 f 是 G 中的流,则由

-90-

若a是G的弧
⎧ f (a ),
⎪ + f ' (a) = ⎨ f (v), 若a = ( x, v)
⎪ f − (v), 若a = (v, y )

+
所定义的函数 f ' 是 G ' 中使得 v ( f ' ) = v ( f ) 的流,这里 f (v) 表示流出 v 的流量, f − (v) 表示流入 v 的流量(在 G 中)
。反之, G ' 中的流在 G 的弧集上的限制就是 G 中

具有相同值的流。
7.2 最大流和最小割关系
设 N = ( s, t ,V , A,U ) , S ⊂ V , s ∈ S , t ∈ V − S ,则称 ( S , S ) 为网络的一个割,
其中 S = V − S , ( S , S ) 为尾在 S ,头在 S 的弧集,称

C(S, S ) =



( i , j )∈ A i∈S , j∈S

uij

为割 ( S , S ) 的容量。

f 是最大流, ( S , S ) 是容量最小的割的充要条件是 v( f ) = C ( S , S ) 。
在网络 N = ( s, t ,V , A,U ) 中,对于轨 ( s, v 2 ,L, v n −1 , t ) (此轨为无向的)
,若
vi vi +1 ∈ A ,则称它为前向弧;若 vi +1vi ∈ A ,则称它为后向弧。
在网络 N 中,从 s 到 t 的轨 P 上,若对所有的前向弧 (i, j ) 都有 f ij < uij ,对所有
定理 8

的后向弧 (i, j ) 恒有 f ij > 0 ,则称这条轨 P 为从 s 到 t 的关于 f 的可增广轨。


⎧uij − f ij , 当(i, j )为前向弧

δ ij = ⎨

⎩ f ij ,

当(i, j )为后向弧



δ = min{δ ij }
则在这条可增广轨上每条前向弧的流都可以增加一个量 δ ,而相应的后向弧的流可减
少 δ ,这样就可使得网络的流量获得增加,同时可以使每条弧的流量不超过它的容量,
而且保持为正,也不影响其它弧的流量。总之,网络中 f 可增广轨的存在是有意义的,
因为这意味着 f 不是最大流。
7.3 最大流的一种算法—标号法
标号法是由 Ford 和 Fulkerson 在 1957 年提出的。用标号法寻求网络中最大流的基
本思想是寻找可增广轨,使网络的流量得到增加,直到最大为止。即首先给出一个初始
流,这样的流是存在的,例如零流。如果存在关于它的可增广轨,那么调整该轨上每条
弧上的流量,就可以得到新的流。对于新的流,如果仍存在可增广轨,则用同样的方法
使流的值增大,继续这个过程,直到网络中不存在关于新得到流的可增广轨为止,则该
流就是所求的最大流。
这种方法分为以下两个过程:
A.标号过程:通过标号过程寻找一条可增广轨。
B.增流过程:沿着可增广轨增加网络的流量。
这两个过程的步骤分述如下。
-91-

(A)标号过程:
+

(i)给发点标号为 ( s , ∞) 。
(ii)若顶点 x 已经标号,则对 x 的所有未标号的邻接顶点 y 按以下规则标号:
① 若 ( x, y ) ∈ A ,且 f xy < u xy 时,令 δ y = min{u xy − f xy , δ x } ,
则给顶点 y 标号为 ( x , δ y ) ,若 f xy = u xy ,则不给顶点 y 标号。
+

② ( y, x) ∈ A ,且 f yx > 0 ,令 δ y = min{ f yx , δ x } ,则给 y 标号为 ( x , δ y ) ,若


f yx = 0 ,则不给 y 标号。
(iii)不断地重复步骤(ii)直到收点 t 被标号,或不再有顶点可以标号为止。当 t
被标号时,表明存在一条从 s 到 t 的可增广轨,则转向增流过程(B)
。如若 t 点不能被
标号,且不存在其它可以标号的顶点时,表明不存在从 s 到 t 的可增广轨,算法结束,
此时所获得的流就是最大流。
(B)增流过程
(i)令 u = t 。
(ii)若 u 的标号为 (v , δ t )
,则 f vu = f vu + δ t ;若 u 的标号为 (v , δ t ) ,则
+



f uv = f uv − δ t 。
(iii)若 u = s ,把全部标号去掉,并回到标号过程(A)
。否则,令 u = v ,并回
到增流过程(ii)

求网络 N = ( s, t ,V , A,U ) 中的最大流 x 的算法的程序设计具体步骤如下:
对每个节点 j ,其标号包括两部分信息

(pred( j ), max f(j))
该节点在可能的增广路中的前一个节点 pred( j ) ,
以及沿该可能的增广路到该节点为止
可以增广的最大流量 max f ( j ) 。
STEP0
1)

STEP1

置初始可行流 x (如零流)
;对节点 t 标号,即令 max f (t ) =任意正值(如
若 max f (t ) > 0 ,继续下一步;否则停止,已经得到最大流,结束。

STEP2 取消所有节点 j ∈ V 的标号,即令 max f ( j ) = 0 , pred( j ) = 0 ;令 LIST={ s },对节点 s 标号,即令 max f ( s) = 充分大的正值。
STEP3 如果 LIST ≠ Φ 且 max f (t ) = 0 ,继续下一步;否则:
(3a)如果 t 已经有
,则找到了一条增广路,沿该增广路对流 x 进行增广(增广的
标号(即 max f (t ) > 0 ) max f (t ) ,增广路可以根据 pred 回溯方便地得到)
流量为
,转 STEP1。
(3b)如果 t 没有标号(即 LIST= Φ 且 max f (t ) = 0 )
,则停止,已得到最大流。
(4a)
STEP4 从 LIST 中移走一个节点 i ;寻找从节点 i 出发的所有可能的增广弧:
,对 j 进行标号,即令
对非饱和前向弧 (i, j ) ,若节点 j 没有标号(即 pred( j ) = 0 ) max f ( j ) = min{max f(i ), uij − xij } , pred( j ) = i ,
并将 j 加入 LIST 中。
(4b)对非空后向弧 ( j , i ) ,若节点 j 没有标号(即 pred( j ) = 0 )
,对 j 进行标号,
即令

max f ( j ) = min{max f(i ), xij } , pred( j ) = −i ,
-92-

并将 j 加入 LIST 中。
例 17 用 Ford-Fulkerson 算法计算如图 6 网络中的最大流,
每条弧上的两个数字分
别表示容量和当前流量。

图 6 最大流问题

解 编写程序如下: clc,clear u(1,2)=1;u(1,3)=1;u(1,4)=2;u(2,3)=1;u(2,5)=2; u(3,5)=1;u(4,3)=3;u(4,5)=3; f(1,2)=1;f(1,3)=0;f(1,4)=1;f(2,3)=0;f(2,5)=1; f(3,5)=1;f(4,3)=1;f(4,5)=0; n=length(u);list=[];maxf(n)=1; while maxf(n)>0 maxf=zeros(1,n);pred=zeros(1,n); list=1;record=list;maxf(1)=inf;
%list是未检查邻接点的标号点,record是已标号点
while (~isempty(list))&(maxf(n)==0) flag=list(1);list(1)=[]; label1= find(u(flag,:)-f(flag,:)); label1=setdiff(label1,record); list=union(list,label1); pred(label1)=flag; maxf(label1)=min(maxf(flag),u(flag,label1)...
-f(flag,label1));
record=union(record,label1); label2=find(f(:,flag)); label2=label2'; label2=setdiff(label2,record); list=union(list,label2); pred(label2)=-flag; maxf(label2)=min(maxf(flag),f(label2,flag)); record=union(record,label2); end if maxf(n)>0 v2=n; v1=pred(v2); while v2~=1 if v1>0 f(v1,v2)=f(v1,v2)+maxf(n); else v1=abs(v1); f(v2,v1)=f(v2,v1)-maxf(n); end v2=v1; v1=pred(v2); end end end f
-93-

例18

现需要将城市 s 的石油通过管道运送到城市 t ,中间有4个中转站 v1 , v2 , v3

和 v4 ,城市与中转站的连接以及管道的容量如图7所示,求从城市 s 到城市 t 的最大流。

图7


最大流问题

使用最大流的数学规划表达式,编写LINGO程序如下:

model: sets: nodes/s,1,2,3,4,t/; arcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,f; endsets data: c=8 7 9 5 2 5 9 6 10; enddata n=@size(nodes); !顶点的个数; max=flow; @for(nodes(i)|i #ne#1 #and# i #ne# n:
@sum(arcs(i,j):f(i,j))=@sum(arcs(j,i):f(j,i)));
@sum(arcs(i,j)|i #eq# 1:f(i,j))=flow;
@sum(arcs(i,j)|j #eq# n:f(i,j))=flow;
@for(arcs:@bnd(0,f,c));
end
在上面的程序中,采用了稀疏集的编写方法。下面介绍的程序编写方法是利用赋权邻
接矩阵,这样可以不使用稀疏集的编写方法,更便于推广到复杂网络。 model: sets: nodes/s,1,2,3,4,t/; arcs(nodes,nodes):c,f; endsets data: c=0; @text('fdata.txt')=f; enddata calc: c(1,2)=8;c(1,4)=7; c(2,3)=9;c(2,4)=5; c(3,4)=2;c(3,6)=5; c(4,5)=9;c(5,3)=6;c(5,6)=10; endcalc n=@size(nodes); !顶点的个数; max=flow; @for(nodes(i)|i #ne#1 #and# i #ne# n:
@sum(nodes(j):f(i,j))=@sum(nodes(j):f(j,i)));
@sum(nodes(i):f(1,i))=flow;
@sum(nodes(i):f(i,n))=flow;
@for(arcs:@bnd(0,f,c)); end -94-

§8 最小费用流及其求法
8.1 最小费用流
上面我们介绍了一个网络上最短路以及最大流的算法,
但是还没有考虑到网络上流
的费用问题,在许多实际问题中,费用的因素很重要。例如,在运输问题中,人们总是
希望在完成运输任务的同时,
寻求一个使总的运输费用最小的运输方案。
这就是下面要
介绍的最小费用流问题。
在运输网络 N = ( s, t ,V , A,U ) 中,设 cij 是定义在 A 上的非负函数,它表示通过弧

(i, j ) 单位流的费用。所谓最小费用流问题就是从发点到收点怎样以最小费用输送一已
知量为 v( f ) 的总流量。
最小费用流问题可以用如下的线性规划问题描述:

min
s.t.

∑f

j:( i , j )∈A

∑c

( i , j )∈A ij −

f

ij ij

∑f

j:( j ,i )∈A

ji

= di ,

0 ≤ f ij ≤ uij , ∀(i, j ) ∈ A .
⎧v( f ), i = s

其中 d i = ⎨− v( f ), i = t
⎪0, i ≠ s, t

显然,如果 v( f ) = 最大流 v( f max ) ,则本问题就是最小费用最大流问题。如果

v( f ) > v( f max ) ,则本问题无解。
例 19(最小费用最大流问题)
(续例 18)由于输油管道的长短不一或地质等原因,
使每条管道上运输费用也不相同,因此,除考虑输油管道的最大流外,还需要考虑输油
管道输送最大流的最小费用。 8 所示是带有运费的网络,

其中第 1 个数字是网络的容
量,第 2 个数字是网络的单位运费。

图8

最小费用最大流问题

解 按照最小费用流的数学规划写出相应的 LINGO 程序如下: model: sets: nodes/s,1,2,3,4,t/:d; arcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,3 4,4 2,4 t/:c,u,f; endsets data: d=14 0 0 0 0 -14; !最大流为14; c=2 8 2 5 1 6 3 4 7; u=8 7 9 5 2 5 9 6 10; enddata min=@sum(arcs:c*f);
-95-

@for(nodes(i):@sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=d(i));
@for(arcs:@bnd(0,f,u));
end
求得最大流的最小费用是 205,而原最大流的费用为 210 单位,原方案并不是最优
的。
类似地,可以利用赋权邻接矩阵编程求得最小费用最大流。LINGO 程序如下: model: sets: nodes/s,1,2,3,4,t/:d; arcs(nodes,nodes):c,u,f; endsets data: d=14 0 0 0 0 -14; c=0; u=0; enddata calc: c(1,2)=2;c(1,4)=8; c(2,3)=2;c(2,4)=5; c(3,4)=1;c(3,6)=6; c(4,5)=3;c(5,3)=4;c(5,6)=7; u(1,2)=8;u(1,4)=7; u(2,3)=9;u(2,4)=5; u(3,4)=2;u(3,6)=5; u(4,5)=9;u(5,3)=6;u(5,6)=10; endcalc min=@sum(arcs:c*f);
@for(nodes(i):@sum(nodes(j):f(i,j))-@sum(nodes(j):f(j,i))=d(i));
@for(arcs:@bnd(0,f,u)); end 8.2 求最小费用流的一种方法—迭代法
这里所介绍的求最小费用流的方法叫做迭代法。这个方法是由 Busacker 和 Gowan
在 1961 年提出的。其主要步骤如下:
(i)求出从发点到收点的最小费用通路 μ ( s, t ) 。
(ii)对该通路 μ ( s, t ) 分配最大可能的流量:

f = min {uij }
( i , j )∈μ ( s ,t )

并让通路上的所有边的容量相应减少 f 。这时,对于通路上的饱和边,其单位流费用
相应改为 ∞ 。
(iii)作该通路 μ ( s, t ) 上所有边 (i, j ) 的反向边 ( j , i ) 。令

u ji = f , c ji = −cij
(iv)在这样构成的新网络中,重复上述步骤(i),(ii),(iii),直到从发点到收点的全

部流量等于 v( f ) 为止(或者再也找不到从 s 到 t 的最小费用道路)
下面我们编写了最小费用最大流函数 mincostmaxflow,
其中调用了利用 Floyd 算法
求最短路的函数 floydpath。
求解例 19 具体程序如下(下面的全部程序放在一个文件中)

function mainexample19 clear;clc; -96-

global M num c=zeros(6);u=zeros(6); c(1,2)=2;c(1,4)=8;c(2,3)=2;c(2,4)=5; c(3,4)=1;c(3,6)=6;c(4,5)=3;c(5,3)=4;c(5,6)=7; u(1,2)=8;u(1,4)=7;u(2,3)=9;u(2,4)=5; u(3,4)=2;u(3,6)=5;u(4,5)=9;u(5,3)=6;u(5,6)=10; num=size(u,1);M=sum(sum(u))*num^2;
[f,val]=mincostmaxflow(u,c)
%求最短路径函数 function path=floydpath(w); global M num w=w+((w==0)-eye(num))*M; p=zeros(num); for k=1:num for i=1:num for j=1:num if w(i,j)>w(i,k)+w(k,j) w(i,j)=w(i,k)+w(k,j); p(i,j)=k; end end end end if w(1,num) ==M path=[]; else path=zeros(num); s=1;t=num;m=p(s,t); while ~isempty(m) if m(1) s=[s,m(1)];t=[t,t(1)];t(1)=m(1); m(1)=[];m=[p(s(1),t(1)),m,p(s(end),t(end))]; else path(s(1),t(1))=1;s(1)=[];m(1)=[];t(1)=[]; end end end %最小费用最大流函数 function [flow,val]=mincostmaxflow(rongliang,cost,flowvalue);
%第一个参数:容量矩阵;第二个参数:费用矩阵;
%前两个参数必须在不通路处置零
%第三个参数:指定容量值(可以不写,表示求最小费用最大流)
%返回值 flow 为可行流矩阵,val 为最小费用值 global M flow=zeros(size(rongliang));allflow=sum(flow(1,:)); if narginx(i)+t(i,j)); end 计算结果给出了各个项目的开工时间,如 x1 = 0 ,则作业 A, B, C 的开工时间均是
第 0 天; x2 = 5 ,作业 E 的开工时间是第 5 天; x3 = 10 ,则作业 D 的开工时间是第
10 天;等等。每个作业只要按规定的时间开工,整个项目的最短工期为 51 天。
尽管上述 LINGO 程序给出相应的开工时间和整个项目的最短工期,但统筹方法中
-101-

许多有用的信息并没有得到,如项目的关键路径、每个作业的最早开工时间、最迟开工
时间等。
例 21(续例 20)求例 20 中每个作业的最早开工时间、最迟开工时间和作业的关
键路径。
解 为了得到每个作业的最早开工时间、作业的关键路线等,将目标函数改为

∑x i∈V i

,即作业的开始时间尽量早,这样就可以得到作业的最早开工时间。再引进作业

对应弧上的松弛变量 sij ,且 sij = x j − xi − tij ,(i, j ) ∈ A ,这样就可以得到作业的最迟
开工时间,记 yi 表示事件 i 的最迟开工时间。当最早开工时间与最迟开工时间相同时,
就得到项目的关键路径。
编写 LINGO 程序如下: model: sets: events/1..8/:x,z; operate(events,events)/1 2,1 3,1 4,2 5,3 4,3 5,4 6,5 6,
5 7,5 8,6 7,6 8,7 8/:s,t,m,c,y; endsets data: t=5 10 11 4 4 0 15 21 25 35 0 20 15; m=5 8 8 3 4 0 15 16 22 30 0 16 12; c=0 700 400 450 0 0 0 600 300 500 0 500 400; d=49; @text(txt2.txt)=x,z; enddata min=mincost+sumx; mincost=@sum(operate:c*y); sumx=@sum(events:x);
@for(operate(i,j):s(i,j)=x(j)-x(i)+y(i,j)-t(i,j));
n=@size(events); x(1)=0; x(n) 0 时,说明还有剩余时间,对
应作业的工期可以推迟 sij 。例如, s78 = 1 ,作业(7,8) J )的开工时间可以推迟 1

天,即开工时间为 36。再如 s46 = 2 ,作业(4,6) F )可以推迟 2 天开始, s14 = 3 ,

作业(1,4) C )可以推迟 3 天开始,但由于作业(4,6) F )已能够推迟 2 天,


所以,作业(1,4) C )最多可推迟 5 天。

由此,可以得到所有作业的最早开工时间和最迟开工时间,如下表所示,方括号
中第 1 个数字是最早开工时间,第 2 个数字是最迟开工时间。
表 10
作业 (i,

A(1,2)
-102-

j)

开工时间
[0,1]

作业数据

计划完成时间
(天) 作业 (i,
5

G (5,6)

j)

开工时间
[10,10]

计划完成时间
(天)
21

B (1,3)
C (1,4)
D(3,4)
E (2,5)
F (4,6)

[0,0]

10

[0,5]

11

[10,12]

4

[5,6]

4

[14,16]

H (5,8)
I (5,7)
J (7,8)
K (6,8)

[10,16]

35

[10,11]

25

[35,36]

15

[31,31]

20

15

从上表可以看出,当最早开工时间与最迟开工时间相同时,对应的作业在关键路
线上,因此可以画出计划网络图中的关键路线,如图 11 粗线所示。关键路线为 1→3→
5→6→8。

图 11

带有关键路线的计划网络图

9.3.4 将关键路线看成最长路
如果将关键路线看成最长路,则可以按照求最短路的方法(将求极小改为求极大)
求出关键路线。
设 xij 为 0-1 变量,当作业 (i, j ) 位于关键路线上取 1,否则取 0。数学规划问题写
成:

max

∑t

( i , j )∈A

i =1
⎧1,

∑ xij − j=∑ x ji = ⎨− 1, i = n j =1
1
⎪0, i ≠ 1, n
( i , j )∈A
( j ,i )∈A

xij = 0 或 1, (i, j ) ∈ A n s.t.

x

ij ij

n

例 22 用最长路的方法,求解例 20。
解 按上述数学规划问题写出相应的 LINGO 程序。 model: sets: events/1..8/:d; operate(events,events)/1 2,1 3,1 4,2 5,3 4,3 5,4 6,5 6,
5 7,5 8,6 7,6 8,7 8/:t,x; endsets data: t=5 10 11 4 4 0 15 21 25 35 0 20 15; d=1 0 0 0 0 0 0 -1; enddata max=@sum(operate:t*x);
@for(events(i):@sum(operate(i,j):x(i,j))-@sum(operate(j,i):x(j,i))=d(i));
end
-103-

求得工期需要 51 天,关键路线为 1→3→5→6→8。
9.4 关键路线与计划网络的优化
例 23
(关键路线与计划网络的优化) 假设例 20 中所列的工程要求在 49 天内完成。
为提前完成工程,有些作业需要加快进度,缩短工期,而加快进度需要额外增加费用。
下表列出例 20 中可缩短工期的所有作业和缩短一天工期额外增加的费用。现在的问题
是,如何安排作业才能使额外增加的总费用最少。

作业

计划完成

最短完成

(i, j ) 时间(天)
B(1,3)
10
C (1,4)
11
E (2,5)
4
G (5,6) 21

表 11 工程作业数据
缩短 1 天增加 作业
计划完成

时间(天) 的费用(元)
8

700

8

400

3

450

16

600

最短完成

(i, j ) 时间(天)
H (5,8)
35
I (5,7)
25
J (7,8)
15
K (6,8)
20

缩短 1 天增加

时间(天) 的费用(元)
30

500

22

300

12

400

16

500

例 23 所涉及的问题就是计划网络的优化问题,这时需要压缩关键路径来减少最短
工期。
9.4.1 计划网络优化的数学表达式
设 xi 是事件 i 的开始时间, tij 是作业 (i, j ) 的计划时间, mij 是完成作业 (i, j ) 的最
短时间, yij 是作业 (i, j ) 可能减少的时间, cij 是作业 (i, j ) 缩短一天增加的费用,因此


x j − xi ≥ tij − yij 且 0 ≤ yij ≤ tij − mij
设 d 是要求完成的天数,1 为最初事件, n 为最终事件,所以有 xn − x1 ≤ d 。而问题的
总目标是使额外增加的费用最小,即目标函数为 min

∑c

( i , j )∈A

规划问题:

min

∑c

( i , j )∈A

s.t.

ij

ij

yij 。由此得到相应的数学

yij

x j − xi + yij ≥ tij , (i, j ) ∈ A , i, j ∈ V xn − x1 ≤ d
0 ≤ yij ≤ tij − mij , (i, j ) ∈ A , i, j ∈ V

9.4.2 计划网络优化的求解
用 LINGO 软件求解例 23,程序如下: model: sets: events/1..8/:x; operate(events,events)/1 2,1 3,1 4,2 5,3 4,3 5,4 6,5 6,
5 7,5 8,6 7,6 8,7 8/:t,m,c,y; endsets data: t=5 10 11 4 4 0 15 21 25 35 0 20 15;
-104-

m=5 8 8 3 4 0 15 16 22 30 0 16 12; c=0 700 400 450 0 0 0 600 300 500 0 500 400; d=49; enddata min=@sum(operate:c*y); @for(operate(i,j):x(j)-x(i)+y(i,j)>t(i,j)); n=@size(events); x(n)-x(1) t1 ) 内有 n (≥ 0) 个顾客到达的概率,即

Pn (t1 , t2 ) = P{N (t 2 ) − N (t1 ) = n} (t2 > t1 , n ≥ 0)
当 Pn (t1 , t 2 ) 合于下列三个条件时,我们说顾客的到达形成泊松流。这三个条件是:
1

o

在不相重叠的时间区间内顾客到达数是相互独立的,我们称这性质为无后效

2

o

对充分小的 Δt ,在时间区间 [t , t + Δt ) 内有一个顾客到达的概率与 t 无关,而

性。
约与区间长 Δt 成正比,即

P1 (t , t + Δt ) = λΔt + o( Δt )
(1)
其中 o( Δt ) ,当 Δt → 0 时,是关于 Δt 的高阶无穷小。 λ > 0 是常数,它表示单位时间
有一个顾客到达的概率,称为概率强度。
o
3 对于充分小的 Δt ,在时间区间 [t , t + Δt ) 内有两个或两个以上顾客到达的概率
极小,以致可以忽略,即


∑ P (t, t + Δt ) = o( Δt ) n n=2

-120-

(2)

在上述条件下,我们研究顾客到达数 n 的概率分布。 o 由条件 2 ,我们总可以取时间由 0 算起,并简记 Pn (0, t ) = Pn (t ) 。 o o

由条件 1 和 2 ,有

P0 (t + Δt ) = P0 (t ) P0 ( Δt ) n Pn (t + Δt ) = ∑ Pn − k (t ) Pk ( Δt ), n = 1,2,L k =0

o

o

由条件 2 和 3 得

P0 ( Δt ) = 1 − λΔt + o( Δt )
因而有

P0 (t + Δt ) − P0 (t ) o( Δt )
= −λP0 (t ) +

Δt
Δt
Pn (t + Δt ) − Pn (t ) o ( Δt )
.
= − λPn (t ) + λPn −1 (t ) +
Δt
Δt
在以上两式中,取 Δt 趋于零的极限,当假设所涉及的函数可导时,得到以下微分方程
组:

dP0 (t )
= − λP0 (t ) , dt dPn (t )
= −λPn (t ) + λPn −1 (t ), n = 1,2,L . dt − λt
; 再 令
取 初 值 P0 (0) = 1 , Pn (0) = 0( n = 1,2,L) , 容 易 解 出 P0 (t ) = e

Pn (t ) = U n (t )e − λt ,可以得到 U 0 (t ) 及其它 U n (t ) 所满足的微分方程组,即 dU n (t )
= λU n −1 (t ), n = 1,2,L, dt U 0 (t ) = 1 , U n ( t ) = 0 .
由此容易解得

Pn (t ) =

( λ t ) n − λt e , n = 1,2,L . n! 正如在概率论中所学过的,我们说随机变量 {N (t ) = N ( s + t ) − N ( s )} 服从泊松分
布。它的数学期望和方差分别是
E[ N (t )] = λt ; Var[ N (t )] = λt 。
当输入过程是泊松流时,那么顾客相继到达的时间间隔 T 必服从指数分布。这是
由于

P{T > t} = P{[0, t ) 内呼叫次数为零 } = P0 (t ) = e − λt
那么,以 F (t ) 表示 T 的分布函数,则有
⎧1 − e − λt , t ≥ 0
P{T ≤ t} = F (t ) = ⎨ t 0 .
-121-

对于泊松流, λ 表示单位时间平均到达的顾客数,所以

1

λ

就表示相继顾客到达平均

间隔时间,而这正和 ET 的意义相符。
对一顾客的服务时间也就是在忙期相继离开系统的两顾客的间隔时间,
有时也服从
指数分布。这时设它的分布函数和密度函数分别是

G (t ) = 1 − e − μt , g (t ) = μe − μt
我们得到

P{T ≤ t + Δt | T > t}
P{t < T ≤ t + Δt}
= lim

Δt → 0
Δt → 0
Δt
ΔtP{T > t}
这表明,在任何小的时间间隔 [t , t + Δt ) 内一个顾客被服务完了(离去)的概率是
1
μΔt + o( Δt ) 。 μ 表示单位时间能被服务完成的顾客数,称为平均服务率,而 表示 lim μ

一个顾客的平均服务时间。
2.2 常用的几种概率分布及其产生
2.2.1 常用的连续型概率分布
我们只给出这些分布的参数、
记号和通常的应用范围,
更详细的内容参看专门的概
率论书籍。
(i)均匀分布
区间 ( a , b) 内的均匀分布记作 U ( a, b) 。服从 U (0,1) 分布的随机变量又称为随机
数,它是产生其它随机变量的基础。如若 X 为 U (0,1) 分布,则 Y = a + (b − a ) X 服从

U ( a , b) 。
(ii)正态分布
以 μ 为期望, σ 为方差的正态分布记作 N ( μ , σ ) 。正态分布的应用十分广泛。
正态分布还可以作为二项分布一定条件下的近似。
(iii)指数分布
指数分布是单参数 λ 的非对称分布,记作 Exp( λ ) ,概率密度函数为:
2

它的数学期望为

2

⎧ λ e − λt , t ≥ 0 f (t ) = ⎨ t t + s | X > t ) = P ( X > s ) ,在排队论、可靠性分析中有广泛应用。
(iv)Gamma 分布
Gamma 分布是双参数 α , β 的非对称分布,记作 G (α , β ) ,期望是 αβ 。 α = 1 时蜕
化为指数分布。 n 个相互独立、同分布(参数 λ )的指数分布之和是 Gamma 分布
( α = n, β = λ ) 。Gamma 分布可用于服务时间,零件寿命等。
Gamma 分布又称爱尔朗分布。
(v)Weibull 分布
Weibull 分布是双参数 α , β 的非对称分布,记作 W (α , β ) 。α = 1 时蜕化为指数分
布。作为设备、零件的寿命分布在可靠性分析中有着非常广泛的应用。
(vi)Beta 分布
-122-

Beta 分布是区间 (0,1) 内的双参数、非均匀分布,记作 B (α , β ) 。
2.2.2 常用的离散型概率分布
(i)离散均匀分布
(ii)Bernoulli 分布(两点分布)
Bernoulli 分 布 是 x = 1,0 处 取 值 的 概 率 分 别 是 p 和 1 − p 的 两 点 分 布 , 记 作

Bern( p) 。用于基本的离散模型。
(iii)泊松(Poisson)分布
泊松分布与指数分布有密切的关系。当顾客平均到达率为常数 λ 的到达间隔服从
指数分布时,单位时间内到达的顾客数 K 服从泊松分布,即单位时间内到达 k 位顾客
的概率为

Pk =

λk e − λ k! , k = 0,1,2,L

记作 Poisson( λ ) 。泊松分布在排队服务、产品检验、生物与医学统计、天文、物理等
领域都有广泛应用。
(iv)二项分布
在独立进行的每次试验中,某事件发生的概率为 p ,则 n 次试验中该事件发生的
次数 K 服从二项分布,即发生 k 次的概率为 k Pk = C n p k (1 − p ) n − k , k = 0,1,L, n .
记作 B( n, p ) 。二项分布是 n 个独立的 Bernoulli 分布之和。它在产品检验、保险、生

物和医学统计等领域有着广泛的应用。
当 n, k 很大时, B ( n, p ) 近似于正态分布 N ( np, np (1 − p )) ;当 n 很大、 p 很小,
且 np 约为常数 λ 时, B( n, p ) 近似于 Poisson( λ ) 。
§3

生灭过程
一类非常重要且广泛存在的排队系统是生灭过程排队系统。
生灭过程是一类特殊的
随机过程,在生物学、物理学、运筹学中有广泛的应用。在排队论中,如果 N (t ) 表示
时刻 t 系统中的顾客数,则 {N (t ), t ≥ 0} 就构成了一个随机过程。如果用“生”表示顾
客的到达,
“灭”表示顾客的离去,则对许多排队过程来说, {N (t ), t ≥ 0} 就是一类特
殊的随机过程-生灭过程。下面结合排队论的术语给出生灭过程的定义。
定义 1 设 {N (t ), t ≥ 0} 为一个随机过程。若 N (t ) 的概率分布具有以下性质:
(1)假设 N (t ) = n ,则从时刻 t 起到下一个顾客到达时刻止的时间服从参数为 λn
的负指数分布, n = 0,1,2, L 。

(2)假设 N (t ) = n ,则从时刻 t 起到下一个顾客离去时刻止的时间服从参数为 μ n

的负指数分别, n = 0,1,2, L 。
(3)同一时刻只有一个顾客到达或离去。
则称 {N (t ), t ≥ 0} 为一个生灭过程。
一般来说,得到 N (t ) 的分布 pn (t ) = P{N (t ) = n}( n = 0,1,2, L )是比较困难的,

因此通常是求当系统到达平衡后的状态分布,记为 pn , n = 0,1,2, L 。

为求平稳分布,
考虑系统可能处的任一状态 n 。
假设记录了一段时间内系统进入状
态 n 和离开状态 n 的次数,则因为“进入”和“离开”是交替发生的,所以这两个数要
-123-

么相等,要么相差为 1。但就这两种事件的平均发生率来说,可以认为是相等的。即当
系统运行相当时间而到达平衡状态后,
对任一状态 n 来说,
单位时间内进入该状态的平
均次数和单位时间内离开该状态的平均次数应该相等,
这就是系统在统计平衡下的
“流
入=流出”原理。根据这一原理,可得到任一状态下的平衡方程如下:

μ1 p1 = λ0 p0 λ0 p0 + μ 2 p2 = (λ1 + μ1 ) p1 λ1 p1 + μ3 p3 = (λ2 + μ 2 ) p2

0
1
2
M

(3)

M

λn−1 pn−1 + μ n+1 pn+1 = (λn + μ n ) pn

n
M

M

由上述平衡方程,可求得

λ0 p μ1 0 λ 1 p2 = 1 p1 +
(μ p − λ p ) = μ2 μ2 1 1 0 0 λ 1 p3 = 2 p2 +
(μ p − λ p ) = μ3 μ3 2 2 1 1 p1 =

0:
1:
2:

M

M

λ λ λ λ L λ0
1
pn+1 = n pn +
( μ n pn − λn−1 pn−1 ) = n pn = n n−1 p μ n+1 μ n+1 μ n+1 μ n+1μ n L μ1 0

n:

M



λλ λ1 p1 = 1 0 p0 μ2 μ 2 μ1 λ λλ λ2 p 2 = 2 1 0 p0 μ3 μ 3 μ 2 μ1

M

Cn =

λn−1λn−2 L λ0
, n = 1,2, L μ n μ n−1 L μ1

(4)

则平稳状态的分布为 pn = Cn p0 , n = 1,2, L

(5)

由概率分布的要求


∑p n =0

n

=1





1 + ∑ C n ⎥ p0 = 1

⎣ n=1 ⎦

于是

p0 =

1

(6)



1 + ∑ Cn n =1

注意:
(6)只有当级数
-124-



∞ n =1

Cn 收敛时才有意义,即当 ∑n=1 Cn < ∞ 时,才能由上


述公式得到平稳状态的概率分布。
§4

M / M / s 等待制排队模型

4.1 单服务台模型
顾客的相继到达时间服从参数为 λ 的负指
单服务台等待制模型 M / M / 1 / ∞ 是指:
数分布,服务台个数为 1,服务时间 V 服从参数为 μ 的负指数分布,系统空间无限,
允许无限排队,这是一类最简单的排队系统。
4.1.1 队长的分布
记 pn = P{N = n}( n = 0,1,2, L )为系统达到平衡状态后队长 N 的概率分布,则
由式(4)~(6)
,并注意到 λn = λ , n = 0,1,2, L 和 μ n =

λ μ ρ=

μ , n = 0,1,2, L 。记

并设 ρ < 1 (否则队列将排至无限远)
,则
n

⎛λ⎞
Cn = ⎜ ⎟ , n = 1,2, L
⎜μ⎟
⎝ ⎠


pn = ρ n p0 , n = 1,2, L
其中
−1

−1

⎛ 1 ⎞

⎛ ∞ p0 =
= ⎜∑ ρn ⎟ = ⎜

⎜1− ρ ⎟ = 1− ρ

n
⎝ n =0 ⎠


1+ ∑ ρ
1

(7)

n =1

因此

pn = (1 − ρ ) ρ n , n = 1,2, L

(8)

公式(7)和(8)给出了在平衡条件下系统中顾客数为 n 的概率。由式(7)不难看出, ρ 是系统中至少有一个顾客的概率,
也就是服务台处于忙的状态的概率,
因而也称 ρ 为
服务强度,它反映了系统繁忙的程度。此外,
(8)式只有在 ρ =

λ
< 1 的条件下才能得 μ 到,即要求顾客的平均到达率小于系统的平均服务率,才能使系统达到统计平衡。
4.1.2 几个主要数量指标
对单服务台等待制排队系统,
由已得到的平稳状态下队长的分布,
可以得到平均队





Ls = ∑ npn = ∑ n(1 − ρ ) ρ n n =0

n =1

= ( ρ + 2 ρ + 3ρ 3 + L) − ( ρ 2 + 2 ρ 3 + 3ρ 4 + L)
2

= ρ + ρ2 + ρ3 +L =

ρ

1− ρ

=

(9)

λ

μ −λ

平均排队长 Lq 为
-125-



Lq = ∑ (n − 1) pn = L − (1 − p0 ) = L − ρ = n =1

λ2 μ (μ − λ )

(10)

关于顾客在系统中的逗留时间 T ,可说明它服从参数为 μ − λ 的复指数分布,即

P{T > t} = e − ( μ −λ )t , t ≥ 0
因此,平均逗留时间

Ws =

1 μ −λ

(11)

因为,顾客在系统中的逗留时间为等待时间 Tq 和接受服务时间 V 之和,即

T = Tq + V
故由

Ws = E (T ) = E (Tq ) + E (V ) = Wq +

1

(12)

μ

可得平均等待时间 Wq 为

Wq = Ws −

1

μ

=

λ μ (μ − λ )

(13)

从式(9)和式(11)
,可发现平均队长 Ls 与平均逗留时间 Ws 具有关系

Ls = λWs

(14)

同样,从式(10)和式(13)
,可发现平均排队长 Lq 与平均等待时间 Wq 具有关系

Lq = λWq

(15)

式(14)和式(15)通常称为 Little 公式,是排队论中一个非常重要的公式。
4.1.3 忙期和闲期
在平衡状态下,忙期 B 和闲期 I 一般均为随机变量,求它们的分布是比较麻烦的。
因此,
我们来求一下平均忙期 B 和平均闲期 I 。
由于忙期和闲期出现的概率分别为 ρ 和

1 − ρ ,所以在一段时间内可以认为忙期和闲期的总长度之比为 ρ : (1 − ρ ) 。又因为忙
期和闲期是交替出现的,所以在充分长的时间里,它们出现的平均次数应是相同的。于
是,忙期的平均长度 B 和闲期的平均长度 I 之比也应是 ρ : (1 − ρ ) ,即

B ρ =
I 1− ρ

(16)

又因为在到达为 Poisson 流时,
根据负指数分布的无记忆性和到达与服务相互独立的假
设,容易证明从系统空闲时刻起到下一个顾客到达时刻止(即闲期)的时间间隔仍服从
参数为 λ 的负指数分布,且与到达时间间隔相互独立。因此,平均闲期应为

1

λ

,这样,

便求得平均忙期为

B=

ρ



1

1− ρ λ

=

1 μ −λ

(17)

与式(11)比较,发现平均逗留时间( Ws )=平均忙期( B )
。这一结果直观看上去
是显然的,顾客在系统中逗留的时间越长,服务员连续繁忙的时间也就越长。因此,一
-126-

个顾客在系统内的平均逗留时间应等于服务员平均连续忙的时间。
4.2 与排队论模型有关的 LINGO 函数
(1)@peb(load,S)
该函数的返回值是当到达负荷为 load,服务系统中有 S 个服务台且允许排队时系
统繁忙的概率,也就是顾客等待的概率。
(2)@pel(load,S)
该函数的返回值是当到达负荷为 load,服务系统中有 S 个服务台且不允许排队时
系统损失概率,也就是顾客得不到服务离开的概率。
(3)@pfs(load,S,K)
该函数的返回值是当到达负荷为 load,顾客数为 K,平行服务台数量为 S 时,有限
源的 Poisson 服务系统等待或返修顾客数的期望值。
例 1 某修理店只有一个修理工,来修理的顾客到达过程为 Poisson 流,平均 4 人
/h;修理时间服从负指数分布,平均需要 6min。试求:
(1)修理店空闲的概率;
(2)
店内恰有 3 个顾客的概率;
(3)
店内至少有 1 个顾客的概率;
(4)
在店内的平均顾客数;
(5)每位顾客在店内的平均逗留时间;
(6)等待服务的平均顾客数;
(7)每位顾客平
均等待服务时间;
(8)顾客在店内等待时间超过 10min 的概率。
解 本例可看成一个 M / M / 1 / ∞ 排队问题,其中

λ = 4,μ =

λ
1
= 10 , ρ = = 0.4 μ 0.1

(1)修理店空闲的概率

p0 = 1 − ρ = 1 − 0.4 = 0.6
(2)店内恰有 3 个顾客的概率

p3 = ρ 3 (1 − ρ ) = 0.43 × (1 − 0.4) = 0.38
(3)店内至少有 1 个顾客的概率

P{N ≥ 1} = 1 − p0 = ρ = 0.4
(4)在店内的平均顾客数

Ls =

ρ
1− ρ

= 0.67 (人)

(5)每位顾客在店内的平均逗留时间

Ws =

Ls

λ

=

0.67
(h ) = 10(min)
4

(6)等待服务的平均顾客数

Lq = Ls − ρ =

ρ2
0 .4 2
=
= 0.267 (人)
1 − ρ 1 − 0 .4

(7)每位顾客平均等待服务时间

Wq =

Lq

λ

=

0.267
(h ) = 4(min)
4

(8)顾客在店内逗留时间超过 10min 的概率

P{T > 10} = e

1 1
−10 ( − )
6 15

= e −1 = 0.3679

编写 LINGO 程序如下: model: -127-

s=1;lamda=4;mu=10;rho=lamda/mu;
Pwait=@peb(rho,s);
p0=1-Pwait;
Pt_gt_10=@exp(-1);
end

4.3 多服务台模型( M / M / s / ∞ )
设顾客单个到达,相继到达时间间隔服从参数为 λ 的负指数分布,系统中共有 s 个
服务台,每个服务台的服务时间相互独立,且服从参数为 μ 的负指数分布。当顾客到
达时,
若有空闲的服务台则马上接受服务,
否则便排成一个队列等待,
等待时间为无限。
下面来讨论这个排队系统的平稳分布。记 pn = P{N = n} ( n = 0,1,2, L )为系统
达到平稳状态后队长 N 的概率分布,注意到对个数为 s 的多服务台系统,有 λn = λ , n = 0,1,2, L


⎧nμ , n = 1,2, L , s
⎩sμ , n = s, s + 1, L

μn = ⎨
记 ρs =

ρ s =

λ
,则当 ρ s < 1 时,由式(4)
,式(5)和式(6)
,有 sμ ⎧ (λ / μ ) n

⎪ n!

Cn = ⎨ s ⎪ (λ / μ )
⎪ s!


, n = 1,2, L , s n ⎛ λ ⎞
(λ / μ ) n
⎜ ⎟ =
, n≥s
⎜ sμ ⎟ s! s n−s
⎝ ⎠

(18)



⎧ρn
⎪ n! p0 , n = 1,2, L , s

pn = ⎨ n
⎪ ρ p , n≥s
⎪ s! s n− s 0


(19)

其中

⎡ s −1 ρ n ρs ⎤
+
p0 = ⎢∑

⎣ n=0 n! s!(1 − ρ s ) ⎦

−1

(20)

公式(19)和式(20)给出了在平衡条件下系统中顾客数为 n 的概率,当 n ≥ s 时,即
系统中顾客数大于或等于服务台个数,这时再来的顾客必须等待,因此记


c ( s, ρ ) = ∑ pn = n=s ρs s!(1 − ρ s )

(21)

p0

式(21)称为 Erlang 等待公式,它给出了顾客到达系统时需要等待的概率。
对多服务台等待制排队系统,由已得到的平稳分布可得平均排队长 Lq 为:

p0 ρ s
Lq = ∑ (n − s ) pn = s! n = s +1


-128-



∑ (n − s) ρ n= s

n−s s p0 ρ s d ⎛ ∞ n ⎞ p0 ρ s ρ s
⎜ ∑ ρs ⎟ = s! dρ s ⎝ n=1 ⎠ s!(1 − ρ s ) 2

=

(22)



c ( s, ρ ) ρ s
1 − ρs

Lq =

(23)

记系统中正在接受服务的顾客的平均数为 s ,显然 s 也是正在忙的服务台的平均数,故 s −1

nρ n ρs p0 + s p0 s!(1 − ρ s ) n =0 n!



s −1

s = ∑ npn + s ∑ pn = ∑ n =0

n=s



ρ n−1 ρ s −1
= p0 ρ ⎢ ∑
+
⎥=ρ
( s − 1)!(1 − ρ s ) ⎦ n =1 ( n − 1)!

s −1

(24)

式(24)说明,平均在忙的服务台个数不依赖于服务台个数 s ,这是一个有趣的结果。
由式(24)
,可得到平均队长 Ls 为

Ls = 平均排队长 + 正在接受服务的顾客的平均数 = Lq + ρ

(25)

对多服务台系统,Little 公式依然成立,即有

Ws =

Ls

λ

, Wq =

Lq

λ

= Ws −

1

(26)

μ

例 2

某 售 票 处 有 3 个 窗 口 , 顾 客 的 到 达 为 Poisson 流 , 平 均 到 达 率 为 λ = 0.9人 / min ;服务(售票)时间服从负指数分布,平均服务率 μ = 0.4人 / min 。
现设顾客到达后排成一个队列,依次向空闲的窗口购票,这一排队系统可看成是一个
M / M / s / ∞ 系统,其中

s = 3,ρ =

λ λ 2.25
= 2.25 , ρ s =
=
1 的情况( M / M / s / s )
例4 某单位电话交换台有一台200门内线的总机,
已知在上班8h的时间内,
有20%的
内线分机平均每40min要一次外线电话,
80%的分机平均隔120min要一次外线。又知外线
打入内线的电话平均每分钟1次。假设与外线通话的时间平均为3min,并且上述时间均服
从负指数分布,如果要求电话的通话率为95%,问该交换台应设置多少条外线?
解 (1)电话交换台的服务分成两类,第一类内线打外线,其强度为

60
⎛ 60

× 0.2 +
× 0.8 ⎟ × 200 = 140
120
⎝ 40


λ1 = ⎜

第二类是外线打内线,其强度为

λ2 = 1 × 60 = 60
-131-

因此,总强度为

λ = λ1 + λ2 = 140 + 60 = 200
(2)这是损失制服务系统,按题目要求,系统损失的概率不能超过5%,即

Plost ≤ 0.05
(3)外线是整数,在满足条件下,条数越小越好。
由上述三条,写出相应的LINGO程序如下: model: lamda=200; mu=60/3;rho=lamda/mu; Plost=@pel(rho,s);Plost K

(27)



pn = ρ n p0 , n = 1,2, L , K
其中

⎧ 1− ρ
⎪1 − ρ K +1 , ρ ≠ 1
1

=⎨
p0 =
K
1+ ∑ ρ n ⎪ 1 , ρ = 1
⎪K +1

n =1

(28)

由已得到的单服务台混合制排队系统平稳状态下队长的分布,可知当 ρ ≠ 1 时,平
均队长 Ls 为:
K

K

n =0

n =1

Ls = ∑ npn = p0 ρ ∑ nρ n−1
=

ρ p0 ρ
( K + 1) ρ K +1

[1 − ρ K − (1 − ρ ) Kρ K ] =
(1 − ρ ) 2
1− ρ
1 − ρ K +1

(29)

当 ρ = 1 时,
K

K

n =0

n =1

Ls = ∑ npn = ∑ nρ n p0 =

K
1 K
∑n = 2
K + 1 n=1

(30)

类似地可得到平均排队长 Lq 为
K

Lq = ∑ (n − 1) pn = Ls − (1 − p0 )

(31)

⎧ ρ ρ (1 + Kρ K )

,
⎪1 − ρ
1 − ρ K +1

Lq = ⎨
⎪ K ( K − 1) , ρ = 1
⎪ 2( K + 1)


(32)

n =1



ρ ≠1

由于排队系统的容量有限,只有 K − 1 个排队位置,因此,当系统空间被占满时,
再来的顾客将不能进入系统排队,
也就是说不能保证所有到达的顾客都能进入系统等待
-133-

服务。假设顾客的到达率(单位时间内来到系统的顾客的平均数)为 λ ,则当系统处
于状态 K 时,顾客不能进入系统,即顾客可进入系统的概率是 1 − p K 。因此,单位时
间内实际可进入系统的顾客的平均数为:
λe = λ (1 − pK ) = μ (1 − p0 )
(33)

它表示了在来到系统的所有顾客中不
称 λe 为有效到达率, p K 也被称为顾客损失率,
能进入系统的顾客的比例。下面根据 Little 公式,可得
平均逗留时间

Ws =

Ls

=

Ls λ (1 − pk )

Lq

=

Lq

λe

(34)

平均等待时间

Wq =

λe

λ (1 − p K )

(35)

且仍有

Ws = Wq +

1

(36)

μ

注意:这里的平均逗留时间和平均等待时间都是针对能够进入系统的顾客而言的。
M
特别, K = 1 时, / M / 1 / 1 为单服务台损失系统,

在上述有关结果中令 K = 1 ,
可得到:

p0 =

ρ
1
, p1 =
1+ ρ
1+ ρ

Ls = p1 =

ρ
1+ ρ



λe = λ (1 − p1 ) = λp0 =
Ws =

Ls

λe

=

(37)
(38)

λ
1+ ρ

ρ 1
=
λ μ

Lq = 0 ,Wq = 0

(39)
(40)
(41)

例 5 某修理站只有一个修理工,且站内最多只能停放 4 台待修的机器。设待修机
器按 Poisson 流到达修理站,平均每分钟到达 1 台;修理时间服从负指数分布,平均每
1.25 分钟可修理 1 台,试求该系统的有关指标。
解 该系统可看成是一个 M / M / 1 / 4 排队系统,其中

λ = 1, μ =

1 λ = 0.8 , ρ = = 1.25 , K = 4
1.25
μ

由式(28)


p0 =

1− ρ
1 − 1.25
=
= 0.122
5
1− ρ
1 − 1.255

因而,顾客损失率为:

p4 = ρ 4 p0 = 1.254 × 0.122 = 0.298
有效到达率为:
-134-

λe = λ (1 − p4 ) = 1 × (1 − 0.298) = 0.702
平均队长

Ls =

1.25
(4 + 1) × 1.255

= 2.44 (台)
1 − 1.25
1 − 1.255

平均排队长

Lq = Ls − (1 − p0 ) = 2.44 − (1 − 0.122) = 1.56 (台)
平均逗留时间

Ws =

Ls

λe

=

2.44
= 3.48 (分钟)
0.702

平均等待时间

Wq = Ws −

1

μ

= 3.48 −

1
= 2.23 (分钟)
0.8

编写 LINGO 程序如下: model: sets: state/1..4/:p; endsets lamda=1;mu=1/1.25;rho=lamda/mu;k=4; lamda*p0=mu*p(1);
(lamda+mu)*p(1)=lamda*p0+mu*p(2);
@for(state(i)|i #gt#1 #and# i #lt# k:(lamda+mu)*p(i)=lamda*p(i-1)+mu*p(i+1)); lamda*p(k-1)=mu*p(k); p0+@sum(state:p)=1; P_lost=p(k);lamda_e=lamda*(1-P_lost);
L_s=@sum(state(i)|i #le#k:i*p(i));
L_q=L_s-(1-p0);
W_s=L_s/lamda_e;
W_q=W_s-1/mu;
end
6.2 多服务台混合制模型
多服务台混合制模型 M / M / s / K 是指顾客的相继到达时间服从参数为 λ 的负指
数分布,服务台个数为 s ,每个服务台服务时间相互独立,且服从参数为 μ 的负指数分
布,系统的空间为 K 。
由式(4)
,式(5)和式(6)
,并注意到在本模型中

⎧λ , n = 0,1,2, L , K − 1 λn = ⎨
⎩0, n ≥ K
⎧nμ , 0 ≤ n < s μn = ⎨
⎩ sμ , s ≤ n ≤ K

于是

-135-

⎧ρn
⎪ n! p0 , 0 ≤ n < s

pn = ⎨ n
⎪ ρ p , s≤n≤K
⎪ s! s n− s 0


(42)

⎧⎛ s −1 ρ n ρ s (1 − ρ K −s +1 ) ⎞ −1 s ⎟ , ρs ≠ 1
⎪⎜ ∑
+
⎜ s!(1 − ρ s ) ⎟
⎪⎝ n=0 n!

p0 = ⎨
−1
⎪⎛ s −1 ρ n ρ s

( K − s + 1) ⎟ , ρ s = 1
+
⎪⎜ ∑

⎜ s! n =0 n!

⎩⎝

(43)

其中

由平稳分布 pn , n = 0,1,2, L , K ,可得平均排队长为
K

Lq = ∑ (n − s ) pn n=s ⎧ p0 ρ s ρ s
K − s +1
− (1 − ρ s )( K − s + 1) ρ sK −s ], ρ s ≠ 1
⎪ s!(1 − ρ ) 2 [1 − ρ s

s
=⎨
s
⎪ p0 ρ ( K − s)( K − s + 1)
, ρs = 1

2s!


(44)

为求平均队长,由
K

K

K

Lq = ∑ (n − s ) pn = ∑ npn − s ∑ pn n=s n=s

n=s

s −1


= ∑ npn − ∑ npn − s⎜1 − ∑ pn ⎟ = Ls − ∑ (n − s ) pn − s n =0 n =0 n =0
⎝ n =0 ⎠ s −1

K

s −1

得到

(n − s ) ρ n n! n =0 s −1

Ls = Lq + s + p0 ∑

(45)

由系统空间的有限性,必须考虑顾客的有效到达率 λe 。对多服务台系统,仍有

λe = λ (1 − p K )

(46)

再利用 Little 公式,得到

Ws =

Ls

λe

, Wq =

Lq

λe

= Ws −

1

μ

平均被占用的服务台数(也是正在接受服务的顾客的平均数)为 s −1
K
K
⎡ s −1 nρ n ρn ⎤ s = ∑ npn + s ∑ pn = p0 ⎢∑
+ s ∑ n−s ⎥ n =0 n=s n = s s! s

⎣ n=0 n! n −1 n −1 s −1
K
s −1

⎡ ρn K ρn

ρ ρ ρK ⎤
+ ∑ n−s −
= p0 ρ ⎢ ∑
+ ∑ n−1− s ⎥ = p0 ρ ⎢∑ s! s K − s ⎥


⎣ n=0 n! n= s s! s
⎣ n=1 (n − 1)! n= s s! s

-136-

(47)

= ρ (1 −

ρK s! s K − s

p0 ) = ρ (1 − p K )

(48)

因此,又有

Ls = Lq + s = Lq + ρ (1 − p K )

(49)

例 6 某汽车加油站设有两个加油机,汽车按 Poisson 流到达,平均每分钟到达 2
辆;汽车加油时间服从负指数分布,平均加油时间为 2 分钟。又知加油站上最多只能停
放 3 辆等待加油的汽车,汽车到达时,若已满员,则必须开到别的加油站去,试对该系
统进行分析。
解 可将该系统看作一个 M / M / 2 / 5 排队系统,其中

λ = 2 , μ = 0.5 , ρ =

λ
= 4 ,s = 2, K = 5 μ (1)系统空闲的概率
−1


4 2 [1 − (4 / 2) 5−2+1 ] ⎫ p0 = ⎨1 + 4 +
⎬ = 0.008
2!(1 − 4 / 2) ⎭

(2)顾客损失率

p5 =

45 × 0.008
= 0.512
2!×25−2

(3)加油站内在等待的平均汽车数

0.008 × 4 2 × (4 / 2)
[1 − (4 / 2) 5−2+1 − (1 − 4 / 2)(5 − 2 + 1)(4 / 2) 5−2 ]
2!(1 − 4 / 2) 2
= 2.18 (辆)

Lq =

加油站内汽车的平均数为

Ls = Lq + ρ (1 − p5 ) = 2.18 + 4(1 − 0.512) = 4.13 (辆)
(4)汽车在加油站内平均逗留时间为

Ws =

Ls
4.13
=
= 4.23 (分钟) λ (1 − p5 ) 2(1 − 0.512)

汽车在加油站内平均等待时间为

Wq = Ws −

1

μ

= 4.23 − 2 = 2.23 (分钟)

(5)被占用的加油机的平均数为

s = Ls − Lq = 4.13 − 2.18 = 1.95 (个)
编写 LINGO 程序如下: model: sets: state/1..5/:p; endsets lamda=2;mu=0.5;rho=lamda/mu;s=2;k=5; lamda*p0=mu*p(1);
(lamda+mu)*p(1)=lamda*p0+2*mu*p(2);
@for(state(i)|i #gt#1 #and# i #lt# s:
(lamda+i*mu)*p(i)=lamda*p(i-1)+(i+1)*mu*p(i+1));
-137-

@for(state(i)|i #ge# s #and# i #lt# k:
(lamda+s*mu)*p(i)=lamda*p(i-1)+s*mu*p(i+1));
lamda*p(k-1)=s*mu*p(k); p0+@sum(state:p)=1; P_lost=p(k);lamda_e=lamda*(1-P_lost);
L_s=@sum(state(i):i*p(i));
L_q=L_s-lamda_e/mu;
W_s=L_s/lamda_e;
W_q=W_s-1/mu; end 在对上述多服务台混合制排队模型 M / M / s / K 的讨论中,当 s = K 时,即为多
服务台损失制系统。对损失制系统,有

pn =

ρn n! p0 , n = 1,2, L , s

(50)

其中

⎛ s ρn ⎞

p0 = ⎜ ∑

⎟ n =0 n! ⎠


−1

(51)

顾客的损失率为

ρs ⎛

s

ρn ⎞

−1

⎜∑

(52) s! ⎜ n=0 n! ⎟


式(52)称为 Erlang 损失公式, B ( s, ρ ) 亦表示了到达系统后由于系统空间已被占满
B ( s, ρ ) = p s =

而不能进入系统的顾客的百分比。
对损失制系统,平均被占用的服务台数(正在接受服务的顾客的平均数)为
s

nρ n p0 n =0 n! s s = ∑ npn = ∑ n =0

−1

⎛ s ρ n ρ s ⎞⎛ s ρ n ⎞
⎟⎜ ∑
⎟ = ρ (1 − B( s, ρ ))
= ρ⎜ ∑

⎜ s! ⎟⎜ n=0 n! ⎟ n =0 n!

⎠⎝


(53)

此外,还有
平均队长 Ls = s =

ρ (1 − B( s, ρ ))
(54)
L ρ [1 − B( s, ρ )] 1
=
平均逗留时间 Ws = s =
(55)
λe λ[1 − B( s, ρ )] μ
其中 λe = λ (1 − ps ) 为有效到达率。在损失制系统中,还经常用 A = λ (1 − ps ) 表示系
统的绝对通过能力,即单位时间内系统实际可完成的服务次数;用 Q = 1 − ps 表示系统
的相对通过能力,
即被服务的顾客数与请求服务的顾客数的比值。
系统的服务台利用率
(或通道利用率)为

η=
§7

s s 其它排队模型简介
7.1 有限源排队模型

-138-

(56)

现在,
来分析一下顾客源为有限的排队问题。
这类排队问题的主要特征是顾客总数
是有限的,如果有 m 个顾客。每个顾客来到系统中接受服务后仍回到原来的总体,还
有可能再来,这类排队问题的典型例子是机器看管问题。如一个工人同时看管 m 台机
器,
当机器发生故障时即停下来等待维修,
修好后再投入使用,
且仍然可能再发生故障。
类似的例子还有 m 个终端共用一台打印机等,如图 2 所示。

图2

有限源排队系统

关于顾客的平均到达率,
在无限源的情形中是按全体顾客来考虑的,
而在有限源的
情形下,必须按每一顾客来考虑。设每个顾客的到达率都是相同的,均为 λ (这里 λ 的
含义是指单位时间内该顾客来到系统请求服务的次数)
,且每一顾客在系统外的时间均
服从参数为 λ 的负指数分布。由于在系统外的顾客的平均数为 m − Ls ,故系统的有效
到达率为

λe = λ (m − Ls )
下面讨论平稳状态下队长 N 的分布 pn = P{N = n} , n = 0,1,2, L , m 。由于状态
间的转移率为

λn = λ (m − n) , n = 0,1,2, L , m
⎧nμ , n = 1,2, L , s μn = ⎨
⎩sμ , n = s + 1, L , m
由式(4)
,式(5)和式(6)
,有(记 ρ =

λ

μ

m!

n
⎪ (m − n)! n! ρ , n = 1,2, L , s

Cn = ⎨ m! ⎪ ρ n , n = s, L , m n−s ⎪ (m − n)! s! s


(57)

m!

n
⎪ (m − n)!n! ρ p0 , n = 1,2,L, s

pn = ⎨ m! ⎪ ρ n p0 , n = s,L , m n− s
⎪ (m − n)! s! s


(58)



其中 m ⎡ s −1

m! m! ρn + ∑ ρn⎥ p0 = ⎢∑ n−s n = s ( m − n)! s! s
⎣ n=0 (m − n)!n!


−1

(59)

下面给出系统的有关运行指标

-139-

m

Lq = ∑ (n − s ) pn

(60)

n= s s −1

s −1

n =0

n =0

Ls = ∑ npn + Lq + s (1 − ∑ pn )

(61)

λe
= Lq + ρ (m − Ls ) μ (62)



Ls = Lq +
Ws =

Ls

λe

,Wq =

Lq

(63)

λe

特别,对单服务台( s = 1 )系统,有

pn =

m! ρ n p0 , n = 1,2, L , m
(m − n)!

⎡m

m! ρn⎥ p0 = ⎢∑
⎣ n=0 (m − n)! ⎦

(64)

−1

(65)

m

Lq = ∑ (n − 1) pn

(66)

Ls = Lq + (1 − p0 )

(67)

n =1



Ls = m −
Ls

μ
(1 − p0 ) λ (68)

m
1
1
− ,Wq = Ws − λe μ (1 − p0 ) λ μ 系统的相对通过能力 Q = 1 ,绝对通过能力
A = λe Q = λ (m − Ls ) = μ (1 − p0 )
Ws =

=

(69)

(70)

例 7 设有一工人看管 5 台机器,每台机器正常运转的时间服从负指数分布,平均
为 15 分钟。当发生故障后,每次修理时间服从负指数分布,平均为 12 分钟,试求该系
统的有关运行指标。
解 用有限源排队模型处理本问题。已知

λ=

λ
1
1
,μ =
,ρ =
= 0.8 , m = 5 μ 15
12

于是,有
(1)修理工人空闲的概率
−1

5!
5!
5!
5!
5!

⎡ 5! p0 = ⎢ (0.8) 0 + (0.8)1 + (0.8) 2 + (0.8) 3 + (0.8) 4 + (0.8) 5 ⎥ = 0.0073
4!
3!
2!
1!
0!
⎣ 5!

(2)5 台机器都出故障的概率

p5 =
-140-

5!
(0.8) 5 p0 = 0.287
0!

(3)出故障机器的平均数

Ls = 5 −

1
(1 − 0.0073) = 3.76 (台)
0.8

(4)等待修理机器的平均数

Lq = 3.76 − (1 − 0.0073) = 2.77 (台)
(5)每台机器发生一次故障的平均停工时间

Ws =

5
1
(1 − 0.0073)
12

− 15 = 46 (分钟)

(6)每台机器平均待修时间
Wq = 46 − 12 = 34 (分钟)
(7)系统绝对通过能力(即工人的维修能力)

1
(1 − 0.0073) = 0.083 (台)
12
即该工人每小时可修理机器的平均台数为 0.083 × 60 = 4.96 台。
A=

上述结果表面,机器停工时间过长,看管工人几乎没有空闲时间,应采取措施提高
服务率或增加工人。
LINGO 计算程序如下 model: lamda=1/15;mu=1/12;rho=lamda/mu;s=1;m=5; load=m*rho; L_s=@pfs(load,s,m); p_0=1-(m-L_s)*rho; lamda_e=lamda*(m-L_s); p_5=@exp(@lgm(6))*0.8^5*p_0; L_q=L_s-(1-p_0); w_s=L_s/lamda_e;w_q=L_q/lamda_e; end
7.2 服务率或到达率依赖状态的排队模型
在前面的各类排队模型的分析中,均假设顾客的到达率为常数 λ ,服务台的服务
率也为常数 μ 。而在实际的排队问题中,到达率或服务率可能是随系统的状态而变化
的。例如,当系统中顾客数已经比较多时,后来的顾客可能不愿意再进入系统;服务员
的服务率当顾客较多时也可能会提高。因此,对单服务台系统,实际的到达率和服务率
(它们均依赖于系统所处的状态 n )可假设为

λn =

λ0

, n = 0,1,2, L
(n + 1) a μ n = n b μ1 , n = 1,2, L

对多服务台系统,实际到达率和服务率假设为

⎧λ0 , n ≤ s − 1

λn = ⎨⎛ s ⎞ a
⎟ λ0 , n ≥ s − 1
⎪⎜
⎩⎝ n + 1 ⎠
-141-

⎧nμ1 , n ≤ s

μ n = ⎨⎛ n ⎞ b
⎪⎜ ⎟ sμ1 , n ≥ s
⎩⎝ s ⎠

其中 λn 和 μ n 分别为系统处于状态 n 时的到达率和服务率。
上述假设表明,
到达率 λn 同
系统中已有顾客数 n 呈反比关系;服务率 μ n 同系统状态 n 呈正比关系。
由式(4)
,对多服务台系统有

⎧ (λ0 / μ1 ) n
, n = 1,2, L , s

n!

Cn = ⎨
(λ0 / μ1 ) n

, n = s, s + 1, L
⎪ s!(n! / s!) a+b s (1−a −b )( n−s )


(71)

下面看一个简单的特例,考虑一个到达依赖状态的单服务台等待制系统
M / M / 1 / ∞ ,其参数为

λ

λn =

n +1

, n = 0,1,2, L

μ n = μ , n = 1,2, L
于是由式(5)
,式(6)
,并设 ρ =

pn =

ρn

n! p0 = e − ρ

λ
< 1 ,有 μ p0 , n = 1,2, L

(72)
(73)

平均队长

nρ n
Ls = ∑ npn = ∑ p0 = ρ n =0 n =0 n!




(74)

平均排队长


Lq = ∑ (n − 1) pn = Ls − (1 − p0 ) = ρ + e − ρ − 1

(75)

n =1

有效到达率(单位时间内实际进入系统的顾客的平均数)


λe = ∑ n =0

λ n +1

pn = μ (1 − e − ρ )

(76)

平均逗留时间为

Ws =

ρ

Ls

=

Lq

= Ws −

λe

μ (1 − e − ρ )

(77)

平均等待时间

Wq =
7.3
-142-

λe

1

μ

非生灭过程排队模型

(78)

一个排队系统的特征是由输入过程,
服务机制和排队规则决定的。
本章前面所讨论
的排队模型都是输入过程为 Poisson 流,服务时间服从负指数分布的生灭过程排队模
型。
这类排队系统的一个主要特征是马尔可夫性,
而马尔可夫性的一个主要性质是由系
统当前的状态可以推断未来的状态。
但是,
当输入过程不是 Poisson 流或服务时间不服
从负指数分布时,仅知道系统内当前的顾客数,对于推断系统未来的状态是不充足的,
因为正在接受服务的顾客,已经被服务了多长时间,将影响其离开系统的时间。因此,
必须引入新的方法来分析具有非负指数分布的排队系统。
7.3.1 M / G / 1 排队模型
M / G / 1 系统是指顾客的到达为 Poisson 流,单个服务台,服务时间为一般分布
的排队系统。现假设顾客的平均到达率为 λ ,服务时间的均值为
证明: ρ =


1

μ

,方差为 σ ,则可
2

λ
< 1 时,
系统可以达到平稳状态,
而给出平稳分布的表示是比较困难的。 μ 已有的几个结果为:

p0 = 1 − ρ

(79)

λ2σ 2 + ρ 2
2(1 − ρ )
Ls = ρ + Lq
Lq =

Wq =

(80)
(81)

Lq

(82)

λ

Ws = Wq +

1

(83)

μ

由式(80)可看出, Lq , Ls , Ws , Wq 等仅依赖于 ρ 和服务时间的方差 σ ,而与分布的类
2

型没有关系,这是排队论中一个非常重要且令人惊奇的结果,式(80)通常被称为
Pollaczek-Khintchine(P-K)公式。
从式(80)还不难发现,当服务率 μ 给定后,当方差 σ 减少时,平均队长和等待
2

时间等都将减少。
因此,
可通过改变服务时间的方差来缩短平均队长,
当且仅当 σ = 0 ,
即服务时间为定长时,平均队长(包括等待时间)可减少到最少水平,这一点是符合直
观的,因为服务时间越有规律,等候的时间也就越短。
例 8 有一汽车冲洗台,汽车按 Poisson 流到达,平均每小时到达 18 辆,冲洗时
2

间 V 根据过去的经验表明,有 E (V ) = 0.05h / 辆,Var (V ) = 0.01( h/辆) ,求有关运行
指标,并对系统进行评价。
2



本例中, λ = 18 , ρ = λE (V ) = 18 × 0.05 = 0.9 , σ = 0.01 , μ = 20 ,于
2



18 2 × 0.01 + (0.9) 2
= 20.25 (辆)
2(1 − 0.9)
Ls = 20.25 + 0.9 = 21.15 (辆)
21.15
Ws =
= 1.175 (h)
18
Lq =

-143-

Wq =

20.25
= 1.125 (h)
18

上述结果表明,
这个服务机构很难令顾客满意,
突出的问题是顾客的平均等待时间

Wq
1.125
= 22.5 倍(通常称
为顾客的时间损失系数)

E (V )
E (V ) 0.05
1
这时,E (V ) = , = Var(V) = 0 , σ2 例 9 考虑定长服务时间 M / D / 1 / ∞ 模型,

是服务时间的

Wq

=

μ

由式(80)有

λ2
2(1 − ρ ) 2 μ ( μ − λ ) λ (2μ − λ )
Ls = Lq + ρ =
2μ ( μ − λ )
2
ρ λ =
Wq =
2λ (1 − ρ ) 2 μ ( μ − λ )
Lq =

ρ2

Ws = Wq +

=

(84)
(85)
(86)

1

(87)

μ

将式(13)和式(86)比较,不难发现在服务时间服从负指数分布的条件下,等待时间
正好是定长服务时间的 2 倍。可以证明,在一般服务时间分布下得到的 Lq 和 Wq 中,以
定长服务时间下得到的为最小。
7.3.2 爱尔朗(Erlang)排队模型
爱尔朗分布族比负指数分布族对现实世界具有更广泛的适应性。下面介绍一个最
简单的爱尔朗排队模型。
对爱尔朗排队模型研究的一般方法是根据 k 阶 Erlang 分布恰为 k 个相同负指数分
布随机变量和的分布这个关系,把服务时间或到达过程假想地(实际并非如此)分为 k
个独立的同分布的位相(或阶段)
,然后利用负指数分布的性质来加以分析。如对
M / Ek / 1 / ∞ 系统来说,服务时间是 k 阶 Erlang 分布,把每个顾客的服务时间假想地
分为 k 个位相,每个位相的平均服务时间为

1
,顾客先进入第 k 个位相,最后进入第 kμ 1 个位相。仍令 N 为系统达到平衡状态时的顾客数,但考虑到顾客可能处在不同位相,
故系统的状态一般用 ( n, i ) 表示,其中 n 表示有 n 个顾客在系统中, i 表示正在接受服
务的顾客处在第 i 个位相,令

pni = P{N = (n, i )}
则可得到类似于(3)的差分方程组,从而在平稳分布存在的条件下得到平稳分布和各
有关指标。由于本节已给出了 M / G / 1 / ∞ 系统的主要结果,作为一个特例,可直接给
出 M / Ek / 1 / ∞ 的主要数量指标。
由于服务时间为 k 阶 Erlang 分布,其分布密度函数为

a (t ) =

μk ( μkt ) k −1
(k − 1)!

故其均值和方差分别为
-144-

e −μ kt , t ≥ 0

(88)

E ( Ek ) =
将ρ =

1

μ

, Var ( Ek ) =

1 kμ 2

λ
1
2
,σ =
代入式(80)~式(83)
,得 kμ 2 μ ρ 2 (k + 1) ρ2 (k − 1) ρ 2
Lq =
=

2k (1 − ρ ) 1 − ρ 2k (1 − ρ ) ρ (k − 1) ρ 2
Ls = Lq + ρ =

1 − ρ 2k (1 − ρ )
1
(k − 1) ρ
Ws =

μ (1 − ρ ) 2kμ (1 − ρ )
(k − 1) ρ ρ Wq =

μ (1 − ρ ) 2kμ (1 − ρ )

(89)
(90)
(91)
(92)

例 10 设一电话间的顾客按 Poisson 流到达,平均每小时到达 6 人,平均通话时
间为 8 分钟,方差为 16 分钟。直观上估计通话时间服从爱尔朗分布,管理人员想知道
平均排队长度和顾客平均等待时间是多少?
解 设 V 为通话时间,服从 k 阶 Erlang 分布,由

k=

[ E (V )]2 8 2
=
=4
Var (V ) 16

可知该系统为 M / E4 / 1 / ∞ 系统,其中 ρ = 6 ×

8
= 0.8 。由式(89)
,有
60

(0.8) 2 (4 + 1)
Lq =
= 2 (人)
2 × 4(1 − 0.8)
L
2
Wq = q = = 0.33 (h) λ 6
§8

排队系统的优化
排队系统中的优化模型,
一般可分为系统设计的优化和系统控制的优化。
前者为静
态优化,即在服务系统设置以前根据一定的质量指标,找出参数的最优值,从而使系统
最为经济。
后者为动态优化,
即对已有的排队系统寻求使其某一目标函数达到最优的运
营机制。
由于对后一类问题的阐述需要较多的数学知识,
所以本节着重介绍静态最优问
题。
在优化问题的处理方法上,
一般根据变量的类型是离散的还是连续的,
相应地采用
边际分析方法或经典的微分法,
对较为复杂的优化问题需要用非线性规划或动态规划等
方法。
8.1 M / M / 1 模型中的最优服务率 μ
先考虑 M / M / 1 / ∞ 模型,
取目标函数 z 为单位时间服务成本与顾客在系统中逗留
费用之和的期望值,即

z = cs μ + cw Ls
其中 cs 为服务一个顾客时单位时间内的服务费用, cw 为每个顾客在系统中逗留单位时
-145-

间的费用,则由式(9)
,有

z = cs μ + cw

λ μ −λ



dz
1
= cs − cw λ
=0

(μ − λ )2
解出最优服务率为

cw
(93)
λ cs 下面考虑 M / M / 1 / K 模型,
从使服务机构利润最大化来考虑。
由于在平稳状态下,
它也等于单位时间内实际
单位时间内到达并进入系统的平均顾客数为 λe = λ (1 − p K ) ,
服务完的平均顾客数。设每服务一个顾客服务机构的收入为 G 元,于是单位时间内收
入的期望值是 λ (1 − p K )G 元,故利润 z 为

μ* = λ +

z = λ (1 − p K )G − cs μ = λG

1− ρ K
− cs μ
1 − ρ K +1

μ K − λK
= λμG K +1
−c μ μ − λK +1 s


dz
= 0 ,得 dμ ρ

K +1

当给定 K 和

K − ( K + 1) ρ + ρ K +1 cs
=
(1 − ρ K +1 ) 2
G

(94)

cs
*
后,即可由(94)式得到最优利润的 μ 。
G

例 11 设某工人照管 4 台自动机床,机床运转时间(或各台机床损坏的相继时间)
平均为负指数分布,
假定平均每周有一台机床损坏需要维修,
机床运转单位时间内平均
收入 100 元,而每增加 1 单位 μ 的维修费用为 75 元。求使总利益达到最大的 μ 。
*



该系统为 M / M / 1 / K / K 系统,其中
K = 4 , λ = 1 , G = 100 , C s = 75

设 Ls 是队长,则正常运装的机器为 K − Ls 部,因此目标函数为

f = 100( K − Ls ) − 75μ
题意就是在上述条件下,求目标函数 f 的最大值。
编写 LINGO 程序如下: model: s=1;k=4;lamda=1;
L_s=@pfs(k*lamda/mu,s,k);
max=100*(k-L_s)-75*mu; end 求得 μ = 1.799 ,最优目标值 f = 31.49 。
*

-146-

*

例 12 假定有一混合制排队系统 M / M / 1 / K ,其中 K = 3 ,顾客的到达率为每
小时 3.6 人,其到达间隔服从 Poisson 过程,系统服务一个顾客收费 2 元。又设系统的
服务强度 μ ( μ =

1
,T 为服务时间)
服从负指数分布,
其服务成本为每小时 0.5μ 元。
T

求系统为每个顾客的最佳服务时间。
解 系统的损失率为 p K ,则系统每小时服务的人数为 λ (1 − p K ) ,每小时运行成
本为 0.5μ ,因此目标函数为

f = 2λ (1 − p K ) − 0.5μ
题意就是在上述条件下,求目标函数 f 的最大值。
编写 LINGO 程序如下: model: sets: state/1..3/:p; endsets lamda=3.6;k=3; lamda*p0=p(1)/t;
(lamda+1/t)*p(1)=lamda*p0+p(2)/t;
@for(state(i)|i #gt# 1 #and# i #lt# k:
(lamda+1/t)*p(i)=lamda*p(i-1)+p(i+1)/t);
lamda*p(k-1)=p(k)/t; p0+@sum(state:p)=1; max=2*lamda*(1-p(k))-0.5/t; end 求得系统为每位顾客最佳服务时间是0.2238h,系统每小时赢利3.70元。
*

8.2 M / M / s 模型中的最优的服务台数 s
这里仅讨论 M / M / s / ∞ 系统,已知在平稳状态下单位时间内总费用(服务费用
与等待费用)之和的平均值为

z = cs' s + cw L
'

(95)
'

其中 s 为服务台数,cs 是每个服务台单位时间内的费用,L 是平均队长。
由于 cs ,cw 是
给定的,故唯一可变的是服务台数 s ,所以可将 z 看成是 s 的函数,记为 z = z (s ) ,并
*

求使 z (s ) 达到最小的 s 。
因为 s 只取整数, z ( s ) 不是连续函数,故不能用经典的微分法,下面采用边际分
*

析方法。根据 z ( s ) 应为最小的特点,有

z ( s * ) ≤ z ( s * − 1) z ( s * ) ≤ z ( s * + 1)

(96)

将式(95)代入式(96)
,得

cs' s * + cw L( s * ) ≤ cs' ( s * − 1) + cw L( s * − 1) cs' s * + cw L( s * ) ≤ cs' ( s * + 1) + cw L( s * + 1)
化简后得到

-147-

L( s * ) − L( s * + 1) ≤

cs'
≤ L( s * − 1) − L( s * ) cw (97)

依次求当 s = 1,2,3, L 时 L 的值,并计算相邻两个 L 值的差。因

cs'
是已知数,根据其
cw

*

落在哪个与 s 有关的不等式中,即可定出最优的 s 。
例 13 某检验中心为各工厂服务,
要求进行检验的工厂
(顾客)
的到来服从 Poisson
流,平均到达率为 λ = 48(次/d)
;每天来检验由于停工等原因损失 6 元;服务(检验)
;每设置一个检验员的服务成本为
时间服从负指数分布,平均服务率为 μ = 25(次/d)
4 元/d,其它条件均适合 M / M / s / ∞ 系统。问应设几个检验员可使总费用的平均值最
少?


已知 cs = 4 , cw = 6 , λ = 48 , μ = 25 ,
'

λ
= 1.92 ,设检验员数为 s ,由 μ 式(20)和式(25)
−1

⎡ s −1 (1.92) n

(1.92) s p0 = ⎢ ∑
+
( s − 1)!( s − 1.92) ⎥
⎣ n=0 n!

s +1 p0 (1.92)
L = Lq + ρ =
+ 1.92
( s − 1)!( s − 1.92) 2
将 s = 1,2,3,4,5 依次代入得到表 2。
由于

cs' 4
= = 0.67 落在区间 (0.582,21.845) 之间, cw 6

故 s = 3 ,即当设 3 个检验员时可使总费用 z 最小,最小值为
*

z ( s * ) = z (3) = 27.87 (元)
表2
检验员数 s

平均顾客数 L( s )

1
2
3
4
5

L( s) − L( s + 1) ~ L( s − 1) − L( s )

总费用 z ( s )

21.845~ ∞
0.582~21.845
0.111~0.582

154.94
27.87
28.38
31.71


24.49
2.645
2.063
1.952



求解的 LINGO 程序如下: model: lamda=48;mu=25;rho=lamda/mu;
P_wait=@peb(rho,s);
L_q=P_wait*rho/(s-rho);
L_s=L_q+rho;
min=4*s+6*L_s;
@gin(s);@bnd(2,s,5);
end
§9

产生给定分布的随机数的方法
Matlab 可以产生常用分布的随机数。下面我们介绍按照给定的概率分布产生随机

-148-

数的一般方法,这些方法都以 U (0,1) 分布的随机变量为基础。
(i)反变换法
定理 设 X 是一个具有连续分布函数 F (x ) 的随机变量,则 F ( X ) 在[0,1]上服
从均匀分布。
设 概 率 分 布 函 数 F (x ) 是 严 格 单 调 增 的 , F 的 反 函 数 记 作 F

−1

。先产生

−1

U ~ U (0,1) ,再取 X = F (U ) 即为所求,称为反变换法。
指 数 分 布 Exp( λ ) 能 够 方 便 地 用 反 变 换 法 产 生 。 由 Exp( λ ) 的 分 布 函 数
F ( x ) = 1 − e − λx ,可得 ln(1 − U )
X = F −1 (U ) = −

λ

思考

有的书上用 X = −

ln U

λ

代替上式,对吗,为什么?

(ii)卷积法
如果随机变量 X 是 n 个独立、
同分布的另一随机变量 Y 之和, Y 又容易产生时,

先产生 n 个独立的 Y1 , Y2 ,L, Yn ,再令 X = Y1 + L + Yn 即可。因为 X 的分布函数是

Y1 , Y2 ,L, Yn 分布函数的卷积,故称为卷积法。
二项分布可以用卷积法产生。因为 X ~ B( n, p ) 是 n 个独立的 Y ~ Bern( p ) 之和,
而 Y ~ Bern( p ) 很容易由 U ~ U (0,1) 按以下方法得到:若 U ≤ p ,令 Y = 1 ;否则令
Y =0。
(iii)取舍法
若随机变量 X 在有限区间 ( a , b) 内变化,但概率密度 f (x ) 具有任意形式(甚至没
有解析表达式)
,无法用前面的方法产生时,可用取舍法。一种比较简单的取舍法的步
骤是:
o
1 产生 Y ~ U ( a , b) 和 U ~ U (0,1) ;
2 记 C = max f ( x ) ,若 U ≤ o a ≤ x ≤b

f (Y ) o ,则取 X = Y ;否则,舍去,返回 1 。
C

§10 排队模型的计算机模拟
10.1 确定随机变量概率分布的常用方法
在模拟一个带有随机因素的实际系统时,
究竟用什么样的概率分布描述问题中的随
机变量,是我们总是要碰到的一个问题,下面简单介绍确定分布的常用方法:
o
1 根据一般知识和经验,可以假定其概率分布的形式,如顾客到达间隔服从指数
分布 Exp( λ ) ;产品需求量服从正态分布 N ( μ , σ ) ;订票后但未能按时前往机场登机
2

的人数服从二项分布 B ( n, p ) 。然后由实际数据估计分布的参数 λ , μ , σ 等,参数估计
可用极大似然估计、矩估计等方法。
o
2 直接由大量的实际数据作直方图,得到经验分布,再通过假设检验,拟合分布
函数,可用 χ 检验等方法。
2

o

3 既缺少先验知识,
又缺少数据时,
对区间 ( a , b) 内变化的随机变量,
可选用 Beta
分布(包括均匀分布)
。先根据经验确定随机变量的均值 μ 和频率最高时的数值(即密
-149-

度函数的最大值点) m ,则 Beta 分布中的参数 α1 ,α 2 可由以下关系求出:

μ =a+

(α − 1)(b − a ) α1 (b − a )
,m = a + 1
.
α1 + α 2 α1 + α 2 − 2

10.2 计算机模拟
当排队系统的到达间隔时间和服务时间的概率分布很复杂时,或不能用公式给出
时,那么就不能用解析法求解。这就需用随机模拟法求解,现举例说明。
例 14 设某仓库前有一卸货场,货车一般是夜间到达,白天卸货,每天只能卸货 2
车,若一天内到达数超过 2 车,那么就推迟到次日卸货。根据表 3 所示的数据,货车到
达数的概率分布(相对频率)平均为 1.5 车/天,求每天推迟卸货的平均车数。

到达车数



0
0.23

1
0.30

表 3 到达车数的概率
2
3
4
5
0.30
0.1
0.05
0.02

≥6
0.00

解 这是单服务台的排队系统,
可验证到达车数不服从泊松分布,
服务时间也不服
从指数分布(这是定长服务时间)

随机模拟法首先要求事件能按历史的概率分布规律出现。
模拟时产生的随机数与事
件的对应关系如表 4。
表4

到达车数
0
1
2
3
4
5

到达车数的概率及其对应的随机数

概 率
0.23
0.30
0.30
0.1
0.05
0.02

累积概率
0.23
0.53
0.83
0.93
0.98
1.00

对应的随机数
0 ≤ x < 0.23
0.23 ≤ x < 0.53
0.53 ≤ x < 0.83
0.83 ≤ x < 0.93
0.93 ≤ x < 0.98
0.98 ≤ x ≤ 1.00

我们用 a1 表示产生的随机数,a2 表示到达的车数,a3 表示需要卸货车数,a4 表
示实际卸货车数,a5 表示推迟卸货车数。编写程序如下: clear rand('state',sum(100*clock)); n=50000; m=2 a1=rand(n,1); a2=a1; %a2初始化 a2(find(a1 0 ,则称积分 h 1 x+ f1,h ( x) = ∫ h2 f (t )dt h x− 2
为 f (x) 的一次磨光函数, h 称为磨光宽度。
同样的,可以定义 f (x) 的 k 次磨光函数为 h 1 x+ f k ,h ( x) = ∫ h2 f k −1,h (t )dt ( k > 1 ) h x− 2
事实上,
磨光函数 f k ,h ( x) 比 f ( x) 的光滑程度要高,
且当磨光宽度 h 很少时 f k ,h ( x)
很接近于 f (x) 。
1.6.2 等距 B 样条函数
对于任意的函数 f ( x) ,定义其步长为 1 的中心差分算子 δ 如下:
-185-

1
2

1
2

0

0

δf ( x) = f ( x + ) − f ( x − )
在此取 f ( x) = x+ ,则
0

1⎞ ⎛
1⎞
⎛ δ x = ⎜x + ⎟ −⎜x − ⎟
2 ⎠+ ⎝
2 ⎠+

0
是一个单位方波函数(如图 1)
,记 Ω 0 ( x) = δx+ 。并取 h = 1 ,对 Ω 0 ( x) 进行一次磨光
0
+


1
2
1
x−
2

Ω1 ( x) = ∫

1
2
1 x− 2

Ω 0 (t )dt = ∫

x +1

0
0
t + dt − ∫ t + dt = ( x + 1) + − 2 x+ + ( x − 1) +

=∫

x

x+

⎡⎛ 1 ⎞ 0 ⎛ 1 ⎞ 0 ⎤
⎢⎜ t + ⎟ − ⎜ t − ⎟ ⎥ dt
⎢⎝ 2 ⎠ + ⎝ 2 ⎠ + ⎥



x+

x

x −1

显然 Ω1 ( x ) 是连续的(如图 1)


图1

Ω 0 ( x) 和 Ω1 ( x) 的图形

类似地可得到 k 次磨光函数为

Cj ⎛ k +1

Ω k ( x) = ∑ (−1) k +1 ⎜ x +
− j⎟
2
k! ⎝
⎠+
j =0
实际上,可以证明: Ω k ( x) 是分段 k 次多项式,且具有 k − 1 阶连续导数,其 k 阶 k +1
( j = 0,1,2, L , k + 1 )
。从而可知 Ω k ( x) 是
导数有 k + 2 个间断点,记为 x j = j −
2
对应于分划 Δ : −∞ < x0 < x1 < L < xk +1 < +∞ 的 k 次多项式样条函数,称之为基本样 k +1
( j = 0,1,2, L , k + 1 )是
条函数,简称为 k 次 B 样条。由于样条节点为 x j = j −
2
等距的,故 Ω k ( x) 又称为 k 次等距 B 样条函数。
对于任意函数 f ( x) 的 k 次磨光函数,由归纳法可以得到: h h
1 +∞
⎛ x−t ⎞ f k ,h ( x) = ∫ Ω k −1 ⎜
⎟ f (t )dt ( x − ≤ t ≤ x + )
−∞
2
2
h
⎝ h ⎠
+∞
1 +∞
⎛ x−t ⎞
特别地,当 f ( x) = 1 时,有 ∫ Ω k −1 ⎜
⎟dt = 1 ,从而 ∫−∞ Ω k ( x)dx = 1 ,且当 h −∞
⎝ h ⎠ k ≥ 1 时有递推关系 k k +1

j

-186-

1 ⎡⎛
1 ⎞ ⎛ k −1
1 ⎞⎤ k + 1⎞



⎢⎜ x + 2 ⎟Ω k −1 ⎜ x + 2 ⎟ − ⎜ 2 − x ⎟Ω k −1 ⎜ x − 2 ⎟⎥ k ⎣⎝


⎠ ⎝


⎠⎦

Ω k ( x) =

1.6.3 一维等距 B 样条函数插值
等距 B 样条函数与通常的样条有如下的关系:
定理


设有区间 [a, b] 的均匀分划 Δ : x j = x0 + jh( j = 0,1,2, L , n ) h =

b−a

n

则对任意 k 次样条函数 sk ( x) ∈ S P ( Δ, k ) 都可以表示为 B 样条函数族 j = n −1

⎧ ⎛ x − x0 k + 1 ⎞⎫
− j−
⎟⎬
⎨Ω k ⎜
2 ⎠⎭ j =− k
⎩ ⎝ h

的线性组合。
根 据 定 理 , 如 果 已 知 曲 线 上 一 组 点 ( x j , y j ) , 其 中 x j = x0 + jh
( h > 0, j = 0,1,2, L , n )
,则可以构造出一条样条磨光曲线(即为 B 样条函数族的线
性组合)

⎛ x − x0

− j⎟

⎝ h

j =− k
其中 c j ( j = − k ,− k + 1, L , n − 1 )为待定常数。用它来逼近曲线,既有较好的精度, sk ( x) =

n −1

∑c Ω j k

又有良好的保凸性。
实际中,最常用的是 k = 3 的情况,即一般形式为

⎛ x − x0

− j⎟ h ⎠ j = −1
其中 n + 3 个待定系数 c j ( j = −1,0, L , n + 1 )可以由插值条件确定。 s3 ( x ) =

n +1

∑c Ω ⎜

j

3

对于插值条件

⎧s3 ( x j ) = y j ( j = 0,1,2, L n)


⎪s '3 ( x j ) = y ' j ( j = 0, n)




1 n+1 s '3 ( x0 ) = ∑ c j Ω'3 (− j ) = y '0

h j = −1

n +1

⎪ s3 ( xi ) = ∑ c j Ω 3 (i − j ) = yi , i = 0,1,2,L, n

j = −1


1 n+1
⎪s '3 ( xn ) = ∑ c j Ω'3 (n − j ) = y 'n h j = −1



(9)

2
1
, Ω 3 ( ±1) = ,当 x ≥ 2 时
3
6
1
1
1
Ω 3 ( x) = 0 ;且由 Ω'3 ( x) = Ω 2 ( x + ) − Ω 2 ( x − ) 知,Ω'3 (0) = 0 ,Ω'3 (±1) = m ,
2
2
2
当 x ≥ 2 时 Ω'3 ( x) = 0 。则(9)式的每一个方程只有三个非零系数,具体为
注意到 Ω 3 ( x) 的局部非零性及其函数值: Ω 3 (0) =

-187-

⎧− c−1 + c1 = 2hy '0

(10)
⎨ci −1 + 4ci + ci +1 = 6 yi , i = 0,1,2, L , n
⎪− c + c = 2hy ' n ⎩ n−1 n+1
由方程组
(10)
容易求解出 c j ( j = −1,0, L , n + 1 ) 即可得到三次样条函数 s3 ( x)

表达式。
1.6.4 二维等距 B 样条函数插值
设 有 空 间 曲 面 z = f ( x, y ) ( 未 知 ) 如 果 已 知 二 维 等 距 节 点 ( xi , y j ) =


( x0 + ih, y0 + jτ ) ( h,τ > 0 )上的值为 zij ( i = 0,1, L , n; j = 0,1, L , m )
,则相应的 B
样条磨光曲面的一般形式为

⎛ x − x0 ⎞ ⎛ y − y 0

− i ⎟Ω l ⎜
− j⎟

⎝ h
⎠ ⎝ τ

i =− k j =− l
其中 cij ( i = 0,1, L , n; j = 0,1, L , m )为待定常数, k, l 可以取不同值,常用的也是 s ( x, y ) =

n −1 m −1

∑ ∑c Ω ij k

k , l = 2 和 3 的情形。这是一种具有良好保凸性的光滑曲面(函数)
,在工程设计中是常

用的,但只能使用于均匀划分或近似均匀划分的情况。
1.7 二维插值
前面讲述的都是一维插值,即节点为一维变量,插值函数是一元函数(曲线)
。若
节点是二维的,插值函数就是二元函数,即曲面。如在某区域测量了若干点(节点)的
高程(节点值)
,为了画出较精确的等高线图,就要先插入更多的点(插值点)
,计算这
些点的高程(插值)

1.7.1 插值节点为网格节点
已知 m × n 个节点: ( xi , y j , z ij ) ( i = 1,2, L, m; j = 1,2, L, n )
,且 x1 < L < x m ;

y1 < L < y n 。求点 ( x, y ) 处的插值 z 。
Matlab 中有一些计算二维插值的程序。如 z=interp2(x0,y0,z0,x,y,'method') 其中 x0,y0 分别为 m 维和 n 维向量,表示节点,z0 为 n × m 维矩阵,表示节点值,x,y
为一维数组,表示插值点,x 与 y 应是方向不同的向量,即一个是行向量,另一个是列
向量,z 为矩阵,它的行数为 y 的维数,列数为 x 的维数,表示得到的插值,'method'
的用法同上面的一维插值。
如果是三次样条插值,可以使用命令 pp=csape({x0,y0},z0,conds,valconds),z=fnval(pp,{x,y}) 其中 x0,y0 分别为 m 维和 n 维向量,z0 为 m × n 维矩阵, z 为矩阵,它的行数为 x 的维
数,列数为 y 的维数,表示得到的插值,具体使用方法同一维插值。
例2 在一丘陵地带测量高程, x 和 y 方向每隔100米测一个点,得高程如2表,试插
值一曲面,确定合适的模型,并由此找出最高点和该点的高程。
解 编写程序如下: clear,clc x=100:100:500; y=100:100:400; z=[636
697
624
478
450
698
712
630
478
420
-188-

680
674
598
412
400
662
626
552
334
310];
pp=csape({x,y},z') xi=100:10:500;yi=100:10:400 cz1=fnval(pp,{xi,yi}) cz2=interp2(x,y,z,xi,yi','spline') [i,j]=find(cz1==max(max(cz1))) x=xi(i),y=yi(j),zmax=cz1(i,j) 表2

x

y

100

200

300

400

500

100
200
300
400

636
698
680
662

697
712
674
626

624
630
598
552

478
478
412
334

450
420
400
310

1.7.2 插值节点为散乱节点
已知 n 个节点: ( xi , y i , z i )(i = 1,2, L , n) ,求点 ( x, y ) 处的插值 z 。
对上述问题,Matlab 中提供了插值函数 griddata,其格式为:
ZI = GRIDDATA(X,Y,Z,XI,YI)
其中 X、Y、Z 均为 n 维向量,指明所给数据点的横坐标、纵坐标和竖坐标。向量 XI、
YI 是给定的网格点的横坐标和纵坐标,返回值 ZI 为网格(XI,YI)处的函数值。XI
与 YI 应是方向不同的向量,即一个是行向量,另一个是列向量。
例 3 在某海域测得一些点(x,y)处的水深 z 由下表给出,在矩形区域(75,200)
×(-50,150) 内画出海底曲面的图形。
表3
x y z

129
7.5
4



140
141.5
8

103.5
23
6

88
147
8

185.5

195

105

157.5

107.5

77

81

162

162

117.5

22.5
6

137.5
8

85.5
8

-6.5
9

-81
9

3
8

56.5
8

-66.5
9

84
4

-33.5
9

编写程序如下:

x=[129 y=[7.5 z=-[4

140 103.5
141.5 23
8
6

88 185.5
147 22.5
8
6

195 105 157.5 107.5 77
137.5 85.5 -6.5 -81
3
8
8
9
9
8

81 162 162 117.5];
56.5 -66.5 84 -33.5];
8
9
4
9];

xi=75:1:200; yi=-50:1:150; zi=griddata(x,y,z,xi,yi','cubic') subplot(1,2,1), plot(x,y,'*') subplot(1,2,2), mesh(xi,yi,zi)
§2

曲线拟合的线性最小二乘法
2.1 线性最小二乘法
曲线拟合问题的提法是,已知一组(二维)数据,即平面上的 n 个点 ( xi , y i ) ,

i = 1,2,L, n , xi 互不相同,寻求一个函数(曲线) y = f ( x ) ,使 f ( x ) 在某种准则下
与所有数据点最为接近,即曲线拟合得最好。
-189-

线性最小二乘法是解决曲线拟合最常用的方法,基本思路是,令

f ( x ) = a1r1 ( x ) + a 2 r2 ( x ) + L + a m rm ( x )
(11)
其中 rk ( x ) 是事先选定的一组线性无关的函数, ak 是待定系数 ( k = 1,2,L, m, m < n ) 。

称为最小二乘准则。
拟合准则是使 yi ,i = 1,2,L, n , f ( xi ) 的距离 δ i 的平方和最小,
2.1.1 系数 ak 的确定

n

n

i =1

i =1

J ( a1 ,L, a m ) = ∑ δ i2 = ∑ [ f (xi ) − y i ]2
为求 a1 ,L, a m 使 J 达到最小,只需利用极值的必要条件

(12)

∂J
= 0 ( k = 1,L, m ) ,得到
∂a k

关于 a1 ,L, a m 的线性方程组 n m

i =1

k =1

∑ rj ( xi )[∑ ak rk ( xi ) − yi ] = 0, ( j = 1,L, m)

m

n

n

k =1

i =1

i =1

∑ ak [∑ rj ( xi )rk ( xi )] = ∑ rj ( xi )yi , ( j = 1,L, m)

(13)



⎡ r1 ( x1 ) L rm ( x1 ) ⎤
M
M ⎥ ,
R=⎢ M


⎢ r1 ( x n ) L rm ( x n )⎥ n ×m


T
A = [a1 ,L, a m ] , Y = ( y1 ,L, y n ) T
方程组(13)可表为

R T RA = R T Y
(14)
T
当 {r1 ( x ),L, rm ( x )} 线性无关时, R 列满秩, R R 可逆,于是方程组(14)有唯
一解

A = ( R T R ) −1 R T Y
2.1.2

函数 rk ( x ) 的选取

面对一组数据 ( xi , y i ), i = 1,2,L, n ,用线性最小二乘法作曲线拟合时,首要的、
也是关键的一步是恰当地选取 r1 ( x ),L, rm ( x ) 。如果通过机理分析,能够知道 y 与 x 之
间应该有什么样的函数关系,则 r1 ( x ),L, rm ( x ) 容易确定。若无法知道 y 与 x 之间的关
系,通常可以将数据 ( xi , y i ), i = 1,2,L, n 作图,直观地判断应该用什么样的曲线去作
拟合。人们常用的曲线有
y = a1 x + a 2
(i)直线

y = a1 x m + L + a m x + a m +1 (一般 m = 2,3 ,不宜太高) a (iii)双曲线(一支) y = 1 + a 2 x (ii)多项式

-190-

y = a1e a 2 x

(iv)指数曲线

对于指数曲线,拟合前需作变量代换,化为对 a1 ,a 2 的线性函数。
已知一组数据,用什么样的曲线拟合最好,可以在直观判断的基础上,选几种曲线
分别拟合,然后比较,看哪条曲线的最小二乘指标 J 最小。
2.2 最小二乘法的 Matlab 实现
2.2.1 解方程组方法
在上面的记号下,

J ( a1 ,L, a m ) =|| RA − Y ||2
Matlab 中的线性最小二乘的标准型为

min RA − Y
命令为 A = R \ Y 。
例4
拟合。

x y A

2
2

,

用最小二乘法求一个形如 y = a + bx 的经验公式,使它与表 4 所示的数据
2

19
19.0

25
32.3

31
49.0

表4
38
73.3

44
97.8

解 编写程序如下 x=[19 25
31
38
44]';
y=[19.0
32.3 49.0 73.3
97.8]';
r=[ones(5,1),x.^2]; ab=r\y x0=19:0.1:44; y0=ab(1)+ab(2)*x0.^2; plot(x,y,'o',x0,y0,'r')
2.2.2

多项式拟合方法

如果取 {r1 ( x ),L, rm +1 ( x )} = {1, x,L, x } ,
即用 m 次多项式拟合给定数据,
Matlab
m

中有现成的函数 a=polyfit(x0,y0,m) 其中输入参数 x0,y0 为要拟合的数据,m 为拟合多项式的次数,输出参数 a 为拟合多项
式 y=amxm+…+a1x+a0 系数 a=[ am, …, a1, a0]。
多项式在 x 处的值 y 可用下面的函数计算 y=polyval(a,x)。 例 5 某乡镇企业 1990-1996 年的生产利润如表 5。
年份
1990
利润(万元) 70

1991
122

表5
1992
144

1993
152

1994
174

1995
196

1996
202

试预测 1997 年和 1998 年的利润。
解 作已知数据的的散点图, x0=[1990 1991 1992 1993 1994 1995 1996]; y0=[70 122 144
152 174
196 202]; plot(x0,y0,'*') -191-

发现该乡镇企业的年生产利润几乎直线上升。因此,我们可以用 y = a1 x + a 0 作为
拟合函数来预测该乡镇企业未来的年利润。编写程序如下:
x0=[1990 1991 1992 1993 1994 1995 1996]; y0=[70 122 144
152 174
196 202]; a=polyfit(x0,y0,1) y97=polyval(a,1997) y98=polyval(a,1998) 求得 a1 = 20 , a0 = −4.0705 × 10 ,1997 年的生产利润 y97=233.4286,1998 年的
4

生产利润 y98=253.9286。
§3 最小二乘优化
在无约束最优化问题中,有些重要的特殊情形,比如目标函数由若干个函数的平
方和构成。这类函数一般可以写成: m F ( x) = ∑ f i 2 ( x) , x ∈ R n i =1

其中 x = ( x1 , L , x n ) ,一般假设 m ≥ n 。我们把极小化这类函数的问题:
T

m

min

F ( x) = ∑ f i 2 ( x) i =1

称为最小二乘优化问题。
最小二乘优化是一类比较特殊的优化问题,在处理这类问题时,Matlab 也提供了
一些强大的函数。 Matlab 优化工具箱中,

用于求解最小二乘优化问题的函数有: lsqlin、 lsqcurvefit、lsqnonlin、lsqnonneg,用法介绍如下。
3.1 lsqlin 函数
求解

1
2
Cx − d 2 x 2
⎧A* x ≤ b

s.t. ⎨ Aeq * x = beq
⎪lb ≤ x ≤ ub

min

其中 C , A, Aeq 为矩阵, d , b, beq, lb, ub, x 为向量。
Matlab 中的函数为: x=lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0) 例 6 用 lsqlin 命令求解例 4。
解 编写程序如下: x=[19 25
31
38
44]';
y=[19.0
32.3
49.0 73.3
97.8]';
r=[ones(5,1),x.^2]; ab=lsqlin(r,y) x0=19:0.1:44; y0=ab(1)+ab(2)*x0.^2; plot(x,y,'o',x0,y0,'r')
-192-

3.2 lsqcurvefit 函数
给定输入输出数列 xdata, ydata ,求参量 x ,使得

min x 1
F ( x, xdata) − ydata
2

2
2

=

1
2
∑ (F ( x, xdatai ) − ydatai )
2 i

Matlab 中的函数为
X=LSQCURVEFIT(FUN,X0,XDATA,YDATA,LB,UB,OPTIONS)
其中 FUN 是定义函数 F ( x, xdata) 的 M 文件。
例7

用下面表 6 中的数据拟合函数 c(t ) = a + be

−0.02 kt

中的参数 a, b, k 。

表6

tj

100

200

300

400

500

600

700

800

900

1000

cj

4.54

4.99

5.35

5.65

5.90

6.10

6.26

6.39

6.50

6.59



该问题即解最优化问题:
10

min F (a, b, k ) = ∑ (a + be

− 0.02 kt j

i =1

− c j )2

(1)编写 M 文件 fun1.m 定义函数 F ( x, tdata) : function f=fun1(x,tdata); f=x(1)+x(2)*exp(-0.02*x(3)*tdata); %其中 x(1)=a,x(2)=b,x(3)=k
(2)调用函数 lsqcurvefit,编写程序如下: td=100:100:1000; cd=[4.54 4.99 5.35 5.65 5.90 6.10 6.26 6.39 6.50 6.59]; x0=[0.2 0.05 0.05]; x=lsqcurvefit(@fun1,x0,td,cd) 3.3

lsqnonlin 函数

已知函数向量 F ( x ) = [ f1 ( x), L ,

min x 1
F ( x)
2

f k ( x)] ,求 x 使得
T

2
2

Matlab 中的函数为
X=LSQNONLIN(FUN,X0,LB,UB,OPTIONS)
其中 FUN 是定义向量函数 F ( x) 的 M 文件。
例 8 用 lsqnonlin 函数求解例 7。
解 这里

[

F ( x) = F ( x, t ) = a + be −0.02 kt1 − c1 , L , a + be −0.02 kt10 − c10 x = [a, b, k ]
(1)编写 M 文件 fun2.m 如下: function f=fun2(x); td=100:100:1000; cd=[4.54 4.99 5.35 5.65 5.90 6.10 f=x(1)+x(2)*exp(-0.02*x(3)*td)-cd; 6.26 6.39 6.50

]

T

6.59];

-193-

(2)调用函数 lsqnonlin,编写程序如下: x0=[0.2 0.05 0.05]; %初始值是任意取的 x=lsqnonlin(@fun2,x0) 3.4

lsqnonneg 函数

求解非负的 x ,使得满足 min x 1
2
Cx − d 2 ,
2

Matlab 中的函数为
X = LSQNONNEG(C,d,X0,OPTIONS)

⎡0.0372
⎢ 0.6861
例 9 已知 C = ⎢
⎢0.6233

⎣0.6344
1
2
min Cx − d 2 x 2

0.2869⎤
⎡0.8587⎤

⎢ 0.1781⎥
0.7071⎥
⎥ ,求 x( x ≥ 0) 满足
,d = ⎢
⎢0.0747⎥
0.6245⎥



0.6170⎦
⎣0.8405⎦

最小。
解 编写程序如下: c=[0.0372 0.2869;0.6861 0.7071;0.6233 0.6245;0.6344 0.6170]; d=[0.8587;0.1781;0.0747;0.8405]; x=lsqnonneg(c,d)
3.5 曲线拟合的用户图形界面求法
Matlab 工具箱提供了命令 cftool,该命令给出了一维数据拟合的交互式环境。具体
执行步骤如下:
(1)把数据导入到工作空间;
(2)运行 cftool,打开用户图形界面窗口;
(3)对数据进行预处理;
(4)选择适当的模型进行拟合;
(5)生成一些相关的统计量,并进行预测。
可以通过帮助(运行 doc cftool)熟悉该命令的使用细节。
§4 曲线拟合与函数逼近
前面讲的曲线拟合是已知一组离散数据 {( xi , yi ), i = 1,L, n} ,选择一个较简单的
函数 f ( x ) ,如多项式,在一定准则如最小二乘准则下,最接近这些数据。
如果已知一个较为复杂的连续函数 y ( x ), x ∈ [a, b] ,要求选择一个较简单的函数

f ( x ) ,在一定准则下最接近 f ( x ) ,就是所谓函数逼近。
与曲线拟合的最小二乘准则相对应,
函数逼近常用的一种准则是最小平方逼近,

b

J = ∫ [ f ( x ) − y ( x )]2 dx a 达到最小。与曲线拟合一样,选一组函数 {rk ( x ), k = 1,L, m} 构造 f ( x ) ,即令

f ( x ) = a1r1 ( x ) + L + a m rm ( x )

-194-

(15)

代入(15)式,求 a1 ,L, a m 使 J 达到极小。利用极值必要条件可得

⎡ (r1 , r1 ) L (r1 , rm ) ⎤ ⎡ a1 ⎤ ⎡ ( y, r1 ) ⎤
⎢ M
M
M ⎥⎢ M ⎥ = ⎢ M ⎥

⎥⎢ ⎥ ⎢

⎢(rm , r1 ) L (rm , rm )⎥ ⎢a m ⎥ ⎢( y, rm )⎥

⎦⎣ ⎦ ⎣

这里 ( g , h ) =

(16)

b

∫ g ( x )h( x )dx 。当方程组(16)的系数矩阵非奇异时,有唯一解。 a 最简单的当然是用多项式逼近函数,即选 r1 ( x ) = 1 , r2 ( x ) = x , r3 ( x ) = x ,…。
2

并且如果能使

b

∫ r ( x )r ( x )dx = 0 , (i ≠ j ) ,方程组(16)的系数矩阵将是对角阵,计 a i

j

算大大简化。满足这种性质的多项式称正交多项式。
勒让得(Legendre)多项式是在 [−1,1] 区间上的正交多项式,它的表达式为

1 dk 2
P0 ( x ) = 1, Pk ( x ) = k
( x − 1) k , k = 1,2,L k 2 k! dx
可以证明

i≠ j
⎧0,

∫−1 Pi ( x) Pj ( x)dx = ⎨ 2 , i = j
⎪ 2i + 1

2k + 1 k Pk +1 ( x ) = xPk ( x ) −
Pk −1 ( x ), k = 1,2,L k +1 k +1
1

常用的正交多项式还有第一类切比雪夫(Chebyshev)多项式

Tn ( x ) = cos(n arccos x ), ( x ∈ [ −1,1], n = 0,1,2,L)
和拉盖尔(Laguerre)多项式

d n n −x
( x e ), ( x ∈ [0,+∞), n = 0,1,2,L) 。 dx n
⎡ π π⎤
2
4
例 10 求 f ( x ) = cos x, x ∈ ⎢ − , ⎥ 在 H = Span{1, x , x } 中的最佳平方逼近多
⎣ 2 2⎦
Ln ( x ) = e x

项式。
解 编写程序如下: syms x base=[1,x^2,x^4]; y1=base.'*base y2=cos(x)*base.' r1=int(y1,-pi/2,pi/2) r2=int(y2,-pi/2,pi/2) a=r1\r2 xishu1=double(a) digits(8),xishu2=vpa(a)
求得 xishu1=0.9996
-0.4964

y = 0.9996 − 0.4964 x + 0.0372 x
2

0.0372,即所求的最佳平方逼近多项式为
4

-195-

§5

黄河小浪底调水调沙问题
5.1

问题的提出

2004 年 6 月至 7 月黄河进行了第三次调水调沙试验,特别是首次由小浪底、三门
峡和万家寨三大水库联合调度,
采用接力式防洪预泄放水,
形成人造洪峰进行调沙试验
获得成功。整个试验期为 20 多天,小浪底从 6 月 19 日开始预泄放水,直到 7 月 13 日
恢复正常供水结束。小浪底水利工程按设计拦沙量为 75.5 亿 m3,在这之前,小浪底共
积泥沙达 14.15 亿 t。这次调水调沙试验一个重要目的就是由小浪底上游的三门峡和万
家寨水库泄洪,在小浪底形成人造洪峰,冲刷小浪底库区沉积的泥沙,在小浪底水库开
闸泄洪以后,从 6 月 27 日开始三门峡水库和万家寨水库陆续开闸放水,人造洪峰于 29
日先后到达小浪底, 月 3 日达到最大流量 2700m3/s,
7
使小浪底水库的排沙量也不断地
增加。表 7 是由小浪底观测站从 6 月 29 日到 7 月 10 检测到的试验数据。
表7
日期

6.29

6.30

观测数据

7.1

7.2

7.3

7.4

时间

8:00

20:00

8:00

20:00

8:00

20:00

8:00

20:00

8:00

20:00

8:00

20:00

水流量

1800

1900

2100

2200

2300

2400

2500

2600

2650

2700

2720

2650

含沙量

32

60

75

85

90

98

100

102

108

112

115

116

日期

7.5

7.6

7.7

7.8

7.9

7.10

时间

8:00

20:00

8:00

20:00

8:00

20:00

8:00

20:00

8:00

20:00

8:00

20:00

水流量

2600

2500

2300

2200

2000

1850

1820

1800

1750

1500

1000

900

含沙量

118

120

118

105

80

60

50

30

26

20

8

5

现在,根据试验数据建立数学模型研究下面的问题:
(1)给出估计任意时刻的排沙量及总排沙量的方法;
(2)确定排沙量与水流量的关系。
5.2 模型的建立与求解
已知给定的观测时刻是等间距的,以 6 月 29 日零时刻开始计时,则各次观测时刻
(离开始时刻 6 月 29 日零时刻的时间)分别为 t i = 3600(12i − 4) , i = 1,2,L,24 ,

其 中 计 时 单 位 为 秒 。 第 1 次 观 测 的 时 刻 t1 = 28800 , 最 后 一 次 观 测 的 时 刻

t 24 = 1022400 。
记第 i ( i = 1,2,L,24 )次观测时水流量为 vi ,含沙量为 ci ,则第 i 次观测时的排

沙量为 yi = ci vi 。有关的数据见表 8。
节点
时刻
排沙量
-196-

1
28800
57600

2
72000
114000

表 8 插值数据对应关系
3
4
5
115200
158400
201600
157500
187000
207000

6
244800
235200

单位:排沙量为 kg
7
8
288000
331200
250000
265200

节点
时刻
排沙量
节点
时刻
排沙量

9
374400
286200
17
720000
160000

10
417600
302400
18
763200
111000

11
460800
312800
19
806400
91000

12
504000
307400
20
849600
54000

13
547200
306800
21
892800
45500

14
590400
300000
22
936000
30000

15
633600
271400
23
979200
8000

16
676800
231000
24
1022400
4500

对于问题(1)
,根据所给问题的试验数据,要计算任意时刻的排沙量,就要确定
出排沙量随时间变化的规律,
可以通过插值来实现。
考虑到实际中的排沙量应该是时间
的连续函数,为了提高模型的精度,我们采用三次样条函数进行插值。
利用 MATLAB 函数,求出三次样条函数,得到排沙量 y = y (t ) 与时间的关系,然
后进行积分,就可以得到总的排沙量
t24

z = ∫ y (t )dt t1 最后求得总的排沙量为 1.844 × 10 t,计算的 Matlab 程序如下:
9

clc,clear load data.txt
%data.txt 按照原始数据格式把水流量和排沙量排成 4 行,12 列 liu=data([1,3],:); liu=liu';liu=liu(:); sha=data([2,4],:); sha=sha';sha=sha(:); y=sha.*liu;y=y'; i=1:24; t=(12*i-4)*3600; t1=t(1);t2=t(end); pp=csape(t,y); xsh=pp.coefs %求得插值多项式的系数矩阵,每一行是一个区间上多项式的系数。
TL=quadl(@(tt)ppval(pp,tt),t1,t2)
,计算
也可以利用 3 次 B 样条函数进行插值,求得总的排沙量也为 1.844 × 10 t,
的 Matlab 程序如下:
9

clc,clear load data.txt
%data.txt 按照原始数据格式把水流量和排沙量排成 4 行,12 列 liu=data([1,3],:); liu=liu';liu=liu(:); sha=data([2,4],:); sha=sha';sha=sha(:); y=sha.*liu;y=y'; i=1:24; t=(12*i-4)*3600; t1=t(1);t2=t(end); pp=spapi(4,t,y) %三次 B 样条 pp2=fn2fm(pp,'pp') %把 B 样条函数转化为 pp 格式
TL=quadl(@(tt)fnval(pp,tt),t1,t2)
对于问题(2)
,研究排沙量与水量的关系,从试验数据可以看出,开始排沙量是随
-197-

着水流量的增加而增长,而后是随着水流量的减少而减少。显然,变化规律并非是线性
的关系,为此,把问题分为两部分,从开始水流量增加到最大值 2720m3/s(即增长的过
程)为第一阶段,从水流量的最大值到结束为第二阶段,分别来研究水流量与排沙量的
关系。
画出排沙量与水流量的散点图(见图 2)

5

3.5

5

x 10

x 10

3.5

3

3

2.5
2.5
2
2
1.5
1.5
1
1

0.5

0.5
1500

2000

2500

0

3000

0

1000

2000

3000

第二阶段

第一阶段

图2

散点图

画散点图的程序如下: load data.txt liu=data([1,3],:); liu=liu';liu=liu(:); sha=data([2,4],:); sha=sha';sha=sha(:); y=sha.*liu; subplot(1,2,1), plot(liu(1:11),y(1:11),'*') subplot(1,2,2), plot(liu(12:24),y(12:24),'*')
从散点图可以看出,
第一阶段基本上是线性关系,
第二阶段准备依次用二次、
三次、
四次曲线来拟合,
看哪一个模型的剩余标准差小就选取哪一个模型。
最后求得第一阶段
排沙量 y 与水流量 v 之间的预测模型为

y = 250.5655v − 373384.4661
第二阶段的预测模型为一个四次多项式。

y = −2.7693 × 10 −7 v 4 + 0.0018v 3 − 4.092v 2 + 3891.0441v − 1.32262749668 × 106
计算的 Matlab 程序如下: clc, clear load data.txt
%data.txt 按照原始数据格式把水流量和排沙量排成 4 行,12 列 liu=data([1,3],:); liu=liu'; liu=liu(:); sha=data([2,4],:); sha=sha'; sha=sha(:); y=sha.*liu; %以下是第一阶段的拟合 format long e nihe1_1=polyfit(liu(1:11),y(1:11),1) %拟合一次多项式,系数排列从高次幂到低次幂 nihe1_2=polyfit(liu(1:11),y(1:11),2) -198-

yhat1_1=polyval(nihe1_1,liu(1:11)); %求预测值 yhat1_2=polyval(nihe1_2,liu(1:11)); %以下求误差平凡和与剩余标准差 cha1_1=sum((y(1:11)-yhat1_1).^2); rmse1_1=sqrt(cha1_1/9) cha1_2=sum((y(1:11)-yhat1_2).^2); rmse1_2=sqrt(cha1_2/8)
%以下是第二阶段的拟合
for j=1:3 str1=char(['nihe2_' int2str(j) '=polyfit(liu(12:24),y(12:24),' int2str(j+1) ')']); eval(str1) str2=char(['yhat2_' int2str(j) '=polyval(nihe2_' int2str(j) ',liu(12:24));']); eval(str2) str3=char(['cha2_' int2str(j) '=sum((y(12:24)-yhat2_' int2str(j) ').^2);'...
'rmse2_' int2str(j) '=sqrt(cha2_' int2str(j) '/(11-j))']); eval(str3) end format 习 题 九
1. 用 给 定 的 多 项 式 , 如 y = x − 6 x + 5 x − 3 , 产 生 一 组 数 据 ( xi , y i ) ,
3

2

i = 1,2, L , m ,再在 y i 上添加随机干扰(可用 rand 产生(0,1)均匀分布随机数,或
用 randn 产生 N (0,1) 分布随机数),然后用 xi 和添加了随机干扰的 y i 作 3 次多项式拟
合,与原系数比较。如果作 2 或 4 次多项式拟合,结果如何?

2. 已知平面区域 0 ≤ x ≤ 5600 , 0 ≤ y ≤ 4800 的高程数据见 9 表(单位:m)
表9
4800
4400
4000
3600
3200
2800
2400
2000
1600
1200
800
400
0

Y/X

1350
1370
1380
1420
1430
950
910
880
830
740
650
510
370
0

1370
1390
1410
1430
1450
1190
1090
1060
980
880
760
620
470
400

1390
1410
1430
1450
1460
1370
1270
1230
1180
1080
880
730
550
800

1400
1430
1450
1480
1500
1500
1500
1390
1320
1130
970
800
600
1200

1410
1440
1470
1500
1550
1200
1200
1500
1450
1250
1020
850
670
1600

960
1140
1320
1550
1600
1100
1100
1500
1420
1280
1050
870
690
2000

940
1110
1280
1510
1550
1550
1350
1400
400
1230
1020
850
670
2400

880
1050
1200
1430
1600
1600
1450
900
1300
1040
830
780
620
2800

800
950
1080
1300
1600
1550
1200
1100
700
900
800
720
580
3200

690
820
940
1200
1600
1380
1150
1060
900
500
700
650
450
3600

570
690
780
980
1550
1070
1010
950
850
700
300
500
400
4000

430
540
620
850
1500
900
880
870
810
780
500
200
300
4400

290
380
460
750
1500
1050
1000
900
380
750
550
300
100
4800

210
300
370
550
1550
1150
1050
936
780
650
480
350
150
5200

150
210
350
500
1550
1200
1100
950
750
550
350
320
250
5600

试用二维插值求 x, y 方向间隔都为 50 的高程,并画出该区域的等高线。
3. 用最小二乘法求一形如 y = ae 的经验公式拟合表 10 中的数据。 bx 表 10

xi yi 1
15.3

2
20.5

3
27.4

4
36.6

5
49.1

6
65.6

7
87.87

8
117.6

4.
(水箱水流量问题)许多供水单位由于没有测量流入或流出水箱流量的设备,而
只能测量水箱中的水位。试通过测得的某时刻水箱中水位的数据,估计在任意时刻(包
-199-

括水泵灌水期间) t 流出水箱的流量 f (t ) 。
给出原始数据表 11,其中长度单位为 E(1E=30.24cm)
。水箱为圆柱体,其直径
为 57E。
假设:
(1)影响水箱流量的唯一因素是该区公众对水的普通需要;
(2)水泵的灌水速度为常数;
(3)从水箱中流出水的最大流速小于水泵的灌水速度;
(4)每天的用水量分布都是相似的;
(5)水箱的流水速度可用光滑曲线来近似;
3
3
(6)当水箱的水容量达到 514×10 g 时,开始泵水;达到 677.6×10 g 时,便停止
泵水。
时间(s)
0
3316
6635
10619
13937
17921
21240
25223
28543
32284
35932
39332
39435
43318

-200-

表 11
水位(10-2E)
3175
3110
3054
2994
2947
2892
2850
2795
2752
2697
泵水
泵水
3550
3445

水位数据表
时间(s)
44636
49953
53936
57254
60574
64554
68535
71854
75021
79254
82649
85968
89953
93270

水位(10-2E)
3350
3260
3167
3087
3012
2927
2842
2767
2697
泵水
泵水
3475
3397
3340

第十章

数据的统计描述和分析

数理统计研究的对象是受随机因素影响的数据,
以下数理统计就简称统计,
统计是
以概率论为基础的一门应用学科。
数据样本少则几个,
多则成千上万,
人们希望能用少数几个包含其最多相关信息的
数值来体现数据样本总体的规律。描述性统计就是搜集、整理、加工和分析统计数据,
使之系统化、条理化,以显示出数据资料的趋势、特征和数量关系。它是统计推断的基
础,实用性较强,在统计工作中经常使用。
面对一批数据如何进行描述与分析,
需要掌握参数估计和假设检验这两个数理统计
的最基本方法。
我们将用 Matlab 的统计工具箱(Statistics Toolbox)来实现数据的统计描述和分析。
§1

统计的基本概念
1.1 总体和样本
总体是人们研究对象的全体,又称母体,如工厂一天生产的全部产品(按合格品及
废品分类)
,学校全体学生的身高。
总体中的每一个基本单位称为个体,个体的特征用一个变量(如 x )来表示,如一
件产品是合格品记 x = 0 ,是废品记 x = 1 ;一个身高 170(cm)的学生记 x = 170 。
从总体中随机产生的若干个个体的集合称为样本,或子样,如 n 件产品,100 名学
生的身高,
或者一根轴直径的 10 次测量。
实际上这就是从总体中随机取得的一批数据,
不妨记作 x1 , x 2 , L , x n , n 称为样本容量。
简单地说,统计的任务是由样本推断总体。
1.2 频数表和直方图
一组数据(样本)往往是杂乱无章的,做出它的频数表和直方图,可以看作是对这
组数据的一个初步整理和直观描述。
将数据的取值范围划分为若干个区间,然后统计这组数据在每个区间中出现的次
数,称为频数,由此得到一个频数表。以数据的取值为横坐标,频数为纵坐标,画出一
个阶梯形的图,称为直方图,或频数分布图。
若样本容量不大,能够手工做出频数表和直方图,当样本容量较大时则可以借助
Matlab 这样的软件了。让我们以下面的例子为例,介绍频数表和直方图的作法。
例 1 学生的身高和体重
学校随机抽取 100 名学生,测量他们的身高和体重,所得数据如表
身高
172
171
166
160
155
173
166
170
167
173
178
173
163

体重
75
62
62
55
57
58
55
63
53
60
60
73
47

身高
169
168
168
175
176
168
161
169
171
178
177
170
173

体重
55
67
65
67
64
50
49
63
61
64
66
58
67

表 1 身高体重数据
身高
体重
身高
169
64
171
165
52
169
164
59
170
173
74
172
172
69
169
169
52
167
173
57
175
173
61
164
166
70
166
163
57
169
170
56
167
160
65
179
165
58
176

体重
65
62
58
64
58
72
76
59
63
54
54
62
63

身高
167
168
165
168
176
170
158
165
172
169
169
172
162

体重
47
65
64
57
57
57
51
62
53
66
58
50
52
-201-

165
170
163
172
182
171
177

66
60
50
57
63
59
64

172
170
172
177
176
175
184

59
62
59
58
68
68
70

177
169
176
177
172
165
166

66
63
60
67
56
56
49

182
186
166
169
173
169
171

69
77
76
72
59
65
71

175
174
167
166
174
168
170

75
66
63
50
64
62
59

(i) 数据输入
数据输入通常有两种方法,
一种是在交互环境中直接输入,
如果在统计中数据量比
较大,这样作不太方便;另一种办法是先把数据写入一个纯文本数据文件 data.txt 中,
格式如例 1 的表 1,有 20 行、10 列,数据列之间用空格键或 Tab 键分割,该数据文件 data.txt 存放在 matlab\work 子目录下,在 Matlab 中用 load 命令读入数据,具体作法是: load data.txt
这样在内存中建立了一个变量 data,它是一个包含有 20 × 10 个数据的矩阵。
为了得到我们需要的 100 个身高和体重各为一列的矩阵,应做如下的改变: high=data(:,1:2:9);high=high(:) weight=data(:,2:2:10);weight=weight(:)
(ii)作频数表及直方图
求频数用 hist 命令实现,其用法是:
[N,X] = hist(Y,M)
得到数组(行、列均可)Y 的频数表。它将区间[min(Y),max(Y)]等分为 M 份(缺省时
M 设定为 10) 返回 M 个小区间的频数,X 返回 M 个小区间的中点。
,N
命令 hist(Y,M) 画出数组 Y 的直方图。
对于例 1 的数据,编写程序如下: load data.txt; high=data(:,1:2:9);high=high(:); weight=data(:,2:2:10);weight=weight(:);
[n1,x1]=hist(high)
%下面语句与hist命令等价
%n1=[length(find(high=158.1&high=161.2&high=164.5&high=167.6&high=170.7&high=173.8&high=176.9&high=180&high=183.1))]
[n2,x2]=hist(weight) subplot(1,2,1), hist(high) subplot(1,2,2), hist(weight)
计算结果略,直方图如图 1 所示。

-202-

3 0

2 5

2 5
2 0

2 0
1 5
1 5
1 0
1 0

5
5

0
1 5 0

0
1 6 0

1 7 0

1 8 0

图1

1 9 0

4 0

5 0

6 0

7 0

8 0

直方图

从直方图上可以看出,身高的分布大致呈中间高、两端低的钟形;而体重则看不出
什么规律。要想从数值上给出更确切的描述,需要进一步研究反映数据特征的所谓“统
计量”
。直方图所展示的身高的分布形状可看作正态分布,当然也可以用这组数据对分
布作假设检验。
例 2 统计下列五行字符串中字符 a、g、c、t 出现的频数
1.aggcacggaaaaacgggaataacggaggaggacttggcacggcattacacggagg
2.cggaggacaaacgggatggcggtattggaggtggcggactgttcgggga
3.gggacggatacggattctggccacggacggaaaggaggacacggcggacataca
4.atggataacggaaacaaaccagacaaacttcggtagaaatacagaagctta
5.cggctggcggacaacggactggcggattccaaaaacggaggaggcggacggaggc
解 把上述五行复制到一个纯文本数据文件 shuju.txt 中,放在 matlab\work 子目录
下,编写如下程序:
clc fid1=fopen('shuju.txt','r'); i=1; while (~feof(fid1)) data=fgetl(fid1); a=length(find(data==97)); b=length(find(data==99)); c=length(find(data==103)); d=length(find(data==116)); e=length(find(data>=97&data 0 称为右偏态,此时数据位于均值右边的比位于左

边的多;ν 1 < 0 称为左偏态,情况相反;而ν 1 接近 0 则可认为分布是对称的。

峰度是分布形状的另一种度量,正态分布的峰度为 3,若ν 2 比 3 大得多,表示分布
有沉重的尾巴,
说明样本中含有较多远离均值的数据,
因而峰度可以用作衡量偏离正态
分布的尺度之一。
Matlab 中 moment(x,order)返回 x 的 order 阶中心矩,order 为中心矩的阶数。 skewness(x)返回 x 的偏度,kurtosis(x)返回峰度。
在以上用 Matlab 计算各个统计量的命令中,若 x 为矩阵,则作用于 x 的列,返回
一个行向量。
对例 1 给出的学生身高和体重,用 Matlab 计算这些统计量,程序如下: clc load data.txt; high=data(:,1:2:9);high=high(:); weight=data(:,2:2:10);weight=weight(:);
-204-

shuju=[high weight]; jun_zhi=mean(shuju) zhong_wei_shu=median(shuju) biao_zhun_cha=std(shuju) ji_cha=range(shuju) pian_du=skewness(shuju) feng_du=kurtosis(shuju)
统计量中最重要、最常用的是均值和标准差,由于样本是随机变量,它们作为样本
的函数自然也是随机变量,
当用它们去推断总体时,
有多大的可靠性就与统计量的概率
分布有关,因此我们需要知道几个重要分布的简单性质。
1.4 统计中几个重要的概率分布
1.4.1 分布函数、密度函数和分位数
随机变量的特性完全由它的(概率)分布函数或(概率)密度函数来描述。设有随
机变量 X ,其分布函数定义为 X ≤ x 的概率,即 F ( x ) = P{ X ≤ x} 。若 X 是连续型随
机变量,则其密度函数 p ( x ) 与 F ( x ) 的关系为 x F ( x ) = ∫ p ( x )dx .
−∞

上 α 分位数是下面常用的一个概念,其定义为:对于 0 < α < 1 ,使某分布函数
F ( x) = 1 − α 的 x ,称为这个分布的上 α 分位数,记作 xα 。
我们前面画过的直方图是频数分布图,频数除以样本容量 n ,称为频率, n 充分大
时频率是概率的近似,因此直方图可以看作密度函数图形的(离散化)近似。
1.4.2 统计中几个重要的概率分布
(i)正态分布
正态分布随机变量 X 的密度函数曲线呈中间高两边低、对称的钟形,期望(均值)
2
2 σ EX = μ ,
方差 DX = σ ,
记作 X ~ N ( μ , σ ) , 称均方差或标准差, μ = 0, σ = 1

2
时称为标准正态分布,记作 X ~ N (0,1) 。正态分布完全由均值 μ 和方差 σ 决定,它

的偏度为 0,峰度为 3。
正态分布可以说是最常见的(连续型)概率分布,成批生产时零件的尺寸,射击中
弹着点的位置,仪器反复量测的结果,自然界中一种生物的数量特征等,多数情况下都
服从正态分布,这不仅是观察和经验的总结,而且有着深刻的理论依据,即在大量相互
独立的、作用差不多大的随机因素影响下形成的随机变量,其极限分布为正态分布。
鉴于正态分布的随机变量在实际生活中如此地常见,记住下面 3 个数字是有用的:
68%的数值落在距均值左右 1 个标准差的范围内,即
P{μ − σ ≤ X ≤ μ + σ } = 0.68 ;
95%的数值落在距均值左右 2 个标准差的范围内,即
P{μ − 2σ ≤ X ≤ μ + 2σ } = 0.95 ;
99.7%的数值落在距均值左右 3 个标准差的范围内,即
P{μ − 3σ ≤ X ≤ μ + 3σ } = 0.997 .
(ii) χ 分布(Chi square)
2

若 X 1 , X 2 ,L, X n 为相互独立的、
服从标准正态分布 N (0,1) 的随机变量,
则它们的
平方和 Y =

n

∑X

2 i 服从 χ 分布,记作 Y ~
2

χ 2 ( n ) , n 称自由度,它的期望 EY = n ,

i =1

-205-

方差 DY = 2n 。
(iii) t 分布
若 X ~ N (0,1) , Y ~

χ 2 (n ) ,且相 互独立,则 T =

X
服从 t 分布, 记作
Y /n

T ~ t ( n ) , n 称自由度。 t 分布又称学生氏(Student)分布。 t 分 布 的 密 度 函 数 曲 线 和 N (0,1) 曲 线 形 状 相 似 。 理 论 上 n → ∞ 时 ,
T ~ t ( n ) → N (0,1) ,实际上当 n > 30 时它与 N (0,1) 就相差无几了。
(iv) F 分布
X / n1
2
2
服从 F 分布,记作
若 X ~ χ ( n1 ) , Y ~ χ ( n 2 ) ,且相互独立,则 F =
Y / n2
F ~ F ( n1 , n2 ) , ( n1 , n2 ) 称自由度。
1.4.3 Matlab 统计工具箱(Toolbox\Stats)中的概率分布
Matlab 统计工具箱中有 27 种概率分布,这里只对上面所述 4 种分布列出命令的字
符:
norm 正态分布; chi2 χ 分布; t 分布 f F 分布 t 工具箱对每一种分布都提供 5 类函数,其命令的字符是: pdf 概率密度; cdf 分布函数; inv 分布函数的反函数; stat 均值与方差; rnd 随机数生成
当需要一种分布的某一类函数时,
将以上所列的分布命令字符与函数命令字符接起
来,并输入自变量(可以是标量、数组或矩阵)和参数就行了,如:
p=normpdf(x,mu,sigma) 均值 mu、标准差 sigma 的正态分布在 x 的密度函数
(mu=0,sigma=1 时可缺省)。 p=tcdf(x,n) t 分布(自由度 n)在 x 的分布函数。
2

x=chi2inv(p,n) χ 分布(自由度 n)使分布函数 F(x)=p 的 x(即 p 分位数)。
[m,v]=fstat(n1,n2) F 分布(自由度 n1,n2)的均值 m 和方差 v。
几个分布的密度函数图形就可以用这些命令作出,如:
x=-6:0.01:6;y=normpdf(x);z=normpdf(x,0,2); plot(x,y,x,z),gtext('N(0,1)'),gtext('N(0,2^2)') 分布函数的反函数的意义从下例看出: x=chi2inv(0.9,10) x=
15.9872
如果反过来计算,则
P=chi2cdf(15.9872,10)
P=
0.9000
1.5 正态总体统计量的分布
用样本来推断总体,
需要知道样本统计量的分布,
而样本又是一组与总体同分布的
随机变量,所以样本统计量的分布依赖于总体的分布。当总体服从一般的分布时,求某
个样本统计量的分布是很困难的,
只有在总体服从正态分布时,
一些重要的样本统计量
(均值、标准差)的分布才有便于使用的结果。另一方面,现实生活中需要进行统计推
断的总体,多数可以认为服从(或近似服从)正态分布,所以统计中人们在正态总体的
2

-206-

假定下研究统计量的分布,是必要的与合理的。
设总体 X ~ N ( μ , σ ) , x1 , x 2 ,L, x n 为一容量 n 的样本,其均值 x 和标准差 s 由
2

式(1)(2)确定,则用 x 和 s 构造的下面几个分布在统计中是非常有用的。


x ~ N (μ,

σ2

) 或

n
( n − 1) s 2

σ x−μ 2

x−μ
~ N (0,1) σ/ n

(3)

~ χ 2 ( n − 1).

(4)

~ t ( n − 1)
(5)
s/ n
2
2
设有两个总体 X ~ N ( μ1 , σ 2 ) 和 Y ~ N ( μ 2 , σ 2 ) ,及由容量分别为 n1 , n2 的两个
样本确定的均值 x, y 和标准差 s1 , s 2 ,则
( x − y ) − ( μ1 − μ 2 )
(6)
~ N (0,1)
2
σ 12 / n1 + σ 2 / n 2
( x − y ) − ( μ1 − μ 2 )
~ t (n1 + n2 − 2) sw 1 / n1 + 1 / n2

其中 sw =
2

(7)

2
(n1 − 1) s12 + (n2 − 1) s2

n1 + n2 − 2

s12 / σ 12
~ F (n1 − 1, n 2 − 1)
(8)
2
2
s2 / σ 2
对于(7)式,假定 σ 1 = σ 2 ,但它们未知,于是用 s 代替。在下面的统计推断中我们
要反复用到这些分布。
§2 参数估计
利用样本对总体进行统计推断的一类问题是参数估计,
即假定已知总体的分布,

常是 X ~ N ( μ , σ ) ,估计有关的参数,如 μ ,σ 。参数估计分点估计和区间估计两种。
2.1 点估计
点估计是用样本统计量确定总体参数的一个数值。评价估计优劣的标准有无偏性、
最小方差性、有效性等,估计的方法有矩法、极大似然法等。
2

2

最常用的是对总体均值 μ 和方差 σ (或标准差 σ )作点估计。让我们暂时抛开评
2

价标准,当从一个样本按照式(1)(2)算出样本均值 x 和方差 s 后,对 μ 和 σ (或

σ )一个自然、合理的点估计显然是(在字母上加^表示它的估计值)
2

ˆ
ˆ
μ = x ,ˆ 2 = s2 , σ = s σ 2

(9)

2.2 区间估计
点估计虽然给出了待估参数的一个数值,
却没有告诉我们这个估计值的精度和可信

ˆ
,由样本算出的 θ 的估计量记作 θ ,
程度。一般地,总体的待估参数记作 θ (如 μ ,σ )
2

ˆ ˆ
人们常希望给出一个区间 [θ1 ,θ 2 ] ,使 θ 以一定的概率落在此区间内。若有

ˆ
P{θ1 < θ < θˆ2 } = 1 − α ,0 < α < 1

(10)
-207-

ˆ ˆ
ˆ ˆ
则 [θ1 ,θ 2 ] 称为 θ 的置信区间,θ 1 ,θ 2 分别称为置信下限和置信上限,1 − α 称为置信概
率或置信水平, α 称为显著性水平。
ˆ ˆ
给出的置信水平为 1 − α 的置信区间 [θ1 ,θ 2 ] ,称为 θ 的区间估计。置信区间越小,
估计的精度越高;
置信水平越大,
估计的可信程度越高。
但是这两个指标显然是矛盾的,
通常是在一定的置信水平下使置信区间尽量小。
通俗地说,
区间估计给出了点估计的误
差范围。
2.3 参数估计的 Matlab 实现
Matlab 统计工具箱中,有专门计算总体均值、标准差的点估计和区间估计的函数。
对于正态总体,命令是
[mu,sigma,muci,sigmaci]=normfit(x,alpha)
其中 x 为样本(数组或矩阵)
,alpha 为显著性水平 α (alpha 缺省时设定为 0.05)
,返
及总体均值 μ 和标准差 σ 的区间估计
回总体均值 μ 和标准差 σ 的点估计 mu 和 sigma, muci 和 sigmaci。当 x 为矩阵时,x 的每一列作为一个样本。
Matlab 统计工具箱中还提供了一些具有特定分布总体的区间估计的命令,如 expfit,poissfit,gamfit,你可以从这些字头猜出它们用于哪个分布,具体用法参见 帮助系统。
§3

假设检验
统计推断的另一类重要问题是假设检验问题。
在总体的分布函数完全未知或只知其
形式但不知其参数的情况,
为了推断总体的某些性质,
提出某些关于总体的假设。
例如,
提出总体服从泊松分布的假设,又如对于正态总体提出数学期望等于 μ 0 的假设等。假
设检验就是根据样本对所提出的假设做出判断:
是接受还是拒绝。
这就是所谓的假设检
验问题。
3.1 单个总体 N ( μ , σ ) 均值 μ 的检验
假设检验有三种:
双边检验: H 0 : μ = μ 0 , H 1 : μ ≠ μ 0 ;
2

右边检验: H 0 : μ ≤

μ0 , H 1 : μ > μ0 ;
左边检验: H 0 : μ ≥ μ 0 , H 1 : μ < μ 0 。
2
3.1.1 σ 已知,关于 μ 的检验( Z 检验)
在 Matlab 中 Z 检验法由函数 ztest 来实现,命令为
[h,p,ci]=ztest(x,mu,sigma,alpha,tail)
其中输入参数 x 是样本,mu 是 H 0 中的 μ 0 ,sigma 是总体标准差 σ ,alpha 是显著性
,tail 是对备选假设 H 1 的选择: H 1 为 μ ≠ μ 0 时
水平 α (alpha 缺省时设定为 0.05)
用 tail=0(可缺省) H 1 为 μ >


μ 0 时用 tail=1; H 1 为 μ < μ 0 时用 tail=-1。输出参

数 h=0 表示接受 H 0 ,h=1 表示拒绝 H 0 ,p 表示在假设 H 0 下样本均值出现的概率,p
越小 H 0 越值得怀疑,ci 是 μ 0 的置信区间。
例 3 某车间用一台包装机包装糖果。包得的袋装糖重是一个随机变量,它服从正
态分布。当机器正常时,其均值为 0.5 公斤,标准差为 0.015 公斤。某日开工后为检验
包装机是否正常,随机地抽取它所包装的糖 9 袋,称得净重为(公斤)

0.497
0.506
0.518 0.524
0.498
0.511 0.520 0.515 0.512
-208-

问机器是否正常?


总体 σ 已知,x ~ N ( μ ,0.015 ) ,μ 未知。
于是提出假设 H 0 : μ =
2

μ 0 = 0.5 和

H 1 : μ ≠ 0 .5 。
Matlab 实现如下: x=[0.497 0.506 0.518 0.524 0.498...
0.511 0.520 0.515 0.512];
[h,p,ci]=ztest(x,0.5,0.015)
求得 h=1,p=0.0248,说明在 0.05 的水平下,可拒绝原假设,即认为这天包装机
工作不正常。
3.1.2 σ 未知,关于 μ 的检验( t 检验)
在 Matlab 中 t 检验法由函数 ttest 来实现,命令为
[h,p,ci]=ttest(x,mu,alpha,tail)
2

例 4 某种电子元件的寿命 x (以小时计)服从正态分布, μ ,σ 均未知.现得 16 只
元件的寿命如下:
159 280 101 212 224 379 179 264
222 362 168 250 149 260 485 170
问是否有理由认为元件的平均寿命大于 225(小时)?
解 按题意需检验
H 0 : μ ≤ μ 0 = 225, H 1 : μ > 225 ,
2

取 α = 0.05 。Matlab 实现如下: x=[159 280 101 212 224 379 179 264 ...
222 362 168 250 149 260 485 170];
[h,p,ci]=ttest(x,225,0.05,1)

求得 h=0,p=0.2570,说明在显著水平为 0.05 的情况下,不能拒绝原假设,认为
元件的平均寿命不大于 225 小时。
3.2 两个正态总体均值差的检验( t 检验)
还可以用 t 检验法检验具有相同方差的 2 个正态总体均值差的假设。在 Matlab 中
由函数 ttest2 实现,命令为:
[h,p,ci]=ttest2(x,y,alpha,tail)
与上面的 ttest 相比,不同处只在于输入的是两个样本 x,y(长度不一定相同)

而不是一个样本和它的总体均值;tail 的用法与 ttest 相似,可参看帮助系统。
例 5 在平炉上进行一项试验以确定改变操作方法的建议是否会增加钢的得率,试
验是在同一平炉上进行的。每炼一炉钢时除操作方法外,其它条件都可能做到相同。先
用标准方法炼一炉,然后用建议的新方法炼一炉,以后交换进行,各炼了 10 炉,其得率分
别为
1°标准方法 78.1 72.4 76.2 74.3 77.4 78.4 76.0 75.6 76.7 77.3
2°新方法
79.1 81.0 77.3 79.1 80.0 79.1 79.1 77.3 80.2 82.1
设这两个样本相互独立且分别来自正态总体 N ( μ1 , σ ) 和 N ( μ 2 , σ ) , μ1 , μ 2 , σ 均未
2

2

2

知,问建议的新方法能否提高得率?(取 α = 0.05 。)
解 (i)需要检验假设
H 0 : μ1 − μ 2 ≥ 0 , H 1 : μ1 − μ 2 < 0 .
(ii)Matlab 实现

-209-

x=[78.1 72.4 76.2 74.3 77.4 78.4 76.0 75.6 76.7 77.3]; y=[79.1 81.0 77.3 79.1 80.0 79.1 79.1 77.3 80.2 82.1];
[h,p,ci]=ttest2(x,y,0.05,-1)
-4
求得 h=1,p=2.2126×10 。表明在 α = 0.05 的显著水平下,可以拒绝原假设,即认
为建议的新操作方法较原方法优。
3.3 分布拟合检验
在实际问题中,
有时不能预知总体服从什么类型的分布,
这时就需要根据样本来检
验关于分布的假设。下面介绍 χ 检验法和专用于检验分布是否为正态的“偏峰、峰度
检验法”

2

3.3.1

χ 2 检验法

H 0 :总体 x 的分布函数为 F ( x ) ,
H 1 : 总体 x 的分布函数不是 F ( x ).
2
在用下述 χ 检验法检验假设 H 0 时,若在假设 H 0 下 F ( x ) 的形式已知,但其参数
值未知,这时需要先用极大似然估计法估计参数,然后作检验。

χ 2 检验法的基本思想如下:将随机试验可能结果的全体 Ω 分为 k 个互不相容的事 k 件 A1 , A2 , A3 ,..., Ak (

∑A i =1

k

于是在假设 H 0 下,
= Ω, Ai A j = Φ , i ≠ j, i , j = 1,2,L, k ) 。

ˆ
ˆ

我们可以计算 pi = P ( Ai ) (或 pi = P ( Ai ) ) i = 1,2, L, k 。在 n 次试验中,事件 Ai 出

ˆ
现的频率 f i / n 与 pi ( pi )往往有差异,但一般来说,若 H 0 为真,且试验的次数又甚多时,
则这种差异不应该很大。基于这种想法,皮尔逊使用
k

χ2 = ∑ i =1

k
ˆ
( f i − npi ) 2
( f − npi ) 2
2
(或 χ = ∑ i

ˆ npi npi i =1

(11)

作为检验假设 H 0 的统计量。并证明了以下定理。
定理

若 n 充分大,则当 H 0 为真时(不论 H 0 中的分布属什么分布),统计量(11)

总是近似地服从自由度为 k − r − 1 的 χ 分布,其中 r 是被估计的参数的个数。
2

于是,若在假设 H 0 下算得(11)有
2
χ 2 ≥ χ a ( k − r − 1),

则在显著性水平 α 下拒绝 H 0 ,否则就接受。
注意:在使用 χ 检验法时,要求样本容量 n 不小于 50,以及每个 npi 都不小于 5,
2

而且 npi 最好是在 5 以上。否则应适当地合并 Ai ,以满足这个要求。
例 6 下面列出了 84 个伊特拉斯坎(Etruscan)人男子的头颅的最大宽度(mm)

试检验这些数据是否来自正态总体(取 α = 0.1) 。
141 148 132 138 154 142 150 146 155 158
150 140 147 148 144 150 149 145 149 158
143 141 144 144 126 140 144 142 141 140
145 135 147 146 141 136 140 146 142 137
148 154 137 139 143 140 131 143 141 149
148 135 148 152 143 144 141 143 147 146
-210-

150 132 142 142 143 153 149 146
142 149 142 137 134 144 146 147
140 137 152 145
解 编写 Matlab 程序如下:

149 138
140 142

clc x=[141 148 132 138 154 142 150 146 155 158 ...
150 140 147 148 144 150 149 145 149 158 ...
143 141 144 144 126 140 144 142 141 140 ...
145 135 147 146 141 136 140 146 142 137 ...
148 154 137 139 143 140 131 143 141 149 ...
148 135 148 152 143 144 141 143 147 146 ...
150 132 142 142 143 153 149 146 149 138 ...
142 149 142 137 134 144 146 147 140 142 ...
140 137 152 145]; mm=minmax(x) %求数据中的最小数和最大数 hist(x,8) %画直方图 fi=[length(find(x=135&x=138&x=142&x=146&x=150&x=154))] %各区间上出现的频数 mu=mean(x),sigma=std(x) %均值和标准差 fendian=[135,138,142,146,150,154] %区间的分点 p0=normcdf(fendian,mu,sigma) %分点处分布函数的值 p1=diff(p0) %中间各区间的概率 p=[p0(1),p1,1-p0(6)] %所有区间的概率 chi=(fi-84*p).^2./(84*p) chisum=sum(chi)
%皮尔逊统计量的值
x_a=chi2inv(0.9,4)
%chi2分布的0.9分位数
求得皮尔逊统计量chisum= 2.2654, χ 0.1 (7 − 2 − 1) =
2

χ 02.1 (4) = 7.7794 ,故在

水平0.1下接受 H 0 ,即认为数据来自正态分布总体。
3.3.2 偏度、峰度检验(留作习题1)
3.4 其它非参数检验
Matlab还提供了一些非参数方法。
3.4.1 Wilcoxon秩和检验
在Matlab中,秩和检验由函数ranksum实现。命令为:
[p,h]=ranksum(x,y,alpha)
其中x,y可为不等长向量,alpha为给定的显著水平,它必须为0和1之间的数量。p返回
产生两独立样本的总体是否相同的显著性概率,h返回假设检验的结果。如果x和y的总
体差别不显著,则h为零;如果x和y的总体差别显著,则h为1。如果p接近于零,则可对
原假设质疑。
例7 某商店为了确定向公司 A 或公司 B 购买某种产品,将 A, B 公司以往各次进
货的次品率进行比较,数据如下所示,设两样本独立。问两公司的商品的质量有无显著
差异。设两公司的商品的次品的密度最多只差一个平移,取 α = 0.05 。
-211-

A :7.0 3.5 9.6 8.1 6.2 5.1 10.4 4.0 2.0 10.5
B :5.7 3.2 4.2 11.0 9.7 6.9 3.6 4.8 5.6 8.4 10.1 5.5 12.3
解 分别以 μ A、μ B 记公司 A、B 的商品次品率总体的均值。所需检验的假设是
H 0 : μ A = μB , H1 : μ A ≠ μ B .
Matlab实现如下:
a=[7.0 3.5 9.6 8.1 6.2 5.1 10.4 4.0 2.0 10.5]; b=[5.7 3.2 4.2 11.0 9.7 6.9 3.6 4.8 5.6 8.4 10.1 5.5
12.3];
[p,h]=ranksum(a,b)
求得p=0.8041,h=0,表明两样本总体均值相等的概率为0.8041,并不很接近于零,
且h=0说明可以接受原假设,即认为两个公司的商品的质量无明显差异。
3.5 中位数检验
在假设检验中还有一种检验方法为中位数检验,在一般的教学中不一定介绍,但在
实际中也是被广泛应用到的。
在Matlab中提供了这种检验的函数。
函数的使用方法简单,
下面只给出函数介绍。
3.5.1 signrank函数 signrank Wilcoxon符号秩检验
[p,h]=signrank(x,y,alpha)
其中p给出两个配对样本x和y的中位数相等的假设的显著性概率。向量x,y的长度必须
相同,alpha为给出的显著性水平,取值为0和1之间的数。h返回假设检验的结果。如果
这两个样本的中位数之差几乎为0,则h=0;若有显著差异,则h=1。
3.5.2 signtest函数 signtest 符号检验
[p,h]= signtest(x,y,alpha)
其中p给出两个配对样本x和y的中位数相等的假设的显著性概率。x和y若为向量,二者
的长度必须相同; y亦可为标量, 在此情况下,
计算x的中位数与常数y之间的差异。
alpha
和h同上。
习 题 十
1. 试用偏度、峰度检验法检验例6中的数据是否来自正态总体(取 α = 0.1 )

2. 下 面 列 出 的 是 某 工 厂 随 机 选 取 的 20 只 部 件 的 装 配 时 间 ( 分 )

9.8,10.4,10.6,9.6,9.7,9.9,10.9,11.1,9.6,10.2,10.3,9.6,9.9,11.2,10.6,9.8,10.
5,10.1,10.5,9.7。设装配时间的总体服从正态分布,是否可以认为装配时间的均值显
著地大于10(取 α = 0.05 )?
3.表2分别给出两个文学家马克﹒吐温(Mark Twain)的八篇小品文及斯诺特格拉
斯(Snodgrass)的10篇小品文中由3个字母组成的词的比例。
马克﹒吐温
斯诺特格拉斯

0.225
0.209

0.262 0.217
0.205 0.196

表2
0.240 0.230
0.210 0.202

0.229 0.235 0.217
0.207 0.224 0.223 0.220

0.201

设两组数据分别来自正态总体,且两总体方差相等。两样本相互独立,问两个作家所写
的小品文中包含由3个字母组成的词的比例是否有显著的差异(取 α = 0.05 )?

-212-

第十一章

方差分析

我们已经作过两个总体均值的假设检验,
如两台机床生产的零件尺寸是否相等,

人和正常人的某个生理指标是否一样。
如果把这类问题推广一下,
要检验两个以上总体
的均值彼此是否相等,
仍然用以前介绍的方法是很难做到的。
而你在实际生产和生活中
可以举出许多这样的问题:
从用几种不同工艺制成的灯泡中,
各抽取了若干个测量其寿
命,
要推断这几种工艺制成的灯泡寿命是否有显著差异;
用几种化肥和几个小麦品种在
若干块试验田里种植小麦,要推断不同的化肥和品种对产量有无显著影响。
可以看到,为了使生产过程稳定,达到优质、高产,需要对影响产品质量的因素进
行分析,
找出有显著影响的那些因素,
除了从机理方面进行研究外,
常常要作许多试验,
对结果作分析、比较,寻求规律。用数理统计分析试验结果、鉴别各因素对结果影响程
度的方法称为方差分析(Analysis Of Variance)
,记作 ANOVA。
人们关心的试验结果称为指标,
试验中需要考察、
可以控制的条件称为因素或因子,
因素所处的状态称为水平。
上面提到的灯泡寿命问题是单因素试验,
小麦产量问题是双
因素试验。处理这些试验结果的统计方法就称为单因素方差分析和双因素方差分析。
§1

单因素方差分析
只考虑一个因素 A 对所关心的指标的影响, A 取几个水平,在每个水平上作若干
个试验,试验过程中除 A 外其它影响指标的因素都保持不变(只有随机因素存在)
,我
们的任务是从试验结果推断,因素 A 对指标有无显著影响,即当 A 取不同水平时指标
有无显著差别。
A 取某个水平下的指标视为随机变量,判断 A 取不同水平时指标有无显著差别,
相当于检验若干总体的均值是否相等。
1.1 数学模型
设 A 取 r 个水平 A1 , A2 ,L, Ar ,在水平 Ai 下总体 xi 服从正态分布 N ( μ i , σ ) ,
2

i = 1,L, r ,这里 μ i ,σ 2 未知, μi 可以互不相同,但假定 xi 有相同的方差。又设在每
即从中抽取容量为 ni 的样本,
记作 xij , j = 1, L, ni ,xij
个水平 Ai 下作了 ni 次独立试验,
服从 N ( μ i , σ ) , i = 1, L, r , j = 1, L, ni 且相互独立。将这些数据列成表 1(单因素试
2

验数据表)的形式。
表1

单因素试验数据表

A1

x11

x12



x1n1

A2

x 21

x22



x2n2









Ar

xr1

xr 2




xrnr

将第 i 行称为第 i 组数据。判断 A 的 r 个水平对指标有无显著影响,相当于要作以
下的假设检验
H 0 : μ1 = μ 2 = L = μ r ; H 1 : μ1 , μ 2 ,L, μ r 不全相等
由于 xij 的取值既受不同水平 Ai 的影响,又受 Ai 固定下随机因素的影响,所以将它
分解为

xij = μi + ε ij ,i = 1,L, r , j = 1, L , ni

(1)
-213-

其中 ε ij ~ N (0, σ ) ,且相互独立。记
2

r
1 r
∑ ni μi , n = ∑ ni , α i = μi − μ , i = 1,L, r n i =1 i =1 μ 是总均值, αi 是水平 Ai 对指标的效应。由(1)(2)模型可表为


μ=

⎧ xij = μ + α i + ε ij
⎪ r

⎨∑ α i = 0
⎪ i =1
⎪ε ~ N (0, σ 2 ), i = 1, L, r , j = 1,L, n i ⎩ ij

(2)

(3)

原假设为(以后略去备选假设)

H 0 : α1 = α 2 = L = α r = 0
1.2


(4)

统计分析

1 ni xi• =

ni

∑ xij ,x = j =1

1 r ni
∑∑ xij n i=1 j =1

(5)

xi• 是第 i 组数据的组平均值, x 是总平均值。考察全体数据对 x 的偏差平方和 r ni

ST = ∑∑ ( xij − x ) 2

(6)

i =1 j =1

经分解可得 r r

ni

ST = ∑ ni ( xi• − x ) 2 + ∑∑ ( xij − xi• ) 2 i =1

i =1 j =1

记 r S A = ∑ ni ( xi• − x ) 2

(7)

i =1 r ni

S E = ∑∑ ( xij − xi• ) 2

(8)

i =1 j =1



ST = S A + S E

(9)

S A 是各组均值对总方差的偏差平方和,称为组间平方和;S E 是各组内的数据对均值偏
差平方和的总和。 S A 反映 A 不同水平间的差异, S E 则表示在同一水平下随机误差的
大小。
ni

注意到

∑ (x

ij

j =1

− xi• ) 2 是总体 N ( μi , σ 2 ) 的样本方差的 ni − 1 倍,于是有

ni

∑ (x j =1

ij

− xi• ) 2 σ 2 ~ χ 2 (ni − 1)

由 χ 分布的可加性知
2

-214-

⎛ r

S E σ 2 ~ χ 2 ⎜ ∑ (ni − 1) ⎟
⎝ i =1



S E σ 2 ~ χ 2 (n − r )
且有

ES E = (n − r )σ 2

(10)

对 S A 作进一步分析可得 r ES A = (r − 1)σ 2 + ∑ niα i2

(11)

i =1

当 H 0 成立时

ES A = ( r − 1)σ 2

(12)

可知若 H 0 成立,S A 只反映随机波动,而若 H 0 不成立,那它就还反映了 A 的不同水平

的效应 α i 。单从数值上看,当 H 0 成立时,由(10)(12)对于一次试验应有

S A /( r − 1)
≈1
S E /(n − r )
而当 H 0 不成立时这个比值将远大于 1。当 H 0 成立时,该比值服从自由度 n1 = r − 1 ,

n2 = (n − r ) 的 F 分布,即
S /(r − 1)
F= A
~ F (r − 1, n − r )
(13)
S E /(n − r )
为检验 H 0 ,给定显著性水平 α ,记 F 分布的 1 − α 分位数为 F1−α (r − 1, (n − r )) ,检验
规则为

F < F1−α (r − 1, (n − r )) 时接受 H 0 ,否则拒绝。
以上对 S A , S E , ST 的分析相当于对组间、组内等方差的分析,所以这种假设检验方法称
方差分析。
1.3 方差分析表
将试验数据按上述分析、计算的结果排成表 2 的形式,称为单因素方差分析表
(Matlab 中给出的方差分析表)

表2
方差来源

平方和

SA

r −1

误差

SE

n−r

总和

ST

单因素方差分析表

自由度

1 − pr 分位数

概率

F1− pr (r − 1, n − r )

pr

n −1

因素

A

均方

SA r −1
S
SE = E n−r SA =

最后一列给出大于 F 值的概率 pr , F1− pr < F1−α ( r − 1, ( n − r )) 相当于 pr > α 。
-215-

方差分析一般用的显著性水平是:取 α = 0.01 ,拒绝 H 0 ,称因素 A 的影响(或 A
各水平的差异)非常显著;取 α = 0.01 ,不拒绝 H 0 ,但取 α = 0.05 ,拒绝 H 0 ,称因
素 A 的影响显著;取 α = 0.05 ,不拒绝 H 0 ,称因素 A 无显著影响。
1.4 Matlab 实现
Matlab 统计工具箱中单因素方差分析的命令是 anoval。
若各组数据个数相等,称为均衡数据。若各组数据个数不等,称非均衡数据。
(1)均衡数据
处理均衡数据的用法为:
p=anoval(x)
返回值 p 是一个概率,当 p > α 时接受 H 0 ,x 为 m × r 的数据矩阵,x 的每一列是一个
。另外,还输出一个方差表和一个
水平的数据(这里各个水平上的样本容量 ni = m )
Box 图。
例 1 为考察 5 名工人的劳动生产率是否相同,记录了每人 4 天的产量,并算出其
平均值,如表 3。你能从这些数据推断出他们的生产率有无显著差别吗?
表3
工人

1
2
3
4
平均产量

A1
256
242
280
298
269

A2

A3

254
250
330
277
290
230
295
302
292.25 264.75

A4

A5

248
280
305
289
280.5

236
252
220
252
240

解 编写程序如下: x=[256 254
250
248
236
242
330
277
280
252
280
290
230
305
220
298
295
302
289
252]; p=anova1(x) 求得 p = 0.1109 > α = 0.05 ,故接受 H 0 ,即 5 名工人的生产率没有显著差异。方
差表对应于上面的单因素方差分析表的 1 ~ 4 列,F = 2.262 是 F ( 4,15) 分布的 1 − p 分
位数,可以验证
fcdf(2.262,4,15)=0.8891=1-p
Box 图反映了各组数据的特征。
注:接受 H 0 ,是将 5 名工人的生产率作为一个整体进行假设检验的结果,并不表
明取其中 2 个工人的生产率作两总体的均值检验时,
也一定接受均值相等的假设。
实际
上,读者可以用 ttest2 对本题作 H 0 : μ 2 = μ 5 的检验,看看会得到什么结果。
(2)非均衡数据
处理非均衡数据的用法为: p=anova1(x,group) x 为向量,从第 1 组到第 r 组数据依次排列;group 为与 x 同长度的向量,标志 x 中数

据的组别(在与 x 第 i 组数据相对应的位置处输入整数 i (i = 1,2,L, r ) )
-216-

例 2 用 4 种工艺生产灯泡,
从各种工艺制成的灯泡中各抽出了若干个测量其寿命,
结果如下表,试推断这几种工艺制成的灯泡寿命是否有显著差异。
表4

工艺
序号
1
2
3
4
5

A1

A2

A3

A4

1620
1670
1700
1750
1800

1580
1600
1640
1720

1460
1540
1620

1500
1550
1610
1680

解 编写程序如下: x=[1620 1580
1460
1500
1670
1600
1540
1550
1700
1640
1620
1610
1750
1720
1680
1800]; x=[x(1:4),x(16),x(5:8),x(9:11),x(12:15)]; g=[ones(1,5),2*ones(1,4),3*ones(1,3),4*ones(1,4)]; p=anova1(x,g) 求得 0.01 t α ( n − 2) ,则拒绝 H 0 ,认为 β1 显著不为零。
2

当拒绝了 H 0 ,认为 β1 显著不为零时,又称 β1 通过了 t 检验。
另一方面,由于


⎧ ˆ

⎪ β − β1
P⎨ 1
< t α (n − 2)⎬ = 1 − α
ˆ

⎪ S ( β1 )
2


还可以确定 β1 的置信度为 1 − α 的置信区间为
ˆ
ˆ
ˆ
ˆ β1 − t α (n − 2) S ( β1 ) ≤ β1 ≤ β1 + t α (n − 2) S ( β1 )
2

(18)

2

同样地,也可以对总体参数 β 0 进行显著性检验,并且求出它的置信区间。它的最

ˆ
小二乘估计量 β 0 的抽样分布为正态分布,即

1 n ˆ β 0 ~ N (β 0 , σ 2[ +

x2 n ∑ (x

i

i =1

− x)

])
2

ˆ
Var ( β 0 ) 的估计量为

1
ˆ
S 2 ( β 0 ) = MSE[ + n x2 n ∑ (x i =1

可以推出

ˆ β0 − β0
~ t ( n − 2)
ˆ
S (β0 )
为检验 β 0 是否显著为零,提出假设

H 0 : β 0 = 0 , H1 : β 0 ≠ 0
-238-

i

− x)

]
2

检验统计量为

t0 =

ˆ β0 ˆ
S (β0 )

在 β 0 = 0 时,检验统计量 t 0 服从自由度为 (n − 2) 的 t 分布。
对于给定的检验水平 α ,则通过 t 分布表可查到统计量 t0 的临界值 t α ( n − 2) 。决
2

策准则为:
若 t0 ≤ t α (n − 2) ,则接受 H 0 ,认为 β 0 显著为零;
2

若 t0 > t α ( n − 2) ,则拒绝 H 0 ,认为 β 0 显著不为零。
2

此外,根据

⎧ β − β0

⎪ ˆ

P⎨ 0
< t α (n − 2)⎬ = 1 − α
ˆ
⎪ S (β 0 )

2


还可以确定 β 0 的置信度为 1 − α 的置信区间为

ˆ
ˆ
ˆ
ˆ
β 0 − t α ( n − 2) S ( β 0 ) ≤ β 0 ≤ β 0 + t α ( n − 2) S ( β 0 )
2

§3

(19)

2

多元线性回归
3.1 模型
多元线性回归分析的模型为

⎧ y = β 0 + β1 x1 + L + β m x m + ε
(20)

2
⎩ε ~ N (0,σ )
2
式中 β 0 , β1 , L , β m , σ 都是与 x1 , x2 , L , xm 无关的未知参数,其中 β 0 , β1 , L , β m 称为回
归系数。
现得到 n 个独立观测数据 ( yi , xi1 ,L, xim ) , i = 1,L, n, n > m ,由(20)得

⎧ yi = β 0 + β1 xi1 + L + β m xim + ε i

2
⎩ε i ~ N (0,σ ), i = 1,L, n

(21)

⎡1 x11 L x1m ⎤
⎡ y1 ⎤
⎢M M L M ⎥ , Y = ⎢ M ⎥
X =

⎢ ⎥

⎢1 x n1 L x nm ⎥
⎢ yn ⎥

⎣ ⎦


(22)



ε = [ε 1 L ε n ]T , β = [ β 0

β1 L β m ]T

(20)表为

⎧Y = Xβ + ε

2
⎩ε ~ N (0, σ En )

(23)

其中 En 为 n 阶单位矩阵。
-239-

3.2

参数估计

ˆ
模型(20)中的参数 β 0 , β1 , L , β m 仍用最小二乘法估计,即应选取估计值 β j ,使
ˆ
当 β j = β j 时, j = 0,1,2, L , m 时,误差平方和 n n

i =1

i =1

Q = ∑ ε i2 = ∑ ( yi − β 0 − β1 xi1 − L − β m xim ) 2

(24)

达到最小。为此,令

∂Q
= 0 , j = 0,1,2, L , n
∂β j

n
⎧ ∂Q
= −2∑ ( yi − β 0 − β1 xi1 − L − β m xim ) = 0
⎪ ∂β i =1
⎪ 0

n
⎪ ∂Q = −2 ( y − β − β x − L − β x ) x = 0,
∑ i 0 1 i1 m im ij ⎪ ∂β j i =1


(25)

j = 1,2, L , m

经整理化为以下正规方程组 n n n n

β 0 n + β1 ∑ xi1 + β 2 ∑ xi 2 + L + β m ∑ xim = ∑ yi

i =1 i =1 i =1 i =1

n n n n n

2
⎨β 0 ∑ xi1 + β1 ∑ xi1 + β 2 ∑ xi1 xi 2 + L + β m ∑ xi1 xim = ∑ xi1 yi i =1 i =1 i =1 i =1
⎪ i =1 n n n n n ⎪
2
β 0 ∑ xim + β1 ∑ xim xi1 + β 2 ∑ xim xi 2 + L + β m ∑ xim = ∑ xim yi

i =1 i =1 i =1 i =1
⎩ i =1

(26)

正规方程组的矩阵形式为

X T Xβ = X T Y
T
(27)式的解为
当矩阵 X 列满秩时, X X 为可逆方阵,
T
−1
T
ˆ β = (X X ) X Y
ˆ
将 β 代回原模型得到 y 的估计值

(27)
(28)

ˆ
ˆ
ˆ ˆ y = β 0 + β1 x1 + L + β m x m
(29)
ˆ
ˆ
ˆ
而这组数据的拟合值为 Y = Xβ ,拟合误差 e = Y − Y 称为残差,可作为随机误差 ε 的
估计,而
n

n

i =1

i =1

ˆ
Q = ∑ ei2 = ∑ ( y i − y i ) 2

(30)

ˆ
为残差平方和(或剩余平方和)
,即 Q ( β ) 。
3.3 统计分析
不加证明地给出以下结果:
ˆ
ˆ
ˆ
(i) β 是 β 的线性无偏最小方差估计。指的是 β 是 Y 的线性函数; β 的期望等于
ˆ
β ;在 β 的线性无偏估计中, β 的方差最小。
-240-

ˆ
(ii) β 服从正态分布
ˆ
β ~ N ( β ,σ 2 ( X T X ) −1 )
T

记(X X )

−1

(31)

= (cij ) n×n 。

(iii)对残差平方和 Q , EQ = ( n − m − 1)σ ,且
2

Q

σ

2

~ χ 2 ( n − m − 1)

(32)

由此得到 σ 的无偏估计
2

Q
ˆ
=σ 2 n − m −1

s 2 是剩余方差(残差的方差) s 称为剩余标准差。 s2 =

(iv)对总平方和 SST =

n

∑(y i =1

i

(33)

− y ) 2 进行分解,有 n ˆ
SST = Q + U ,U = ∑ ( y i − y ) 2

(34)

i =1

其中 Q 是由(24)定义的残差平方和,反映随机误差对 y 的影响,U 称为回归平方和,
反映自变量对 y 的影响。上面的分解中利用了正规方程组。
3.4 回归模型的假设检验
因变量 y 与自变量 x1 ,L, x m 之间是否存在如模型(20)所示的线性关系是需要检

ˆ
验的,显然,如果所有的 | β j | ( j = 1,L, m ) 都很小, y 与 x1 ,L, x m 的线性关系就不
明显,所以可令原假设为

H 0 : β j = 0( j = 1,L, m )
当 H 0 成立时由分解式(34)定义的 U, Q 满足

U /m
~ F ( m, n − m − 1)
(35)
Q /(n − m − 1)
在显著性水平 α 下有上 α 分位数 Fα ( m, n − m − 1) ,若 F < Fα ( m, n − m − 1) ,接受
H 0 ;否则,拒绝。
注意 接受 H 0 只说明 y 与 x1 ,L, x m 的线性关系不明显,可能存在非线性关系,
F=

如平方关系。
还有一些衡量 y 与 x1 ,L, x m 相关程度的指标,如用回归平方和在总平方和中的比
值定义复判定系数

R2 =

U
S

(36)

R = R 2 称为复相关系数, R 越大, y 与 x1 ,L, x m 相关关系越密切,通常, R 大于
0.8(或 0.9)才认为相关关系成立。
3.5 回归系数的假设检验和区间估计
当上面的 H 0 被拒绝时, β j 不全为零,但是不排除其中若干个等于零。所以应进
-241-

一步作如下 m 个检验 ( j = 0,1,L , m) :
(
H 0 j) : β j = 0


(31) β j ~ N ( β j ,σ c jj ) , jj 是 ( X X ) 中的第 ( j , j ) 元素, s 代替 σ ,
式, ˆ c 用
T

2

−1

2

2

( j)

由(31)~(33)式,当 H 0 成立时

tj =

ˆ β j / c jj
Q /(n − m − 1)

~ t ( n − m − 1)

(37)

对给定的 α ,若 | t j |< t α ( n − m − 1) ,接受 H 0 ;否则,拒绝。
( j)

2

(37)式也可用于对 β j 作区间估计( j = 0,1,L, m )
,在置信水平 1 − α 下, β j 的
置信区间为

ˆ
ˆ
[ β j − t α (n − m − 1) s c jj , β j + t α (n − m − 1) s c jj ]
2

其中 s =

(38)

2

Q

n − m −1

3.6 利用回归模型进行预测
当回归模型和系数通过检验后,
可由给定的 x0 = ( x01 ,L, x0 m ) 预测 y 0 , y 0 是随机
的,显然其预测值(点估计)为

ˆ
ˆ
ˆ
ˆ
y 0 = β 0 + β1 x01 + L + β m x0 m

(39)

,结果较复杂,但当 n 较大且 x0i 接近平均
给定 α 可以算出 y 0 的预测区间(区间估计)
值 xi 时, y 0 的预测区间可简化为

ˆ
ˆ
[ y 0 − z α s , y0 + z α s ]
2

其中 zα 是标准正态分布的上
2

α
2

(40)

2

分位数。

ˆ
对 y 0 的区间估计方法可用于给出已知数据残差 ei = yi − yi (i = 1,L, n ) 的置信区
间, ei 服从均值为零的正态分布,所以若某个 ei 的置信区间不包含零点,则认为这个
数据是异常的,可予以剔除。
§4

Matlab 中的回归分析
4.1 多元线性回归
Matlab 统计工具箱用命令 regress 实现多元线性回归,用的方法是最小二乘法,用
法是:
b=regress(Y,X)

ˆ ˆ
ˆ
其中 Y,X 为按(22)式排列的数据,b 为回归系数估计值 β 0 , β 1 ,L, β m 。
[b,bint,r,rint,stats]=regress(Y,X,alpha)
这里 Y,X 同上,alpha 为显著性水平(缺省时设定为 0.05)
,b,bint 为回归系数估计值和
它们的置信区间,r,rint 为残差(向量)及其置信区间,stats 是用于检验回归模型的统
2

计量,有四个数值,第一个是 R (见(36)式)
,第二个是 F (见(35)式)
,第三个
-242-

是与 F 对应的概率 p , p < α 拒绝 H 0 ,回归模型成立,第四个是残差的方差 s (见
2

(33)式)

残差及其置信区间可以用 rcoplot(r,rint)画图。
例 1 合金的强度 y 与其中的碳含量 x 有比较密切的关系,
今从生产中收集了一批
数据如下表 1。

x y 表1
0.10 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18
42.0 41.5 45.0 45.5 45.0 47.5 49.0 55.0 50.0

试先拟合一个函数 y (x ) ,再用回归分析对它进行检验。
解 先画出散点图: x=0.1:0.01:0.18; y=[42,41.5,45.0,45.5,45.0,47.5,49.0,55.0,50.0]; plot(x,y,'+') 可知 y 与 x 大致上为线性关系。
设回归模型为

y = β 0 + β1 x

(41)

用 regress 和 rcoplot 编程如下: clc,clear x1=[0.1:0.01:0.18]'; y=[42,41.5,45.0,45.5,45.0,47.5,49.0,55.0,50.0]'; x=[ones(9,1),x1];
[b,bint,r,rint,stats]=regress(y,x);
b,bint,stats,rcoplot(r,rint)
得到
b =27.4722 137.5000 bint =18.6851
36.2594
75.7755
199.2245
stats =0.7985 27.7469
0.0012
4.0883

ˆ
ˆ
ˆ
ˆ
即 β 0 = 27.4722 , β 1 = 137.5000 , β 0 的置信区间是[18.6851,36.2594], β1 的置信区
间是[75.7755,199.2245]; R = 0.7985 , F = 27.7469 , p = 0.0012 , s = 4.0883 。
可知模型(41)成立。
观察命令 rcoplot(r,rint)所画的残差分布,除第 8 个数据外其余残差的置信区间均包
含零点,第 8 个点应视为异常点,将其剔除后重新计算,可得 b =30.7820
109.3985
bint =26.2805
35.2834
76.9014
141.8955
stats =0.9188 67.8534
0.0002
0.8797
应该用修改后的这个结果。
2

2

表2

x1 元 x2 元 y个 120

140

190

130

155

175

125

145

180

150

100

110

90

150

210

150

250

270

300

250

102

100

120

77

46

93

26

69

65

85

-243-

例 2

某厂生产的一种电器的销售量 y 与竞争对手的价格 x1 和本厂的价格 x2 有

关。表 2 是该商品在 10 个城市的销售记录。试根据这些数据建立 y 与 x1 和 x2 的关系
式,对得到的模型和系数进行检验。若某市本厂产品售价 160(元)
,竞争对手售价 170
(元)
,预测商品在该市的销售量。
解 分别画出 y 关于 x1 和 y 关于 x2 的散点图,可以看出 y 与 x2 有较明显的线性
关系,而 y 与 x1 之间的关系则难以确定,我们将作几种尝试,用统计分析决定优劣。
设回归模型为
y = β 0 + β1 x1 + β 2 x2
(42)
编写如下程序: x1=[120 140 190 130 155 175 125 145 180 150]'; x2=[100 110 90 150 210 150 250 270 300 250]'; y=[102 100 120 77 46 93 26 69 65 85]'; x=[ones(10,1),x1,x2]; [b,bint,r,rint,stats]=regress(y,x); b,bint,stats 得到 b =66.5176
0.4139 -0.2698 bint =-32.5060 165.5411
-0.2018
1.0296
-0.4611
-0.0785 stats =0.6527
6.5786
0.0247
351.0445
可以看出结果不是太好: p = 0.0247 ,取 α = 0.05 时回归模型(42)可用,但取

ˆ ˆ α = 0.01 则模型不能用; R 2 = 0.6527 较小; β 0 , β1 的置信区间包含了零点。下面将
试图用 x1 , x 2 的二次函数改进它。
4.2 多项式回归
如果从数据的散点图上发现 y 与 x 呈较明显的二次(或高次)函数关系,或者用线
性模型(20)的效果不太好,就可以选用多项式回归。
4.2.1 一元多项式回归
一元多项式回归可用命令 polyfit 实现。
例 3 将 17 至 29 岁的运动员每两岁一组分为 7 组,
每组两人测量其旋转定向能力,
以考察年龄对这种运动能力的影响。现得到一组数据如表 3。
年 龄
第一人
第二人

表3
17
19
21
23
25
27
29
20.48 25.13 26.15 30.0 26.1
20.3 19.35
24.35 28.11 26.3
31.4 26.92 25.7 21.3

试建立二者之间的关系。
解 数据的散点图明显地呈现两端低中间高的形状,所以应拟合一条二次曲线。
选用二次模型

y = a 2 x 2 + a1 x + a0
编写如下程序:
x0=17:2:29;x0=[x0,x0]; y0=[20.48 25.13 26.15 30.0 26.1
20.3 19.35...
24.35 28.11 26.3 31.4 26.92 25.7 21.3];
-244-

(43)

[p,s]=polyfit(x0,y0,2); p
得到
p =-0.2003
8.9782 -72.2150
即 a 2 = −0.2003 , a1 = 8.9782 , a0 = −72.2150 。
上面的s是一个数据结构,用于计算函数值,如
[y,delta]=polyconf(p,x0,s);y
得到 y 的拟合值,及预测值 y 的置信区间半径delta。
35

30

25

20

15

10
18

图1

20

22

24

26

28

拟合的交互式画面

用polytool(x0,y0,2),可以得到一个如1图的交互式画面,在画面中绿色曲线为拟合
曲线,它两侧的红线是 y 的置信区间。你可以用鼠标移动图中的十字线来改变图下方
的 x 值,也可以在窗口内输入,左边就给出 y 的预测值及其置信区间。通过左下方的
Export下拉式菜单,可以输出回归系数等。这个命令的用法与下面将介绍的rstool相似。
4.2.2 多元二项式回归
统计工具箱提供了一个作多元二项式回归的命令rstool,
它也产生一个交互式画面,
并输出有关信息,用法是
rstool(x,y,model,alpha)
其中输入数据x,y分别为 n × m 矩阵和 n 维向量,alpha为显著性水平 α (缺省时设定为
0.05)
,model由下列4个模型中选择1个(用字符串输入,缺省时设定为线性模型)

linear(线性): y = β 0 + β1 x1 + L + β m x m purequadratic(纯二次): y =

m

β 0 + β1 x1 + L + β m x m + ∑ β jj x 2 j j =1

interaction(交叉) y = β 0 + β1 x1 + L + β m xm +


∑β

1≤ j ≠ k ≤ m

quadratic(完全二次): y = β 0 + β1 x1 + L + β m x m +

jk

∑β

x j xk jk x j xk

1≤ j , k ≤ m

我们再作一遍例2 商品销售量与价格问题,选择纯二次模型,即
2
y = β 0 + β1 x1 + β 2 x2 + β11 x12 + β 22 x2

(44)

编程如下: x1=[120 140 190 130 155 175 125 145 180 150]'; x2=[100 110 90 150 210 150 250 270 300 250]'; y=[102 100 120 77 46 93 26 69 65 85]';
-245-

x=[x1 x2]; rstool(x,y,'purequadratic') 300

200

100

0

-100
140

160

180

150

200

250

图2 拟合的交互式画面

得到一个如图2所示的交互式画面,左边是 x1 (=151)固定时的曲线 y ( x1 ) 及其置
信区间,右边是 x2 (=188)固定时的曲线 y ( x 2 ) 及其置信区间。用鼠标移动图中的十
字线,或在图下方窗口内输入,可改变 x1 , x 2 。图左边给出 y 的预测值及其置信区间,
就用这种画面可以回答例2提出的“若某市本厂产品售价160(元)
,竞争对手售价170
(元)
,预测该市的销售量”问题。
图的左下方有两个下拉式菜单,一个菜单Export用以向Matlab工作区传送数据,包
括beta(回归系数),rmse(剩余标准差)
,residuals(残差)。模型(41)的回归系数和剩余
标准差为 beta =-312.5871
7.2701
-1.7337
-0.0228
0.0037 rmse =16.6436
另一个菜单model用以在上述4个模型中选择,你可以比较一下它们的剩余标准差,
会发现以模型(24)的rmse=16.6436最小。
注意本例子在Matlab中完全二次模型的形式为
2 y = b0 + b1 x1 + b2 x2 + b3 x1 x2 + b4 x12 + b5 x2

§5

(45)

非线性回归和逐步回归
本节介绍怎样用Matlab统计工具箱实现非线性回归和逐步回归。
5.1 非线性回归
非线性回归是指因变量 y 对回归系数 β1 ,L, β m (而不是自变量)是非线性的。

Matlab统计工具箱中的nlinfit,nlparci,nlpredci,nlintool,不仅给出拟合的回归系数,
而且可以给出它的置信区间,
及预测值和置信区间等。
下面通过例题说明这些命令的用
法。
例4 在研究化学动力学反应过程中,建立了一个反应速度和反应物含量的数学模
型,形式为

β 4 x2 − y= -246-

x3

β5

1 + β1 x1 + β 2 x2 + β 3 x3

其中 β1 ,L, β 5 是未知的参数, x1 , x 2 , x3 是三种反应物(氢, n 戊烷,异构戊烷)的含

量, y 是反应速度。今测得一组数据如表4,试由此确定参数 β1 ,L, β 5 ,并给出其置信


区间。 β1 ,L, β 5 的参考值为(0.1,0.05,0.02,1,2)
表4
序号
1
2
3
4
5
6
7
8
9
10
11
12
13

反应速度
8.55
3.79
4.82
0.02
2.75
14.39
2.54
4.35
13.00
8.50
0.05
11.32
3.13

y

氢 x1
470
285
470
470
470
100
100
470
100
100
100
285
285

n 戊烷 x2
300
80
300
80
80
190
80
190
300
300
80
300
190

异构戊烷 x3
10
10
120
120
10
10
65
65
54
120
120
10
120

解 首先,以回归系数和自变量为输入变量,将要拟合的模型写成函数文件 huaxue.m: function yhat=huaxue(beta,x); yhat=(beta(4)*x(:,2)-x(:,3)/beta(5))./(1+beta(1)*x(:,1)+... beta(2)*x(:,2)+beta(3)*x(:,3));
然后,用nlinfit计算回归系数,用nlparci计算回归系数的置信区间,用nlpredci
计算预测值及其置信区间,编程如下: clc,clear x0=[ 1
8.55
470
300
10
2
3.79
285
80
10
3
4.82
470
300
120
4
0.02
470
80
120
5
2.75
470
80
10
6
14.39
100
190
10
7
2.54
100
80
65
8
4.35
470
190
65
9
13.00
100
300
54
10
8.50
100
300
120
11
0.05
100
80
120
12
11.32
285
300
10
13
3.13
285
190
120]; x=x0(:,3:5); y=x0(:,2); beta=[0.1,0.05,0.02,1,2]'; %回归系数的初值,任意取的
[betahat,r,j]=nlinfit(x,y,@huaxue,beta); %r,j是下面命令用的信息 betaci=nlparci(betahat,r,'jacobian',j); betaa=[betahat,betaci] %回归系数及其置信区间
[yhat,delta]=nlpredci(@huaxue,x,betahat,r,'jacobian',j)
%y的预测值及其置信区间的半径,置信区间为yhat±delta。
用nlintool得到一个交互式画面,
左下方的Export可向工作区传送数据,
如剩余标
-247-

准差等。使用命令 nlintool(x,y,'huaxue',beta) 可看到画面,并传出剩余标准差rmse= 0.1933。
4.2 逐步回归
实际问题中影响因变量的因素可能很多,
我们希望从中挑选出影响显著的自变量来
建立回归模型,
这就涉及到变量选择的问题,
逐步回归是一种从众多变量中有效地选择
重要变量的方法。以下只讨论线性回归模型(1)式的情况。
变量选择的标准,
简单地说就是所有对因变量影响显著的变量都应选入模型,
而影
响不显著的变量都不应选入模型,从便于应用的角度应使模型中变量个数尽可能少。
若候选的自变量集合为 S = {x1 ,L, x m } ,从中选出一个子集 S1 ⊂ S ,设 S1 中有 l
个自变量 (l = 1,L, m) ,由 S1 和因变量 y 构造的回归模型的误差平方和为 Q ,则模型

Q
, n 为数据样本容量。所选子集 S1 应使 s 尽量小, n − l −1
通常回归模型中包含的自变量越多,误差平方和 Q 越小,但若模型中包含有对 y 影响
很小的变量,
那么 Q 不会由于包含这些变量在内而减少多少, 却因 l 的增加可能使 s 反
而增大,同时这些对 y 影响不显著的变量也会影响模型的稳定性,因此可将剩余标准
差 s 最小作为衡量变量选择的一个数量标准。
的剩余标准差的平方 s =
2

逐步回归是实现变量选择的一种方法,基本思路为,先确定一初始子集,然后每次
从子集外影响显著的变量中引入一个对 y 影响最大的,再对原来子集中的变量进行检
验,从变得不显著的变量中剔除一个影响最小的,直到不能引入和剔除为止。使用逐步
回归有两点值得注意,一是要适当地选定引入变量的显著性水平 α in 和剔除变量的显著
性水平 α out ,显然, α in 越大,引入的变量越多; α out 越大,剔除的变量越少。二是由

于各个变量之间的相关性,
一个新的变量引入后,
会使原来认为显著的某个变量变得不
显著,从而被剔除,所以在最初选择变量时应尽量选择相互独立性强的那些。
在Matlab统计工具箱中用作逐步回归的是命令stepwise,它提供了一个交互式画
面,通过这个工具你可以自由地选择变量,进行统计分析,其通常用法是:
stepwise(x,y,inmodel,alpha)
其中x是自变量数据,y是因变量数据,分别为 n × m 和 n × 1 矩阵,inmodel是矩阵x的
列数的指标,给出初始模型中包括的子集(缺省时设定为空)
,alpha为显著性水平。
Stepwise Regression 窗口,显示回归系数及其置信区间,和其它一些统计量的信
息。绿色表明在模型中的变量,红色表明从模型中移去的变量。在这个窗口中有Export
按钮,点击Export产生一个菜单,表明了要传送给Matlab工作区的参数,它们给出了统
计计算的一些结果。
下面通过一个例子说明stepwise的用法。
例5 水泥凝固时放出的热量 y 与水泥中4种化学成分 x1 , x 2 , x3 , x 4 有关,今测得一
组数据如表5,试用逐步回归来确定一个线性模型
表5
序号

x1

x2

x3

x4

y

1
2
3
4
5

7
1
11
11
7

26
29
56
31
52

6
15
8
8
6

60
52
20
47
33

78.5
74.3
104.3
87.6
95.9

-248-

6
7
8
9
10
11
12
13

11
3
1
2
21
1
11
10

55
71
31
54
47
40
66
68

9
17
22
18
4
23
9
8

22
6
44
22
26
34
12
12

109.2
102.7
72.5
93.1
115.9
83.8
113.3
109.4

编写程序如下: clc,clear x0=[1
7
26
6
2
1
29
15
3
11
56
8
4
11
31
8
5
7
52
6
6
11
55
9
7
3
71
17
8
1
31
22
9
2
54
18
10
21
47
4
11
1
40
23
12
11
66
9
13
10
68
8
x=x0(:,2:5); y=x0(:,6); stepwise(x,y)
得到图3所示的图形界面。

60
52
20
47
33
22
6
44
22
26
34
12
12

78.5
74.3
104.3
87.6
95.9
109.2
102.7
72.5
93.1
115.9
83.8
113.3
109.4];

Coefficients with Error Bars

Coeff.

t-stat

p-val

X1

1.5511

2.0827

0.0708

X2

0.510168

0.7049

0.5009

X3

0.101909

0.1350

0.8959

X4

-0.144061

-0.2032

0.8441

-2

-1

0

1

2

3

Model History

RMSE

2.45
2.4
2.35
2.3

1

2

3

图3

4

5

6

7

8

9

逐步回归交互式画面

-249-

可以看出, x3 , x 4 不显著,移去这两个变量后的统计结果如图4。
Coefficients with Error Bars

Coeff.

t-stat

p-val

X1

1.46831

12.1047

0.0000

X2

0.66225

14.4424

0.0000

X3

0.250018

1.3536

0.2089

X4

-0.23654

-1.3650

0.2054

-0.5

0

0.5

1

1.5

Model History

RMSE

2.45
2.4
2.35
2.3

1

2

3

4

图4

5

6

7

8

9

10

11

逐步回归交互式画面

这个表中的 x3 , x 4 两行用红色显示,表明它们已移去。
从新的统计结果可以看出,虽然剩余标准差 s (RMSE)没有太大的变化,但是统计
量 F 的值明显增大,因此新的回归模型更好一些。可以求出最终的模型为

y = 52.5773 + 1.4683x1 + 0.6623 x2
习 题 十 二
1. 某人记录了21天每天使用空调器的时间和使用烘干器的次数,并监视电表以计
算出每天的耗电量,数据见表6,试研究耗电量(KWH)与空调器使用的小时数(AC)和烘
干器使用次数(DRYER)之间的关系,建立并检验回归模型,诊断是否有异常点。
表6

序号
1
KWH
35
AC
1.5
DRYER 1

2
63
4.5
2

3
66
5.0
2

4
17
2.0
0

5
94
8.5
3

6
79
6.0
3

7
8
93
66
13.5 8.0
1
1

9
94
12.5
1

序号
12
kWH
65
AC
8.0
DRYER 1

13
77
7.5
2

14
75
8.0
2

15
62
7.5
1

16
85
12.0
1

17
43
6.0
0

18
57
2.5
3

20
65
7.5
1

19
33
5.0
0

10
82
7.5
2

11
78
6.5
3

21
33
6.0
0

2. 在一丘陵地带测量高程, x 和 y 方向每隔100米测一个点,得高程如下表,试拟
合一曲面,确定合适的模型,并由此找出最高点和该点的高程。
-250-

表7 x y

100

200

300

400

100
200
300
400

636
698
680
662

697
712
674
626

624
630
598
552

478
478
412
334

3. 一矿脉有13个相邻样本点,人为地设定一原点,现测得各样本点对原点的距离 x ,与该样本点处某种金属含量 y 的一组数据如下,画出散点图观测二者的关系,试建
立合适的回归模型,如二次曲线、双曲线、对数曲线等。
表8

x
2
y 106.42 x 11 y 110.59

3
109.20
14
110.60

4
109.58
15
110.90

5
109.50
16
110.76

7
110.00
18
111.00

8
10
109.93 110.49
19
111.20

-251-

第十三章

微分方程建模

微分方程建模是数学建模的重要方法,
因为许多实际问题的数学描述将导致求解微
分方程的定解问题。
把形形色色的实际问题化成微分方程的定解问题,
大体上可以按以
下几步:
1. 根据实际要求确定要研究的量(自变量、
未知函数、
必要的参数等)并确定坐标系。
2. 找出这些量所满足的基本规律(物理的、几何的、化学的或生物学的等等)。
3. 运用这些规律列出方程和定解条件。
列方程常见的方法有:
(i)按规律直接列方程
在数学、力学、物理、化学等学科中许多自然现象所满足的规律已为人们所熟悉,
并直接由微分方程所描述。如牛顿第二定律、放射性物质的放射性规律等。我们常利用
这些规律对某些实际问题列出微分方程。
(ii)微元分析法与任意区域上取积分的方法
自然界中也有许多现象所满足的规律是通过变量的微元之间的关系式来表达的。

于这类问题,
我们不能直接列出自变量和未知函数及其变化率之间的关系式,
而是通过
微元分析法,
利用已知的规律建立一些变量
(自变量与未知函数)
的微元之间的关系式,
然后再通过取极限的方法得到微分方程,
或等价地通过任意区域上取积分的方法来建立
微分方程。
(iii)模拟近似法
在生物、经济等学科中,许多现象所满足的规律并不很清楚而且相当复杂,因而需
要根据实际资料或大量的实验数据,提出各种假设。在一定的假设下,给出实际现象所
满足的规律,然后利用适当的数学方法列出微分方程。
在实际的微分方程建模过程中,
也往往是上述方法的综合应用。
不论应用哪种方法,
通常要根据实际情况,
作出一定的假设与简化,
并要把模型的理论或计算结果与实际情
况进行对照验证,以修改模型使之更准确地描述实际问题并进而达到预测预报的目的。
本章将利用上述方法讨论具体的微分方程的建模问题。
§1

发射卫星为什么用三级火箭
采用运载火箭把人造卫星发射到高空轨道上运行,
为什么不能用一级火箭而必须用
多级火箭系统?
下面通过建立运载火箭有关的数学模型来回答上述问题。
火箭是一个复杂的系统,
为了使问题简单明了,
我们只从动力系统和整体结构上分
析,并且假设引擎是足够强大的。
1.1 为什么不能用一级火箭发射人造卫星
下面用三个数学模型回答这个问题
1.1.1 卫星进入 600km 高空轨道时,火箭必须的最低速度
首先将问题理想化,假设:
(i)卫星轨道是以地球中心为圆心的某个平面上的圆周,卫星在此轨道上以地球
引力作为向心力绕地球作平面匀速圆周运动;
(ii)地球是固定于空间中的一个均匀球体,其质量集中于球心;
(iii)其它星球对卫星的引力忽略不计。
建模与求解:设地球半径为 R ,质量为 M ;卫星轨道半径为 r ,卫星质量为 m 。
根据假设(ii)和(iii)
,卫星只受到地球的引力,由牛顿万有引力定律可知其引力
-153-

大小为

F=

GMm r2 (1)

其中 G 为引力常数。
为消去常数 G ,把卫星放在地球表面,则由(1)式得

mg =

GMm
R2



GM = R 2 g

再代入(1)式,得

⎛R⎞
F = mg ⎜ ⎟
⎝r⎠

2

(2)

其中 g = 9.81( m/s ) 为重力加速度。
2

2

则其向心力为 mv / r ,
根据假设 ,
(i) 若卫星围绕地球作匀速圆周运动的速度为 v ,
因为卫星所受的地球引力就是它作匀速运动的向心力,故有
2

mv 2
⎛R⎞
mg ⎜ ⎟ = r ⎝r⎠
由此便推得卫星距地面为 ( r − R ) km ,必须的最低速度的数学模型为 g r
取 R = 6400km , r − R = 600km ,代入上式,得 v ≈ 7.6km/s v=R (3)

即要把卫星送入离地面 600km 高的轨道,火箭的末速度最低应为 7.6km/s。
1.1.2 火箭推进力及升空速度
火箭的简单模型是由一台发动机和一个燃料仓组成。
燃料燃烧产生大量气体从火箭
末端喷出,给火箭一个向前的推力。火箭飞行要受地球引力、空气阻力、地球自转与公
转等的影响,使火箭升空后作曲线运动。为使问题简化,假设:
(i)火箭在喷气推动下作直线运动,火箭所受的重力和空气阻力忽略不计。
(ii)在 t 时刻火箭质量为 m(t ) ,速度为 v (t ) ,且均为时间 t 的连续可微函数;
(iii)从火箭末端喷出气体的速度(相对火箭本身)为常数 u 。
建模与分析:由于火箭在运动过程中不断喷出气体,使其质量不断减少,在
(t , t + Δt ) 内的减少量可由台劳展式表示为

dm
Δt + o(Δt )
(4)
dt
因 为 喷 出 的 气 体 相 对 于 地 球 的 速 度 为 v (t ) − u , 则 由 动 量 守 恒 定 律 有
⎡ dm

m(t )v(t ) = m(t + Δt )v(t + Δt ) − ⎢
Δt + o(Δt )⎥ (v(t ) − u )
(5)
⎣ dt

m(t + Δt ) − m(t ) =

从(4)式和(5)式可得火箭推进力的数学模型为

dv dm = −u dt dt
令 t = 0 时, v (0) = v 0 , m(0) = m0 ,求解上式,得火箭升空速度模型 m -154-

(6)

v (t ) = v 0 + u ln

m0 m(t )

(7)

(6)式表明火箭所受推力等于燃料消耗速度与喷气速度(相对火箭)的乘积。
(7)
式表明,在 v 0 , m0 一定的条件下,升空速度 v (t ) 由喷气速度(相对火箭) u 及质量比

m0 / m(t ) 决定。这为提高火箭速度找到了正确途径:从燃料上设法提高 u 值;从结构
上设法减少 m(t ) 。
1.1.3 一级火箭末速度上限
如卫星) mF (燃料质量)


火箭—卫星系统的质量可分为三部分:m p(有效负载,

ms (结构质量,如外壳、燃料容器及推进器)
。一级火箭末速度上限主要是受目前技术
条件的限制,假设:
(i)目前技术条件为:相对火箭的喷气速度 u = 3 km/s 及

ms
1
≥ mF + ms 9
(ii)初速度 v0 忽略不计,即 v0 = 0 。
建模与求解:因为升空火箭的最终(燃料耗尽)质量为 m p + m s ,由(7)式及假
设(ii)得到末速度为

v = u ln

m0 m p + ms

(8)

令 ms = λ ( m F + ms ) = λ ( m0 − m p ) ,代入上式,得

v = u ln

m0 λm0 + (1 − λ )m p

(9)

于是,当卫星脱离火箭,即 m p = 0 时,便得火箭末速度上限的数学模型为

v 0 = u ln

1

λ

1
,便得火箭速度上限
9 v 0 = 3 ln 9 ≈ 6.6 km/s

由假设(i)
,取 u = 3 km, λ =

因此,用一级火箭发射卫星,在目前技术条件下无法达到相应高度所需的速度。
1.2 理想火箭模型
从前面对问题的假设和分析可以看出:
火箭推进力自始至终在加速着整个火箭,

而随着燃料的不断消耗,所出现的无用结构质量也在随之不断加速,作了无用功,故效
益低,浪费大。
所谓理想火箭,
就是能够随着燃料的燃烧不断抛弃火箭的无用结构。
下面建立它的
数学模型。
假设:在 (t , t + Δt ) 时段丢弃的结构质量与烧掉的燃料质量以 α 与 1 − α 的比例同
时进行。
建模与分析:由动量守恒定律,有

-155-

m(t )v(t ) = m(t + Δt )v(t + Δt ) − α
− (1 − α )

dm
Δt ⋅ v(t ) dt dm
Δt ⋅ (v(t ) − u ) + o(Δt ) dt 由上式可得理想火箭的数学模型为

− m( t )

dv (t ) dm = (1 − α )
⋅u
dt dt (10)



v ( 0) = 0 , m ( 0) = m 0
解之得

v(t ) = (1 − α )u ln

m0 m( t )

(11)

由上式可知,当燃料耗尽,结构质量抛弃完时,便只剩卫星质量 m p ,从而最终速
度的数学模型为

v (t ) = (1 − α )u ln

m0 mp (12)

(12)式表明,当 m0 足够大时,便可使卫星达到我们所希望它具有的任意速度。
例如,
考虑到空气阻力和重力等因素,
估计要使 v = 10.5 km/s 才行,
如果取 u = 3 km/s, α = 0.1 ,则可推出 m0 / m p = 50 ,即发射 1 吨重的卫星大约需 50 吨重的理想火箭。
1.3 多级火箭卫星系统
理想火箭是设想把无用结构质量连续抛弃以达到最佳的升空速度,
虽然这在目前的
技术条件下办不到,
但它确为发展火箭技术指明了奋斗目标。
目前已商业化的多级火箭
卫星系统便是朝着这种目标迈进的第一步。多级火箭是从末级开始,逐级燃烧,当第 i
级燃料烧尽时,第 i + 1 级火箭立即自动点火,并抛弃已经无用的第 i 级。我们用 mi 表
示第 i 级火箭质量, m p 表示有效负载。为了简单起见,先作如下假设:
(i)设各级火箭具有相同的 λ , λmi 表示第 i 级结构质量, (1 − λ )mi 表示第 i 级
的燃料质量。
(ii)
喷气相对火箭的速度 u 相同,
燃烧级的初始质量与其负载质量之比保持不变,
记该比值为 k 。
先考虑二级火箭。由(7)式,当第一级火箭燃烧完时,其速度为

v1 = u ln

m1 + m2 + m p

λm1 + m2 + m p

= u ln

k +1 λk + 1

= 2u ln

k +1 λk + 1

在第二级火箭燃烧完时,其速度为

v 2 = v1 + u ln

m2 + m p

λm 2 + m p

(13)

仍取 u = 3 km/s, λ = 0.1 ,考虑到阻力等因素,为了达到第一宇宙速度,对于二
级火箭,欲使 v 2 = 10.5 km/s,由(13)式得

-156-

6 ln

k +1
= 10.5
0.1k + 1

解之得

k = 11.2 ,
这时

m0 m1 + m2 + m p
=
= ( k + 1) 2 ≈ 149 mp mp
同理,可推出三级火箭

k +1 λk + 1
欲使 v 3 = 10.5 km/s,应该 k ≈ 3.25 ,从而 m0 / m p ≈ 77 。 v3 = 3u ln

与二级火箭相比,在达到相同效果的情况下,三级火箭的质量几乎节省了一半。
现记 n 级火箭的总质量(包括有效负载 m p )为 m0 ,在相同假设下( u = 3 km/s,

v末 = 10.5 km/s, λ = 0.1 )
,可以算出相应的 m0 / m p 值,现将计算结果列于下表中: n (级数)
1
2
3
4
5


m0 / m p
×
149 77
65
60
… 50
实际上,由于受技术条件的限制,采用四级或四级以上的火箭,经济效益是不合算
的,因此采用三级火箭是最好的方案。
1.4 最佳结构设计
下面我们将考虑当用 n 级火箭发射卫星时的最佳结构,即使 m0 / m p 最小的结构。


w1 = m0 = m1 + m2 + L + mn + m p w2 = m 2 + L + m n + m p


wn +1 = m p


k1 =

wn w1 ,…, k n = w2 wn +1



wn w1 ⎟ v末 = u ln⎜
L
⎜ λm + w λmn + wn +1 ⎟
1
2


由于 m1 = w1 − w2 , m2 = w2 − w3 ,…, mn = wn − wn +1 ,可以推出

⎞ kn k1
L
v末 = u ln⎜
⎜ λ ( k − 1) + 1 λ ( k − 1) + 1 ⎟

1 n ⎝

易知

m0
= k1 k 2 L k n mp 则最佳结构问题转化为
-157-

min k1k 2 Lk n

k1 k 2 L k n
=c
[λ ( k1 − 1) + 1]L[λ ( k n − 1) + 1] m 可以推出当 k1 = k 2 = L = k n 时, 0 最小。 mp s.t.

人口模型
2.1 问题提出
据考古学家论证,
地球上出现生命距今已有 20 亿年,
而人类的出现距今却不足 200
万年。纵观人类人口总数的增长情况,我们发现:1000 年前人口总数为 2.75 亿。经过
漫长的过程到 1830 年,人口总数达 10 亿,又经过 100 年,在 1930 年,人口总数达 20
亿;30 年之后,在 1960 年,人口总数为 30 亿;又经过 15 年,1975 年的人口总数是
40 亿,12 年之后即 1987 年,人口已达 50 亿。
我们自然会产生这样一个问题:
人类人口增长的规律是什么?如何在数学上描述这
一规律。
2.2 Malthus 模型
1789 年,英国神父 Malthus 在分析了一百多年人口统计资料之后,提出了 Malthus
模型。
模型假设
(i)设 x (t ) 表示 t 时刻的人口数,且 x (t ) 连续可微。

(ii)人口的增长率 r 是常数(增长率=出生率—死亡率)
(iii)人口数量的变化是封闭的,即人口数量的增加与减少只取决于人口中个体的
生育和死亡,且每一个体都具有同样的生育能力与死亡率。
建模与求解
由假设, t 时刻到 t + Δt 时刻人口的增量为
§2

x (t + Δt ) − x (t ) = rx (t ) Δt

于是得

⎧ dx
⎪ = rx
⎨ dt
⎪ x (0) = x 0


(14)

其解为

x (t ) = x0 e rt

(15)

模型评价
考虑二百多年来人口增长的实际情况,1961 年世界人口总数为 3.06 × 10 ,在
1961~1970 年这段时间内,每年平均的人口自然增长率为 2%,则(15)式可写为
9

x (t ) = 3.06 × 10 9 ⋅ e 0.02 ( t −1961)

(16)
根据 1700~1961 年间世界人口统计数据,我们发现这些数据与(16)式的计算结
果相当符合。因为在这期间地球上人口大约每 35 年增加 1 倍,而(16)式算出每 34.6
年增加 1 倍。
但是,当人们用(15)式对 1790 年以来的美国人口进行检验,发现有很大差异。
利用(16)式对世界人口进行预测,也会得出惊异的结论:当 t = 2670 年时,
-158-

x (t ) = 4.4 × 1015 ,即 4400 万亿,这相当于地球上每平方米要容纳至少 20 人。
显然,用这一模型进行预测的结果远高于实际人口增长,误差的原因是对增长率 r
的估计过高。由此,可以对 r 是常数的假设提出疑问。
2.3 阻滞增长模型(Logistic 模型)
如何对增长率 r 进行修正呢?我们知道,地球上的资源是有限的,它只能提供一定
数量的生命生存所需的条件。随着人口数量的增加,自然资源、环境条件等对人口再增
长的限制作用将越来越显著。如果在人口较少时,我们可以把增长率 r 看成常数,那么
当人口增加到一定数量之后,就应当视 r 为一个随着人口的增加而减小的量,即将增长
率 r 表示为人口 x (t ) 的函数 r ( x ) ,且 r ( x ) 为 x 的减函数。
模型假设
(工程师原则,首先用线性)
(i)设 r ( x ) 为 x 的线性函数, r ( x ) = r − sx 。
(ii)自然资源与环境条件所能容纳的最大人口数为 x m ,即当 x = x m 时,增长率

r( xm ) = 0 。
建模与求解

x
) ,则有 xm x
⎧ dx
⎪ = r (1 − ) x, xm ⎨ dt
⎪ x (t ) = x
⎩ 0
0

由假设(i)(ii)可得 r ( x ) = r (1 −


(17)

(17)式是一个可分离变量的方程,其解为

x (t ) =
模型检验

xm

(18)

x
1 + ( m − 1)e − r ( t − t0 ) x0 由(17)式,计算可得

2x x d 2x
= r 2 (1 − )(1 − ) x
2
xm xm dt

(19)

人口总数 x (t ) 有如下规律:
(i) lim x(t ) = x m ,即无论人口初值 x m 如何,人口总数以 x m 为极限。 t → +∞

(ii)当 0 < x 0 < x m 时,

x dx = r (1 − ) x > 0 ,这说明 x(t ) 是单调增加的,又由 xm dt

xm xm d 2x d 2x
时, 2 > 0 ,x = x (t ) 为凹, x >

时, 2 < 0 ,x = x (t )
(19)
式知: x <

2
2
dt dt 为凸。
(iii)人口变化率

x dx 在 x = m 时取到最大值,即人口总数达到极限值一半以前 dt 2

是加速生长时期,经过这一点之后,生长速率会逐渐变小,最终达到零。
与 Malthus 模型一样,代入一些实际数据进行验算,若取 1790 年为 t = t0 = 0 ,

x 0 = 3.9 × 10 6 , x m = 197 × 10 6 , r = 0.3134 可以看出,直到 1930 年,计算结果与
-159-

实际数据都能较好地吻合,在 1930 年之后,计算与实际偏差较大。原因之一是 60 年代
的实际人口已经突破了假设的极限人口 x m ,由此可知,本模型的缺点之一就是不易确
定 xm 。
2.4 模型推广
可 以 从 另 一 个 角 度 导 出 阻 滞 增 长 模 型 , 在 Malthus 模 型 上 增 加 一 个 竞 争 项

− bx 2 (b > 0) ,它的作用是使纯增长率减少。如果一个国家工业化程度较高,食品供应
较充足,能够提供更多的人生存,此时 b 较小;反之 b 较大,故建立方程
⎧ dx
( a, b > 0),
⎪ = x ( a − bx )
(20)
⎨ dt
⎪ x (t0 ) = x0 ,

其解为

x (t ) =

ax 0 bx0 + ( a − bx 0 )e − a ( t − t0 )

(21)

由(21)式,得

d 2x
= ( a − 2bx )( a − bx ) x dt 2

(22)

对(20)~(22)式进行分析,有
(i)对任意 t > t 0 ,有 x (t ) > 0 ,且 lim x (t ) = t → +∞

a b a a a
时,x ' (t ) > 0 , x (t ) 递增; x = 时, x ' (t ) = 0 ;当 x (t ) >

b b b
时, x ' (t ) < 0 , x (t ) 递减。 a a a (iii)当 0 < x <
时, x ' ' (t ) > 0 , x (t ) 为凹,当
< x < 时, x' ' (t ) < 0 ,
2b
2b b x (t ) 为凸。 a 令(20)式第一个方程的右边为 0,得 x1 = 0 , x 2 = ,称它们是微分方程(20) b a a 的平衡解。易知 lim x (t ) = ,故又称 是(20)式的稳定平衡解。可预测:不论人 t → +∞ b b a 口开始的数量 x0 为多少,经过相当长的时间后,人口总数将稳定在 。 b 参数 a 和 b 可以通过已知数据利用 Matlab 中的非线性回归命令 nlinfit 求得。
(ii)当 0 < x <

§3

战争模型
早在第一次世界大战期间,F. W. Lanchester 就提出了几个预测战争结局的数学模
型,其中包括作战双方均为正规部队;作战双方均为游击队;作战的一方为正规部队,
另一方为游击队。
后来人们对这些模型作了改进和进一步的解释,
用以分析历史上一些
著名的战争,如二次世界大战中的美日硫黄岛之战和 1975 年的越南战争。
影响战争胜负的因素有很多,
兵力的多少和战斗力的强弱是两个主要的因素。
士兵
的数量会随着战争的进行而减少,这种减少可能是因为阵亡、负伤与被俘,也可能是因
-160-

为疾病与开小差。
分别称之为战斗减员与非战斗减员。
士兵的数量也可随着增援部队的
到来而增加。从某种意义上来说,当战争结束时,如果一方的士兵人数为零,那么另一
方就取得了胜利。
如何定量地描述战争中相关因素之间的关系呢?比如如何描述增加士
兵数量与提高士兵素质之间的关系。
3.1 模型一 正规战模型
模型假设
(i)双方士兵公开活动。 x 方士兵的战斗减员仅与 y 方士兵人数有关。记双方士
兵人数分别为 x (t ), y (t ) , x 方士兵战斗减员率为 ay (t ) ,a 表示 y 方每个士兵的杀伤

率。可知 a = ry p y , ry 为 y 方士兵的射击率(每个士兵单位时间的射击次数) p y 每

次射击的命中率。同理,用 b 表示 x 方士兵对 y 方士兵的杀伤率,即 b = rx p x 。
(ii)双方的非战斗减员率仅与本方兵力成正比。减员率系数分别为 α , β 。
(iii)设双方的兵力增援率为 u (t ), v (t ) 。
模型与求解
由假设可知

⎧ dx
⎪ dt = − ay − αx + u(t )


⎪ dy = −bx − βy + v (t )
⎪ dt


(23)

我们对(23)式中的一种理想的情况进行求解,即双方均没有增援与非战斗减员。
则(23)式化为

⎧ dx
⎪ dt = − ay

⎪ dy
⎨ = −bx
⎪ dt
⎪ x ( 0) = x 0 ,



(24)

y ( 0) = y 0

其中 x0 , y 0 为双方战前的兵力。
由(24)式的前两式相除,得

dy bx
=
dx ay
分离变量并积分得
2
2
a ( y 2 − y 0 ) = b( x 2 − x 0 ) ,

整理得
2
2 ay 2 − bx 2 = ay 0 − by 0

若令 k = ay 0 − bx 0 ,则有
2

2

ay 2 − bx 2 = k
当 k = 0 ,双方打成平局。当 k > 0 时, y 方获胜。当 k < 0 时, x 方获胜。这样, y 方要想取得战斗胜利,就要使 k > 0 ,即
-161-

2
2
ay 0 − bx 0 > 0

考虑到假设(i)
,上式可写为

⎛ y 0 ⎞ ⎛ rx ⎞⎛ p x ⎞
⎜ ⎟ > ⎜ ⎟⎜ ⎟
⎜ x ⎟ ⎜ r ⎟⎜ p ⎟
⎝ 0 ⎠ ⎝ y ⎠⎝ y ⎠
2

(25)

(25)式是 y 方占优势的条件。若交战双方都训练有素,且都处于良好的作战状态。则 rx
与 ry , pz 与 p y 相差不大,
(25)式右边近似为 1。
(25)式左边表明,初始兵力比例被

y0
,以平方的关系影响着战争的结局。比如说,
x0
则影响着战争的结局的能力将增加
如果 y 方的兵力增加到原来的 2 倍,x 方兵力不变, x 须把其士兵的射击率 rx 增加到原来的 4 倍 p x , ry , p y

4 倍。
此时, 方要想与 y 方抗衡,
平方地放大了。即双方初始兵力之比

均不变)

以上是研究双方之间兵力的变化关系。下面将讨论每一方的兵力随时间的变化关
系。
对(24)式两边对 t 求导,得

d 2x dy = −a
= abx ,
2
dt dt 即

d 2x
− abx = 0 dt 2

(27)

初始条件为

x ( 0) = x 0 ,

dx dt t =0

= −ay 0

解之,得

x (t ) = x0 ch ( ab t ) −

a y 0sh( ab t ) b 同理可求得 y (t ) 的表达式为

y (t ) = y 0 ch ( ab t ) −

b x0sh ( ab t ) 。 a 3.2 模型二 游击战模型
模型假设
(i) y 方士兵看不见 x 方士兵, x 方士兵在某个面积为 S x 的区域内活动。 y 方士
兵不是向 x 方士兵射击,而是向该区域射击。此时, x 方士兵的战斗减员不仅与 y 方兵
力有关,而且随着 x 方兵力增加而增加。因为在一个有限区域内,士兵人数越多,被杀
伤的可能性越大。可设, x 方的战斗减员率为 cxy ,其中 c 为 y 方战斗效果系数,

c = ry p y = ry

S ry
Sx

,其中 ry 仍为射击率,命中率 p y 为 y 方一次射击的有效面积( S ry )

与 x 方活动面积( S x )之比。
-162-

假设(ii)(iii)同模型一的假设(ii)(iii)



模型与求解
由假设,可得方程

⎧ dx
⎪ dt = − cxy − αx + u(t )


⎪ dy = −dxy − βy + v (t )
⎪ dt

S
其中 d = rx p x = rx rx 是 x 方战斗效果系数。
Sy

(28)

为了使(28)式容易求解,可以做一些简化:设交战双方在作战中均无非战斗减员
和增援。此时,有

⎧ dx
⎪ dt = − cxy


⎪ dy = −dxy
⎪ dt


(29)

两式相除,得

dy d
= , dx c
其解为

c( y − y 0 ) = d ( x − x 0 )
令 l = cy 0 − dx 0 ,上式可化为

cy − dx = l
(30)
当 l = 0 ,双方打成平局。当 l > 0 时, y 方获胜。当 l < 0 时, x 方获胜。 y 方获胜的条件可以表示为 y 0 d rx S rx S x
> = x0 c ry S ry S y y 即初始兵力之比 0 以线性关系影响战斗的结局。
当双方的射击率 rx , ry 与有效射击面积 x0 S rx , S ry 一定时,增加活动面积 S y 与增加初始兵力 y 0 起着同样的作用。
3.3 模型三 混合战模型
模型假设
(i) x 方为游击队, y 方为正规部队。
(ii)交战双方均无战斗减员与增援。
模型与求解
借鉴模型一与二的思想,可得

-163-

⎧ dx
⎪ dt = − cxy

⎪ dy
⎨ = −bx
⎪ dt
⎪ x ( 0) = x 0 , y ( 0) = y 0



(31)

其解为

cy 2 − 2bx = m

(32)

其中 m = cy − 2bx 0 。
2
0

经验表明,
只有当兵力

y0
远远大于 1 时,
正规部队 y 才能战胜游击队。 m > 0 时,

x0

y 方胜,此时
2

⎛ y0 ⎞
2b 2rx p x S x
⎜ ⎟ >
=
⎜x ⎟ cx 0 ry S ry x0
⎝ 0⎠

(33)

一般来说,正规部队以火力强而见长,游击队以活动灵活,活动范围大而见长。这
可以通过一些具体数据进行计算。
不妨设 x0 = 100 ,命中率 p x = 0.1 ,

rx 1
= ,活动区域的面积 S x = 10 6 m2, y 方 ry 2


有效射击面积 S ry = 1 m2,则由(33) y 方取胜的条件为
2

⎛ y0 ⎞
2 × 0.1 × 0.1 × 10 6
⎜ ⎟ >
= 100
⎜x ⎟
2 × 1 × 100
⎝ 0⎠ y 0 > 10 x 0 , y 方的兵力是 x 方的 10 倍。
美国人曾用这个模型分析越南战争。
根据类似于上面的计算以及四五十年代发生在
马来亚、菲律宾、印尼、老挝等地的混合战争的实际情况估计出,正规部队一方要想取
胜必须至少投入 8 倍于游击部队一方的兵力,而美国至多只能派出 6 倍于越南的兵力。
越南战争的结局是美国不得不接受和谈并撤军,越南人民取得最后的胜利。
3.4 模型四 一个战争实例
J. H. Engel 用二次大战末期美日硫黄岛战役中的美军战地记录,
对正规战争模型进
行了验证,发现模型结果与实际数据吻合得很好。
硫黄岛位于东京以南 660 英里的海面上,是日军的重要空军基地。美军在 1945 年
2 月开始进攻,激烈的战斗持续了一个月,双方伤亡惨重,日方守军 21500 人全部阵亡
或被俘,美方投入兵力 73000 人,伤亡 20265 人,战争进行到 28 天时美军宣布占领该
岛,实际战斗到 36 天才停止。美军的战地记录有按天统计的战斗减员和增援情况。日
军没有后援,战地记录则全部遗失。
用 A(t ) 和 J (t ) 表示美军和日军第 t 天的人数,忽略双方的非战斗减员,则

-164-

⎧ dA
⎪ dt = − aJ + u(t )

⎪ dJ
= −bA

⎪ dt
⎪ A(0) = 0, J (0) = 21500



(34)

美军战地记录给出增援率 u (t ) 为

⎧54000, 0 ≤ t < 1
⎪6000, 2 ≤ t < 3

u (t ) = ⎨
⎪13000, 5 ≤ t < 6
⎪0,
其它

并可由每天伤亡人数算出 A(t ) , t = 1,2,L,36 。下面要利用这些实际数据代入(34)
式,算出 A(t ) 的理论值,并与实际值比较。
利用给出的数据,对参数 a, b 进行估计。对(34)式两边积分,并用求和来近似代
替积分,有
t

t

τ =1

τ =1

A(t ) − A(0) = − a ∑ J (τ ) + ∑ u(τ )

(35)

t

J (t ) − J (0) = −b∑ A(τ )

(36)

τ =1

为 估 计 b 在 ( 36 ) 式 中 取 t = 36 , 因 为 J (36) = 0 , 且 由 A(t ) 的 实 际 数 据 可 得
36

∑ A(t ) = 2037000 ,于是从(36)式估计出 b = 0.0106 。再把这个值代入(36)式即可 t =1

算出 J (t ) , t = 1,2,L,36 。

然后从(35)式估计 a 。令 t = 36 ,得
36

a=

∑ u(τ ) − A(36) τ =1

(37)

36

∑ J (τ ) τ =1


其中分子是美军的总伤亡人数, 20265 人,

分母可由已经算出的 J (t ) 得到, 372500
人,于是从(37)式有 a = 0.0544 。把这个值代入(35)式得 t t

τ =1

τ =1

A(t ) = −0.0544∑ J (τ ) + ∑ u(τ )

(38)

由(38)式就能够算出美军人数 A(t ) 的理论值,与实际数据吻合得很好。
习 题 十 三
1. 设位于坐标原点的甲舰向位于 x 轴上点 A(1,0) 处的乙舰发射导弹,导弹始终对
准乙舰。如果乙舰以最大的速度 v0 ( v0 是常数)沿平行于 y 轴的直线行驶,导弹的速
-165-

度是 5v0 ,求导弹运行的曲线。又乙舰行驶多远时,导弹将它击中?
2. 有高为 1m 的半球形容器,水从它的底部小孔流出。小孔横截面积为 1cm2。开
始时容器内盛满了水,
求水从小孔流出过程中容器里水面的高度 h(水面与孔口中心的
距离)随时间 t 变化的规律。
3. 在交通十字路口,都会设置红绿灯。为了让那些正行驶在交叉路口或离交叉路
口太近而无法停下的车辆通过路口,
红绿灯转换中间还要亮起一段时间的黄灯。
对于一
位驶近交叉路口的驾驶员来说,
万万不可处于这样的进退两难的境地:
要安全停车则离
路口太近;要想在红灯亮之前通过路口又觉太远。
那么,黄灯应亮多长时间才最为合理呢?
4. 我们知道现在的香烟都有过滤嘴,而且有的过滤嘴还很长,据说过滤嘴可以起
到减少毒物进入体内。
你认为呢?过滤嘴的作用到底有多大,
与使用的材料和过滤嘴的
长度有无关系?请你建立一个描述吸烟过程的数学模型,
分析人体吸入的毒量与哪些因
素有关,以及它们之间的数量表达式。
5. 根据经验当一种新商品投入市场后,随着人们对它的拥有量的增加,其销售量 s(t ) 下降的速度与 s(t ) 成正比。
广告宣传可给销量添加一个增长速度,
它与广告费 a (t )
成正比,但广告只能影响这种商品在市场上尚未饱和的部分(设饱和量为 M )
。建立一
个销售 s (t ) 的模型。若广告宣传只进行有限时间 τ ,且广告费为常数 a ,问 s (t ) 如何变
化?

-166-

第十四章

稳定状态模型

虽然动态过程的变化规律一般要用微分方程建立的动态模型来描述,
但是对于某些
实际问题,
建模的主要目的并不是要寻求动态过程每个瞬时的性态,
而是研究某种意义
下稳定状态的特征,
特别是当时间充分长以后动态过程的变化趋势。
譬如在什么情况下
描述过程的变量会越来越接近某些确定的数值,
在什么情况下又会越来越远离这些数值
而导致过程不稳定。
为了分析这种稳定与不稳定的规律常常不需要求解微分方程,
而可
以利用微分方程稳定性理论,直接研究平衡状态的稳定性就行了。
本章先介绍平衡状态与稳定性的概念,然后列举几个这方面的建模例子。
§1

微分方程稳定性理论简介
定义 1 称一个常微分方程(组)是自治的,如果方程(组)

⎡ f1 ( x, t )⎤ dx = F ( x, t ) = ⎢ M ⎥

⎢ dt ⎢ f N (t ) ⎥


中的 F ( x, t ) = F ( x ) ,即在 F 中不含时间变量 t 。

(1)

事实上,如果增补一个方程,一个非自治系统可以转化自治系统,就是说,如果定


⎡ x⎤
⎡ F ( x, t ) ⎤ y = ⎢ ⎥ , G( y ) = ⎢

⎣t ⎦
⎣ 1 ⎦
且引入另一个变量 s ,则方程(1)与下述方程

dy
= G( y ) ds 是等价的。这就是说自治系统的概念是相对的。下面仅考虑自治系统,这样的系统也称
为动力系统。
定义 2 系统

dx
= F (x ) dt (2)

的相空间是以 ( x1 ,L, xn ) 为坐标的空间 R ,特别,当 n = 2 时,称相空间为相平面。 n n

空间 R 中的点集

{( x1 , L , xn ) | xi = xi (t )满足( 2), i = 1,L, n}

称为系统(2)的轨线,所有轨线在相空间中的分布图称为相图。
定义 3 相空间中满足 F ( x0 ) = 0 的点 x0 称为系统(2)的奇点(或平衡点)

奇点可以是孤立的,也可以是连续的点集。例如,系统

⎧ dx (t )
⎪ dt = ax + by


⎪ dy (t ) = cx + dy
⎪ dt


(3)

当 ad − bc = 0 时,有一个连续的奇点的集合。当 ad − bc ≠ 0 时, (0,0) 是这个系统的
唯一的奇点。下面仅考虑孤立奇点。为了知道何时有孤立奇点,给出下述定理:
-167-

定理 1

设 F (x ) 是实解析函数,且 x0 系统(2)的奇点。若 F (x ) 在点 x0 处的

Jacobian 矩阵

⎡ ∂f ⎤
J ( x0 ) = ⎢ i ⎥
⎢ ∂x j ⎥


是非奇异的,则 x0 是该系统的孤立奇点。
定义 4

设 x0 是(2)的奇点,称

(i) x0 是稳定的,如果对于任意给定的 ε > 0 ,存在一个 δ > 0 ,使得如果

| x (0) − x0 |< δ ,则 | x (t ) − x 0 |< ε 对所有的 t 都成立。
(ii) x0 是渐近稳定的,如果它是稳定的,且 lim | x (t ) − x 0 |= 0 。 t →∞

这样,如果当系统的初始状态靠近于奇点,其轨线对所有的时间 t 仍然接近它,于
是说 x0 是稳定的。另一方面,如果当 t → ∞ 时这些轨线趋于 x0 ,则 x0 是渐近稳定的。
定义 5 一个奇点不是稳定的,则称这个奇点是不稳定的。
对于常系数齐次线性系统(3)有下述定理。
定理 2 设 x = x (t ) 是系统(3)的通解。则
(i)如果系统(3)的系数矩阵 A 的一切特征根的实部都是负的,则系统(3)的
零解是渐近稳定的。
(ii)如果 A 的特征根中至少有一个根的实部是正的,则系统(3)的零解是不稳
定的。
(iii)如果 A 的一切特征根的实部都不是正的,但有零实部,则系统(3)的零解
可能是稳定的,也可能是不稳定的,但总不会是渐近稳定的。
定理 2 告诉我们:系统(3)的零解渐近稳定的充分必要条件是 A 的一切特征根的
实部都是负的。
对于非线性系统,
一般不可能找出其积分曲线或轨迹,
也就不可能直接导出奇点的
稳定性。为克服这一困难,在奇点附近用一个线性系统来近似这个非线性系统,用这个
近似系统的解来给出这个奇点的稳定解。
定义 6
设 x0 是系统
(2)
的一个孤立奇点。
称系统在 x0 点几乎是线性的,
如果 F
在 x0 的 Jacobian 矩阵是非奇异的,即 det J ( x0 ) ≠ 0 。
设 F ( x ) 在 x = 0 的某邻域内连续,并有直到二阶连续偏导数,则由多元函数的
Taylor 公式,可将 F ( x ) 展开成 F ( x ) = Ax + O (| x | ) ,其中
2

⎡ ∂f 1
⎢ ∂x
⎢ 1
A= ⎢ M
⎢ ∂f n
⎢ ∂x1


∂f 1 ⎤
∂x n ⎥

M
M ⎥
∂f n ⎥
L
∂x n ⎥

L

是一个常数矩阵,这样得到的线性系统

dx
= Ax dt (4)

称为系统(2)的线性近似。一开始,人们以为总可以用线性近似系统来代替所研究的
-168-

原系统。但后来人们发现,这种看法是不对的,或至少说是不全面的,非线性系统中的
许多性质,在它的线性近似中不再保留。即使象零解稳定性这样一个问题,也要在一定
条件下,
才可用它的线性近似系统代替原系统来研究。
关于这个问题,
我们有下述定理:
定理 3 如果系统(4)的零解是渐近稳定的,或不稳定的,则原系统的零解也是
渐近稳定的或不稳定的。然而,如果系统(4)的零解是稳定的,则原系统的零解是不
定的,即此时不能从线性化的系统来导出原系统的稳定性。

⎡a b ⎤
⎥ 的行列式 det A ≠ 0 的条件下,可知 (0,0) 是
⎣c d ⎦

系统(3)在其系数矩阵 A = ⎢

系统(3)的唯一的平衡点,它的稳定性由特征方程:

det( A − λI ) = 0

的根 λ (特征根)决定。
定理 4 设线性系统(3)所对应的特征方程是

λ2 + pλ + q = 0
其中 p = −( a + d ) ,q = ad − bc 。 λ1 和 λ2 是它的根,

则当 q ≠ 0 时关于奇点 O (0,0)
有下述结论:
(i) λ1 < λ2 < 0 , O 是稳定结点;

(ii) λ1 = λ2 < 0 , O 是稳定退化结点;

(iii) λ1 > λ2 > 0 , O 是不稳定结点;

(iv) λ1 = λ2 > 0 , O 是不稳定退化结点;
(v) λ1 < 0 < λ2 , O 是不稳定鞍点;

(vi) λ1, 2 = α ± βi, α < 0 , O 是稳定焦点;
(vii) λ1, 2 = α ± βi, α > 0 , O 是不稳定焦点;
(viii) λ1, 2 = α ± βi, α = 0 , O 是不稳定中心。
定理 5

设非线性系统

⎧ dx
⎪ dt = ax + by + ϕ ( x, y )


⎪ dy = ax + by + ψ ( x, y )
⎪ dt


(5)

中的 ϕ 和ψ 满足条件:

(i)在点 O 的某邻域内存在连续的一阶偏导数。
(ii)存在常数 δ > 0 ,使得

lim r →0

ϕ ( x, y ) r 1+δ

= lim r →0

ψ ( x, y ) r 1+ δ

= 0 , r = x2 + y2 )


又设系统(5)的一次近似系统(3)的特征方程的根没有零实部,则(5)式与(3)式
的奇点 O 的类型相同,并有相同的稳定性或不稳定性。
§2

再生资源的管理和开发
渔业资源是一种再生资源,再生资源要注意适度开发,不能为了一时的高产“竭泽
而渔”
,应该在持续稳产的前提下追求最高产量或最优的经济效益。
-169-

这是一类可再生资源管理与开发的模型,
这类模型的建立一般先考虑在没有收获的
情况下资源自然增长模型,然后再考虑收获策略对资源增长情况的影响。
2.1 资源增长模型
考虑某种鱼的种群的动态。在建立模型之前,做如下的基本假设:
(i)鱼群的数量本身是离散变量,谈不到可微性。但是,由于突然增加或减少的
只是单一个体或少数几个个体,与全体数量相比,这种增长率是微小的。所以,可以近
似地假设鱼群的数量随时间连续地,甚至是可微地变化。
(ii)假设鱼群生活在一个稳定的环境中,即其增长率与时间无关。
(iii)种群的增长是种群个体死亡与繁殖共同作用的结果。
(iv)资源有限的生存环境对种群的繁衍,生长有抑制作用,而且这一作用与鱼群
的数量是成正比的。
记时刻 t 渔场中鱼量为 x (t ) ,我们可以得到 x (t ) 所满足的 Logistic 模型:

x
⎧&
⎪ x (t ) = rx(1 − )
(6)
N

⎪ x ( 0) = N 0

其中 r 是固有增长率, N 是环境容许的最大鱼量。由分离变量法求得方程(6)解为
N
x (t ) =
− rt
1+ e (N − N0 ) / N0
(6)式有两个平衡点,即 x1 = 0 , x 2 = N ,其中 x1 是不稳定的, x2 在正半轴内全局
稳定。
2.2 资源开发模型
建立一个在捕捞情况下渔场鱼量遵从的方程,
分析鱼量稳定的条件,
并且在稳定的
前提下,讨论如何控制捕捞使持续产量或经济效益达到最大。
设单位时间的捕捞量与渔场鱼量 x (t ) 成正比,
比例系数 k 表示单位时间捕捞率,k
可以进一步分解分解为 k = qE , E 称为捕捞强度,用可以控制的参数如出海渔船数来
度量; q 称为捕捞系数,表示单位强度下的捕捞率。为方便取 q = 1 ,于是单位时间的
捕捞量为 h( x ) = Ex (t ) 。 h(x ) = 常数,表示一个特定的捕捞策略,即要求捕鱼者每天
只能捕捞一定的数量。这样,捕捞情况下渔场鱼量满足方程

& x(t ) = rx(1 −

x
) − Ex
N

(7)

这是一个一阶非线性方程,且是黎卡提型的。也称为 Scheafer 模型。
希望知道渔场的稳定鱼量和保持稳定的条件,
即时间 t 足够长以后渔场鱼量 x (t ) 的
趋向,并且由此确定最大持续产量。在平衡点处有

dx
= 0 ,方程(7)有两个平衡点 dt E
) 。显然,它们均是方程的解。 r 在 E < r 的情况下, x2 是一正平衡点。
(7)式可改写为
& x (t ) = − x ( x − x 2 )
(8)
&
&
易知,当 0 < x < x 2 时, x (t ) > 0 ; x > x 2 时, x (t ) < 0 ,即平衡解 x1 是不稳定的,而 x2 是稳定平衡解。即在捕捞强度 E < r 的情况下,渔场鱼量将稳定在 x2 的水平,因此 x1 = 0 , x 2 = N (1 −

-170-

产量(单位时间的捕捞量)也将稳定在 Ex 2 的水平,即此时可获得持续收获量。

&
当然,当 E > r 时, x (t ) < 0 ,渔场鱼量将逐渐减少至 x1 = 0 ,这时的捕捞其实是
“竭泽而渔”
,当然谈不上获得持续产量了。
如何才能做到渔资源在持续捕捞的条件下为我们提供最大的收益?从数学上说,


x (t )
) = Ex (t ) 的条件下极大化所期望的“收益”
,这里的“收
N
益”可理解为产量 h = Ex (t ) ,则问题就可以数学地叙述为下述优化问题: hmax = max Ex (t ) x (t )
) − Ex (t ) = 0 。
约束条件为 rx (t )(1 −
N
E
这里它可以归结为 E 的二次函数 h( E ) = NE (1 − ) 的最大值问题。简单的推导不 r r rN 。捕捞强度 Emax 是
难得到最大持续捕捞强度为 E max = ,最大持续产量为 hmax =
2
4
&
是在 x (t ) = 0 或 rx (t )(1 −

得到最大持续捕鱼量的策略。
2.3 经济效益模型
当今,
对鱼类资源的开发和利用已经成为人类经济活动的一部分。
其目的不是追求
最大的渔产量而是最大的经济收益。
因而一个自然的想法就是进一步分析经济学行为对
鱼类资源开发利用的影响。
如果经济效益用从捕捞所得的收入中扣除开支后的利润来衡量,
并且简单地设鱼的
销售单价为常数 p ,单位捕捞强度(如每条出海渔船)的费用为常数 c ,那么单位时间
的收入 T 和支出 S 分别为

T = ph( x ) = pEx , S = cE

单位时间的利润为

R = T − S = pEx − cE
利润是渔民所关注的焦点。因此在制定管理策略时所期望极大化的“收益”
,这时
就应理解为经济利润或净收入而不是鱼的产量 h 。
因而所讨论的问题就变成了在使鱼量

E
) 的约束条件下的 Rmax 。即求 r E
R( E ) = pNE (1 − ) − cE r 的最大值。容易求出使 R( E ) 达到最大的捕捞强度为 r c
E max = (1 −
)
pN
2
稳定在 x = x 2 = N (1 −

最大利润下的渔场稳定鱼量

x max =

N c +
2 2p

最大利润下渔场单位时间的持续产量为

hmax

x max rN c2
)=
(1 − 2 2 )
= rx max (1 −
4
N p N
-171-

最大可持续净收益

Rmax =

prN c 2
(1 −
)
4 pN 与前一模型相比较可以看出,
在最大效益原则下捕捞强度和持续产量均有减少,

渔场的鱼量有所增加。并且,减少或增加的比例随着捕捞成本 c 的增长而变大,随着销
售价格 p 的增长而变小,这显然是符合实际情况的。
2.4 种群的相互竞争模型
有甲乙两个种群,
当它们独自在一个自然环境中生存时,
数量的演变均遵从 Logistic
规律。记 x1 (t ), x 2 (t ) 是两个种群的数量, r1 , r2 是它们的固有增长率, N 1 , N 2 是它们的
最大容量。
于是,对于种群甲有

& x (t ) = r1 x1 (1 −

x1
)
N1

x1 x ) 反映由于甲对有限资源的消耗导致的对它本身增长的阻滞作用, 1
N
N1
可解释为相对 N1 而言单位数量的甲消耗的食物量(设食物总量为 1)
。当两个种群在同
其中,
因子 (1 −

一自然环境中生存时,
考察由于乙消耗同一种有限资源对甲的增长产生的影响,
可以合
理地在因子 (1 −

x1
) 中再减去一项,该项与种群乙的数量 x2(相对于 N 2 而言)成正比,
N

于是,种群甲增长的方程为

& x1 (t ) = r1 x1 (1 −

x1 x −σ1 2 )
N1
N2

(9)

这里 σ 1 的意义是,
单位数量乙
(相对 N 2 而言)
消耗的供养甲的食物量为单位数量甲
(相

对 N1 )消耗的供养乙的食物量的 σ 1 倍,类似地,甲的存在也影响了乙的增长,种群乙
的方程应该是

& x 2 (t ) = r2 x 2 (1 − σ 2

x1 x 2

)
N1 N 2

(10)

对 σ 2 可作相应的解释。

在两个种群的相互竞争中, σ 1 , σ 2 是两个关键的指标。从上面对它们的解释可知,

σ 1 > 1 表示在消耗供养甲的资源中,乙的消耗多于甲,对 σ 2 > 1 可作相应的理解。一
般来说, σ 1 , σ 2 之间没有确定的关系,在此我们仅讨论 σ 1 , σ 2 相互独立的情形。
目的是研究两个种群相互竞争的结局,即 t → ∞ 时, x1 (t ), x 2 (t ) 的趋向,不必要
解方程组(9)和(10)
,只需对它的平衡点进行稳定性分析。为此我们解代数方程

x x ⎧ f ( x1 , x 2 ) = r1 x1 (1 − 1 − σ 1 2 ) = 0

N1
N2


⎪ g ( x , x ) = r x (1 − σ x1 − x 2 ) = 0
2 2
2
⎪ 1 2
N1 N 2

-172-

(11)

N 1 (1 − σ 1 ) N 2 (1 − σ 2 )
,
) ,P4 (0,0) 。
1 − σ 1σ 2
1 − σ 1σ 2
&
为分析这些点的稳定性,
需使用相空间的技巧。
首先找出在 x1 x2 平面上使 xi (t ) > 0 x x
&
&
或 xi (t ) < 0 (i = 1,2) 的区域。注意到,当 r1 x1 (1 − 1 − σ 1 2 ) > 0 时 x1 (t ) > 0 ,但要
N1
N2
&
使 x1 > 0 和 x1 (t ) > 0 ,当且仅当 x x
1 − 1 − σ 1 2 > 0, x1 > 0
N1
N2
&
类似地 x1 (t ) < 0 ,当且仅当 x x
1 − 1 − σ 1 2 < 0, x1 > 0
N1
N2
这样我们得到在 x1 x2 平面中,直线 x x ϕ = 1− 1 −σ1 2 = 0
(12)
N1
N2
&
&
把平面划分为 x1 (t ) > 0 和 x1 (t ) < 0 两个区域。类似地,对 x2 进行分析得到
&
(i) x 2 (t ) > 0 ,当且仅当 x x
1 − σ 2 1 − 2 > 0, x 2 > 0
N1 N 2
&
(ii) x 2 (t ) < 0 ,当且仅当 x x
1 − σ 2 1 − 2 < 0, x 2 > 0
N1 N 2
得到四个平衡点分别为 P1 ( N 1 ,0) ,P2 (0, N 2 ) ,P3 (

(iii)直线

x1 x 2

=0
N1 N 2
&
&
将 x1 x2 平面划分为 x 2 (t ) > 0 和 x 2 (t ) < 0 两个区域。

φ = 1−σ 2

(13)

两直线(12)和(13)之间的位置关系可以由下图的四种情况来说明。每种可能性
对应于平衡点的稳定性说明如下:
(i) σ 1 < 1, σ 2 > 1 ,由图(b)知,两直线将平面 ( x1 > 0, x 2 > 0) 划分为三个区
域:
&
&
S1 : x1 (t ) > 0, x 2 (t ) > 0
(14)

&
&
S 2 : x1 (t ) > 0, x 2 (t ) < 0
&
&
S 3 : x1 (t ) < 0, x 2 (t ) < 0

(15)
(16)

可以说明不论轨线从哪个区域出发, t → ∞ 时都将趋向 P1 ( N 1 ,0) 。若轨线从 S1 出
发,由(14)式可知随着 t 的增加轨线向右上方运动,必然进入 S2 ;若轨线从 S2 出发,
由(15)式可知轨线向下方运动,那么它或者趋向 P1 点,或者进入 S3 ,但进入 S3 是不
(12)
式进入 S3 , x1 (t1 ) = 0 , (9)
则&
由式

可能的。
因为,
如果设轨线在某时刻 t1 经直线
-173-

(10)不难看出。

r1σ 1
&
x1 (t ) x 2 (t1 )
N2
&
由式(15)(16)知 x 2 (t1 ) < 0 ,故 &&1 (t1 ) > 0 ,表明 x1 (t1 ) 在 t1 达到极小值,而这是不

x
&
可能的,因为在 S2 中 x1 (t ) > 0 ,即 x1 (t1 ) 一直是增加的。若轨线从 S3 出发,由(16)
式可知轨线向左下方运动,那么它或者趋向 P1 点,或者进入 S2 ,而进入 S2 后,根据上
面的分析最终也将趋向 P1 。综合上述分析可以画出轨线示意图。因为直线(12)式上 dx1 = 0 ,所以在(12)式上轨线方向垂直于 x 轴;在(13)式上 dx 2 = 0 ,轨线方向
平行于 x1 轴。
(ii) σ 1 > 1, σ 2 < 1 ,类似的分析可知 P2 (0, N ) 稳定。
(iii) σ 1 < 1, σ 2 < 1 , P3 稳定。

(iv) σ 1 > 1, σ 2 > 1 , P3 不稳定(鞍点)
因为轨线的初始位置不同,其走向也不同或趋于 P 或趋于 P2 。根据建模过程中
1
σ 1 ,σ 2 的含义,可以说明 P1 , P2 , P3 点稳定在生态学上的意义:
① σ 1 < 1, σ 2 > 1 :σ 1 < 1 意味着在对供养甲的资源的竞争中乙弱于甲,σ 2 > 1 意
&&1 (t1 ) = − x 味着在对供养乙的资源的竞争中甲强于乙,
于是种群乙终将灭绝,
种群甲趋向最大容量,
即 x1 (t ), x 2 (t ) 趋向平衡点 P ( N 1 ,0) 。
1
② σ 1 > 1, σ 2 < 1 :情况与①正好相反。

③ σ 1 < 1, σ 2 < 1 :因为在竞争甲的资源中乙较弱,而在竞争乙的资源中甲较弱,

于是可以达到一个双方共存的稳定的平衡状态 P3 ,这是种群竞争中很少出现的情况。
④ σ 1 > 1, σ 2 > 1 :留作习题。
§3

Volterra 模型

-174-

意大利生物学家 D'Ancona 曾致力于鱼类种群相互制约关系的研究,在研究过程中
他无意中发现了第一次世界大战期间地中海各港口捕获的几种鱼类占捕获总量百分比
的资料,从这些资料中他发现各种软骨掠肉鱼,如鲨鱼、鲢鱼等我们称之为捕食者的一
些不是很理想的鱼占总渔获量的百分比,在 1914~1923 年期间,意大利阜姆港收购的
捕食者所占的比例有明显的增加:
年代
百分比
年代
百分比

1914
11.9
1919
27.3

1915
21.4
1920
16.0

1916
22.1
1921
15.9

1917
21.2
1922
14.8

1918
36.4
1923
10.7

他知道,
捕获的各种鱼的比例基本上代表了地中海渔场中各种鱼类的比例。
战争中捕获
量大幅度下降,当然使渔场中食用鱼(食饵)增加,以此为生的鲨鱼也随之增加。但是
捕获量的下降为什么会使鲨鱼的比例增加,
即对捕食者而不是对食饵有利呢?他无法解
释这个现象,于是求助于著名的意大利数学家 V. Volterra,希望建立一个食饵—捕食者
系统的数学模型,定量地回答这个问题。
3.l 形成模型
为建立这样的模型,我们分别用 x1 (t ) 和 x 2 (t ) 记食饵和捕食者在时刻 t 的数量。因
为大海中鱼类的资源丰富,
可以假设如果食饵独立生存则食饵将以增长率 r1 按指数规律

&
增长,即有 x1 (t ) = r1 x1 (t ) 。捕食者的存在使食饵的增长率降低,设降低的程度与捕食
者数量成正比,于是 x1 (t ) 满足方程

& x1 (t ) = x1 ( r1 − λ1 x 2 )

(17)

比例系数反映捕食者掠取食饵的能力。
&
捕食者离开食饵无法生存,若设它独自存在时死亡率为 r2 ,即 x 2 (t ) = − r2 x 2 (t ) ,
而食饵为它提供食物的作用相当于使死亡率降低,
或使之增长。
设这个作用与食饵数量
成正比,于是 x 2 (t ) 满足

& x 2 (t ) = x 2 ( − r2 + λ2 x1 )

(18)

比例系数 λ2 反映食饵对捕食者的供养能力。
方程(17)和(18)是在没有人工捕获情况下自然环境中食饵与捕食者之间的制约
关系,是 Volterra 提出的最简单的模型。这个模型没有引入竞争项。
3.2 模型分析
这是一个非线性模型,
不能求出其解析解,
所以我们还是通过平衡点的稳定性分析,
研究 x1 (t ), x 2 (t ) 的变化规律。容易得到方程(17)和(18)的平衡点为

P1 (0,0) , P2 (

r2 r1
, )

λ2 λ1

(19)

当 然 , 平 衡 解 P1 (0,0) 对 我 们 来 说 是 没 有 意 义 的 。 这 个 方 程 组 还 有 一 族 解

x1 (t ) = C1e r1t , x 2 (t ) = 0 和 x1 (t ) = 0 , x 2 = C 2 e − r2 t 。因此, x1 轴和 x2 轴都是方程组
(17)(18)的轨线。这意味着:方程(17)(18)在 t = t 0 由第一象限 x1 > 0, x 2 > 0


出发的每一个解 x1 (t ), x 2 (t ) 在以后一切时间 t ≥ t 0 都保持在第一象限内。当 x1 , x 2 > 0
时,方程(17)(18)的轨线是一阶方程

-175-

dx1 x (r − λ x )
= 1 1 1 2 dx 2 x 2 ( − r2 + λ2 x1 )
的解曲线。用分离变量方法解得
r
( x1r2 e − λ2 x1 )( x 21 e − λ1 x 2 ) = c

(20) c 是任意常数。因此,方程(17)(18)的轨线是由式(20)定义的曲线族,我们来证

明这些曲线是封闭的。
引理 1 当 x1 , x 2 > 0 时,方程(20)定义了一组封闭曲线。
证明

我们首先来确定当 x1 , x 2 > 0 时函数

ϕ ( x1 ) = x1r e − λ x
2

2 1

和 r φ ( x2 ) = x2 e − λ x
1

1 2

的性状。利用微积分方法可以作出 ϕ 和 φ 的图形。如下图所示。

若它们的极大值分别记作 ϕ m 和 φm ,则不难确定 x1 、x 2 满足
0

ϕ ( x10 ) = ϕ m ,x10 =
0
0 φ ( x 2 ) = φ m ,x 2 =

0

r2

(21)

r1

(22)

λ2

λ1
显然,仅当(20)式右端常数 c ≤ ϕ mφ m 时相轨线才有定义。
0
0
0
0
当 c = ϕ mφ m 时,x1 = x1 ,x 2 = x 2 , (21) (22) (19)
将式


式比较可知 ( x1 , x 2 )
正是平衡点 P2 ,所以 P2 是相轨线的退化点。

为了考察 c < ϕ mφ m 时 ( c > 0) 轨线的形状,我们只需考虑 c = λφ m 的情况,其中

0 < λ < ϕ m 。首先注意到:方程 x1r2 e − λ2 x1 = λ 具有一个解 x1 = x '1 < x10 和另一个解 x1 = x ' '1 > x10 。因此,当 x1 < x '1 或 x1 > x ' '1 时,方程

λ r φ ( x2 ) = x2 e − λ x = ⎜ r − λ x
⎜x e
⎝ 1
1

1 2

2

2 1


⎟φ m



没 有 解 x2 。 当 x1 = x '1 或 x1 = x' '1 时 , 这 个 方 程 具 有 唯 一 的 解 x 2 = x 2 , 而 对 于
0

0 x '1 < x1 < x ' '1 ,则具有两个解 x ' 2 ( x1 ) 和 x ' ' 2 ( x1 ) 。较小的解 x ' 2 ( x1 ) 总是小于 x2 ,较
0

0

大的解总是大于 x2 。当 x1 趋于 x '1 或 x ' '1 时, x ' 2 ( x1 ) 和 x ' ' 2 ( x1 ) 都趋向于 x2 。因此,
-176-

当 x1 和 x2 是正数时,由(20)所定义的曲线都是封闭的。而且,这些封闭曲线中的每

一条(除 x1 = x1 和 x 2 = x 2 以外) 都不含(17)和(18)的任何平衡点。所以(17)
0

0

和(18)的具有初始条件 x1 (0) > 0 , x 2 (0) > 0 的所有的解 x1 (t ) , x 2 (t ) 都是时间的
周期函数。也就是说,
(17)和(18)的具有初始条件 x1 (0) > 0 , x 2 (0) > 0 的每一个
解 x1 (t ) , x 2 (t ) 都 具 有 这 样 的 性 质 :

x1 (t + T ) = x1 (t ) , x 2 (t + T ) = x 2 (t ) ,其中 T 是某
一正数。
D'Ancona 所用的数据实际上是捕食者的百分比
在每一年中的平均值。因此,为了把这些数据同方程

(17) (18)

的结果进行比较,
对于
(17) (18)

的任何解 x1 (t ) ,x 2 (t ) ,
我们必须算出 x1 (t ) 和 x 2 (t )
的“平均值”
。值得注意的是,即使还没有准确地求
得 x1 (t ) 和 x 2 (t ) ,我们仍然能够算出这些平均值。
引理 2 设 x1 (t ) , x 2 (t ) 是(17)和(18)的周期解,其周期 T > 0 , x1 (t ) 和 x 2 (t )
的平均值定义为

1 T
1 T
∫0x1 (t )dt , x2 = T ∫0x2 (t )dt
T
0
0
这时, x1 = x1 , x 2 = x 2 。换句话说, x1 (t ) 和 x 2 (t ) 的平均值是平衡解。
&
x (t )
证明 把(17)的两端除以 x1 ,得到 1
= r1 − λ1 x 2 ,于是 x1 &
1 T x1 (t )
1 T
∫0 x1 (t ) dt = T ∫0[r1 − λ1 x2 (t )]dt
T
x1 =

由于



T

0

& x1 (t ) dt = ln x1 (T ) − ln x1 (0) = 0 x1 (t )

因此,

1
T
于是,x 2 =

r1

λ1



T

0

λ1 x 2 (t )dt =

1 T r1dt = r1 ,
T ∫0


类似地, (18)

的两端除以 Tx 2 (t ) , 0 到 T 积分,

我们得到 x1 =

r2

λ2



下面,我们考虑渔业对于上述数学模型的影响。注意到渔业使得食饵总数以速率 εx1 减少,而使得捕食者的总数以速率 εx 2 减少。常数 ε 反映渔业的水平;即反映了海
上的渔船数和下水的网数。因此,真实的状态由下列修正的微分方程组来描述:

&
⎧ x1 (t ) = x1 ( r1 − λ1 x 2 ) − εx1 = ( r1 − ε ) x1 − λ1 x1 x 2
(23)

&
⎩ x 2 (t ) = x 2 ( − r2 + λ2 x1 ) − εx 2 = −( r2 + ε ) x 2 + λ2 x1 x 2
,只是其中 r1 换成 r1 − ε ,而 r2
这个方程组同(17)(18)完全一样(当 r1 − ε > 0 时)

换成 r2 + ε 。因此,现在 x1 (t ) 和 x 2 (t ) 的平均值是
-177-

x1 =

r2 + ε

, x2 =

r1 − ε

λ2 λ1 平均说来,中等捕鱼量 (ε < r1 ) 实际上会增加食饵的数目,而减少捕食者的数目。相反,
捕鱼量的降低,平均说来,会增加捕食者的数目,而减少食饵的数目。这个值得注意的
结果称为 Volterra 原理,它解释了 D'Ancona 的数据。
值得注意的是 Volterra 模型是非常粗糙的,有兴趣的读者可以作进一步的探讨。
习 题 十 四
1. 单棵树木的商品价值 V 是由这棵树能够生产的木材体积和质量所决定的。显然
V = V (t ) 依赖于树木的年龄 t 。假设曲线 V (t ) 已知, c 为树木砍伐成本。试给出砍伐
树木(更确切地说砍伐相同年龄的树木)的最优年龄。如果考虑到森林轮种问题,即一
旦树木从某一处砍掉,这块土地便可以种植新树,假定各轮种周期具有相等的长度,试
建模讨论最优砍伐轮种的森林管理策略的问题。
2. 如果两个种群都能独立生存,共处时又能相互提供食物,试建立种群依存模型
并讨论平衡点及稳定性,解释稳定的意义。
3. 如果两个种群都不能独立生存,但共处时可以相互提供食物,试建模以讨论共
处的可能性。
4. 如果在食饵—捕食者系统中,捕食者掠夺的对象只是成年的食饵,而未成年的
食饵因体积太小免遭捕获。在适当的假设下建立这三者之间关系的模型,求平衡点。

-178-

第十五章

常微分方程的解法

建立微分方程只是解决问题的第一步,
通常需要求出方程的解来说明实际现象,

加以检验。如果能得到解析形式的解固然是便于分析和应用的,但是我们知道,只有线
性常系数微分方程,并且自由项是某些特殊类型的函数时,才可以肯定得到这样的解,
而绝大多数变系数方程、非线性方程都是所谓“解不出来”的,即使看起来非常简单的
方程如

dy
= y 2 + x 2 ,于是对于用微分方程解决实际问题来说,数值解法就是一个十 dx 分重要的手段。
§1

常微分方程的离散化
下面主要讨论一阶常微分方程的初值问题,其一般形式是

⎧ dy
⎪ = f ( x, y )
⎨ dx
⎪ y (a ) = y0


a≤ x≤b

(1)

在下面的讨论中,我们总假定函数 f ( x, y ) 连续,且关于 y 满足李普希兹(Lipschitz)条
件,即存在常数 L ,使得

| f ( x, y ) − f ( x, y ) |≤ L | y − y |

这样,由常微分方程理论知,初值问题(1)的解必定存在唯一。
所谓数值解法,就是求问题(1)的解 y (x ) 在若干点

a = x0 < x1 < x 2 < L < x N = b
处的近似值 y n ( n = 1,2,L, N ) 的方法, y n ( n = 1,2,L, N ) 称为问题(1)的数值解, hn = x n +1 − x n 称为由 xn 到 xn +1 的步长。今后如无特别说明,我们总取步长为常量 h 。
建立数值解法,首先要将微分方程离散化,一般采用以下几种方法:
(i)用差商近似导数

y ( x n +1 ) − y ( x n )
代替 y ' ( x n ) 代入(1)中的微分方程,则得 h y ( x n +1 ) − y ( x n )
≈ f ( x n , y ( x n )) ( n = 0,1,L) h 若用向前差商

化简得

y ( xn +1 ) ≈ y ( xn ) + hf ( xn , y ( xn ))
如果用 y ( x n ) 的近似值 y n 代入上式右端,所得结果作为 y ( x n +1 ) 的近似值,记为 yn +1 ,
则有

y n +1 = y n + hf ( x n , y n ) ( n = 0,1,L)

(2)

这样,问题(1)的近似解可通过求解下述问题

⎧ y n +1 = y n + hf ( xn , y n ) ( n = 0,1,L)
(3)

⎩ y0 = y (a )
得到,按式(3)由初值 y0 可逐次算出 y1 , y 2 ,L 。式(3)是个离散化的问题,称为差
分方程初值问题。
-179-

需要说明的是,用不同的差商近似导数,将得到不同的计算公式。
(ii)用数值积分方法
将问题(1)的解表成积分形式,用数值积分方法离散化。例如,对微分方程两端
积分,得

y ( x n +1 ) − y ( x n ) = ∫

x n +1

xn

f ( x, y ( x ))dx ( n = 0,1,L)

(4)

右边的积分用矩形公式或梯形公式计算。
(iii)Taylor 多项式近似
将函数 y (x ) 在 xn 处展开,取一次 Taylor 多项式近似,则得

y ( x n +1 ) ≈ y ( x n ) + hy ' ( x n ) = y ( x n ) + hf ( x n , y ( x n ))
再将 y ( x n ) 的近似值 y n 代入上式右端,所得结果作为 y ( x n +1 ) 的近似值 yn +1 ,得到离
散化的计算公式

y n +1 = y n + hf ( x n , y n )
以上三种方法都是将微分方程离散化的常用方法,
每一类方法又可导出不同形式的
计算公式。其中的 Taylor 展开法,不仅可以得到求数值解的公式,而且容易估计截断
误差。
§2 欧拉(Euler)方法
2.1 Euler 方法
Euler 方法就是用差分方程初值问题
(3)
的解来近似微分方程初值问题
(1)
的解,
即由公式(3)依次算出 y ( x n ) 的近似值 y n ( n = 1,2,L) 。这组公式求问题(1)的数值
解称为向前 Euler 公式。
如果在微分方程离散化时,
用向后差商代替导数, y ' ( x n +1 ) ≈


y ( x n +1 ) − y ( x n )

h

则得计算公式

⎧ y n +1 = y n + hf ( x n +1 , y n +1 ) ( n = 0,1,L)

⎩ y0 = y(a )

(5)

用这组公式求问题(1)的数值解称为向后 Euler 公式。
向后 Euler 法与 Euler 法形式上相似,但实际计算时却复杂得多。向前 Euler 公式
是显式的,可直接求解。向后 Euler 公式的右端含有 yn +1 ,因此是隐式公式,一般要用
迭代法求解,迭代公式通常为

⎧ ( 0)
⎪ y n +1 = y n + hf ( x n , y n )
⎨ ( k +1)
(
⎪ y n +1 = y n + hf ( x n +1 , y nk )1 )
+


( k = 0,1,2,L)

(6)

2.2 Euler 方法的误差估计
对于向前 Euler 公式(3)我们看到,当 n = 1,2,L 时公式右端的 yn 都是近似的,
所以用它计算的 yn +1 会有累积误差,分析累积误差比较复杂,这里先讨论比较简单的
所谓局部截断误差。
假定用(3)式时右端的 yn 没有误差,即 y n = y ( x n ) ,那么由此算出

y n +1 = y ( x n ) + hf ( x n , y ( x n ))
-180-

(7)

局部截断误差指的是, (7)

式计算由 xn 到 xn +1 这一步的计算值 yn +1 与精确值 y ( xn +1 )
之差 y ( x n +1 ) − y n +1 。为了估计它,由 Taylor 展开得到的精确值 y ( xn +1 ) 是

y ( x n +1 ) = y ( x n ) + hy ' ( x n ) +

h2 y' ' ( xn ) + O(h 3 )
2

(8)

(7)(8)两式相减(注意到 y ' = f ( x, y ) )得


y ( x n +1 ) − y n +1 =

h2 y ' ' ( xn ) + O (h 3 ) ≈ O (h 2 )
2

(9)

2

即局部截断误差是 h 阶的,而数值算法的精度定义为: p +1

若一种算法的局部截断误差为 O ( h ) ,则称该算法具有 p 阶精度。
显然 p 越大,方法的精度越高。式(9)说明,向前 Euler 方法是一阶方法,因此
它的精度不高。
§3

改进的 Euler 方法
3.1 梯形公式
利用数值积分方法将微分方程离散化时,若用梯形公式计算式(4)中之右端积分,



h f ( x, y ( x ))dx ≈ [ f ( x n , y ( x n )) + f ( x n +1 , y ( x n +1 ))] xn 2
并用 y n , y n +1 代替 y ( x n ), y ( x n +1 ) ,则得计算公式 h y n +1 = y n + [ f ( x n , y n ) + f ( x n +1 , y n +1 )]
2



x n +1

这就是求解初值问题(1)的梯形公式。
直观上容易看出,
用梯形公式计算数值积分要比矩形公式好。
梯形公式为二阶方法。
梯形公式也是隐式格式,一般需用迭代法求解,迭代公式为
(
⎧ y n0 )1 = y n + hf ( x n , y n )
+
⎪ h ⎪ ( k +1)
(k )
(10)
⎨ y n +1 = y n + [ f ( x n , y n ) + f ( x n +1 , y n +1 )]
2

⎪ (k = 0,1,2, L)

由于函数 f ( x, y ) 关于 y 满足 Lipschitz 条件,容易看出 hL ( k )
(
(
(
| y nk++1) − y nk+)1 |≤
| y n +1 − y nk+−1) |
1
1
2
hL
< 1 时,迭代收敛。但这样做计算量较大。
其中 L 为 Lipschitz 常数。因此,当 0 <
2

如果实际计算时精度要求不太高,用公式(10)求解时,每步可以只迭代一次,由此导
出一种新的方法—改进 Euler 法。
3.2 改进 Euler 法
按式(5)计算问题(1)的数值解时,如果每步只迭代一次,相当于将 Euler 公式
与梯形公式结合使用:先用 Euler 公式求 y n +1 的一个初步近似值 y n +1 ,称为预测值,然
后用梯形公式校正求得近似值 y n +1 ,即
-181-

预测
⎧ y n +1 = y n + hf ( x n , y n )

⎨ h ⎪ y n +1 = y n + 2 [ f ( x n , y n ) + f ( x n +1 , y n +1 ) ] 校正


(11)

式(11)称为由 Euler 公式和梯形公式得到的预测—校正系统,也叫改进 Euler 法。
为便于编制程序上机,式(11)常改写成


⎪ y p = y n + hf ( x n , y n )

⎨ y q = y n + hf ( x n + h, y p )

⎪ y n +1 = 1 ( y p + y q )

2

(12)

改进 Euler 法是二阶方法。
§4

龙格—库塔(Runge—Kutta)方法
回到 Euler 方法的基本思想—用差商代替导数—上来。实际上,按照微分中值定理

应有

y ( x n +1 ) − y ( x n )
= y ' ( x n + θh ), 0 < θ < 1 h 注意到方程 y ' = f ( x, y ) 就有 y ( x n +1 ) = y ( x n ) + hf ( x n + θh, y ( x n + θh ))

(13)

不妨记 K = f ( x n + θh, y ( x n + θh )) ,称为区间 [ xn , xn +1 ] 上的平均斜率。可见给出一种
斜率 K ,
(13)式就对应地导出一种算法。
向前 Euler 公式简单地取 f ( x n , y n ) 为 K ,精度自然很低。改进的 Euler 公式可理
解为 K 取 f ( x n , y n ) , f ( x n +1 , y n +1 ) 的平均值,其中 y n +1 = y n + hf ( x n , y n ) ,这种处
理提高了精度。
如上分析启示我们,在区间 [ xn , xn +1 ] 内多取几个点,将它们的斜率加权平均作为

K ,就有可能构造出精度更高的计算公式。这就是龙格—库塔方法的基本思想。
4.1 首先不妨在区间 [ xn , xn +1 ] 内仍取 2 个点,仿照(13)式用以下形式试一下
⎧ y n +1 = y n + h ( λ1k1 + λ2 k 2 )

⎨ k1 = f ( x n , y n )
⎪k = f ( x + αh, y + βhk ), 0 < α , β < 1 n n
1
⎩ 2

(14)

其中 λ1 , λ2 , α , β 为待定系数,看看如何确定它们使(14)式的精度尽量高。为此我们
分析局部截断误差 y ( x n +1 ) − y n +1 ,因为 y n = y ( x n ) ,所以(14)可以化为

-182-

⎧ y n +1 = y ( x n ) + h ( λ1k1 + λ2 k 2 )

⎪k1 = f ( x n , y ( x n )) = y ' ( x n )

⎨k 2 = f ( x n + αh, y ( x n ) + βhk1 )
⎪ = f ( x , y ( x )) + αhf ( x , y ( x )) n n x n n ⎪
2

+ βhk1 f y ( x n , y ( x n )) + O ( h )

其中 k 2 在点 ( x n , y ( x n )) 作了 Taylor 展开。
(15)式又可表为

y n +1 = y ( x n ) + ( λ1 + λ2 )hy ' ( x n ) + λ2αh 2 ( f x +

(15)

β ff y ) + O ( h 3 ) α 注意到

h2 y' ' ( xn ) + O(h 3 )
2
3
中 y ' = f , y ' ' = f x + ff y ,可见为使误差 y ( x n +1 ) − y n +1 = O ( h ) ,只须令 y ( x n +1 ) = y ( x n ) + hy ' ( x n ) +

λ1 + λ2 = 1 , λ2α =

1 β
, =1
2 α

(16)

待定系数满足(16)的(15)式称为 2 阶龙格—库塔公式。由于(16)式有 4 个未知数
而只有 3 个方程,所以解不唯一。不难发现,若令 λ1 = λ2 =

1
,α = β = 1 ,即为改
2

进的 Euler 公式。可以证明,在 [ xn , xn +1 ] 内只取 2 点的龙格—库塔公式精度最高为 2
阶。
4.2 4 阶龙格—库塔公式
要进一步提高精度,必须取更多的点,如取 4 点构造如下形式的公式:

⎧ y n +1 = y n + h ( λ1k1 + λ2 k 2 + λ3 k 3 + λ4 k 4 )
⎪k = f ( x , y ) n n
⎪ 1

(17)
⎨k 2 = f ( x n + α1h, y n + β 1hk1 )
⎪k = f ( x + α h, y + β hk + β hk ) n n
2
2
1
3
2
⎪ 3
⎪k 4 = f ( x n + α 3 h, y n + β 4 hk1 + β 5 hk 2 + β 6 hk 3 )

其中待定系数 λi , α i , β i 共 13 个,经过与推导 2 阶龙格—库塔公式类似、但更复杂的计
算,得到使局部误差 y ( x n +1 ) − y n +1 = O ( h ) 的 11 个方程。取既满足这些方程、又较简
5

单的一组 λi , α i , β i ,可得

-183-

h

⎪ y n +1 = 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 )

⎪ k1 = f ( x n , y n )

hk1 h ⎪
)
⎨k 2 = f ( x n + , y n +
2
2

hk 2 h ⎪
⎪k 3 = f ( x n + 2 , y n + 2 )

⎪k 4 = f ( x n + h, y n + hk 3 )


(18)

这就是常用的 4 阶龙格—库塔方法(简称 RK 方法)

§5

线性多步法
以上所介绍的各种数值解法都是单步法,这是因为它们在计算 yn +1 时,都只用到

前一步的值 yn ,单步法的一般形式是

y n +1 = y n + hϕ ( x n , y n , h ) ( n = 0,1,L, N − 1)
(19)
其中 ϕ ( x, y , h ) 称为增量函数,例如 Euler 方法的增量函数为 f ( x, y ) ,改进 Euler 法的
增量函数为

1
2

ϕ ( x, y, h ) = [ f ( x, y ) + f ( x + h, y + hf ( x, y ))]
如何通过较多地利用前面的已知信息,如 y n , y n −1 ,L, y n − r ,来构造高精度的算法
计算 yn +1 ,这就是多步法的基本思想。经常使用的是线性多步法。
让我们试验一下 r = 1 ,即利用 yn , yn −1 计算 yn +1 的情况。
从用数值积分方法离散化方程的(4)式

y ( x n +1 ) − y ( x n ) = ∫

x n +1

xn

f ( x, y ( x ))dx

出发,记 f ( x n , y n ) = f n , f ( x n −1 , y n −1 ) = f n −1 ,式中被积函数 f ( x, y ( x )) 用二节点

( xn −1 , f n −1 ) , ( x n , f n ) 的插值公式得到(因 x ≥ x n ) ,所以是外插。 x − x n −1 x − xn f ( x, y ( x )) = f n
+ f n −1 x n − x n −1 x n −1 − x n

(20)

1
= [( x − x n −1 ) f n − ( x − x n ) f n −1 ] h 此式在区间 [ xn , xn +1 ] 上积分可得



x n +1

xn

f ( x, y ( x ))dx =

h
3h
f n − f n −1
2
2

于是得到

h y n +1 = y n + (3 f n − f n −1 )
(21)
2
注意到插值公式(20)的误差项含因子 ( x − x n −1 )( x − x n ) ,在区间 [ xn , xn +1 ] 上积分后
-184-

3

3

得出 h ,故公式(21)的局部截断误差为 O ( h ) ,精度比向前 Euler 公式提高 1 阶。
若取 r = 2,3,L 可以用类似的方法推导公式,如对于 r = 3 有

h
(55 f n − 59 f n −1 + 37 f n − 2 − 9 f n − 3 )
(22)
24
5
其局部截断误差为 O ( h ) 。
如果将上面代替被积函数 f ( x, y ( x )) 用的插值公式由外插改为内插,可进一步减
小误差。内插法用的是 yn +1 , yn , L , yn − r +1 ,取 r = 1 时得到的是梯形公式,取 r = 3 时 y n +1 = y n +

可得

h
(9 f n +1 + 19 f n − 5 f n −1 + f n − 2 )
(23)
24
5
与(22)式相比,虽然其局部截断误差仍为 O ( h ) ,但因它的各项系数(绝对值)大
为减小,误差还是小了。当然,
(23)式右端的 f n +1 未知,需要如同向后 Euler 公式一 y n +1 = y n +

样,用迭代或校正的办法处理。
§6 一阶微分方程组与高阶微分方程的数值解法
6.1 一阶微分方程组的数值解法
设有一阶微分方程组的初值问题

⎧ y ' i = f i ( x, y1 , y 2 ,L, y m )
(i = 1,2,L, m )
(24)

⎩ yi (a ) = yi 0
T
T
T
若记 y = ( y1 , y 2 ,L, y m ) , y 0 = ( y10 , y 20 ,L, y m 0 ) , f = ( f 1 , f 2 ,L, f m ) ,则初值
问题(24)可写成如下向量形式

⎧ y ' = f ( x, y )

⎩ y(a ) = y0
如果向量函数 f ( x, y ) 在区域 D :

a ≤ x ≤ b,

(25)

y ∈ Rm

连续,且关于 y 满足 Lipschitz 条件,即存在 L > 0 ,使得对 ∀x ∈ [a, b] , y1 , y 2 ∈ R ,
都有
m

f ( x, y1 ) − f ( x, y 2 ) ≤ L y1 − y 2
那么问题(25)在 [a , b] 上存在唯一解 y = y (x ) 。
问题(25)与(1)形式上完全相同,故对初值问题(1)所建立的各种数值解法可
全部用于求解问题(25)

6.2 高阶微分方程的数值解法
高阶微分方程的初值问题可以通过变量代换化为一阶微分方程组初值问题。
设有 m 阶常微分方程初值问题

⎧ y ( m ) = f ( x, y , y ' ,L, y ( m −1) ) a ≤ x ≤ b
(26)

(1)
( m −1)
(
( a ) = y 0m −1)
⎩ y ( a ) = y 0 , y ' ( a ) = y 0 ,L, y
( m −1)
引入新变量 y1 = y , y 2 = y ' ,L, y m = y
,问题(26)就化为一阶微分方程初值问题
-185-

⎧ y '1 = y 2

⎪ y' 2 = y3

⎨ M
⎪ y' = y m ⎪ m −1
⎪ y ' m = f ( x, y1 ,L, y m )


y1 ( a ) = y 0
(
y 2 ( a ) = y 01)

M y m −1 (a ) = y

(27)
(m−2)
0

( y m ( a ) = y 0m −1)

然后用 6.1 中的数值方法求解问题(27)
,就可以得到问题(26)的数值解。
最后需要指出的是,
在化学工程及自动控制等领域中,
所涉及的常微分方程组初值
问题常常是所谓的“刚性”问题。具体地说,对一阶线性微分方程组

dy
= Ay + Φ (x )
(28)
dx m 其中 y , Φ ∈ R , A 为 m 阶方阵。若矩阵 A 的特征值 λi (i = 1,2,L, m ) 满足关系
Re λi < 0 (i = 1,2,L, m ) max | Re λi |>> min | Re λi |
1≤ i ≤ m

1≤ i ≤ m

则称方程组(28)为刚性方程组或 Stiff 方程组,称数

s = max | Re λi | / min | Re λi |
1≤ i ≤ m

1≤ i ≤ m

为刚性比。对刚性方程组,用前面所介绍的方法求解,都会遇到本质上的困难,这是由
数值方法本身的稳定性限制所决定的。
理论上的分析表明,
求解刚性问题所选用的数值
方法最好是对步长 h 不作任何限制。
Matlab 解法
7.1 Matlab 数值解
7.1.1 非刚性常微分方程的解法
Matlab 的工具箱提供了几个解非刚性常微分方程的功能函数,如 ode45,ode23, ode113,其中 ode45 采用四五阶 RK 方法,是解非刚性常微分方程的首选方法,ode23
采用二三阶 RK 方法,ode113 采用的是多步法,效率一般比 ode45 高。
Matlab 的工具箱中没有 Euler 方法的功能函数。
(I)对简单的一阶方程的初值问题
§7

⎧ y ' = f ( x, y )

⎩ y ( x0 ) = y 0
改进的 Euler 公式为


⎪ y p = y n + hf ( x n , y n )

⎨ y q = y n + hf ( x n + h, y p )

⎪ y n +1 = 1 ( y p + y q )

2
我们自己编写改进的 Euler 方法函数 eulerpro.m 如下: function [x,y]=eulerpro(fun,x0,xfinal,y0,n); if nargin 1) z −1 k (iii)单边指数函数 f ( k ) = a 的 Z 变换( a 为不等于 1 的正常数)

z
Z [a k ] = ∑ a k z − k =
(| z |> a ) z−a k =0
1.2.2 Z 变换的性质
Z [U ( k )] =

(i)线性性质
设 Z [ f 1 ( k )] = F1 ( z ) , Z [ f 2 ( k )] = F2 ( z ) ,则

Z [af 1 ( k ) + bf 2 ( k )] = aF1 ( z ) + bF2 ( z )
其中 a, b 为常数。收敛域为 F1 ( z ) 和 F2 ( z ) 的公共区域。
(ii)平移性
设 Z [ f ( k )] = F ( z ) ,则

Z [ f ( k + 1)] = z[ F ( z ) − f (0)] ,
N −1

Z [ f ( k + N )] = z N [ F ( z ) − ∑ f ( k ) z − k ] , k =0

−1

Z [ f ( k − 1)] = z [ F ( z ) + f ( −1) z ] ,
N −1

Z [ f ( k − N )] = z − N [ F ( z ) + ∑ f ( − k ) z k ] k =1

例3
-194-

求齐次差分方程

(4)

x ( k + 2) + 3x ( k + 1) + 2 x ( k ) = 0 , x (0) = 0 , x (1) = 1
的解。


令 Z [ x ( k )] = X ( z ) ,对差分方程取 Z 变换,得

z 2 X ( z ) − z + 3zX ( z ) + 2 X ( z ) = 0 , z z z X ( z) = 2
=


z + 3z + 2 z + 1 z + 2
对上式取 z 反变换,便得差分方程的解为 x ( k ) = ( −1) k − ( −2) k 。
§2

蛛网模型
2.1 问题提出
在自由竞争的社会中,很多领域会出现循环波动的现象。在经济领域中,可以从自
由集市上某种商品的价格变化看到如下现象:在某一时期,商品的上市量大于需求,引
起价格下跌,生产者觉得该商品无利可图,转而经营其它商品;一段时间之后,随着产
量的下降,带来的供不应求又会导致价格上升,又有很多生产商会进行该商品的生产;
随之而来的,又会出现商品过剩,价格下降。在没有外界干扰的情况下,这种现象将会
反复出现。
如何从数学的角度来描述上述现象呢?
2.2 模型假设
(i)设 k 时段商品数量为 x k ,其价格为 y k 。这里,把时间离散化为时段,一个时

期相当于商品的一个生产周期。
(ii)同一时段的商品的价格取决于该时段商品的数量,把

yk = f ( xk )

(5)

称之为需求函数。出于对自由经济的理解,商品的数量越多,其价格就越低,故可以假
设:需求函数为一个单调下降函数。
(iii)下一时段商品数量由上一个时段的商品的价格决定,把 x k +1 = g ( y k )
(6)
称之为供应函数。
由于价格越高可以导致产量越大,
故可假设供应函数是一个单调上升
的函数。
2.3 模型求解
在同一个坐标系中做出需求函数与供应函数的图形,设两条曲线相交于
P0 ( x0 , y 0 ) , P0 为平衡点。

因为此时 x 0 = g ( y 0 ) ,y 0 = f ( x 0 ) ,
若某个 k , x k = x 0 ,

则可推出

y l = y 0 , xl = x0 , (l = k , k + 1,L)
即商品的数量保持在 x0 ,价格保持在 y 0 ,不妨设 x1 ≠ x0 ,下面考虑 x k , y k 在图上的变
化 ( k = 1,2,L) 。如下图所示,当 x1 给定后,价格 y1 由 f 上的 P
1

-195-

点决定,下一时段的数量 x2 由 g 上的 P2 点决定, y 2 又可由 f 上的 P3 点决定。依此类
推,可得一系列的点 P ( x1 , y1 ) , P2 ( x 2 , y1 ) , P3 ( x 2 , y 2 ) , P4 ( x3 , y 2 ) ,图上的箭头
1
表示求出 Pk 的次序,由图知:

lim Pk ( x, y ) = P0 ( x0 , y 0 ) ,

k → +∞

即市场经济将趋于稳定。
并不是所有的需求函数和供应函数都趋于稳定,若给定的 f 与 g 的图形如下图所
示,得出的 P1 , P2 ,L 就不趋于 P0 ,此时,市场经济趋向不稳定。

上两图中的折线 P1 P2 , P2 P3 , P3 P4 ,L 形似蛛网,故把这种模型称为蛛网模型。在进
行市场经济分析中, f 取决于消费者对某种商品的需要程度及其消费水平, g 取决于
生产者的生产、管理等能力。
当已经知道需求函数和供应函数之后,可以根据 f 和 g 的性质判断平衡点 P0 的稳
定性。利用结论:当 | x1 − x0 | 较小时, P0 点的稳定性取决于 f 与 g 在 P0 点的斜率,即


| f ' ( x0 ) || g ' ( y 0 ) |

(8)

时, P0 点稳定,当
时, P0 点不稳定。
这一结论的直观解释是:需求曲线越平,供应曲线越陡,越有利于经济稳定。
设 α =| f ' ( x 0 ) | ,
式得
-196-

1

β

=| g ' ( y 0 ) | ,在 P0 点附近取 f 与 g 的线性近似,由(5)(6)


y k − y 0 = −α ( x k − x0 ) x k +1 − x 0 = β ( y k − y 0 )

(9)
(10)

上两式中消去 y k ,得

x k +1 = −αβ x k + (1 + αβ ) x 0
(11)式对 k = 1,2,L 均成立,有 x k +1 = −αβ x k + (1 + αβ ) x 0

(11)

( −αβ ) x k = ( −αβ ) 2 x k −1 + ( −αβ )(1 + αβ ) x0
( −αβ ) 2 x k −1 = ( −αβ ) 3 x k − 2 + ( −αβ ) 2 (1 + αβ ) x 0
………………………………………………

( −αβ ) k − 2 x3 = ( −αβ ) k −1 x 2 + ( −αβ ) k − 2 (1 + αβ ) x 0
( −αβ ) k −1 x 2 = ( −αβ ) k x1 + ( −αβ ) k −1 (1 + αβ ) x0
以上 k 个式子相加,有

x k = ( −αβ ) k x1 + (1 + αβ ) x0 [1 + ( −αβ ) + L + ( −αβ ) k −1 ]
= ( −αβ ) k x1 + [1 − ( −αβ ) k ] x 0

(12)

此为(11)式的解。
若 P0 是稳定点,则应有:

lim xk +1 = x0

k → +∞

结合(12)式考虑, P0 点稳定的条件是

αβ < 1

(13)



α<
同理, P0 点不稳定的条件是

1

β

αβ > 1

(14)



α>

1

β


此时, lim xk +1 = ∞ 。这与(7)(8)式是一致的。 k → +∞

2.4 模型的修正
在上面模型假设的第
(iii)
点中引进了供应函数,
并且知道 g 取决于管理者的生产、
管理水平。如果生产者的管理水平更高一些,他们在决定该商品生产数量 xk +1 时,不仅
考虑了前一时期的价格 y k ,而且也考虑了价格 yk −1 。为了简化起见,不妨设 xk +1 由

1
( y k + y k −1 ) 决定,则供应函数可写成
2

-197-

⎡1

x k +1 = g ⎢ ( y k + y k −1 )⎥
⎣2

在 P0 附近取线性近似,则有

xk +1 − x0 =

β
2

( y k + y k −1 − 2 y 0 )

(15)

由(9)式有

y k = y 0 − α ( x k − x0 ) y k −1 = y 0 − α ( x k −1 − x0 )
将上两式代入(15)式,整理得

2 x k +1 + αβx k + αβx k −1 = (1 + αβ ) x0 , ( k = 2,3,L)
这是一个二阶线性差分方程,其特征方程为

2λ2 + αβλ + αβ = 0
经计算,可得其特征根

− αβ ± (αβ ) 2 − 8αβ
(16)
4
结论:若方程的特征根均在单位圆内,即 | λ1 |< 1 , | λ2 |< 1 ,则 P0 为稳定点。
(16)式有两个实根,因
当 αβ > 8 时,

λ1, 2 =

− αβ − (αβ ) 2 − 8αβ αβ λ2 = 2 ,故此时 P0 不是稳定点。
当 αβ < 8 时,
(16)式有两个共轭复根,此时
1

| λ1, 2

2 2
⎡⎛ αβ ⎞ 2 ⎛ 1

αβ
2 ⎞
|= ⎢⎜
8αβ − (αβ ) ⎟ ⎥ =
⎟ +⎜
2
⎠ ⎥
⎢⎝ 4 ⎠ ⎝ 4



要使 P0 为稳定点,只需

αβ < 2
与(13)式相比, α 与 β 的范围扩大了。这是由于经营者经营管理水平的提高带来的
结果。
商品销售量预测
在利用差分方程建模研究实际问题时,
常常需要根据统计数据并用最小二乘法来拟
合出差分方程的系数。
其系统稳定性讨论要用到代数方程的求根。
对问题的进一步研究
又常需考虑到随机因素的影响,从而用到相应的概率统计知识。
例 4 某商品前 5 年的销售量见表。
现希望根据前 5 年的统计数据预测第 6 年起该
商品在各季度中的销售量。
年份
第一年
第二年
第三年
第四年 第五年
季度
1
11
12
13
15
16
2
16
18
20
24
25
§3

-198-

3
4

25
12

26
14

27
15

30
15

32
17

从表中可以看出,
该商品在前 5 年相同季节里的销售量呈增长趋势,
而在同一年中
销售量先增后减,
第一季度的销售量最小而第三季度的销售量最大。
预测该商品以后的
销售情况,根据本例中数据的特征,可以用回归分析方法按季度建立四个经验公式,分
别用来预测以后各年同一季度的销售量。
例如,
如认为第一季度的销售量大体按线性增
长,可设销售量 y t = at + b ,由 x=[[1:5]',ones(5,1)];y=[11 12 13 15 16]';z=x\y
求得 a = z (1) = 1.3 , b = z ( 2) = 9.5 。
(1)

(1)

根 据 yt

(
= 1.3t + 9.5 , 预 测 第 六 年 起 第 一 季 度 的 销 售 量 为 y 61) = 17.3 ,

( y 71) = 18.6 ,…。由于数据少,用回归分析效果不一定好。

如认为销售量并非逐年等量增长而是按前一年或前几年同期销售量的一定比例增
长的,则可建立相应的差分方程模型。仍以第一季度为例,为简单起见不再引入上标,
以 yt 表示第 t 年第一季度的销售量,建立形式如下的差分公式:

y t = a1 y t −1 + a 2


y t = a1 y t −1 + a 2 y t − 2 + a 3
等等。
上述差分方程中的系数不一定能使所有统计数据吻合,
较为合理的办法是用最小二
乘法求一组总体吻合较好的数据。以建立二阶差分方程 y t = a1 y t −1 + a 2 y t − 2 + a 3 为例,
选取 a1 , a 2 , a 3 使
5

∑[ y t =3

t

− ( a1 y t −1 + a 2 y t − 2 + a 3 )]2

最小。编写 Matlab 程序如下: y0=[11 12 13 15 16]'; y=y0(3:5);x=[y0(2:4),y0(1:3),ones(3,1)]; z=x\y
求得 a1 = z (1) = −1 , a 2 = z ( 2) = 3 , a 3 = z (3) = −8 。即所求二阶差分方程为

y t = − y t −1 + 3 y t − 2 − 8 。
虽然这一差分方程恰好使所有统计数据吻合,但这只是一个巧合。根据这一方程,
可迭代求出以后各年第一季度销售量的预测值 y 6 = 21 , y 7 = 19 ,…等。
上述为预测各年第一季度销售量而建立的二阶差分方程,
虽然其系数与前 5 年第一
季度的统计数据完全吻合,但用于预测时预测值与事实不符。凭直觉,第六年估计值明
显偏高,第七年销售量预测值甚至小于第六年。稍作分析,不难看出,如分别对每一季
度建立一差分方程,则根据统计数据拟合出的系数可能会相差甚大,但对同一种商品,
这种差异应当是微小的,
故应根据统计数据建立一个共用于各个季度的差分方程。
为此,
将季度编号为 t = 1,2,L,20 ,令 y t = a1 y t − 4 + a 2 或 y t = a1 y t − 4 + a 2 y t −8 + a 3 等,利用
全体数据来拟合,求拟合得最好的系数。以二阶差分方程为例,为求 a1 , a 2 , a 3 使得

-199-

20

Q ( a1 , a 2 , a 3 ) = ∑ [ y t − ( a1 y t − 4 + a 2 y t −8 + a 3 )]2 t =9

最小,编写 Matlab 程序如下: y0=[11 16 25 12 12 18 26 14 13 20 27 15 15 24 30 15 16 25 32 17]'; y=y0(9:20); x=[y0(5:16),y0(1:12),ones(12,1)]; z=x\y 求得 a1 = z (1) = 0.8737 , a 2 = z ( 2) = 0.1941 , a 3 = z (3) = 0.6957 ,故求得二
阶差分方程

y t = 0.8737 y t − 4 + 0.1941 y t −8 + 0.6957 , (t ≥ 21)
根据此式迭代,可求得第六年和第七年第一季度销售量的预测值为
y 21 = 17.5869 , y 25 = 19.1676
还是较为可信的。
§4

遗传模型
随着人类的进化,人们为了揭示生命的奥妙,越来越重视遗传学的研究,特别是遗
传特征的逐代传播,引起人们更多的注意。无论是人,还是动植物都会将本身的特征遗
传给下一代,这主要是因为后代继承了双亲的基因,形成自己的基因对,基因对将确定
后代所表现的特征。下面,我们来研究两种类型的遗传:常染色体遗传和 x − 链遗传。
根据亲体基因遗传给后代的方式,
建立模型,
利用这些模型可以逐代研究一个总体基因
型的分布。
4.1 常染色体遗传模型
常染色体遗传中,
后代从每个亲体的基因对中各继承一个基因,
形成自己的基因对,
基因对也称为基因型。如果我们所考虑的遗传特征是由两个基因 A 和 a 控制的,那么
就有三种基因对,记为 AA, Aa , aa 。例如,金鱼草由两个遗传基因决定花的颜色,基
因型是 AA 的金鱼草开红花, Aa 型的开粉红色花,而 aa 型的开白花。又如人类眼睛
的颜色也是通过常染色体遗传控制的。基因型是 AA 或 Aa 的人,眼睛为棕色,基因型
是 aa 的人,
眼睛为蓝色。
这里因为 AA 和 Aa 都表示了同一外部特征,
我们认为基因 A
支配基因 a ,也可以认为基因 a 对于 A 来说是隐性的。当一个亲体的基因型为 Aa ,而
另一个亲体的基因型是 aa 时,那么后代可以从 aa 型中得到基因 a ,从 Aa 型中或得到
基因 A ,或得到基因 a 。这样,后代基因型为 Aa 或 aa 的可能性相等。下面给出双亲
体基因型的所有可能的结合,以及其后代形成每种基因型的概率,如下表所示。
父体—母体的基因型

AA − AA
后代
基因


AA
Aa
aa

AA − Aa

AA − aa

Aa − Aa

Aa − aa

aa − aa

1
0
0

1/2
1/2
0

0
1
0

1/4
1/2
1/4

0
1/2
1/2

0
0
1

农场计划采用 AA 型的
例 5 农场的植物园中某种植物的基因型为 AA, Aa 和 aa 。
植物与每种基因型植物相结合的方案培育植物后代。
那么经过若干年后,
这种植物的任
一代的三种基因型分布如何?
(a)假设
令 n = 0,1,2,L 。
-200-

(i)设 a n , bn 和 cn 分别表示第 n 代植物中,基因型为 AA, Aa 和 aa 的植物占植物
总数的百分率。令 x

(n )

= [a n

bn

cn ]

x ( 0 ) = [a 0

b0

c0 ]

x
当n = 0时

为第 n 代植物的基因型分布:

(n)

T

T

表示植物基因的初始分布(即培育开始时的分布)
,显然有

a 0 + b0 + c0 = 1
(ii)第 n 代的分布与第 n − 1 代的分布之间的关系是通过上面的表格确定的。
(b)建模
根据假设(ii)
,先考虑第 n 代中的 AA 型。由于第 n − 1 代的 AA 型与 AA 型结合,
后代全部是 AA 型;第 n − 1 代的 Aa 型与 AA 型结合,后代是 AA 型的可能性为
第 n − 1 代的 aa 型与 AA 型结合,后代不可能是 AA 型。因此当 n = 1,2,L 时

1
;而
2

1 a n = 1 ⋅ a n −1 + bn −1 + 0 ⋅ cn −1
2


1 a n = a n −1 + bn −1
2

(17)

类似可推出

1 bn −1 + cn −1
2
cn = 0

bn =

(18)
(19)

将(17)(18)(19)式相加,得



a n + bn + cn = a n −1 + bn −1 + cn −1
根据假设(i)
,有

a n + bn + cn = a 0 + b0 + c0 = 1
对于(17)(18)(19)式,我们采用矩阵形式简记为


其中

x ( n ) = Mx ( n −1) ,n = 1,2,L

⎢1

M = ⎢0

⎢0



(20)

1

0⎥
2

1
1⎥
2

0 0⎥



由(20)式递推,得

x ( n ) = Mx ( n −1) = M 2 x ( n − 2) = L = M n x ( 0)

(21)
(21)式给出第 n 代基因型的分布与初始分布的关系。

-201-

编写如下 Matlab 程序: syms n a0 b0 c0
M=sym('[1,1/2,0;0,1/2,1;0,0,0]');
[p,lamda]=eig(M); x=p*lamda.^n*p^(-1)*[a0;b0;c0]; x=simple(x)
求得
n n −1

⎛1⎞
⎛1⎞
⎪a n = 1 − ⎜ ⎟ b0 − ⎜ ⎟ c0
⎝2⎠
⎝2⎠

n n −1


⎛1⎞
⎛1⎞ bn = ⎜ ⎟ b0 + ⎜ ⎟ c0

⎝2⎠
⎝2⎠

⎪c n = 0




(22)

n

⎛1⎞
当 n → ∞ 时, ⎜ ⎟ → 0 ,所以从(22)式得到
⎝2⎠
a n → 1 , bn → 0 , cn = 0
即在极限的情况下,培育的植物都是 AA 型。
(c)模型的讨论
若在上述问题中,不选用基因 AA 型的植物与每一植物结合,而是将具有相同基因
型植物相结合,那么后代具有三种基因型的概率如下表所示。
父体—母体的基因型

AA − AA
后代
基因

并且 x

(n)

Aa − Aa

aa − aa

1
0
0

1/4
1/2
1/4

0
0
1

AA
Aa
aa

= M n x ( 0 ) ,其中

⎢1

M = ⎢0

⎢0



1

0⎥
4

1
0⎥
2

1
1⎥

4


编写如下 Matlab 程序: syms n a0 b0 c0
M=sym('[1,1/4,0;0,1/2,0;0,1/4,1]');
[p,lamda]=eig(M); x=p*lamda.^n*p^(-1)*[a0;b0;c0]; x=simple(x)
-202-

求得


⎡ 1 ⎛ 1 ⎞ n +1 ⎤
⎪a n = a 0 + ⎢ − ⎜ ⎟ ⎥b0
⎢2 ⎝ 2 ⎠ ⎥



⎪ n ⎪
⎛1⎞
(23)
⎨bn = ⎜ ⎟ b0
⎝2⎠
⎪ n +1



⎪cn = c0 + ⎢ 1 − ⎛ 1 ⎞ ⎥b0
⎜ ⎟

⎢2 ⎝ 2 ⎠ ⎥



1
1
当 n → ∞ 时, a n → a 0 + b0 , bn → 0 , cn → c0 + b0 。因此,如果用基因型相同
2
2
的植物培育后代,在极限情况下,后代仅具有基因 AA 和 aa 。
4.2 常染色体隐性病模型
现在世界上已经发现的遗传病有将近 4000 种。在一般情况下,遗传病与特殊的种
族、部落及群体有关。例如,遗传病库利氏贫血症的患者以居住在地中海沿岸为多,镰
状网性贫血症一般流行在黑人中,
家族黑蒙性白痴症则流行在东欧犹太人中间。
患者经
常未到成年就痛苦地死去,
而他们的父母则是疾病的病源。
假若我们能识别这些疾病的
隐性患者,并且规定两个隐性患者不能结合(因为两个隐性患者结合,他们的后代就可
能成为显性患者)
,那么未来的儿童,虽然有可能是隐性患者,但决不会出现显性特征,
不会受到疾病的折磨。现在,我们考虑在控制结合的情况下,如何确定后代中隐性患者
的概率。
(a)假设
(i)常染色体遗传的正常基因记为 A ,不正常基因记为 a ,并以 AA, Aa , aa 分别
表示正常人,隐性患者,显性患者的基因型。
(ii)设 a n , bn 分别表示第 n 代中基因型为 AA, Aa 的人占总人数的百分比,记

⎡a ⎤ x ( n ) = ⎢ n ⎥ , n = 1,2,L
⎣ bn ⎦
(iii)为使每个儿童至少有一个正常的父亲或母亲,因此隐性患者必须与正常人结
合,其后代的基因型概率由下表给出:
父母的基因型

AA − AA
后代
基因型

AA
Aa

AA − Aa

1
0

1/2
1/2

(b)建模
由假设(iii)
,从第 n − 1 代到第 n 代基因型分布的变化取决于方程

所以 x

(n)

1 a n = a n −1 + bn −1
2
1 bn = 0 ⋅ a n −1 + bn −1
2
( n −1)
= Mx
, n = 1,2,L ,其中
-203-


⎢1
M =⎢
⎢0

如果初始分布 x
易知

(0)

1⎤
2⎥
1⎥

2⎦

已知,那么第 n 代基因型分布为 x

(n)

= M n x ( 0 ) , n = 1,2,L 。

n

⎛1⎞
⎪a n = 1 − ⎜ ⎟ b0

⎝2⎠ n = 1,2,L

n
⎛1⎞

⎪bn = ⎜ 2 ⎟ b0
⎝ ⎠

当 n → ∞ 时, a n → 1 , bn → 0 ,隐性患者逐渐消失。从(24)式中可知
1
bn = bn −1
2
1
这说明每代隐性患者的概率是前一代隐性患者概率的 。
2

(24)

(c)模型讨论
研究在随机结合的情况下,
隐性患者的变化是很有意思的,
但随机结合导致了非线
性化问题,超出了本章范围,然而用其它技巧,在随机结合的情况下可以把(24)式改
写为

bn =

bn −1
1
1 + bn −1
2

(25)

下面给出数值的例子:
某地区有 10%的黑人是镰状网性贫血症隐性患者,如果控制结合,根据(24)式
可知下一代(大约 27 年)的隐性患者将减少到 5%;如果随机结合,根据(25)式,
可以预言下一代人中有 9.5%是隐性患者,并且可计算出大约每出生 400 个黑人孩子,
其中有一个是显性患者。
4.3 X − 链遗传模型
X − 链遗传是指雄性具有一个基因 A 或 a ,
雌性具有两个基因 AA , Aa , aa 。


其遗传规律是雄性后代以相等概率得到母体两个基因中的一个,
雌性后代从父体中得到
一个基因,并从母体的两个基因中等可能地得到一个。下面,研究与 X − 链遗传有关
的近亲繁殖过程。
(a)假设
(i)从一对雌雄结合开始,在它们的后代中,任选雌雄各一个成配偶,然后在它
们产生的后代中任选两个结成配偶。如此继续下去。
(ii)父体与母体的基因型组成同胞对,同胞对的形式有 ( A, AA) , ( A, Aa ) ,

( A, aa ) , ( a, AA) , ( a, Aa ) , ( a, aa ) 六种。初始一对雌雄的同胞对,是这六种类型
中的任一种,其后代的基因型如下表所示。
父体—母体的基因型

( A, AA)
-204-

( A, Aa )

( A, aa )

( a, AA)

( a, Aa )

( a, aa )







A a AA
Aa
aa

1
0
1
0

1/2
1/2
1/2
1/2

0
1
0
1

1
0
0
1

1/2
1/2
0
1/2

0
1
0
0

0

0

0

0

1/2

1

(iii)在每一代中,配偶的同胞对也是六种类型之一,并有确定的概率。为计算这
些概率,设 a n , bn , cn , d n , en , f n 分别是第 n 代中配偶的同胞对为 ( A, AA) , ( A, Aa ) ,

( A, aa ) , ( a, AA) , ( a, Aa ) , ( a, aa ) 型的概率, n = 0,1,L 。令 x ( n ) = [a n

bn cn d n en f n ] , n = 0,1,L
(iv)如果第 n − 1 代配偶的同胞对是 ( A, Aa ) 型,那么它们的雄性后代将等可能地
得到基因 A 和 a ,它们的雌性后代的基因型将等可能地是 AA 或 Aa 。又由于第 n 代雌
雄结合是随机的,
那么第 n 代配偶的同胞对将等可能地为四种类型 ( A, AA) ,( A, Aa ) ,
( a, AA) , ( a, Aa ) 之一。对于其它类型的同胞对,我们可以进行同样分析,因此有 x ( n ) = Mx ( n −1) ,n = 1,2,L
(26)
T

其中


⎢1

⎢0

⎢0
M =⎢

⎢0

⎢0

⎢0



1
4
1
4
0

0 0

0

1
4
1
0 0
4
0 1

1
0 0 0
4
1
1
1 0
4
4
1
0 0 0
4


0⎥

0⎥

0⎥


0⎥

0⎥

1⎥



从(26)式中易得

x ( n ) = M n x ( 0 ) , n = 1,2,L

编写如下 Matlab 程序: syms n a0 b0 c0 d0 e0 f0
M=[1 1/4 0 0 0 0;0 1/4 0 1 1/4 0;0 0 0 0 1/4 0;
0 1/4 0 0 0 0;0 1/4 1 0 1/4 0;0 0 0 0 1/4 1];
M=sym(M);
[p,lamda]=eig(M); x=p*lamda.^n*p^(-1)*[a0;b0;c0;d0;e0;f0]; x=simple(x)
由上述程序计算结果可以看出

-205-

2
1
2
1 ⎤

⎢a 0 + 3 b0 + 3 c0 + 3 d 0 + 3 e0 ⎥


0


0

⎥,
(n)
当 n → ∞ 时, x →


0


0


2
1
2
⎢1

⎢ 3 b0 + 3 c0 + 3 d 0 + 3 e0 + f 0 ⎥


因此,在极限情况下所有同胞对或者是 ( A, AA) 型,或者是 ( a , aa ) 型。如果初始的父
母体同胞对是 ( A, Aa ) 型,即 b0 = 1 ,而 a 0 = c0 = d 0 = e0 = f 0 = 0 ,于是,当 n → ∞

T

1⎤
⎡2
0 0 0 0 x →⎢
3⎥
⎣3

2
1
即同胞对是 ( A, AA) 型的概率是 ,是 ( a , aa ) 型的概率是 。
3
3
(n)

习 题 十 六
大的在下,
1. (汉诺塔问题)n 个大小不同的圆盘依其半径大小依次套在桩 A 上,
小的在上。现要将此 n 个盘移到空桩 B 或 C 上,但要求一次只能移动一个盘且移动过
程中,始终保持大盘在下,小盘在上。移动过程中桩 A 也可利用。设移动 n 个盘的次
数为 a n ,试建立关于 a n 的差分方程,并求 a n 的通项公式。
2. 设第一月初有雌雄各一的一对小兔。假定两月后长成成兔,同时(即第三月)
开始每月初产雌雄各一的一对小兔,新增小兔也按此规律繁殖。设第 n 月末共有 Fn 对
兔子,试建立关于 Fn 的差分方程,并求 Fn 的通项公式。
3. 在常染色体遗传的问题中,
假设植物总是和基因型是 Aa 的植物结合。
求在第 n
代中,基因型为 AA, Aa 和 aa 的植物的百分率,并求当 n 趋于无穷大时,基因型分布
的极限。

-206-

第十七章

马氏链模型

随机过程的概念
一个随机试验的结果有多种可能性,在数学上用一个随机变量(或随机向量)来描
述。在许多情况下,人们不仅需要对随机现象进行一次观测,而且要进行多次,甚至接
连不断地观测它的变化过程。这就要研究无限多个,即一族随机变量。随机过程理论就
是研究随机现象变化过程的概率规律性的。
定义 1 设 {ξ t , t ∈ T } 是一族随机变量, 是一个实数集合,
T
若对任意实数 t ∈ T , ξ t
§1

是一个随机变量,则称 {ξ t , t ∈ T } 为随机过程。

T 称为参数集合,参数 t 可以看作时间。ξ t 的每一个可能取值称为随机过程的一个
状态。其全体可能取值所构成的集合称为状态空间,记作 E 。当参数集合 T 为非负整
数集时,随机过程又称随机序列。本章要介绍的马尔可夫链就是一类特殊的随机序列。
例 1 在一条自动生产线上检验产品质量,每次取一个,
“废品”记为 1,
“合格品”
记为 0。以 ξ n 表示第 n 次检验结果,则 ξ n 是一个随机变量。不断检验,得到一列随机
变量 ξ1 , ξ 2 ,L ,记为 {ξ n , n = 1,2,L} 。它是一个随机序列,其状态空间 E = {0,1} 。
例 2 在 m 个商店联营出租照相机的业务中
(顾客从其中一个商店租出,
可以到 m
个商店中的任意一个归还)
,规定一天为一个时间单位, ξ t = j ”表示“第 t 天开始营


业时照相机在第 j 个商店” j = 1,2,L, m 。则 {ξ n , n = 1,2,L} 是一个随机序列,其状

态空间 E = {1,2,L, m} 。
例 3 统计某种商品在 t 时刻的库存量,对于不同的 t ,得到一族随机变量,
{ξ t , t ∈ [0,+∞)} 是一个随机过程,状态空间 E = [0, R ] ,其中 R 为最大库存量。
我们用一族分布函数来描述随机过程的统计规律。一般地,一个随机过程
{ξ t , t ∈ T } ,对于任意正整数 n 及 T 中任意 n 个元素 t1 ,L, t n 相应的随机变量 ξ t1 ,L,ξ tn
的联合分布函数记为

Ft1 Ltn ( x1 ,L, x n ) = P{ξ t1 ≤ x1 ,L,ξ tn ≤ x n }

(1)

由于 n 及 ti (i = 1,L, n ) 的任意性,
(1)式给出了一族分布函数。记为

{Ft1 Ltn ( x1 ,L, x n ), ti ∈ T , i = 1,L, n; n = 1,2,L}

称它为随机过程 {ξ t , t ∈ T } 的有穷维分布函数族。它完整地描述了这一随机过程的统计
规律性。
马尔可夫链
2.1 马尔可夫链的定义
现实世界中有很多这样的现象:
某一系统在已知现在情况的条件下,
系统未来时刻
的情况只与现在有关,
而与过去的历史无直接关系。
比如,
研究一个商店的累计销售额,
如果现在时刻的累计销售额已知,
则未来某一时刻的累计销售额与现在时刻以前的任一
时刻累计销售额无关。
上节中的几个例子也均属此类。
描述这类随机现象的数学模型称
为马氏模型。
定义 2 设 {ξ n , n = 1,2,L} 是一个随机序列,
状态空间 E 为有限或可列集,
对于任
§2

意的正整数 m, n ,若 i, j, ik ∈ E ( k = 1,L, n − 1) ,有

-207-

P{ξ n + m = j | ξ n = i, ξ n −1 = in −1 ,L,ξ1 = i1 } = P{ξ n + m = j | ξ n = i}
(2)

则称 {ξ n , n = 1,2,L} 为一个马尔可夫链(简称马氏链)(2)式称为马氏性。
事实上,可以证明若等式(2)对于 m = 1 成立,则它对于任意的正整数 m 也成立。
因此,只要当 m = 1 时(2)式成立,就可以称随机序列 {ξ n , n = 1,2,L} 具有马氏性,
即 {ξ n , n = 1,2,L} 是一个马尔可夫链。
定义 3 设 {ξ n , n = 1,2,L} 是一个马氏链。如果等式(2)右边的条件概率与 n 无
关,即

P{ξ n + m = j | ξ n = i} = pij ( m)

(3)

则称 {ξ n , n = 1,2,L} 为时齐的马氏链。 pij ( m ) 为系统由状态 i 经过 m 个时间间隔

(或

m 步)转移到状态 j 的转移概率。
(3)称为时齐性。它的含义是:系统由状态 i 到状态 j 的转移概率只依赖于时间间隔的长短,与起始的时刻无关。本章介绍的马氏链假定都
是时齐的,因此省略“时齐”二字。
2.2 转移概率矩阵及柯尔莫哥洛夫定理
对于一个马尔可夫链 {ξ n , n = 1,2,L} ,称以 m 步转移概率 pij ( m ) 为元素的矩阵

P( m) = ( pij ( m )) 为马尔可夫链的 m 步转移矩阵。 m = 1 时, P(1) = P 称为马尔可


夫链的一步转移矩阵,或简称转移矩阵。它们具有下列三个基本性质:
(i)对一切 i , j ∈ E , 0 ≤ pij ( m ) ≤ 1 ;
(ii)对一切 i ∈ E ,

∑p j∈E ij

(m) = 1 ;
⎧1, 当i = j时

⎩0, 当i ≠ j时

(iii)对一切 i , j ∈ E , pij (0) = δ ij = ⎨

当实际问题可以用马尔可夫链来描述时,
首先要确定它的状态空间及参数集合,

后确定它的一步转移概率。关于这一概率的确定,可以由问题的内在规律得到,也可以
由过去经验给出,还可以根据观测数据来估计。
例 4 某计算机机房的一台计算机经常出故障,研究者每隔 15 分钟观察一次计算
机的运行状态,收集了 24 小时的数据(共作 97 次观察)
。用 1 表示正常状态,用 0 表
示不正常状态,所得的数据序列如下:
1110010011111110011110111111001111111110001101101
111011011010111101110111101111110011011111100111
解 设 X n ( n = 1,L,97) 为第 n 个时段的计算机状态,可以认为它是一个时齐马氏

链,状态空间 E = {0,1} ,编写如下 Matlab 程序: a1='1110010011111110011110111111001111111110001101101'; a2='111011011010111101110111101111110011011111100111'; a=[a1 a2]; f00=length(findstr('00',a)) f01=length(findstr('01',a)) f10=length(findstr('10',a)) f11=length(findstr('11',a))
或者把上述数据序列保存到纯文本文件data1.txt中,存放在Matlab下的work
子目录中,编写程序如下: clc,clear -208-

format rat fid=fopen('data1.txt','r'); a=[]; while (~feof(fid)) a=[a fgetl(fid)]; end for i=0:1 for j=0:1 s=[int2str(i),int2str(j)]; f(i+1,j+1)=length(findstr(s,a)); end end fs=sum(f'); for i=1:2 f(i,:)=f(i,:)/fs(i); end f 求得 96 次状态转移的情况是:
0 → 0 ,8 次;
0 → 1 ,18 次;
1 → 0 ,18 次; 1 → 1 ,52 次,
因此,一步转移概率可用频率近似地表示为

8
4
=
8 + 18 13
18
9
= P{ X n +1 = 1 | X n = 0} ≈
=
8 + 18 13
18
9
= P{ X n +1 = 0 | X n = 1} ≈
=
18 + 52 35
52
26
= P{ X n +1 = 1 | X n = 1} ≈
=
18 + 52 35
设一随机系统状态空间 E = {1,2,3,4} ,记录观测系统所处状态如下:

p00 = P{ X n +1 = 0 | X n = 0} ≈

p01 p10 p11

例5
4 3 2 1 4 3 1 1 2 3
2 1 2 3 4 4 3 3 1 1
1 3 3 2 1 2 2 2 4 4
2 3 2 3 1 1 2 4 3 1
若该系统可用马氏模型描述,估计转移概率 pij 。


首先将不同类型的转移数 nij 统计出来分类记入下表

i → j 转移数 nij
1
1
2
3
4

各类转移总和

∑∑ n

2

3

4

行和 ni

4
3
4
0

4
2
4
1

1
4
2
4

1
2
1
2

10
11
11
7

ij

i

等于观测数据中马氏链处于各种状态次数总和减 1,
而行和 ni 是

j

-209-

系统从状态 i 转移到其它状态的次数, nij 是由状态 i 到状态 j 的转移次数,则 pij 的估
计值 pij =

nij ni 。计算得

⎡ 2 / 5 2 / 5 1 / 10 1 / 10 ⎤
⎢ 3 / 11 2 / 11 4 / 11 2 / 11⎥
ˆ

P=⎢
⎢4 / 11 4 / 11 2 / 11 1 / 11⎥


1/ 7 4 / 7 2 / 7 ⎦
⎣ 0
Matlab 计算程序如下: format rat clc a=[4 3 2 1 4 3 1 1 2 3 ...
2 1 2 3 4 4 3 3 1 1 ...
1 3 3 2 1 2 2 2 4 4 ...
2 3 2 3 1 1 2 4 3 1]; for i=1:4 for j=1:4 f(i,j)=length(findstr([i j],a)); end end f ni=(sum(f'))' for i=1:4 p(i,:)=f(i,:)/ni(i); end p 例 6 带有反射壁的随机徘徊)

如果在原点右边距离原点一个单位及距原点 s ( s > 1)
个单位处各立一个弹性壁。一个质点在数轴右半部从距原点两个单位处开始随机徘徊。
若在+1 处,

每次分别以概率 p (0 < p < 1) 和 q( q = 1 − p ) 向右和向左移动一个单位;
以概率 p 反射到 2,以概率 q 停在原处;在 s 处,则以概率 q 反射到 s − 1 ,以概率 p 停
在原处。设 ξ n 表示徘徊 n 步后的质点位置。 {ξ n , n = 1,2,L} 是一个马尔可夫链,其状

态空间 E = {1,2,L, s} ,写出转移矩阵 P 。


⎧1, 当i = 2时
P{ξ 0 = i} = ⎨
⎩0, 当i ≠ 2时
⎧q, 当j = 1时

p1 j = ⎨ p, 当j = 2时
⎪0, 其它

⎧ p, 当j = s时

p sj = ⎨q, 当j = s − 1时
⎪0, 其它


-210-

⎧ p, 当j − i = 1时

pij = ⎨q, 当j − i = −1时(i = 2,3, L , s − 1)
⎪0, 其它

因此, P 为一个 s 阶方阵,即
⎡q p 0 L 0 0⎤
⎢q 0 p L 0 0⎥


⎢0 q 0 L 0 0⎥
P=⎢
⎥。
L L L L L L⎥

⎢ 0 0 0 q 0 p⎥


⎣ 0 0 0 0 q p⎦
定理 1 (柯尔莫哥洛夫—开普曼定理)设 {ξ n , n = 1,2,L} 是一个马尔可夫链,其
状态空间 E = {1,2,L} ,则对任意正整数 m, n 有

pij ( n + m) = ∑ pik ( n ) pkj ( m ) k ∈E

其中的 i , j ∈ E 。


定理 2 设 P 是一个马氏链转移矩阵( P 的行向量是概率向量) P
行向量,则第 n 步的概率分布为

( 0)

是初始分布

P ( n ) = P ( 0) P n 。
例 7 若顾客的购买是无记忆的,即已知现在顾客购买情况,未来顾客的购买情况
不受过去购买历史的影响,
而只与现在购买情况有关。
现在市场上供应 A、B、C 三个


不同厂家生产的 50 克袋状味精,用“ ξ n = 1 ”“ ξ n = 2 ”“ ξ n = 3 ”分别表示“顾客
。显然, {ξ n , n = 1,2,L} 是一个马氏链。若已知第一
第 n 次购买 A、B、C 厂的味精”
次顾客购买三个厂味精的概率依次为 0.2,0.4,0.4。又知道一般顾客购买的倾向由表 2
给出。求顾客第四次购买各家味精的概率。
表2
下 次 购 买

A
A
B
C

上次
购买


B

C

0.8
0.5
0.5

0.1
0.1
0.3

0.1
0.4
0.2

第一次购买的概率分布为

P (1) = [0.2
⎡ 0 .8 0 .1
转移矩阵 P = ⎢0.5 0.1

⎢ 0 .5 0 .3


0.4 0.4]
0.1⎤
0 .4 ⎥

0 .2 ⎥


则顾客第四次购买各家味精的概率为

P ( 4 ) = P (1) P 3 = [0.7004 0.136 0.1636]。

2.3

转移概率的渐近性质—极限概率分布
-211-

n

现在我们考虑, n 的增大,P 是否会趋于某一固定向量?先考虑一个简单例子:


⎡0.5 0.5⎤
⎥ ,当 n → +∞ 时,
⎣0.7 0.3⎦
5⎤
⎡7
⎢12 12 ⎥
Pn → ⎢
7
5⎥


⎣12 12 ⎦
5⎤
⎡7
T
又若取 u = ⎢

uT
(概
⎥ , uP = u , 为矩阵 P 的对应于特征值 λ = 1 的特征
⎣12 12 ⎦
率)向量, u 也称为 P 的不动点向量。哪些转移矩阵具有不动点向量?为此我们给出
转移矩阵 P = ⎢

正则矩阵的概念。 k 定义4 一个马氏链的转移矩阵 P 是正则的,当且仅当存在正整数 k ,使 P 的每
一元素都是正数。
定理3 若 P 是一个马氏链的正则阵,那么:
(i) P 有唯一的不动点向量 W , W 的每个分量为正。 n (ii) P 的 n 次幂 P ( n 为正整数)随 n 的增加趋于矩阵 W ,W 的每一行向量均
等于不动点向量 W 。
传播的方式是 a1 传
例 8 信息的传播 一条新闻在 a1 , a 2 ,L, a n ,L 等人中间传播,
给 a2 , a2 传给 a3 ,…如此继续下去,每次传播都是由 ai 传给 ai +1 。每次传播消息的失
真概率是 p , 0 < p < 1 ,即 ai 将消息传给 ai +1 时,传错的概率是 p ,这样经过长时间
传播,第 n 个人得知消息时,消息的真实程度如何?
设整个传播过程为随机转移过程,消息经过一次传播失真的概率为 p ,转移矩阵


P=

假 ⎡1 −



⎢ p




p

p ⎤

1 − p⎥


P 是正则矩阵。又设 V 是初始分布,则消息经过 n 次传播后,其可靠程度的概率分布 n 为V ⋅ P 。
一般地,设时齐马氏链的状态空间为 E ,如果对于所有 i , j ∈ E ,转移概率 pij (n )
存在极限

lim pij ( n ) = π j ,
(不依赖于 i )

n→∞



⎡π 1
⎢π
⎢ 1 n P ( n ) = P ⎯(⎯⎯→ ⎢L n→∞ )

⎢π 1
⎢L

-212-

π 2 L π j L⎤ π 2 L π j L⎥


L L L L⎥ , π 2 L π j L⎥

L L L L⎥


则称此链具有遍历性。又若

∑π

j

= 1 ,则同时称 π = (π 1 , π 2 ,L) 为链的极限分布。

j

下面就有限链的遍历性给出一个充分条件。
定理 4 设时齐(齐次)马氏链 {ξ n , n = 1,2,L} 的状态空间为 E = {a1 ,L, a N } ,

P = ( pij ) 是它的一步转移概率矩阵,如果存在正整数 m ,使对任意的 ai , a j ∈ E ,都


pij ( m ) > 0 , i, j = 1,2,L, N
则此链具有遍历性;且有极限分布 π = (π 1 ,L, π N ) ,它是方程组
N

π = πP 或即 π j = ∑ π i pij , j = 1, L , N i =1

的满足条件
N

π j > 0 , ∑π j = 1 j =1

的唯一解。
例 9 根据例 7 中给出的一般顾客购买三种味精倾向的转移矩阵,
预测经过长期的
多次购买之后,顾客的购买倾向如何?
解 这个马氏链的转移矩阵满足定理 4 的条件,可以求出其极限概率分布。为此,
解下列方程组:

⎧ p1 = 0.8 p1 + 0.5 p 2 + 0.5 p3
⎪ p = 0.1 p + 0.1 p + 0.3 p
⎪ 2
1
2
3

⎪ p3 = 0.1 p1 + 0.4 p 2 + 0.2 p3
⎪ p1 + p 2 + p3 = 1

编写如下的 Matlab 程序: format rat p=[0.8 0.1 0.1;0.5 0.1 0.4;0.5 0.3 0.2]; a=[p'-eye(3);ones(1,3)]; b=[zeros(3,1);1]; p_limit=a\b T

或者利用求转移矩阵 P 的转置矩阵 P 的特征值 1 对应的特征(概率)向量,求得极
限概率。编写程序如下:
p=[0.8 0.1 0.1;0.5 0.1 0.4;0.5 0.3 0.2]; p=sym(p'); [x,y]=eig(p) for i=1:3 x(:,i)=x(:,i)/sum(x(:,i)); end x 求得 p1 =

5
11
13
, p2 =
, p3 =

7
84
84

这说明,无论第一次顾客购买的情况如何,经过长期多次购买以后, A 厂产的味

-213-

精占有市场的

11 13
5
, B, C 两厂产品分别占有市场的


7
84 84

2.4 吸收链
马氏链还有一种重要类型—吸收链。
若马氏链的转移矩阵为

1

2

3

4

1 ⎡ 0.3 0.3 0 0.4⎤
2 ⎢0.2 0.3 0.2 0.3⎥ ,

P= ⎢
3 ⎢ 0 0.3 0.3 0.4⎥


4⎣ 0
0
0
1⎦
P 的最后一行表示的是,当转移到状态 4 时,将停留在状态 4,状态 4 称为吸收状态。
如果马氏链至少含有一个吸收状态,
并且从每一个非吸收状态出发,
都可以到达某
个吸收状态,那么这个马氏链被称为吸收链。
具有 r 个吸收状态, s ( s = n − r ) 个非吸收状态的吸收链,它的 n × n 转移矩阵的标
准形式为

⎡I O⎤
P=⎢ r
(4)

⎣R S⎦
其中 I r 为 r 阶单位阵, O 为 r × s 零阵, R 为 s × r 矩阵, S 为 s × s 矩阵。从(4)得
O⎤
⎡I
Pn = ⎢ r
(5)
n⎥
⎣Q S ⎦ n (5)式中的子阵 S 表示以任何非吸收状态作为初始状态,经过 n 步转移后,处于
非吸收状态的概率。

s个

−1

在吸收链中,令 F = ( I − S ) ,则 F 称为基矩阵。
对于具有标准形式(即(4)式)转移矩阵的吸收链,可以证明以下定理:
定理 5 吸收链的基矩阵 F 中的每个元素,
表示从一个非吸收状态出发,
过程到达
每个非吸收状态的平均转移次数。

定理 6 设 N = FC , F 为吸收链的基矩阵, C = [1 1 L 1] ,则 N 的每个
元素表示从非吸收状态出发,到达某个吸收状态被吸收之前的平均转移次数。
定理 7 设 B = FR = (bij ) ,其中 F 为吸收链的基矩阵, R 为(4)式中的子阵,
T

则 bij 表示从非吸收状态 i 出发,被吸收状态 j 吸收的概率。
例 10 智力竞赛问题 甲、乙两队进行智力竞赛。竞赛规则规定:竞赛开始时,
甲、乙两队各记 2 分,在抢答问题时,如果甲队赢得 1 分,那么甲队的总分将增加 1
分,同时乙队总分将减少 1 分。当甲(或乙)队总分达到 4 分时,竞赛结束,甲(或乙)
获胜。根据队员的智力水平,知道甲队赢得 1 分的概率为 p ,失去 1 分的概率为 1 − p ,
求:
(i)甲队获胜的概率是多少?(ii)竞赛从开始到结束,分数转移的平均次数是多
少?(iii)甲队获得 1、2、3 分的平均次数是多少?
分析 甲队得分有 5 种可能,即 0、1、2、3、4,分别记为状态 a 0 , a1 , a 2 , a 3 , a 4 ,
其中 a0 和 a4 是吸收状态, a1 , a 2 和 a3 是非吸收状态。过程是以 a2 作为初始状态。根据
-214-

甲队赢得 1 分的概率为 p ,建立转移矩阵:

a0

a1

a2

a3

a0 ⎡ 1
0
0 a1 ⎢1 − p
0
p

P = a2 ⎢ 0
1− p
0
⎢ a3 ⎢ 0
0
1− p a4 ⎢ 0
0
0


a4

0
0
p
0
0

0⎤
0⎥

0⎥
⎥ p⎥ 1⎥


(6)

将(6)式改记为标准形式:

⎡I
P=⎢ 2
⎣R

O⎤
S⎥


其中

⎡1 − p
R=⎢ 0

⎢ 0


0⎤ p ⎡ 0
⎥ , S = ⎢1 − p
0
0

⎢ p⎥ 1− p
⎢ 0



0⎤ p⎥ ,

0⎥


计算

⎡1 − pq
1 ⎢
−1
F = (I3 − S) = q 1 − 2 pq ⎢ 2
⎢ q

其中 q = 1 − p 。

p2 ⎤

p ⎥ q 1 − pq⎥


p
1

因为 a2 是初始状态,根据定理 5,甲队获得 1,2,3 分的平均次数为

q

1− 2 pq

1 p ,
。又
1 − 2 pq 1− 2 pq
⎡1 − pq p p2 ⎤
1 ⎢

p ⎥
N = FC =
1
⎢ q
1 − 2 pq
⎢ q2 q 1 − pq⎥


1
=
1+ 2 p2 2 1+ 2 p2
1 − 2 pq

[

]

根据定理 6,以 a2 为初始状态,甲队最终获胜的分数转移的平均次数为

2

1 − 2 pq

又因为

⎡(1 − pq) p p3 ⎤
1 ⎢

2
B = FR = p2 ⎥
⎢ q
1 − 2 pq
⎢ q3
(1 − pq) p ⎥


-215-

根据定理 7,甲队最后获胜的概率 b22 =

p2

1 − 2 pq

Matlab 程序如下: syms p q r=[q,0;0,0;0,p]; s=[0,p,0;q,0,p;0,q,0]; f=(eye(3)-s)^(-1);f=simple(f) n=f*ones(3,1);n=simple(n) b=f*r;b=simple(b) 马尔可夫链的应用
应用马尔可夫链的计算方法进行马尔可夫分析,
主要目的是根据某些变量现在的情
况及其变动趋向,
来预测它在未来某特定区间可能产生的变动,
作为提供某种决策的依
据。
例 11(服务网点的设置问题)为适应日益扩大的旅游事业的需要,某城市的甲、
乙、丙三个照相馆组成一个联营部,联合经营出租相机的业务。游客可由甲、乙、丙三
处任何一处租出相机,
用完后,
还在三处中任意一处即可。
估计其转移概率如下表所示:
还 相 机 处



0.2
0.8
0

0.8
0
0.2
租相机处

0.1
0.3
0.6

今欲选择其中之一附设相机维修点,问该点设在哪一个照相馆为最好?
解 由于旅客还相机的情况只与该次租机地点有关,而与相机以前所在的店址无
关,
所以可用 X n 表示相机第 n 次被租时所在的店址; X n = 1 ” X n = 2 ” X n = 3 ”





§3

分别表示相机第 n 次被租用时在甲、乙、丙馆。则 { X n , n = 1,2,L} 是一个马尔可夫链,
其转移矩阵 P 由上表给出。考虑维修点的设置地点问题,实际上要计算这一马尔可夫
链的极限概率分布。
转移矩阵满足定理 4 的条件,极限概率存在,解方程组

⎧ p1 = 0.2 p1 + 0.8 p2 + 0.1 p3
⎪ p = 0 .8 p + 0 .3 p
⎪ 2
1
3

p 3 = 0 .2 p 2 + 0 .6 p 3

⎪ p1 + p 2 + p3 = 1

17
16
8
得极限概率 p1 =
, p2 =
, p3 =

41
41
41
由计算看出,经过长期经营后,该联营部的每架照相机还到甲、乙、丙照相馆的概
率分别为

17 16
8


。由于还到甲馆的照相机较多,因此维修点设在甲馆较好。但
41 41 41

由于还到乙馆的相机与还到甲馆的相差不多,若是乙的其它因素更为有利的话,比如,
交通较甲方便,便于零配件的运输,电力供应稳定等等,亦可考虑设在乙馆。
习 题 十 七
-216-

1. 在英国,工党成员的第二代加入工党的概率为 0.5,加入保守党的概率为 0.4,
加入自由党的概率为 0.1。
而保守党成员的第二代加入保守党的概率为 0.7,
加入工党的
概率为 0.2,
加入自由党的概率为 0.1。
而自由党成员的第二代加入保守党的概率为 0.2,
加入工党的概率为 0.4,
加入自由党的概率为 0.4。
求自由党成员的第三代加入工党的概
率是多少?在经过较长的时间后,
各党成员的后代加入各党派的概率分布是否具有稳定
性?
2. 社会学的某些调查结果指出:儿童受教育的水平依赖于他们父母受教育的水
平。调查过程是将人们划分为三类: E 类,这类人具有初中或初中以下的文化程度;S
类,这类人具有高中文化程度; C 类,这类人受过高等教育。当父或母(指文化程度
较高者)
是这三类人中某一类型时,
其子女将属于这三种类型中的任一种的概率由下面
给出
子女

E
父 E ⎡0.7

或 S 0.4

母 C ⎢ 0.1



S

C

0.2 0.1⎤
0.4 0.2⎥

0.2 0.7⎥


问:
(i)属于 S 类的人们中,其第三代将接受高等教育的概率是多少?
(ii)假设不同的调查结果表明,如果父母之一受过高等教育,那么他们的子女总
可以进入大学,修改上面的转移矩阵。
(iii)根据(ii)的解,每一类型人的后代平均要经过多少代,最终都可以接受高
等教育?
3. 色盲是 X − 链遗传,由两种基因 A 和 a 决定。男性只有一个基因 A 或 a ,女性
有两个基因 AA、Aa 或 aa ,当基因为 a 或 aa 时呈现色盲。基因遗传规律为:男性等
概率地取母亲的两个基因之一,女性取父亲的基因外又等概率地取母亲的两个基因之
一。由此可知,母亲色盲则儿子必色盲但女儿不一定。试用马氏链研究:
(i)若近亲结婚,其后代的发展趋势如何?若父亲非色盲而母亲色盲,问平均经
多少代,其后代就会变为全色盲或全不色盲,两者的概率各为多少?
(ii)若不允许双方均色盲的人结婚,情况会怎样?

-217-

第十八章

动态优化模型

动态过程的另一类问题是所谓的动态优化问题,
这类问题一般要归结为求最优控制
函数使某个泛函达到极值。
当控制函数可以事先确定为某种特殊的函数形式时,
问题又
简化为求普通函数的极值。求解泛函极值问题的方法主要有变分法和最优控制理论方
法。
§1

变分法简介
变分法是研究泛函极值问题的一种经典数学方法,
有着广泛的应用。
下面先介绍变
分法的基本概念和基本结果,
然后介绍动态系统最优控制问题求解的必要条件和最大值
原理。
1.1 变分法的基本概念
1.1.1 泛函
设 S 为一函数集合,
若对于每一个函数 x (t ) ∈ S 有一个实数 J 与之对应,
则称 J 是

对应在 S 上的泛函,记作 J ( x (t )) 。 S 称为 J 的容许函数集。
通俗地说,泛函就是“函数的函数”


例如对于 xy 平面上过定点 A( x1 , y1 ) 和 B ( x 2 , y 2 ) 的每一条光滑曲线 y (x ) , x 轴
旋转得一旋转体,旋转体的侧面积是曲线 y ( x ) 的泛函 J ( y ( x )) 。由微积分知识不难写

x2

J ( y ( x )) = ∫ 2πy ( x ) 1 + y ' 2 ( x ) dx

(1)

x1

容许函数集可表示为

S = { y ( x) | y ( x) ∈ C 1 [ x1 , x 2 ], y ( x1 ) = y1 , y ( x 2 ) = y 2 }

(2)

最简单的一类泛函表为 t2 &
J ( x (t )) = ∫ F (t , x, x )dt

(3)

t1

& (1)式是最简泛函。
被积函数 F 包含自变量 t ,未知函数 x 及导数 x 。
1.1.2 泛函的极值
泛 函 J ( x (t )) 在 x 0 (t ) ∈ S 取 得 极 小 值 是 指 , 对 于 任 意 一 个 与 x0 (t ) 接 近 的

x (t ) ∈ S ,都有 J ( x (t )) ≥ J ( x0 (t )) 。所谓接近,可以用距离 d ( x (t ), x0 (t )) < ε 来度量,
而距离定义为

&
&
d ( x (t ), x 0 (t )) = max{| x (t ) − x0 (t ) |, | x (t ) − x 0 (t ) |} t1 ≤ t ≤ t 2

泛函的极大值可以类似地定义。 x0 (t ) 称为泛函的极值函数或极值曲线。
1.1.3 泛函的变分
如同函数的微分是增量的线性主部一样,
泛函的变分是泛函增量的线性主部。
作为
泛函的自变量,函数 x (t ) 在 x0 (t ) 的增量记为

δ x (t ) = x (t ) − x0 (t )
也称函数的变分。由它引起的泛函的增量记作

ΔJ = J ( x0 (t ) + δx (t )) − J ( x 0 (t ))
如果 ΔJ 可以表为
-218-

ΔJ = L( x0 (t ), δx (t )) + r ( x0 (t ), δx (t ))
其中 L 为 δx 的线性项,而 r 是 δx 的高阶项,则 L 称为泛函在 x0 (t ) 的变分,记作 δJ ( x0 (t )) 。用变动的 x(t ) 代替 x0 (t ) ,就有 δJ ( x (t )) 。
泛函变分的一个重要形式是它可以表为对参数 α 的导数:

δJ ( x (t )) =


J ( x (t ) + αδx (t )) α = 0
∂α

(4)

这是因为当变分存在时,增量

ΔJ = J ( x (t ) + αδx ) − J ( x (t )) = L( x (t ),αδx ) + r ( x (t ),αδx )
根据 L 和 r 的性质有
L( x (t ),αδx ) = αL( x (t ), δx ) r ( x (t ), αδx ) r ( x (t ), αδx ) lim = lim δx = 0 α →0 α →0 α αδx
所以


J ( x + αδx ) − J ( x )
J ( x + αδx ) α = 0 = lim α →0
∂α
α
L( x,αδx ) + r ( x, αδx )
= lim
= L ( x , δx ) = δJ ( x )

α

α →0

1.1.4 极值与变分
利用变分的表达式(4)可以得到泛函极值与变分的关系:
若 J ( x (t )) 在 x0 (t ) 达到极值(极大或极小)
,则

δJ ( x0 (t )) = 0
(5)
这是因为对任意给定的 δx , J ( x 0 + αδx ) 是变量 α 的函数,该函数在 α = 0 处达到极
值。根据函数极值的必要条件知


J ( x 0 + αδx ) α = 0 = 0
∂α
于是由(4)式直接得到(5)式。
1.1.5. 变分法的基本引理
引理

ϕ ( x ) ∈ C[ x1 , x2 ] , ∀η ( x ) ∈ C 1 [ x1 , x2 ] ,η ( x1 ) = η ( x2 ) = 0 ,有



x2

x1



ϕ ( x )η ( x )dx ≡ 0 ,

ϕ ( x ) ≡ 0, x ∈ [ x1 , x 2 ] 。
1.2 无约束条件的泛函极值
求泛函
tf

&
J = ∫ F (t , x (t ), x (t ))dt

(6)

t0

的极值,一般是用泛函极值的必要条件去寻找一条曲线 x (t ) ,使给定的二阶连续可微
*

,记为 x (t ) 。
函数 F 沿该曲线的积分达到极值。常称这条曲线为极值曲线(或轨线)
1.2.1 端点固定的情况
设容许曲线 x (t ) 满足边界条件
-219-

x (t0 ) = x 0 ,x (t f ) = x f

(7)

且二次可微。
首先计算(6)式的变分:


J ( x (t ) + αδx (t )) α = 0
∂α
tf ∂
&
&
=∫
F (t , x (t ) + αδx (t ), x (t ) + αδx (t )) α = 0 dt t 0 ∂α

δJ =

tf

&
& &
= ∫ [ Fx (t , x, x )δx + Fx (t , x, x )δx ]dt
&

(8)

t0

对上式右端第二项做分布积分,并利用 δx (t 0 ) = δx (t f ) = 0 ,有



tf

t0

& &
Fx (t , x, x )δxdt = − ∫
&

tf

t0

d
&
Fx (t , x, x )δxdt ,
&
dt

再代回到(8)式,并利用泛函取极值的必要条件,有

d
Fx ]δxdt = 0
&
t0 dt 因为 δx 的任意性,及 δx (t 0 ) = δx (t f ) = 0 ,所以由基本引理得到著名的欧拉方程 tf δJ = ∫ [ Fx −

Fx −

d
Fx = 0
&
dt

(9)

它是这类最简泛函取极值的必要条件。
(9)式又可记作

Fx − Ftx − Fxx x − Fxx && = 0
&
& &
&& x

(10)

通常这是 x (t ) 的二阶微分方程,其通解的两个任意常数由(7)式中的两个端点条件确
定。
1.2.2 最简泛函的几种特殊情形
&
(i) F 不依赖于 x ,即 F = F (t , x )
这时 Fx ≡ 0 ,欧拉方程为 Fx (t , x ) = 0 ,这个方程以隐函数形式给出 x (t ) ,但它一
&

般不满足边界条件,因此,变分问题无解。
&
(ii) F 不依赖 x ,即 F = F (t , x )
欧拉方程为

d
&
Fx (t , x ) = 0
&
dt
&
&
将上式积分一次,便得首次积分 Fx (t , x ) = c1 ,由此可求出 x = ϕ (t , c1 ) ,积分后得到
&
可能的极值曲线族

x = ∫ ϕ (t , c1 )dt

&
&
(iii) F 只依赖于 x ,即 F = F ( x )

这时 Fx = 0, Ftx = 0, Fxx = 0 ,欧拉方程为
&
&

&&Fxx = 0 x && x x
由此可设 && = 0 或 Fxx = 0 ,如果 && = 0 ,则得到含有两个参数的直线族 x = c1t + c 2 。
&&
-220-

另外若 Fxx = 0 有一个或几个实根时,
则除了上面的直线族外,
又得到含有一个参数 c 的
&&

直线族 x = kt + c ,它包含于上面含有两个参数的直线族 x = c1t + c 2 中,于是,在

&
F = F (x ) 情况下,极值曲线必然是直线族。
&
&
(iv) F 只依赖于 x 和 x ,即 F = F ( x, x )
这时有 Ftx = 0 ,故欧拉方程为
&
& & x &&
Fx − xFxx − &&Fxx = 0
此方程具有首次积分为

& &
F − xFx = c1
事实上,注意到 F 不依赖于 t ,于是有 d d d & &
&
& x & &
( F − xFx ) = Fx x + Fx && − &&Fx − x Fx = x ( Fx − Fx ) = 0 。
&x
&
&
dt dt dt
例 1 (最速降线问题)最速降线问题是历史上变分法开始发展的第一个问题。它是
约翰·贝努里(J. Bernoulli)于 1696 年提出的。问题的提法是这样的:设 A 和 B 是铅
直平面上不在同一铅直线上的两点,在所有连结 A 和 B 的平面曲线中,求一曲线,当
质点仅受重力作用,且初速为零,沿此曲线从 A 滑行至 B 时,使所需时间最短。
解 将 A 点取为坐标原点, x 轴水平向右, y 轴垂直向下, B 点为 B ( x 2 , y 2 ) 。根
据能量守恒定律,质点在曲线 y ( x ) 上任一点处的速度

ds
满足( s 为弧长) dt 2

1 ⎛ ds ⎞ m⎜ ⎟ = mgy
2 ⎝ dt ⎠
将 ds = 1 + y ' ( x ) dx 代入上式得
2

1 + y'2 dx 2 gy
于是质点滑行时间应表为 y ( x ) 的泛函 dt =

J ( y ( x )) = ∫

x2

0

1 + y'2 dx 2 gy

端点条件为

y (0) = 0, y ( x 2 ) = y 2
最速降线满足欧拉方程,因为

F ( y, y ' ) =

1 + y'2 y 不含自变量 x ,所以方程(10)可写作

Fy − Fyy ' y '− Fy ' y ' y ' ' = 0
等价于

d
( F − y ' Fy ' ) = 0 dx 作一次积分得
-221-

θ

令 y ' = ctg

2

y (1 + y ' 2 ) = c1
, 则方程化为

y=

c1 θ c
= c1 sin 2 = 1 (1 − cosθ )
2
1 + y'
2 2

又因

θ

θ

c1 sin cos dθ c dy
2
2 dx =
=
= 1 (1 − cosθ )dθ θ y'
2
ctg
2
积分之,得

c1
(θ − sin θ ) + c 2
2
由边界条件 y (0) = 0 ,可知 c2 = 0 ,故得 c ⎧ x = 1 (θ − sin θ )


2

⎪ y = c1 (1 − cosθ ).


2
x=

这是摆线(圆滚线)的参数方程,其中常数 c1 可利用另一边界条件 y ( x 2) y 2 来确定。
=
例 2 最小旋转面问题 x2 J ( y ( x)) = 2π ∫ y ( x) 1 + y ' 2 ( x) dx x1 S = { y | y ∈ C [ x1 , x2 ], y ( x1 ) = y1 , y ( x2 ) = y 2 }
1



因 F = y 1 + y'

2

不包含 x ,故有首次积分

F − y ' Fy ' = y 1 + y ' 2 − y ' y
化简得

y'
1 + y'2

= c1

y = c1 1 + y ' 2

令 y ' = sht ,代入上式, y = c1 1 + sh t = c1cht
2

dy c1 shtdt
=
= c1dt y' sht
积分之,得 x = c1t + c2 x − c2
消去 t ,就得到 y = c1ch

c1
由于

dx =

这是悬链线方程。
1.2.3 最简泛函的推广
最简泛函取极值的必要条件可以推广到其它情况。
(ⅰ)含多个函数的泛函
-222-

使泛函 x2 J ( y ( x ), z ( x )) = ∫ F ( x, y , y ' , z , z ' )dx x1 取极值且满足固定边界条件

y ( x1 ) = y1 , y ( x 2 ) = y 2 , z ( x1 ) = z1 , z ( x 2 ) = z 2 .
的极值曲线 y = y ( x ), z = z ( x ) 必满足欧拉方程组 d ⎧
⎪ Fy − dx Fy ' = 0


⎪ Fz − d Fz ' = 0

dx

(ii)含高阶导数的泛函
使泛函
x2

J ( y ( x )) = ∫ F ( x, y , y ' , y" )dx x1 取极值且满足固定边界条件 y ( x1 ) = y1 , y(x 2) y 2,y ' ( x1 ) = y '1 , y ' ( x 2 ) = y ' 2
=
的极值曲线 y = y ( x ) 必满足微分方程

d d2 Fy − F y ' + 2 Fy " = 0 dx dx
(iii) 含多元函数的泛函
设 z ( x, y ) ∈ c , ( x, y ) ∈ D ,使泛函
2

J ( z ( x, y )) = ∫∫ F ( x, y, z, z x , z y )dxdy
D

取极值且在区域 D 的边界线 l 上取已知值的极值函数 z = z ( x, y ) 必满足方程

Fz −



Fz x − Fz y = 0
∂x
∂y

上式称为奥式方程。
1.2.4 端点变动的情况(横截条件)
设容许曲线 x (t ) 在 t 0 固定,在另一端点 t = t f 时不固定,是沿着给定的曲线

x = ψ (t ) 上变动。于是端点条件表示为
⎧ x (t 0 ) = x 0

⎩ x (t ) = ψ (t )
这里 t 是变动的,不妨用参数形式表示为

t = t f + αdt f

寻找端点变动情况的必要条件,可仿照前面端点固定情况进行推导,即有

0 = δJ = tf ∂
∂α

= ∫ ( Fx − t0 ∫

t f +αdt f

t0

&
&
F (t , x + αδ x, x + αδx )dt α = 0

d
Fx )δxdt + Fxδx t =t + F t =t dt f
&
& f f dt (11)
-223-

再对(11)式做如下分析:
(i)对每一个固定的 t f , x (t ) 都满足欧拉方程,即(11)式右端的第一项积分为
零;
(ii)为考察(11)式的第二、第三项,建立 dt f 与 δx t =t 之间的关系,因为 f x (t f + αdt f ) + αδx(t f + αdt f ) = ψ (t f + αdt f )
对 α 求导并令 α = 0 得
&
& x (t f )dt f + δx t =t = ψ (t f )dt f f 即

&
&
δx t =t = [ψ (t f ) − x (t f )]dt f

(12)

f

把(12)代入(11)并利用 dt f 的任意性,得

& & &
[ F + (ψ − x ) Fx ] t = t f = 0

(13)

(13)式就是确定欧拉方程通解中另一常数的定解条件,称为横截条件。
横截条件有两种常见的特殊情况:
(i)当 x = ψ (t ) 是垂直横轴的直线时, t f 固定, x (t f ) 自由,并称 x (t f ) 为自由
端点。此时(11)式中 dt f = 0 及 δx t =t 的任意性,便得自由端点的横截条件 f Fx
&

t =t f

=0

(14)

(ii)当 x = ψ (t ) 是平行横轴的直线时, t f 自由, x (t f ) 固定,并称 x (t f ) 为平动

&
(13)式的横截条件变为
端点。此时ψ = 0 ,
& &
F − xFx

=0

t =t f

(15)

注意,横截条件与欧拉方程联立才能构成泛函极值的必要条件。
1.3 有约束条件的泛函极值
在最优控制系统中,
常常要涉及到有约束条件泛函的极值问题,
其典型形式是对动
态系统
&
x(t ) = f (t , x (t ), u(t ))
(16)
寻求最优性能指标(目标函数) tf J (u(t )) = ϕ (t f , x (t f )) + ∫ F (t , x (t ), u(t ))dt

(17)

t0

其中 u(t ) 是控制策略, x (t ) 是轨线,t 0 固定,t f 及 x (t f ) 自由, x (t ) ∈ R ,u (t ) ∈ R n m

(不受限,充满 R 空间) f , ϕ , F 连续可微。

m

*

*

下面推导取得目标函数极值的最优控制策略 u (t ) 和最优轨线 x (t ) 的必要条件。
采用拉格朗日乘子法,化条件极值为无条件极值,即考虑
tf

&
J 1 ( x, u, λ ) = ϕ (t f , x (t f )) + ∫ [ F (t , x, u ) + λT (t )( f (t , x, u ) − x )]dt

(18)

t0

的无条件极值,首先定义(16)式和(17)式的哈密顿(Hamilton)函数为

H (t , x, u, λ ) = F (t , x, u ) + λT (t ) f (t , x, u )
将其代入(18)式,得到泛函
-224-

(19)

tf

&
J 1 ( x, u, λ ) = ϕ (t f , x(t f )) + ∫ [ H (t , x, u, λ ) − λT x ]dt

(20)

t0

下面先对其求变分

δJ 1 =


{ϕ (t f + αdt f , x(t f ) + αδx (t f ))
∂α

+∫

t f +αdt f

t0

&
&
[H (t , x + αδx, u + αδu, λ + αδλ ) − ( λ + αδλ ) T ( x + αδx )]dt} α =0

&
= [δx (t f )] ϕ x ( t f ) + ( dt f ) T ϕ t f + ( dt f ) T H (t , x, u, λ ) t = t f − ( dt f ) T ( λT x ) t = t f
T

tf

&
&
+ ∫ [(δx ) T H x + (δu ) T H u + (δλ ) T H λ − (δλ ) T x − λT δx ]dt t0 = ( dt f ) T [ϕ t f + F (t , x, u, t ) t = t f ] + [δx (t f )]T ϕ x ( t f ) tf tf
&
&
+ ∫ [(δx ) T H x + (δu )T H u + (δλ ) T H λ − (δλ ) T x ]dt − λT (t f )δx t =t f + ∫ (δx )T λdt t0 t0

注意到 δx

t =t f

≠ δx ( t f ) , δx

&
= δx (t f ) − x (t f )dt f ,因而

t =t f

δJ 1 = ( dt f ) T [ϕ t + H (t , x, u, λ ) t = t ] + [δx (t f )]T (ϕ x − λ ) t = t f f

f

tf

&
&
+ ∫ [(δx ) T ( H x + λ ) + (δλ ) T ( H λ − x ) + (δu ) T H u ]dt t0 再令 δJ 1 = 0 ,由 dt f , δx (t f ), δx, δu, δλ 的任意性,便得
(i) x , λ 必满足正则方程:
*

*

& x = H λ = f (t , x, u )
&
λ = −H 。

① 状态方程
② 协态方程

x

(ii)哈密顿函数 H (t , x , u, λ ) 作为 u 的函数,也必满足
*

*

Hu = 0
*

并由此方程求得 u 。
(iii)求 x , λ , u 时,必利用边界条件
*

*

*

① x (t0 ) = x 0 ,

*

(用于确定 x )
(用于确定 λ )



λ (t f ) = ϕ x ( t ) ,



ϕ t = − H (t , x, u, λ ) t = t , (确定 t f )

*

f

f

f

1.4 最大(小)值原理
如果受控系统

& x = f (t , x, u ) , x ( t 0 ) = x 0
其控制策略 u(t ) 的全体构成有界集 U ,求 u(t ) ∈ U ,使性能指标 tf J (u(t )) = ϕ (t f , x (t f )) + ∫ F (t , x, u )dt t0 达到最大(小)值。
最大(小)值原理:如果 f (t , x, u ) , ϕ (t f , x (t f )) 和 F (t , x, u ) 都是连续可微的,
-225-

*

*

那么最优控制策略 u (t ) 和相应的最优轨线 x (t ) 由下列的必要条件决定:
(i)最优轨线 x (t ) ,协态向量 λ (t ) 由下列的必要条件决定:
*

*

dx
= f (t , x, u ) , u (t ) ∈ U , dt dλ
∂H
.
=−
dt
∂x
(ii)哈密顿函数

H (t , x * , u, λ* ) = F (t , x * , u ) + λ*T (t ) f (t , x * , u )
*
作为 u (t ) 的函数,最优策略 u (t ) 必须使
H (t , x * , u * , λ* ) = max H (t , x * , u, λ* ) u∈U 或使

H (t , x * , u * , λ* ) = min H (t , x * , u, λ* ) (最小值原理) u∈U (iii)满足相应的边界条件
① 若两端点固定,则正则方程的边界条件为 x ( 0) = x 0 , x ( t f ) = x f 。
② 若始端固定,终端 t f 也固定,而 x (t f ) 自由,则正则方程的边界条件为

x(0) = x0 , λ (t f ) = ϕ x ( t f ) (t f , x (t f )) 。
③ 若始端固定,终端 t f , x (t f ) 都自由,则正则方程的边界条件为

x(0) = x0 , λ (t f ) = ϕ x ( t f ) (t f , x (t f )) ,
H (t f , x (t f ), u (t f ), λ (t f )) + ϕ t f (t f , x (t f )) = 0 。
§2 生产设备的最大经济效益
某工厂购买了一台新设备投入到生产中。
一方面该设备随着运行时间的推移其磨损
程度愈来愈大,
因此其转卖价将随着使用设备的时间增加而减小;
另一方面生产设备总
是要进行日常保养,花费一定的保养费,保养可以减缓设备的磨损程度,提高设备的转
卖价。那么,怎样确定最优保养费和设备转卖时间,才能使这台设备的经济效益最大。
2.1 问题分析与假设
(i)设备的转卖价是时间 t 的函数,记为 x (t ) 。 x (t ) 的大小与设备的磨损程度和
保养费的多少密切相关。记初始转卖价 x (0) = x0 。
(ii)设备随其运行时间的推移,磨损程度越来越大。 t 时刻设备的磨损程度可以
用 t 时刻转卖价的损失值来刻画,常称其为磨损函数或废弃函数,记为 m(t ) 。
(iii)保养设备可以减缓设备的磨损速度,提高转卖价。如果 u(t ) 是单位时间的保
养费, g (t ) 是 t 时刻的保养效益系数(每用一元保养费所增加的转卖价)
,那么单位时
间的保养效益为 g (t )u (t ) 。另外,保养费不能过大(如单位时间保养费超过单位时间产
值时,
保养失去了意义) 只能在有界函数集中选取,

记有界函数集为 W , u(t ) ∈ W 。

(iv)设单位时间的产值与转卖价的比值记为 p ,则 px(t ) 表示在 t 时刻单位时间
的产值,即 t 时刻的生产率。
-226-

(v)转卖价 x (t ) 及单位时间的保养费 u (t ) 都是时间 t 的连续可微函数。为了统一
标准,采用它们的贴现值。对于贴现值的计算,例如转卖价 x (t ) 的贴现值计算,如果
,那么由
它的贴现因子为 δ (经过单位时间的单位费用贴现)

⎧ dx (t1 )
= δx(t1 )

⎨ dt1
⎪ x (t ) = 1

解得

x(t1 ) = e −δ ( t − t1 )
令 t1 = 0 ,便得 t 时刻单位费用的贴现(称贴现系数)为 e

x(t ) 的贴现为 x(t )e px (t )e −δt 。

− δt

− δt

。仿此计算, u(t ) 的贴现为 u (t )e

− δt

,所以设备在 t 时刻转卖价
,单位时间产值的贴现为

(vi)欲确定的转卖时间 t f 和转卖价 x (t f ) 都是自由的。
2.2 模型构造
根据以上的分析与假设可知:
考察的对象是设备在生产中的磨损—保养系统;
转卖
价体现了磨损和保养的综合指标,
可以选作系统的状态变量;
在生产中设备磨损的不可
控性强,其微弱的可控性也是通过保养体现,加之保养本身具有较强的可控性,所以选
单位时间的保养费 u (t ) 作为控制策略。这样,生产设备的最大经济效益模型可以构成
为在设备磨损—保养系统的(转卖价)状态方程

⎧ dx (t )
= − m ( t ) + g ( t )u ( t )

(21)
⎨ dt
⎪ x ( 0) = x 0

*
之下,在满足 0 ≤ u(t ) ≤ U 的函数集 W 中寻求最优控制策略 u (t ) ,使系统的经济效益
这一性能指标

J (u(t )) = x (t f )e

− δt f

tf

+ ∫ [ px (t ) − u (t )]e −δt dt

(22)

0

为最大,其中 t f , x (t f ) 都是自由的。
2.3 模型求解
首先写出问题的哈密顿函数

H = [ px (t ) − u(t )]e −δt + λ[ − m(t ) + g (t )m(t )]
再由协态方程及边界条件求出 λ (t ) ,即由
⎧ dλ ( t )
−δt
⎪ dt = − H x = − pe

⎪ λ ( t f ) = ϕ x ( t ) = e − δt f f ⎩

(23)

解得

p

λ (t ) = (1 − )e δ − δt f

+

p

δ

e −δt

*

下面利用最大值原理求 u (t ) 。先将(23)式改变为
-227-

H = px(t )e −δt − λm(t ) + [λg (t ) − e −δt ]u(t )
显然, H 是对 u 的线性函数,因此得到
⎧U , λg ( t ) − e − δ t > 0 u * (t ) = ⎨ λg ( t ) − e − δ t < 0
⎩0,

(24)




⎪U ,

* u (t ) = ⎨
⎪0,



p −δ t p [(1 − )e f + e −δt ]g (t ) − e −δt > 0

δ

δ

p

[(1 − )e

−δ t f

δ

+

p

δ

(25)

e

− δt

]g (t ) − e

− δt

t s 时, u (t ) = 0 ,状态方程为
*

dx
= −2 dt -228-

(27)

于是 t > t s 时,有 ts dx dt = ∫ [ −2 +
0 dt
0



2

t

(1 + t )

t

1
2

]dt + ∫ ( −2)dt ts 解得
1

x(t ) = 4(1 + t s ) 2 + 96 − 2t
由自由边界条件 H

t =t f

= −ϕ t f 及 λ (t f ) = e

− px (t f )e

− δt f

+ 2e

− δt f

− δt f

(28)

,得

= −δe

− δt f

x (t f )

于是

x (t f ) =

2
= 40 p −δ

当 t = t f 时,由(28)式有
1
2

40 = 4(1 + t s ) + 96 − 2t f

1

t f = 2(1 + t s ) 2 + 28

(29)

将(27)和(29)联立求解,编写如下 Matlab 程序
[x,y]=solve('(1+ts)^(1/2)=4-2*exp(0.05*(ts-tf))','tf=2*(1+ts)^
(1/2)+28')
求得
t s = 10.6 , t f = 34.8
于是,最优控制策略(保养费)为

⎧1, 0 ≤ t < 10.6 u * (t ) = ⎨
⎩0, 10.6 < t ≤ 34.8
习 题 十 八
1. 求自原点(0,0)到直线 x + y − 1 = 0 的最速降线。
2. 求概率密度函数 ϕ ( x ) ,使得信息量
+∞

J = − ∫ ϕ ( x ) ln[νϕ ( x )]dx
−∞

取最大值,且满足等周条件
+∞

+∞

−∞

−∞



ϕ ( x )dx = 1 , ∫ x 2ϕ ( x )dx = σ 2 (常数)


3. 在生产设备或科学仪器中长期运行的零部件,如滚珠、轴承、电器元件等会突
然发生故障或损坏,
即使是及时更换也已经造成了一定的经济损失。
如果在零部件运行
一定时期后,就对尚属正常的零件做预防性更换,以避免一旦发生故障带来的损失,从
经济上看是否更为合算?如果合算,做这种预防性更换的时间如何确定呢?

-229-

第十九章

神经网络模型

§1 神经网络简介
人工神经网络是在现代神经科学的基础上提出和发展起来的,
旨在反映人脑结构及
功能的一种抽象数学模型。自 1943 年美国心理学家 W. McCulloch 和数学家 W. Pitts 提
出形式神经元的抽象数学模型—MP 模型以来,人工神经网络理论技术经过了 50 多年
曲折的发展。特别是 20 世纪 80 年代,人工神经网络的研究取得了重大进展,有关的理
论和方法已经发展成一门界于物理学、
数学、
计算机科学和神经生物学之间的交叉学科。
它在模式识别,图像处理,智能控制,组合优化,金融预测与管理,通信,机器人以及
专家系统等领域得到广泛的应用,提出了 40 多种神经网络模型,其中比较著名的有感
知机,Hopfield 网络,Boltzman 机,自适应共振理论及反向传播网络(BP)等。在这
里我们仅讨论最基本的网络模型及其学习算法。
1.1 人工神经元模型
下图表示出了作为人工神经网络(artificial neural network,以下简称 NN)的基本
单元的神经元模型,它有三个基本要素:

(i)一组连接(对应于生物神经元的突触)
,连接强度由各连接上的权值表示,权
值为正表示激活,为负表示抑制。
(ii)一个求和单元,用于求取各输入信号的加权和(线性组合)

(iii)一个非线性激活函数,起非线性映射作用并将神经元输出幅度限制在一定范
围内(一般限制在 (0,1) 或 (−1,1) 之间)

此外还有一个阈值 θ k (或偏置 bk = −θ k )

以上作用可分别以数学式表达出来: p uk = ∑ wkj x j , v k = u k − θ k , y k = ϕ ( v k ) j =1

式中 x1 , x 2 ,L, x p 为输入信号, wk 1 , wk 2 ,L, wkp 为神经元 k 之权值, uk 为线性组合结
果, θ k 为阈值, ϕ (⋅) 为激活函数, y k 为神经元 k 的输出。
若把输入的维数增加一维,则可把阈值 θ k 包括进去。例如 p vk = ∑ wkj x j , y k = ϕ (uk ) j =0

此处增加了一个新的连接,其输入为 x0 = −1 (或 + 1 )
,权值为 wk 0 = θ k (或 bk )
,如
下图所示。
-230-

激活函数 ϕ (⋅) 可以有以下几种:
(i)阈值函数

⎧1, v ≥ 0
⎩0, v < 0
即阶梯函数。这时相应的输出 yk 为

ϕ (v ) = ⎨

(1)

⎧1, v k ≥ 0 yk = ⎨
⎩0, v k < 0
其中 v k =

p

∑w j =1

kj

x j − θ k ,常称此种神经元为 M − P 模型。

(ii)分段线性函数

v ≥1
⎧1,
⎪1

ϕ ( v ) = ⎨ (1 + v ), − 1 < v < 1
⎪2
v ≤ −1
⎪0,


(2)

它类似于一个放大系数为 1 的非线性放大器,当工作于线性区时它是一个线性组合器,
放大系数趋于无穷大时变成一个阈值单元。
(iii)sigmoid 函数
最常用的函数形式为

ϕ (v ) =

1
1 + exp( −αv )

(3)

参数 α > 0 可控制其斜率。另一种常用的是双曲正切函数

⎛v⎞
⎝2⎠

ϕ ( v ) = tanh ⎜ ⎟ =

1 − exp( −v )
1 + exp( −v )

(4)

这类函数具有平滑和渐近性,并保持单调性。
Matlab 中的激活(传递)函数如下表所示:
函数名
功 能 purelin 线性传递函数
-231-

hardlim hardlims satlin satlins logsig tansig radbas compet 硬限幅传递函数
对称硬限幅传递函数
饱和线性传递函数
对称饱和线性传递函数
对数 S 形传递函数
正切 S 形传递函数
径向基传递函数
竞争层传递函数

各个函数的定义及使用方法,可以参看 Matlab 的帮助(如在 Matlab 命令窗口运行 help tansig,可以看到 tantig 的使用方法,及 tansig 的定义为 ϕ ( v ) =

2
− 1)

1 + e −2 v

1.2 网络结构及工作方式
除单元特性外,网络的拓扑结构也是 NN 的一个重要特性。从连接方式看 NN 主要
有两种。
(i)前馈型网络
各神经元接受前一层的输入,并输出给下一层,没有反馈。结点分为两类,即输入
单元和计算单元,每一计算单元可有任意个输入,但只有一个输出(它可耦合到任意多
个其它结点作为其输入)
。通常前馈网络可分为不同的层,第 i 层的输入只与第 i − 1 层
输出相连,输入和输出结点与外界相连,而其它中间层则称为隐层。
(ii)反馈型网络
所有结点都是计算单元,同时也可接受输入,并向外界输出。
NN 的工作过程主要分为两个阶段:第一个阶段是学习期,此时各计算单元状态不
变,各连线上的权值可通过学习来修改;第二阶段是工作期,此时各连接权固定,计算
单元状态变化,以达到某种稳定状态。
从作用效果看,前馈网络主要是函数映射,可用于模式识别和函数逼近。反馈网络
按对能量函数的极小点的利用来分类有两种:第一类是能量函数的所有极小点都起作
用,这一类主要用作各种联想存储器;第二类只利用全局极小点,它主要用于求解最优
化问题。
§2

蠓虫分类问题与多层前馈网络
2.1 蠓虫分类问题
蠓虫分类问题可概括叙述如下:生物学家试图对两种蠓虫(Af 与 Apf)进行鉴别,
依据的资料是触角和翅膀的长度,已经测得了 9 支 Af 和 6 支 Apf 的数据如下:
Af: (1.24,1.27),(1.36,1.74),(1.38,1.64),(1.38,1.82),(1.38,1.90),(1.40,1.70),
(1.48,1.82),(1.54,1.82),(1.56,2.08).
Apf: (1.14,1.82),(1.18,1.96),(1.20,1.86),(1.26,2.00),(1.28,2.00),(1.30,1.96).
现在的问题是:
(i)根据如上资料,如何制定一种方法,正确地区分两类蠓虫。
(ii)对触角和翼长分别为(1.24,1.80),(1.28,1.84)与(1.40,2.04)的 3 个标本,用所得
到的方法加以识别。
(iii)设 Af 是宝贵的传粉益虫,Apf 是某疾病的载体,是否应该修改分类方法。
如上的问题是有代表性的,它的特点是要求依据已知资料(9 支 Af 的数据和 6 支
Apf 的数据)制定一种分类方法,类别是已经给定的(Af 或 Apf)
。今后,我们将 9 支
-232-

Af 及 6 支 Apf 的数据集合称之为学习样本。
2.2 多层前馈网络
为解决上述问题,考虑一个其结构如下图所示的人工神经网络,

激活函数由

ϕ (v ) =

1
1 + exp( −αv )



来决定。图中最下面单元,即由 所示的一层称为输入层,用以输入已知测量值。在
我们的例子中,
它只需包括两个单元,
一个用以输入触角长度,
一个用以输入翅膀长度。
中间一层称为处理层或隐单元层,单元个数适当选取,对于它的选取方法,有一些文献
进行了讨论,但通过试验来决定,或许是最好的途径。在我们的例子中,取三个就足够
了。最上面一层称为输出层,在我们的例子中只包含二个单元,用以输出与每一组输入
数据相对应的分类信息.
任何一个中间层单元接受所有输入单元传来的信号,
并把处理
后的结果传向每一个输出单元,供输出层再次加工,同层的神经元彼此不相联接,输入
与输出单元之间也没有直接联接。这样,除了神经元的形式定义外,我们又给出了网络
结构。有些文献将这样的网络称为两层前传网络,称为两层的理由是,只有中间层及输
出层的单元才对信号进行处理;
输入层的单元对输入数据没有任何加工,
故不计算在层
数之内。
为了叙述上的方便,此处引人如下记号上的约定:令 s 表示一个确定的已知样品标
号,在蠓虫问题中, s = 1,2,L,15 ,分别表示学习样本中的 15 个样品;当将第 s 个样
品的原始数据输入网络时,相应的输出单元状态记为 Oi (i = 1,2) ,隐单元状态记为 s H s ( j = 1,2,3) ,输入单元取值记为 I ks ( k = 1,2) 。请注意,此处下标 i, j, k 依次对应于 j 输出层、中间层及输入层。在这一约定下,从中间层到输出层的权记为 wij ,从输入层
到中间层的权记为 w jk 。如果 wij , w jk 均已给定,那么,对应于任何一组确定的输入

( I 1s , I 2s ) ,网络中所有单元的取值不难确定。事实上,对样品 s 而言,隐单元 j 的输入

2

h js = ∑ w jk I ks

(5)

k =1

相应的输出状态是
2

H s = ϕ ( h js ) = ϕ ( ∑ w jk I ks ) j (6)

k =1

由此,输出单元 i 所接收到的迭加信号是
-233-

3

3

2

j =1

j =1

k =1

his = ∑ wij H s = ∑ wijϕ ( ∑ w jk I ks ) j (7)

网络的最终输出是
3

3

2

j =1

j =1

k =1

Ois = ϕ ( his ) = ϕ ( ∑ wij H s ) = ϕ ( ∑ wijϕ ( ∑ w jk I ks )) j (8)

这里,
没有考虑阈值,
正如前面已经说明的那样,
这一点是无关紧要的。
还应指出的是,
对于任何一组确定的输入,输出是所有权 {wij , w jk } 的函数。
如果我们能够选定一组适当的权值 {wij , w jk } ,
使得对应于学习样本中任何一组 Af
样品的输入 ( I 1 , I 2 ) ,输出 (O1 , O2 ) = (1,0) ,对应于 Apf 的输入数据,输出为 (0,1) ,
那么蠓虫分类问题实际上就解决了。因为,对于任何一个未知类别的样品,只要将其触
就可能判断其归属。
当然,
角及翅膀长度输入网络,
视其输出模式靠近 (1,0) 亦或 (0,1) ,
有可能出现介于中间无法判断的情况。现在的问题是,如何找到一组适当的权值,实现
上面所设想的网络功能。
2.3 向后传播算法
对于一个多层网络,如何求得一组恰当的权值,使网络具有特定的功能,在很长一
段时间内,曾经是使研究工作者感到困难的一个问题,直到 1985 年,美国加州大学的
一个研究小组提出了所谓向后传播算法(Back-Propagation)
,使问题有了重大进展,这
一算法也是促成人工神经网络研究迅猛发展的一个原因。下面就来介绍这一算法。
如前所述,
我们希望对应于学习样本中 Af 样品的输出是 (1,0) ,
对应于 Apf 的输出 s s

s

s

是 (0,1) ,这样的输出称之为理想输出。实际上要精确地作到这一点是不可能的,只能
希望实际输出尽可能地接近理想输出。为清楚起见,把对应于样品 s 的理想输出记为

{Ti s } ,那么
E (W ) =

1
∑ (Ti s − Ois ) 2
2 i,s

(9)

度量了在一组给定的权下,实际输出与理想输出的差异,由此,寻找一组恰当的权的问
,有
题,自然地归结为求适当 W 的值,使 E (W ) 达到极小的问题。将式(8)代入(9)
3
2
1
(10)
[Ti s − ϕ ( ∑ wijϕ ( ∑ w jk I ks ))]2

2 s ,i j =1 k =1
易知,对每一个变量 wij 或 wij 而言,这是一个连续可微的非线性函数,为了求得其极

E (W ) =

小点与极小值,最为方便的就是使用最速下降法。最速下降法是一种迭代算法,为求出
E (W ) 的(局部)极小,它从一个任取的初始点 W0 出发,计算在 W0 点的负梯度方向
— ∇E (W0 ) ,这是函数在该点下降最快的方向;只要 ∇E (W0 ) ≠ 0 ,就可沿该方向移动
一小段距离,达到一个新的点 W1 = W0 − η∇E (W0 ) , η 是一个参数,只要 η 足够小,
定能保证 E (W1 ) < E (W0 ) 。不断重复这一过程,一定能达到 E 的一个(局部)极小点。
就本质而言,这就是 BP 算法的全部内容,然而,对人工神经网络问题而言,这一算法
的具体形式是非常重要的,下面我们就来给出这一形式表达。
对于隐单元到输出单元的权 wij 而言,最速下降法给出的每一步的修正量是
-234-

Δwij = −η

∂E
= η ∑ [Ti s − Ois ]ϕ ' ( his ) H s = η ∑ δ is H s j j
∂wij
s s (11)

此处令

δ is = ϕ ' ( his )[Ti s − Ois ]

(12)

对输入单元到隐单元的权 w jk

Δw jk = −η

∂E
= η ∑ [Ti s − Ois ]ϕ ' ( his ) wijϕ ' ( h s ) I s j j
∂w jk s,i = η ∑ δ is wijϕ ' ( h s ) I ks =η ∑ δ js I ks j s,i

此处

(13)

s

δ js = ϕ ' (h sj )∑ wijδ is i 从(11)和(13)式可以看出,所有权的修正量都有如下形式,即 s s
Δw pq = η ∑ δ p v q

(14)

s

指标 p 对应于两个单元中输出信号的一端,q 对应于输入信号的一端, 或者代表 H 或 v 者代表 I 。形式上看来,这一修正是“局部”的,可以看作是 Hebb 律的一种表现形式。
还应注意, δ i 由实际输出与理想输出的差及 hi 决定,而 δ j 则需依赖 δ i 算出,因此, s s

s

s

这一算法才称为向后传播算法。稍加分析还可知道,利用由(11)~(13)式所给出的
计算安排,较之不考虑 δ p 的向后传播,直接计算所有含 ϕ ' 的原表达式,极大地降低了 s 计算工作量。这组关系式称作广义 δ − 法则,它们不难推广到一般的多层网络上去。
利用这一迭代算法,最终生成在一定精度内满足要求的 {wij , w jk } 的过程,称为人
工神经网络的学习过程。
可以看出,
这里所提供的学习机制是元与元之间权的不断调整,
学习样本中任何一个样品所提供的信息,
最终将包含在网络的每一个权之中。
参数 η 的
大小则反映了学习效率。
为了更有效地应用 BP 算法,我们做出如下一些补充说明。
(i)在式(11)与(13)中, Δwij , Δw jk 表示为与所有样品 s 有关的求和计算。
实际上,我们还可以每次仅考虑输入一个样品所造成的修正,然后,按照随机选取的顺
序,将所有样品逐个输入,不断重复这一手续,直至收敛到一个满意的解为止。
(ii)
在如上的算法中,
利用实际输出与理想输出差的平方和作为度量 {wij , w jk } 优
劣的标准,这并不是唯一的度量方式,完全可以从其它的函数形式出发,例如从相对熵
出发,导出相应的算法。
(iii)在如上的讨论中使用的是最速下降法,显然,这也不是唯一的选择,其它的
非线性优化方法,诸如共轭梯度法,拟牛顿法等,都可用于计算。为了加速算法的收敛
速度,还可以考虑各种不同的修正方式。
(iv)BP 算法的出现,虽然对人工神经网络的发展起了重大推动作用,但是这一
算法仍有很多问题.对于一个大的网络系统,BP 算法的工作量仍然是十分可观的,这
主要在于算法的收敛速度很慢。更为严重的是,此处所讨论的是非线性函数的优化,那
么它就无法逃脱该类问题的共同困难:BP 算法所求得的解,只能保证是依赖于初值选
取的局部极小点。为克服这一缺陷,可以考虑改进方法,例如模拟退火算法,或从多个
-235-

随机选定的初值点出发,进行多次计算,但这些方法都不可避免地加大了工作量。
2.4 蠓虫分类问题的求解
下面利用上文所叙述的网络结构及方法,对蠓虫分类问题求解。编写 Matlab 程序
如下:
clear p1=[1.24,1.27;1.36,1.74;1.38,1.64;1.38,1.82;1.38,1.90; 1.40,1.70;1.48,1.82;1.54,1.82;1.56,2.08]; p2=[1.14,1.82;1.18,1.96;1.20,1.86;1.26,2.00 1.28,2.00;1.30,1.96]; p=[p1;p2]'; pr=minmax(p); goal=[ones(1,9),zeros(1,6);zeros(1,9),ones(1,6)]; plot(p1(:,1),p1(:,2),'h',p2(:,1),p2(:,2),'o') net=newff(pr,[3,2],{'logsig','logsig'}); net.trainParam.show = 10; net.trainParam.lr = 0.05; net.trainParam.goal = 1e-10; net.trainParam.epochs = 50000; net = train(net,p,goal); x=[1.24 1.80;1.28 1.84;1.40 2.04]'; y0=sim(net,p) y=sim(net,x)
§3

处理蠓虫分类的另一种网络方法
3.1 几个有关概念
在介绍本节主要内容之前,首先说明几个不同的概念。在上一节中,我们把利用
BP 算法确定联接强度,即权值的过程称为“学习过程”
,这种学习的特点是,对任何一
个输入样品,其类别事先是已知的,理想输出也已事先规定,因而从它所产生的实际输
出与理想输出的异同,
我们清楚地知道网络判断正确与否,
故此把这一类学习称为在教
师监督下的学习;与它不同的是,有些情况下学习是无监督的,例如,我们试图把一组
样品按其本身特点分类,
所要划分的类别是事先未知的,
需要网络自身通过学习来决定,
因而,在学习过程中,对每一输入所产生的输出也就无所谓对错,对于这样的情况,显
然 BP 算法是不适用的。
另一个有关概念是所谓有竞争的学习。
在上节所讨论的蠓虫分类网络中,
尽管我们
所希望的理想输出是 (1,0) 或 (0,1) ,但实际输出并不如此,一般而言,两个输出单元均
同时不为 0。与此不同,我们完全可以设想另外一种输出模式:对应任何一组输入,所
有输出单元中,只允许有一个处于激发态,即取值为 1,其它输出单元均被抑制,即取
值为 0。一种形象的说法是,对应任何一组输入,要求所有的输出单元彼此竞争,唯一
的胜利者赢得一切,失败者一无所获,形成这样一种输出机制的网络学习过程,称为有
竞争的学习。
3.2 最简单的无监督有竞争的学习
本节叙述一种无监督有竞争的网络学习方法,
由此产生的网络可用来将一组输入样
品自动划分类别,相似的样品归于同一类别,因而激发同一输出单元,这一分类方式,
是网络自身通过学习,从输入数据的关系中得出的。
蠓虫分类问题对应有教师的网络学习过程,
显然不能由如上的方法来解决。
但在这
种无监督有竞争的学习阐明之后,很容易从中导出一种适用于有监督情况的网络方法;
此外,本节所介绍的网络,在数据压缩等多种领域,都有其重要应用。
-236-

考虑一个仅由输入层与输出层组成的网络系统,
输入单元数目与每一样品的测量值
数目相等,输出单元数目适当选取。每一个输入单元与所有输出单元联接,第 j 个输入
元到第 i 个输出元的权记为 wij ,同层单元间无横向联接。无妨假设所有输入数值均已
规化到 [ −1,1] 之间,又因为是有竞争的学习,输出单元只取 0 或 1 两个值,且对应每一
组输入,只有一个输出元取 1。
*

取 1 的输出元记为 i ,称之为优胜者.对于任何一组输入 s ,规定优胜者是有最大
净输入的输出元,即对输入 I = ( I 1 ,L, I n ) 而言,

hi = ∑ wij I j ≡ Wi ⋅ I

(15)

j

取最大值的单元,其中 Wi 是输出元 i 所有权系数组成的向量,也就是说
如果权向量是按照

∑w

Wi * ⋅ I ≥ Wi ⋅ I , (∀i )

2 ij (16)

= 1 的方式标准化的,
(16)式等价于

j

| Wi * − I |≤| Wi − I | , (∀i )

(17)

即优胜者是其标准化权向量最靠近输入向量的输出元。令 Oi * = 1 ,其余的输出

Oi = 0 。这样的输出规定了输入向量的类别,但为了使这种分类方式有意义,问题化
为如何将学习样本中的所有样品,
自然地划分为聚类,
并对每一聚类找出适当的权向量。
为此,
采用如下的算法:
随机取定一组不大的初始权向量,
注意不使它们有任何对称性。
*

然后,将已知样品按照随机顺序输入网络。对输入样品 s ,按上文所述确定优胜者 i ,
*

对所有与 i 有关的权作如下修正

Δwi * j = η ( I s − wi * j ) j (18)

所有其它输出单元的权保持不变。注意到 Oi * = 1 ,Oi = 0(i ≠ i ) ,所有权的修正公式
*

可统一表示为

Δwi * j = ηOi ( I s − wi * j ) j 这一形式也可视为 Hebb 律的一种表现。
(18)式的几何意义是清楚的,每次修正将优
*

胜者的权向量向输入向量移近一小段距离,这使得同一样品再次输入时, i 有更大的
获胜可能。可以合理地预期,反复重复以上步骤,使得每个输出单元对应了输入向量的
一个聚类,相应的权向量落在了该聚类样品的重心附近。当然,这只是一个极不严密的
说明。
特别应当指出,上述算法,对于事先按照

∑I

j

= 1 标准化了的输入数据更为适用,

整个过程不难由计算机模拟实现。
为了更有效地使用如上算法,
下面对实际计算时可能产生的问题,
作一些简要说明。
首先,如果初始权选择不当,那么可能出现这样的输出单元,它的权远离任何输入
向量,因此,永远不会成为优胜者,相应的权也就永远不会得到修正,这样的单元称之
为死单元。为避免出现死单元,可以有多种方法。一种办法是初始权从学习样本中抽样
选取,这就保证了它们都落在正确范围内;另一种办法是修正上述的学习算法,使得每
一步不仅调整优胜者的权,同时也以一个小得多的 η 值,修正所有其它的权。这样,对
于总是失败的单元,
其权逐渐地朝着平均输入方向运动,
最终也会在某一次竞争中取胜。
此外,还存在有多种处理死单元的方法,感兴趣的读者可从文献中找到更多的方法。
-237-

另外一个问题是这一算法的收敛性。如果式(18)或(19)中反映学习效率的参数 η 取为一个固定常数,那么权向量永远不会真正在某一有限点集上稳定下来。因此,应
当考虑在公式中引进随学习时间而变化的收敛因子。例如,取 η = η (t ) = η 0 t

−a



0 < a ≤ 1 。这一因子的适当选取是极为重要的, η 下降太慢,无疑增加了不必要工作

量, η 下降太快,则会使学习变得无效。
3.3 LVQ 方法
上述有竞争学习的一个最重要应用是数据压缩中的向量量子化方法(Vector
s

Quantization)
。它的基本想法是,把一个给定的输入向量集合 I 分成 M 个类别,然后
用类别指标来代表所有属于该类的向量。
向量分量通常取连续值,
一旦一组适当的类别
确定之后,代替传输或存储输入向量本身,可以只传输或存储它的类别指标。所有的类
别由 M 个所谓“原型向量”来表示,我们可以利用一般的欧氏距离,对每一个输入向
量找到最靠近的原型向量,作为它的类别。显然,这种分类方法可以通过有竞争的学习
直接得到。一旦学习过程结束,所有权向量的集合,便构成了一个“电码本”

一般而言,上述无监督有竞争的学习,实际提供了一种聚类分析方法,对如蠓虫分
类这种有监督的问题并不适用。1989 年,Kohonen 对向量量子化方法加以修改,提出
了 一 种 适 用 于 有 监 督 情 况 的 学 习 方 法 , 称 为 学 习 向 量 量 子 化 ( Learning Vector
Quantization)
,该方法可用于蠓虫分类问题。在有监督的情况下,学习样品的类别是事
先已知的,与此相应,每个输出单元所对应的类别也事先作了规定,但是,代表同一类
别的输出单元可以不止一个。
*

在 LVQ 中,对于任一输入向量,仍按无监督有竞争的方式选出优胜者 i ,但权的
*

修正规则则依输入向量的类别与 i 所代表的是否一致而不同,确切地说,令

Δwi* j

⎧η ( I s − wi* j ) j ⎪
=⎨
s
⎪− η ( I j − wi* j )


一致情况
不一致情况

前一种情况,修正和无监督的学习一致,权朝向样品方向移动一小段距离;后一种
则相反,权向离开样品方向移动,这样就减少了错误分类的机会。
对于上述的蠓虫分类问题,我们编写 Matlab 程序如下: clear p1=[1.24,1.27;1.36,1.74;1.38,1.64;1.38,1.82;1.38,1.90;
1.40,1.70;1.48,1.82;1.54,1.82;1.56,2.08];
p2=[1.14,1.82;1.18,1.96;1.20,1.86;1.26,2.00
1.28,2.00;1.30,1.96];
p=[p1;p2]' pr=minmax(p) goal=[ones(1,9),zeros(1,6);zeros(1,9),ones(1,6)] net = newlvq(pr,4,[0.6,0.4]) net = train(net,p,goal)
Y = sim(net,p) x=[1.24 1.80;1.28 1.84;1.40 2.04]' sim(net,x) 习 题 十 九
1. 利用 BP 算法及 sigmoid 函数,研究以下各函数的逼近问题

-238-

(i) f ( x ) =

1
, 1 ≤ x ≤ 100 x (ii) f ( x ) = sin x,

0≤ x≤

π
2

对每一函数要完成如下工作:
① 获取两组数据,一组作为训练集,一组作为测试集;
② 利用训练集训练一个单隐层的网络;
用测试集检验训练结果,
改变隐层单元数,
研究它对逼近效果的影响。
2. 给定待拟合的曲线形式为

f ( x ) = 0.5 + 0.4 sin(2πx )

在 f (x ) 上等间隔取 11 个点的数据,
在此数据的输出值上加均值为 0,
均方差 σ = 0.05
的正态分布噪声作为给定训练数据,用多项式拟合此函数,分别取多项式的阶次为 1,
3 和 11 阶,图示出拟合结果,并讨论多项式阶次对拟合结果的影响。

-239-

第二十章

偏微分方程的数值解

自然科学与工程技术中种种运动发展过程与平衡现象各自遵守一定的规律。
这些规
律的定量表述一般地呈现为关于含有未知函数及其导数的方程。
我们将只含有未知多元
函数及其偏导数的方程,称之为偏微分方程。
方程中出现的未知函数偏导数的最高阶数称为偏微分方程的阶。
如果方程中对于未
知函数和它的所有偏导数都是线性的,
这样的方程称为线性偏微分方程,
否则称它为非
线性偏微分方程。
初始条件和边界条件称为定解条件,未附加定解条件的偏微分方程称为泛定方程。
对于一个具体的问题,
定解条件与泛定方程总是同时提出。
定解条件与泛定方程作为一
个整体,称为定解问题。
§1

偏微分方程的定解问题
各种物理性质的定常(即不随时间变化)过程,都可用椭圆型方程来描述。其最典
型、最简单的形式是泊松(Poisson)方程

Δu =

∂ 2u ∂ 2u
+
= f ( x, y )
∂x 2 ∂y 2

(1)

特别地,当 f ( x, y ) ≡ 0 时,即为拉普拉斯(Laplace)方程,又称为调和方程

Δu =

∂ 2u ∂ 2u
+
=0
∂x 2 ∂y 2

(2)

带有稳定热源或内部无热源的稳定温度场的温度分布,
不可压缩流体的稳定无旋流动及
静电场的电势等均满足这类方程。
Poisson 方程的第一边值问题为

⎧ ∂ 2u ∂ 2u
⎪ 2 + 2 = f ( x, y )
∂y
⎨ ∂x
⎪u ( x, y ) |
( x , y )∈Γ = ϕ ( x, y )


( x, y ) ∈ Ω

(3)

Γ = ∂Ω

其 中 Ω 为 以 Γ 为 边 界 的 有 界区 域 , Γ 为 分 段 光 滑 曲 线, Ω U Γ 称 为 定 解区 域 , f ( x, y ), ϕ ( x, y ) 分别为 Ω, Γ 上的已知连续函数。
第二类和第三类边界条件可统一表示成

⎛ ∂u

(4)
⎜ + αu ⎟ ( x , y )∈Γ = ϕ ( x, y )
⎝ ∂n

其中 n 为边界 Γ 的外法线方向。当 α = 0 时为第二类边界条件,α ≠ 0 时为第三类边界
条件。
在研究热传导过程,气体扩散现象及电磁场的传播等随时间变化的非定常物理问
题时,常常会遇到抛物型方程。其最简单的形式为一维热传导方程

∂u
∂ 2u
−a 2 =0
∂t
∂x

( a > 0)

方程(5)可以有两种不同类型的定解问题:
初值问题(也称为 Cauchy 问题)

-240-

(5)

⎧ ∂u
∂ 2u
⎪ −a 2 =0
∂x
⎨ ∂t
⎪u( x,0) = ϕ ( x )


t > 0, − ∞ < x < +∞

(6)

− ∞ < x < +∞

初边值问题

⎧ ∂u
∂ 2u
0 < t < T, 0 < x < l
⎪ −a 2 =0
∂x
⎪ ∂t

⎨u ( x,0) = ϕ ( x)
⎪u (0, t ) = g (t ), u (l , t ) = g (t ), 0 ≤ t ≤ T
1
2




(7)

其中 ϕ ( x ), g1 (t ), g 2 (t ) 为已知函数,且满足连接条件

ϕ (0) = g1 (0), ϕ (l ) = g 2 (0)

问题(7)中的边界条件 u (0, t ) = g 1 (t ), u (l , t ) = g 2 (t ) 称为第一类边界条件。第二类和
第三类边界条件为

⎡ ∂u

= g1 (t ), 0 ≤ t ≤ T
⎢ ∂x − λ1 (t )u ⎥

⎦ x =0

(8)

⎡ ∂u

⎢ ∂x + λ 2 (t )u ⎥ = g 2 (t ), 0 ≤ t ≤ T

⎦ x =l
其中 λ1 (t ) ≥ 0, λ 2 (t ) ≥ 0 。当 λ1 (t ) = λ 2 (t ) ≡ 0 时,为第二类边界条件,否则称为第三
类边界条件。
双曲型方程的最简单形式为一阶双曲型方程

∂u
∂u
+a
=0
∂t
∂x

(9)

物理中常见的一维振动与波动问题可用二阶波动方程
2
∂ 2u
2 ∂ u
=a
∂t 2
∂x 2

(10)

描述,它是双曲型方程的典型形式。方程(10)的初值问题为
2
⎧ ∂ 2u
2 ∂ u
⎪ 2 =a
∂x 2
⎪ ∂t

⎨u ( x,0) = ϕ ( x)
⎪ ∂u

= φ ( x)
⎪ ∂t t =0


t > 0, − ∞ < x < +∞
− ∞ < x < +∞

(11)

− ∞ < x < +∞

边界条件一般也有三类,最简单的初边值问题为

-241-

⎧ ∂ 2u
∂ 2u
= a2 2 t > 0, 0 < x < l
⎪ 2
∂t
∂x

∂u

= φ ( x) 0 ≤ x ≤ l
⎨u ( x,0) = ϕ ( x),
∂t t =0

⎪u (0, t ) = g1 (t ), u (l , t ) = g 2 (t ) 0 ≤ t ≤ T


如果偏微分方程定解问题的解存在,唯一且连续依赖于定解数据(即出现在方程
和定解条件中的已知函数)
,则此定解问题是适定的。可以证明,上面所举各种定解问
题都是适定的。
§2

偏微分方程的差分解法
差分方法又称为有限差分方法或网格法,
是求偏微分方程定解问题的数值解中应用
最广泛的方法之一。它的基本思想是:先对求解区域作网格剖分,将自变量的连续变化
区域用有限离散点(网格点)集代替;将问题中出现的连续变量的函数用定义在网格点
上离散变量的函数代替;
通过用网格点上函数的差商代替导数,
将含连续变量的偏微分
方程定解问题化成只含有限个未知数的代数方程组(称为差分格式)
。如果差分格式有
解,
且当网格无限变小时其解收敛于原微分方程定解问题的解,
则差分格式的解就作为
原问题的近似解(数值解)
。因此,用差分方法求偏微分方程定解问题一般需要解决以
下问题:
(i)选取网格;
(ii)对微分方程及定解条件选择差分近似,列出差分格式;
(iii)求解差分格式;
(iv)讨论差分格式解对于微分方程解的收敛性及误差估计。
下面我们只对偏微分方程的差分解法作一简要的介绍。
2.1 椭圆型方程第一边值问题的差分解法
以 Poisson 方程(1)为基本模型讨论第一边值问题的差分方法。
考虑 Poisson 方程的第一边值问题(3)

⎧ ∂ 2u ∂ 2u
⎪ 2 + 2 = f ( x, y )
∂y
⎨ ∂x
⎪u ( x, y ) |
( x , y )∈Γ = ϕ ( x, y )


( x, y ) ∈ Ω
Γ = ∂Ω

取 h, τ 分 别 为 x 方 向 和 y 方 向 的 步 长 , 以 两 族 平 行 线 x = x k = kh, y = y j = jτ

(k , j = 0,±1,±2, L) 将 定 解 区 域 剖 分 成 矩 形 网 格 。 节 点 的 全 体 记 为
R = {( x k , y j ) | x k = kh, y j = jτ , i, j为整数} 。定解区域内部的节点称为内点,记内点
集 R I Ω 为 Ω hτ 。边界 Γ 与网格线的交点称为边界点,边界点全体记为 Γhτ 。与节点

( x k , y j ) 沿 x 方 向 或 y 方 向 只 差 一 个 步 长 的 点 ( x k ±1 , y j ) 和 ( x k , y j ±1 ) 称 为 节 点
( x k , y j ) 的相邻节点。如果一个内点的四个相邻节点均属于 Ω U Γ ,称为正则内点,正
则内点的全体记为 Ω

(1)

,至少有一个相邻节点不属于 Ω U Γ 的内点称为非正则内点,

非正则内点的全体记为 Ω 。我们的问题是要求出问题(3)在全体内点上的数值解。
为简便记,记 (k , j ) = ( x k , y j ), u (k , j ) = u ( x k , y j ), f k , j = f ( x k , y j ) 。对正则内点
( 2)

-242-

(k , j ) ∈ Ω (1) ,由二阶中心差商公式
∂ 2u
∂x 2

∂ u
∂y 2

=
(k , j)

2

=

u (k + 1, j ) − 2u (k , j ) + u (k − 1, j )
+ O(h 2 )
2
h

u (k , j + 1) − 2u (k , j ) + u (k , j − 1)

τ

(k , j)

2

+ O(τ 2 )

Poisson 方程(1)在点 ( k , j ) 处可表示为

u (k + 1, j ) − 2u (k , j ) + u (k − 1, j ) u (k , j + 1) − 2u (k , j ) + u (k , j − 1)
+
τ2 h2 = f k , j + O(h 2 + τ 2 )

(12)

在式(12)中略去 O ( h + τ ) ,即得与方程(1)相近似的差分方程
2

2

u k +1, j − 2u k , j + u k −1, j h 2

+

u k , j +1 − 2u k , j + u k , j −1

τ2

= f k, j

(13)

式(13)中方程的个数等于正则内点的个数,而未知数 u k , j 则除了包含正则内点处
解 u 的近似值,还包含一些非正则内点处 u 的近似值,因而方程个数少于未知数个数。
在非正则内点处 Poisson 方程的差分近似不能按式(13)给出,需要利用边界条件得到。
边界条件的处理可以有各种方案,下面介绍较简单的两种。
(i) 直接转移
(ii) 线性插值
由式(13)所给出的差分格式称为五点菱形格式,实际计算时经常取 h = τ ,此时
五点菱形格式可化为

1
(u k +1, j + u k −1, j + u k , j +1 + u k , j −1 − 4u k , j ) = f k , j h2 (14)

简记为

其中 ◊u k , j = u k +1, j

1
◊u k , j = f k , j h2 + u k −1, j + u k , j +1 + u k , j −1 − 4u k , j 。

(15)

求解差分方程组最常用的方法是同步迭代法,
同步迭代法是最简单的迭代方式。

边界节点外,区域内节点的初始值是任意取定的。
例 1 用五点菱形格式求解 Laplace 方程第一边值问题

⎧ ∂ 2u ∂ 2u
⎪ 2 + 2 =0
∂y
⎨ ∂x
2
2
⎪u ( x, y ) |
( x , y )∈Γ = lg[(1 + x ) + y ]


( x, y ) ∈ Ω
Γ = ∂Ω

1

3
当 h = τ 时,利用点 ( k , j ), ( k ± 1, j − 1), ( k ± 1, j + 1) 构造的差分格式
1
(u k +1, j +1 + u k +1, j −1 + u k −1, j +1 + u k −1, j −1 − 4u k , j ) = f k , j
2h 2

其中 Ω = {( x, y ) | 0 ≤ x, y ≤ 1} 。取 h = τ =

(16)
-243-

称为五点矩形格式,简记为

其中‫ ٱ‬u k , j

1
‫ ٱ‬uk, j = f k, j
2h 2
= u k +1, j +1 + u k +1, j −1 + u k −1, j +1 + u k −1, j −1 − 4u k , j 。

(17)

2.2 抛物型方程的差分解法
以一维热传导方程(5)

∂u
∂ 2u
−a 2 =0
∂t
∂t

(a > 0)

为基本模型讨论适用于抛物型方程定解问题的几种差分格式。
首先对 xt 平面进行网格剖分。分别取 h, τ 为 x 方向与 t 方向的步长,用两族平行直
线 x = x k = kh( k = 0,±1,±2, L) , t = t j = jτ ( j = 0,1,2, L) ,将 xt 平面剖分成矩形网
格,节点为 ( x k , t j )(k = 0,±1,±2, L , j = 0,1,2, L) 。为简便起见,记 ( k , j ) = ( x k , y j ) ,

u (k , j ) = u ( x k , y j ) , ϕ k = ϕ ( x k ) , g1 j = g1 (t j ) , g 2 j = g 2 (t j ) , λ1 j = λ1 (t j ) ,

λ 2 j = λ 2 (t j ) 。
2.2.1

微分方程的差分近似

∂u
∂ 2u
在网格内点 (k , j ) 处,对
分别采用向前、向后及中心差商公式,对 2 采用二
∂t
∂x
阶中心差商公式,一维热传导方程(5)可分别表示为

u (k , j + 1) − u (k , j )

u (k + 1, j ) − 2u (k , j ) + u (k − 1, j )
= O(τ + h 2 )
2
τ h u (k , j ) − u (k , j − 1) u (k + 1, j ) − 2u (k , j ) + u (k − 1, j )
−a
= O(τ + h 2 )
2
τ h u (k , j + 1) − u (k , j − 1) u (k + 1, j ) − 2u (k , j ) + u (k − 1, j )
−a
= O(τ + h 2 )
2
2τ h −a

由此得到一维热传导方程的不同的差分近似

u k , j +1 − u k , j

τ

u k , j − u k , j −1

τ

−a
−a

u k , j +1 − u k , j −1


u k +1, j − 2u k , j + u k −1, j u k +1, j

−a

h2
− 2u k , j + u k −1, j

u k +1, j

=0

=0 h2 − 2u k , j + u k −1, j
=0
h2

2.2.2 初、边值条件的处理
为用差分方程求解定解问题(6)(7)等,还需对定解条件进行离散化。

对初始条件及第一类边界条件,可直接得到
(k = 0,±1,L或k = 0,1, L, n) u k ,0 = u ( x k ,0) = ϕ k

u 0, j = u (0, t j ) = g ij u n , j = u (l , t j ) = g 2 j
-244-

( j = 0,1,L, m − 1)

(18)
(19)
(20)

(21)
(22)

其中 n =

l
T
,m = 。 τ h

对第二、三类边界条件则需用差商近似。下面介绍两种较简单的处理方法。
(i)在左边界 ( x = 0) 处用向前差商近似偏导数
商近似偏导数

∂u
,即
∂x
∂u
u (1, j ) − u (0, j )
=
+ O ( h)
∂x ( 0, j ) h ∂u
∂x

( n, j )

∂u
,在右边界 ( x = l ) 处用向后差
∂x

u (n, j ) − u (n − 1, j )
=
+ O ( h) h ( j = 0,1,L, m)

即得边界条件(8)的差分近似为

⎧ u1, j − u 0, j
− λ1 j u 0, j = g1 j

⎪ h ⎨
⎪ u n , j − u n −1, j + λ u = g
2 j n, j
2j
⎪ h ⎩

( j = 0,1,L, m)

( 0, j )

∂u
,即
∂x u (1, j ) − u (−1, j )
=
+ O(h 2 )
2h

( n, j )

u (n + 1, j ) − u (n − 1, j )
=
+ O(h 2 )
2h

(23)

(ii)用中心差商近似

∂u
∂x
∂u
∂x

( j = 0,1,L, m)

则得边界条件的差分近似为

⎧ u1, j − u −1, j
− λ1 j u 0, j = g1 j


2h

⎪ u n +1, j − u n −1, j + λ u = g
2 j n, j
2j

2h


( j = 0,1,L, m)

(24)

这样处理边界条件,误差的阶数提高了,但式(24)中出现定解区域外的节点 (−1, j ) 和

(n + 1, j ) ,
这就需要将解拓展到定解区域外。
可以通过用内节点上的 u 值插值求出 u −1, j
和 u n +1, j ,也可以假定热传导方程(5)在边界上也成立,将差分方程扩展到边界节点
上,由此消去 u −1, j 和 u n +1, j 。
2.2.3 几种常用的差分格式
下面我们以热传导方程的初边值问题(7)为例给出几种常用的差分格式。
(i) 古典显式格式
为便于计算,令 r =


,式(18)改写成以下形式
h2

-245-

u k , j +1 = ru k +1, j + (1 − 2r )u k , j + ru k −1, j
将式(18)与(21)(22)结合,我们得到求解问题(7)的一种差分格式


⎧u k , j +1 = ru k +1, j + (1 − 2r )u k , j + ru k −1, j

⎨u k ,0 = ϕ k
⎪u = g , u = g
1j
n, j
2j
⎩ 0, j

(k = 1,2, L, n − 1, j = 0,1,L, m − 1)
(k = 1,2,L , n)

(25)

( j = 1,2,L, m)

由于第 0 层 ( j = 0) 上节点处的 u 值已知 (u k , 0 = ϕ k ) ,由式(25)即可算出 u 在第一层

( j = 1) 上节点处的近似值 u k ,1 。重复使用式(25) 可以逐层计算出各层节点的近似值。

(ii)古典隐式格式
将(19)整理并与式(21)(22)联立,得差分格式如下


⎧u k , j +1 = u k , j + r (u k +1, j +1 − 2u k , j +1 + u k −1, j +1 )(k = 1,2, L, n − 1, j = 0,1,L, m − 1)

(k = 0,1, L, n)
(26)
⎨u k ,0 = ϕ k
⎪u = g , u = g
( j = 0,1, L, m)
1j
n, j
2j
⎩ 0, j


。虽然第 0 层上的 u 值仍为已知,但不能由式(30)直接计算以上各层节 h2 点上的值 u k , j ,故差分格式(26)称为古典隐式格式。

其中 r =

(iii)杜福特—弗兰克尔(DoFort—Frankel)格式
DoFort—Frankel 格式是三层显式格式,它是由式(24)与(25)(26)结合得到

的。具体形式如下:

2r
1 − 2r

⎪u k , j +1 = 1 + 2r (u k +1, j + u k −1, j ) + 1 + 2r u k , j −1 (k = 1,2,L , n − 1, j = 1,2,L, m − 1)

(k = 0,1,L, n)
(27)
⎨u k ,0 = ϕ k
⎪u = g , u = g
( j = 0,1,L, m)
1j
n, j
2j
⎪ 0, j

用这种格式求解时,除了第 0 层上的值 u k , 0 由初值条件(21)得到,必须先用二层格式
求出第 1 层上的值 u k ,1 ,然后再按格式(27)逐层计算 u k , j ( j = 2,3, L , m) 。
2.3 双曲型方程的差分解法
对二阶波动方程(10)

∂ 2u
∂ 2u
= a2 2
∂x
∂t 2

∂u
∂u
, v2 =
,则方程(10)可化成一阶线性双曲型方程组
∂t
∂x
⎧ ∂v1
2 ∂v 2
⎪ ∂t = a ∂x


⎪ ∂v 2 = ∂v1
⎪ ∂t
∂x

T
记 v = (v1 , v 2 ) ,则方程组(28)可表成矩阵形式

如果令 v1 =

-246-

(28)

∂v
∂v ⎡0 a 2 ⎤ ∂v
=A
=⎢

∂x
∂t ⎣1 0 ⎦ ∂x
矩阵 A 有两个不同的特征值 λ = ± a ,故存在非奇异矩阵 P ,使得
⎡a 0 ⎤
PAP −1 = ⎢
⎥=Λ
⎣0 − a ⎦

(29)

作变换 w = Pv = ( w1 , w2 ) ,方程组(29)可化成
T

∂w
∂w

∂t
∂x

(30)

方程组(30)由两个独立的一阶双曲型方程联立而成。因此下面主要讨论一阶双曲型方
程的差分解法。
考虑一阶双曲型方程的初值问题

∂u
⎧ ∂u
=0
⎪ +a
∂x
⎨ ∂t
⎪u ( x,0) = ϕ ( x)


t > 0 − ∞ < x < +∞

(31)

− ∞ < x < +∞

与抛物型方程的讨论类似,仍将 xt 平面剖分成矩形网格。取 x 方向步长为 h ,t 方向步
长为 τ ,网格线为 x = x k = kh( k = 0,±1,±2, L), t = t j = jτ ( j = 0,1,2, L) 。为简便起
见,记 ( k , j ) = ( x k , y j ) , u ( k , j ) = u ( x k , y j ) , ϕ k = ϕ ( x k ) 。
以不同的差商近似偏导数,可以得到方程(9)的不同的差分近似

u k , j +1 − u k , j

τ

u k , j +1 − u k , j

τ

u k , j +1 − u k , j

τ

+a

uk, j

h
− u k −1, j

u k +1, j

h
− u k −1, j

−a
−a

u k +1, j − u k , j

2h

=0

(32)

=0

(33)

=0

(34)

结合离散化的初始条件,可以得到几种简单的差分格式。
§3

一维状态空间的偏微分方程的 MATLAB 解法
3.1 工具箱命令介绍
MATLAB 提供了一个指令 pdepe,用以解以下的 PDE 方程式

∂u ∂u

∂u
∂u
)
= x − m ( x m f ( x, t , u , )) + s ( x, t , u, )
(35)
∂x ∂t
∂x
∂x
∂x
其中时间介于 t 0 ≤ t ≤ t f 之间,而位置 x 则介于 [a, b] 有限区域之间。 m 值表示问题的 c ( x, t , u ,

对称性,其可为 0,1 或 2,分别表示平板(slab),圆柱(cylindrical)或球体(spherical)的情
形。因而,如果 m > 0 ,则 a 必等于 b ,也就是说其具有圆柱或球体的对称关系。同时,
式 中 f ( x, t , u , ∂u ∂x) 一 项 为 流 通 量 (flux) , 而 s ( x, t , u , ∂u ∂x ) 为 来 源 (source) 项 。

c( x, t , u , ∂u ∂x) 为偏微分方程的对角线系数矩阵。若某一对角线元素为 0,则表示该偏
微分方程为椭圆型偏微分方程,
若为正值(不为 0),
则为拋物型偏微分方程。
请注意 c 的
对角线元素一定不全为 0。偏微分方程初始值可表示为
-247-

u ( x, t 0 ) = v 0 ( x )

(36)

而边界条件为

p ( x, t , u ) + q ( x, t ) f ( x, t , u , ∂u ∂x) = 0
其中 x 为两端点位置,即 a 或 b

(37)

用以解含上述初始值及边界值条件的偏微分方程的 MATLAB 命令 pdepe 的用法如
下:

sol = pdepe(m, pdepe, icfun, bcfun, xmesh, tspan, options)
其中

m 为问题之对称参数; xmesh 为空间变量 x 的网格点(mesh)位置向量,即 xmesh = [ x0 , x1 ,L , x N ] ,其中

x0 = a (起点), x N = b (终点)。 tspan 为时间变量 t 的向量,即 tspan = [t0 , t1 ,L , t M ] ,其中 t 0 为起始时间,t M 为
终点时间。

pdefun 为使用者提供的 pde 函数文件。其函数格式如下:
[c, f , s ] = pdefun( x, t , u, dudx)
亦即,使用者仅需提供偏微分方程中的系数向量。 c , f 和 s 均为行(column)向量,而
向量 c 即为矩阵 c 的对角线元素。 icfun 提供解 u 的起始值,其格式为 u = icfun(x) 值得注意的是 u 为行向量。 bcfun 使用者提供的边界条件函数,格式如下:
[ pl , ql , pr , ql ] = bcfun(xl , ul , xr , ur , t )
其中 ul 和 ur 分别表示左边界 ( xl = b) 和右边界 ( xr = a ) u 的近似解。输出变量中, pl
和 ql 分别表示左边界 p 和 q 的行向量,而 pr 和 qr 则为右边界 p 和 q 的行向量。 sol 为解答输出。 sol 为多维的输出向量, sol (:,: i ) 为 u i 的输出,即 u i = sol (:,:, i ) 。
元素 u i ( j , k ) = sol ( j , k , i ) 表示在 t = tspan( j ) 和 x = xmesh(k ) 时 u i 之答案。 options 为求解器的相关解法参数。详细说明参见 odeset 的使用方法。
注:
1. MATLAB PDE 求解器 pdepe 的算法,主要是将原来的椭圆型和拋物线型偏微分
方程转化为一组常微分方程。此转换的过程是基于使用者所指定的 mesh 点,以二阶空
间离散化(spatial discretization)技术为之(Keel and Berzins,1990),然后以 ode15s 的指令
求解。采用 ode15s 的 ode 解法,主要是因为在离散化的过程中,椭圆型偏微分方程被
转化为一组代数方程,
而拋物线型的偏微分方程则被转化为一组联立的微分方程。
因而,
原偏微分方程被离散化后,变成一组同时伴有微分方程与代数方程的微分代数方程组,
故以 ode15s 便可顺利求解。
2. x 的取点(mesh)位置对解的精确度影响很大,若 pdepe 求解器给出“…has difficulty finding consistent initial considition”
的讯息时,
使用者可进一步将 mesh 点取密
一点,即增加 mesh 点数。另外,若状态 u 在某些特定点上有较快速的变动时,亦需将
此处的点取密集些,
以增加精确度。
值得注意的是 pdepe 并不会自动做 xmesh 的自动取
点,使用者必须观察解的特性,自行作取点的操作。一般而言,所取的点数至少需大于
3 以上。
3. tspan 的选取主要是基于使用者对那些特定时间的状态有兴趣而选定。而间距
-248-

(step size)的控制由程序自动完成。
4. 若要获得特定位置及时间下的解,可配合以 pdeval 命令。使用格式如下:

[uout , duoutdx] = pdeval (m, xmesh, ui, xout )

其中

m 代表问题的对称性。 m =0 表示平板; m =1 表示圆柱体; m =2 表示球体。其意
义同 pdepe 中的自变量 m 。 xmesh 为使用者在 pdepe 中所指定的输出点位置向量。 xmesh = [ x0 , x1 ,L , xN ] 。

ui 即 sol ( j , :, i ) 。也就是说其为 pdepe 输出中第 i 个输出 ui 在各点位置 xmesh 处,
时间固定为 t j = tspan( j ) 下的解。 xout 为所欲内插输出点位置向量。此为使用者重新指定的位置向量。 uout 为基于所指定位置 xout ,固定时间 t f 下的相对应输出。 duoutdx 为相对应的 du dx 输出值。 ref. Keel,R.D. and M. Berzins,“A Method for the Spatial Discritization of Parabolic
Equations in One Space Variable”
,SIAM J. Sci. and Sat. Comput.,Vol.11,pp.1-32,1990.
以下将以数个例子,详细说明 pdepe 的用法。
3.2 求解一维偏微分方程
例 2 试解以下之偏微分方程式

π2

∂u ∂ 2 u
=
∂t ∂x 2

其中 0 ≤ x ≤ 1 ,且满足以下之条件限制式
(i)起始值条件
IC: u ( x,0) = sin(π x)
(ii)边界条件
BC1: u (0, t ) = 0

∂u (1, t )
=0
∂x
−t
注:本问题的解析解为 u ( x, t ) = e sin(πx)

BC2: πe

−t

+

解 下面将叙述求解的步骤与过程。
当完成以下各步骤后,
可进一步将其汇总为一
主程序 ex20_1.m,然后求解。
步骤 1 将欲求解的偏微分方程改写成如式的标准式。

π2
此即

∂u
∂ ⎛ ∂u ⎞
= x0 ⎜ x0
⎟+0
∂t
∂x ⎝ ∂x ⎠

c( x, t , u, ∂u ∂x ) = π 2
∂u
f ( x, t , u, ∂u ∂x ) =
∂x
s ( x, t , u , ∂u ∂x ) = 0

和m = 0。
步骤 2 编写偏微分方程的系数向量函数。 function [c,f,s]=ex20_1pdefun(x,t,u,dudx)
-249-

c=pi^2; f=dudx; s=0;
步骤 3 编写起始值条件。 function u0=ex20_1ic(x) u0=sin(pi*x); 步骤 4 编写边界条件。在编写之前,先将边界条件改写成标准形式,如式(37)

找出相对应的 p (⋅) 和 q (⋅) 函数,然后写出 MATLAB 的边界条件函数,例如,原边界条

件可写成


(0, t ) = 0 , x = 0
∂x
∂u
−t
(1, t ) = 0 , x = 1
BC2: πe + 1 ⋅
∂x
BC1: u (0, t ) + 0 ⋅



pl = u (0, t ), ql = 0,


pr = π e − t , qr = 1
因而,边界条件函数可编写成
function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t) pl=ul; ql=0; pr=pi*exp(-t); qr=1;
步骤 5 取点。例如 x=linspace(0,1,20); %x 取 20 点 t=linspace(0,2,5); %时间取 5 点输出
步骤 6 利用 pdepe 求解。 m=0; %依步骤 1 之结果 sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t); 步骤 7 显示结果。 u=sol(:,:,1); surf(x,t,u) title('pde 数值解') xlabel('位置') ylabel('时间' ) zlabel('u') 若要显示特定点上的解,可进一步指定 x 或 t 的位置,以便绘图。例如,欲了解时
间为 2(终点)时,各位置下的解,可输入以下指令(利用 pdeval 指令): figure(2); %绘成图 2
M=length(t); %取终点时间的下标 xout=linspace(0,1,100); %输出点位置
[uout,dudx]=pdeval(m,x,u(M,:),xout);
plot(xout,uout); %绘图 title('时间为 2 时,各位置下的解') xlabel('x') ylabel('u')
-250-

综合以上各步骤,可写成一个程序求解例 2。其参考程序如下: function ex20_1
%************************************
%求解一维热传导偏微分方程的一个综合函数程序
%************************************
m=0; x=linspace(0,1,20); %xmesh t=linspace(0,2,20); %tspan
%************
%以 pde 求解
%************
sol=pdepe(m,@ex20_1pdefun,@ex20_1ic,@ex20_1bc,x,t); u=sol(:,:,1); %取出答案
%************
%绘图输出
%************
figure(1) surf(x,t,u) title('pde 数值解') xlabel('位置 x') ylabel('时间 t' ) zlabel('数值解 u')
%*************
%与解析解做比较
%*************
figure(2) surf(x,t,exp(-t)'*sin(pi*x)); title('解析解') xlabel('位置 x') ylabel('时间 t' ) zlabel('数值解 u')
%*****************
%t=tf=2 时各位置之解
%*****************
figure(3)
M=length(t); %取终点时间的下表 xout=linspace(0,1,100); %输出点位置
[uout,dudx]=pdeval(m,x,u(M,:),xout);
plot(xout,uout); %绘图 title('时间为 2 时,各位置下的解') xlabel('x') ylabel('u')
%******************
%pde 函数
%******************
function [c,f,s]=ex20_1pdefun(x,t,u,dudx) c=pi^2; f=dudx; s=0; %******************
-251-

%初始条件函数
%******************
function u0=ex20_1ic(x) u0=sin(pi*x); %******************
%边界条件函数
%****************** function [pl,ql,pr,qr]=ex20_1bc(xl,ul,xr,ur,t) pl=ul; ql=0; pr=pi*exp(-t); qr=1;

例3

试解以下联立的偏微分方程系统

∂u1
∂ 2u
= 0.024 21 − F (u1 − u 2 )
∂t
∂x
∂u 2
∂ 2u2
= 0.170 2 + F (u1 − u 2 )
∂t
∂x
其中 F (u1 − u 2 ) = exp(5.73(u1 − u 2 )) − exp(−11.46(u1 − u 2 )) ,且 0 ≤ x ≤ 1 和 t ≥ 0 。
此联立偏微分方程系统满足以下初边值条件。
(i)初值条件

u1 ( x,0) = 1 u 2 ( x ,0 ) = 0
(ii)边值条件

∂u1
(0, t ) = 0
∂x
u 2 (0, t ) = 0 u1 (1, t ) = 1
∂u 2
(1, t ) = 0
∂x


步骤 1:改写偏微分方程为标准式


⎡1⎤ ∂ ⎡ u1 ⎤ ∂ ⎢0.024
⎢1⎥ * ∂t ⎢u ⎥ = ∂x ⎢
⎣ ⎦•
⎣ 2⎦
⎢0.170


∂u1 ⎤
∂x ⎥ + ⎡− F (u1 − u 2 )⎤
∂u 2 ⎥ ⎢ F (u1 − u 2 ) ⎥

⎥ ⎣
∂x ⎦

因此

⎡1⎤ c=⎢⎥ ⎣1⎦

⎢0.024 f =⎢
⎢0.170

-252-

∂u1 ⎤
∂x ⎥
∂u 2 ⎥

∂x ⎦

⎡− F (u1 − u 2 )⎤ s=⎢ ⎥
⎣ F (u1 − u 2 ) ⎦
和 m = 0 。另外,左边界条件( x = 0 处)。写成
∂u1 ⎤

⎡ 0 ⎤ ⎡1⎤ ⎢ 0.024 ∂x ⎥ ⎡0⎤
⎥=⎢ ⎥
⎢u ⎥ + ⎢0⎥ ∗ ⎢
⎣ 2 ⎦ ⎣ ⎦ • ⎢0.170 ∂u 2 ⎥ ⎣0⎦
∂x ⎦



⎡0⎤
⎡1 ⎤ pl = ⎢ ⎥ , ql = ⎢ ⎥
⎣0 ⎦
⎣u 2 ⎦
同理,右边界条件( x = 1 处)为
∂u1 ⎤

⎡u1 − 1⎤ ⎡0⎤ ⎢ 0.024 ∂x ⎥ ⎡0⎤
⎥=⎢ ⎥
⎢ 0 ⎥ + ⎢1⎥ ∗ ⎢

⎦ ⎣ ⎦ • ⎢0.170 ∂u 2 ⎥ ⎣0⎦
∂x ⎦



⎡u − 1⎤
⎡0 ⎤ pr = ⎢ 1 ⎥ , qr = ⎢ ⎥
⎣ 0 ⎦
⎣1 ⎦
步骤 2:编写偏微分方程的系数向量函数。 function [c,f,s]=ex20_2pdefun(x,t,u,dudx) c=[1 1]'; f=[0.024 0.170]'.*dudx; y=u(1)-u(2); F=exp(5.73*y)-exp(-11.47*y); s=[-F F]';
步骤 3:编写初始条件函数 function u0=ex20_2ic(x) u0=[1 0]';
步骤 4:编写边界条件函数 function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t) pl=[0 ul(2)]'; ql=[1 0]'; pr=[ur(1)-1 0]'; qr=[0 1]';
步骤 5: 取点。
由于此问题的端点均受边界条件的限制,
且时间 t 很小时状态的变动很大(由多次求
解后的经验得知),故在两端点处的点可稍微密集些。同时对于 t 小处亦可取密一些。例
如,
x=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1]; t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
以上几个主要步骤编写完成后,
事实上就可直接完成主程序来求解。
此问题的参考
程序如下: function ex20_2
%***************************************
-253-

%求解一维偏微分方程组的一个综合函数程序
%***************************************
m=0; x=[0 0.005 0.01 0.05 0.1 0.2 0.5 0.7 0.9 0.95 0.99 0.995 1]; t=[0 0.005 0.01 0.05 0.1 0.5 1 1.5 2];
%*************************************
%利用 pdepe 求解
%*************************************
sol=pdepe(m,@ex20_2pdefun,@ex20_2ic,@ex20_2bc,x,t); u1=sol(:,:,1); %第一个状态之数值解输出 u2=sol(:,:,2); %第二个状态之数值解输出
%*************************************
%绘图输出
%*************************************
figure(1) surf(x,t,u1) title('u1 之数值解') xlabel('x') ylabel('t')
%
figure(2) surf(x,t,u2) title('u2 之数值解') xlabel('x') ylabel('t')
%***************************************
%pde 函数
%***************************************
function [c,f,s]=ex20_2pdefun(x,t,u,dudx) c=[1 1]'; f=[0.024 0.170]'.*dudx; y=u(1)-u(2); F=exp(5.73*y)-exp(-11.47*y); s=[-F F]';
%****************************************
%初始条件函数
%****************************************
function u0=ex20_2ic(x) u0=[1 0]';
%****************************************
%边界条件函数
%****************************************
function [pl,ql,pr,qr]=ex20_2bc(xl,ul,xr,ur,t) pl=[0 ul(2)]'; ql=[1 0]'; pr=[ur(1)-1 0]'; qr=[0 1]';

3.3 化工应用实例
例 4 触煤反应装置内温度及转换率的分布
-254-

以外部热交换式的管形固定层触煤反应装置,
进行苯加氢反应产生环己烷。
此反应
系统之质量平衡及热平衡方程式如下:

k ⎛ ∂ 2T 1 ∂T ⎞ rA ρ B (− ΔH r )
∂T
⎟+
+ e ⎜ 2 +
=0
∂L GC p ⎜ ∂r r ∂r ⎟
GC p


∂f De ⎛ ∂ 2 f 1 ∂f ⎞ rA ρ B M ar

⎟+

+
+
=0
∂L u ⎜ ∂r 2 r ∂r ⎟
Gy 0


其中 T 为温度(℃), f 为反应率, L 为轴向距离, r 为径向距离。此系统的边界条件为
L = 0 , T = T0 (r ) , f = f 0 (r )
∂T ∂f r=0 ,
=
=0
∂r ∂r
∂T
r = rw , − k e
= hw (T − Tw )
∂r
∂f r = rw ,
=0
∂r


此外,式中之相关数据及操作条件如下:
(i)反应速率式

3H 2



图1

rA =

环己烷

反应示意图

3
3
kK H K B PH PB
(1 + K H PH + K B PB + K C PC ) 4

其中 P 表示分压(atm),而速率参数为

ln K = − 12100 RT + 32.3 R ln K H = 15500 RT − 31.9 R ln K B = 11200 RT − 23.1 R ln K C = 8900 RT − 19.4 R
上式中,
下标 B, 及 C 分别代表苯,
H
氢及环己烷。 为理想气体常数(1.987cal/mol·K)。
R
(ii)操作条件及物性数据
总压
Pt = 1.25atm
反应管管径
壁温
质量速度
苯对氢之莫耳流量比
反应管入口的苯之莫耳分率
反应气体之平均分子量

rw = 2.5cm
Tw = 100 ℃
G = 631 kg m 2 ⋅ hr m = 30 y 0 = 0.0323
M av = 4.47
-255-

PB = 1200 kg m 3
C P = 1.74 kcal kg − mol
ΔH r = −49250 kcal kg − mol

触煤层密度
流体平均比热
反应热

反应管管长
流速

h0 = 65.8 kcal m 2 ⋅ hr ⋅0 C
T (0) = 125 ℃
L = 45cm u = 8.03 m hr

有效热传导系数

K e = 0.65 kcal m ⋅ hr ⋅0 C

壁境膜传热系数

hw = 112 kcal m 2 ⋅ hr⋅0 C

有效扩散系数

De = 0.755 m 2 hr

整体传热系数
进料温度

题意解析:
因反应速率式 rA 与分压有关,而分压又与反应率 f 有关。故需进一步将 rA 由反应
率 f 表示,方能求解偏微分方程。基于以下的反应方程

3H 2 m 1
-f
1-f

-3f m-3f 图2

f f 反应方程

则各分压与总压之关系为

m−3f
1+ m − 3 f m− f
PB = Pt
1+ m − 3 f f PC = Pt
1+ m − 3 f
PH = Pt

将上式,
连同反应速率式,
带入平衡方程式中,
配合边界条件,
可利用 pdepe 求解。
MATLAB 程序设计
将原方程改写成如式(35)的标准式

⎡1 0 ⎤
⎢0 1 ⎥


因此

-256-

⎡ ke
⎡ ∂T ⎤
⎢r GC
⎢ ∂L ⎥
−1 ∂ p ⎢
⎢ ∂f ⎥ = r
∂r ⎢ De
⎢ ⎥
⎢ r u
⎣ ∂L ⎦


∂T ⎤ ⎡ rA ρ B (− ΔH r ) ⎤


GC p
∂r ⎥ ⎢

⎥+
∂f ⎥ ⎢ rA ρ B M av ⎥

Gy 0
∂r ⎥ ⎢
⎦ ⎣


⎡ rA ρ B (−ΔH r ) ⎤
∂T ⎤
⎡ ke



⎢ GC
GC p
∂r
~ ⎡1⎤ ~ p ⎥ s c = ⎢ ⎥, f = ⎢
⎥ ,~ = ⎢
∂f ⎥
⎢ rA ρ B M av ⎥
⎢ De
⎣1⎦


⎢ u
Gy 0
∂r ⎥




和 m = +1 (圆柱)。另外,左边界条件( r = 0 处)写成
⎡0⎤ ⎡1⎤ ~ ⎡0⎤
⎢0⎥ + ⎢1⎥ * f = ⎢0⎥
⎣ ⎦ ⎣ ⎦•
⎣ ⎦


⎡0 ⎤
⎡1⎤
pl = ⎢ ⎥ , ql = ⎢ ⎥
⎣0 ⎦
⎣1⎦
同理右边界条件( r = rw )可写成
⎡hw (T − Tw )⎤ ⎡+ GC p ⎤ ~ ⎡0⎤

⎥ + ⎢ 1 ⎥ * f = ⎢0 ⎥
0

⎦ ⎣
⎦•
⎣ ⎦


⎡h (T − Tw )⎤
⎡+ GC p ⎤ pr = ⎢ w
⎥ , qr = ⎢ 0 ⎥
0




根据以上的分析,可编写 MATLAB 程序求解此 PDE 问题,其参考程序如下: function ex60_3_1
%******************************
% 触媒反应器内温度及转化率的分布
%******************************
global Pt rw Tw G M y0 Mav rho_B Cp dHr h0 u R ke hw De
%******************************
% 给定数据
%******************************
Pt=1.25; %总压(atm) rw=0.025; %管径(m)
Tw=100+273; %壁温(℃)
G=631; %质量流率(kg/m2hr)
M=30;
y0=0.0323;
Mav=4.47;
rho_B=1200;
Cp=1.74;
dHr=-49250; h0=65.8; T0=125+273;
Lw=1;
u=8.03;
R=1.987;
ke=0.65; hw=112; De=0.755;
%********************
-257-

m=1;
%********************
% 取点
%********************
r=linspace(0,rw,10);
L=linspace(0,Lw,10);
%***********************
% 利用 pdepe 求解
%***********************
sol=pdepe(m,@ex20_3_1pdefun,@ex20_3_1ic,@ex20_3_1bc,r,L);
T=sol(:,:,1); %温度 f=sol(:,:,2); %反应率
%***********************
% 绘图输出
%***********************
figure(1) surf(L,r,T'-273) title('temp') xlabel('L') ylabel('r') zlabel('temp (0C)')
%
figure(2) surf(L,r,f') title('reaction rate') xlabel('L') ylabel('r') zlabel('reaction rate')
%*************************************************
% PDE 函数
%*************************************************
function [c1,f1,s1]=ex20_3_1pdefun(r,L,u1,DuDr) global Pt rw Tw G M y0 Mav rho_B Cp dHr h0 u R ke hw De
T=u1(1);
f=u1(2);
%
k=exp(-12100/(R*T)+32.3/R);
Kh=exp(15500/(R*T)-31.9/R);
Kb=exp(11200/(R*T)-23.1/R);
Kc=exp(8900/(R*T)-19.4/R);
% a=1+M-3*f; ph=Pt*(M-3*f)/a; pb=Pt*(1-f)/a; pc=Pt*f/a;
%
rA=k*Kh^3*Kb*ph^3*pb/(1+Kh*ph+Kb*pb+Kc*pc)^4;
%
c1=[1 1]'; f1=[ke/(G*Cp) De/u]'.*DuDr;
%s1=[ke/(G*Cp*r)*DuDr(1)-rA*rho_B*dHr/(G*Cp)-2*h0*(T-Tw)/(rw)
s1=[-rA*rho_B*dHr/(G*Cp);rA*rho_B*Mav/(G*y0)];
%**********************************
-258-

%初始条件函数
%**********************************
function u0=ex20_3_1ic(x) u0=[125+273 0]';
%**********************************
% 边界条件档
%**********************************
function [pl,ql,pr,qr]=ex20_3_1bc(rl,ul,rr,ur,L) global Pt rw Tw G M y0 Mav rho_B Cp dHr h0 u R ke hw De pl=[0 0]'; ql=[1 1]'; pr=[hw*(ur(1)-Tw) 0]'; qr=[G*Cp 1]';

例 5 扩散系统之浓度分布
参考如图 3 的装置。管中储放静止液体 B,高度为 L=10 ㎝,放置于充满 A 气体的
环境中。假设与 B 液体接触面之浓度为 C A0 = 0.01 mol m ,且此浓度不随时间改变
3

而改变,即在操作时间内( h = 10 天)维持定值。气体 A 在液体 B 中之扩散系数为

D AB = 2 × 10 −9 m 2 s 。试决定以下两种情况下,气体 A 溶于液体 B 中之流通量(flux)。
(a) A 与 B 不发生反应;
(b) A 与 B 发生以下之反应
A + B → C , − rA = kC A
−7

−1

其反应速率常数 k = 2 × 10 s 。
气 体

z

图3

A

液 体

10 cm B

气体 A 在液体 B 中的扩散

题意解析:
(a) 因气体 A 与液体 B 不发生反应,故其扩散现象的质量平衡方程如下:

∂ 2C A
∂C A
= D AB
∂t
∂z 2
依题意,其初始及边界条件为
C A ( z ,0 ) = 0 , z > 0
I.C.
B.C.

C A (0, t ) = C A0 , t ≥ 0 ;

∂C A
∂z

= 0,t ≥ 0 z=L (b) 在气体 A 与液体 B 会发生一次反应的情况下,其质量平衡方程需改写为

∂ 2C A
∂C A
= D AB
+ kC A
∂t
∂z 2
而起始及边界条件同上。
-259-

在获得浓度分布后,即可以 Fick’s law

N Az (t ) = − D AB

∂C A
∂z

z =0

计算流通量。
MATLAB 程序设计:
此问题依旧可以利用 pdepe 迅速求解。现就各状况的处理过程简述如下。
(a)与标准式(35)比较,可得 C = 1 , f = D AB ∂C A ∂z , s = 0 ,和 m = 0 。另
外,经与式(37)比较后得知,左边界及右边界条件之系数分别为
左边界( z = 0 ): pl = C A (0, t ) − C A0 , ql = 0 。

1

D AB
(b)与标准式(35)比较,可得 m = 0 , C = 1 , f = D AB ∂C A ∂z ,和 s = kC A 。
右边界( z = L ): pr = 0 , qr =

而边界条件之系数同(a)之结果。
利用以上的处理结果,可编写 MATLAB 参考程序如下: function ex20_3_2
%*****************************
% 扩散系统之浓度分布
%*****************************
clear clc global DAB k CA0
%******************************
% 给定数据
%******************************
CA0=0.01;
L=0.1;
DAB=2e-9; k=2e-7; h=10*24*3600;
%*******************************
% 取点
%*******************************
t=linspace(0,h,100); z=linspace(0,L,10); %*******************************
% case (a)
%*******************************
m=0; sol=pdepe(m,@ex20_3_2pdefuna,@ex20_3_2ic,@ex20_3_2bc,z,t); CA=sol(:,:,1); for i=1:length(t)
[CA_i,dCAdz_i]=pdeval(m,z,CA(i,:),0);
NAz(i)=-dCAdz_i*DAB; end figure(1) subplot(211) surf(z,t/(24*3600),CA) title('case (a)')
-260-

xlabel('length (m)') ylabel('time (day)') zlabel('conc. (mol/m^3)') subplot(212) plot(t/(24*3600),NAz'*24*3600) xlabel('time (day)') ylabel('flux (mol/m^2.day)')
%************************************
% case (b)
%************************************
m=0; sol=pdepe(m,@ex20_3_2pdefunb,@ex20_3_2ic,@ex20_3_2bc,z,t); CA=sol(:,:,1); for i=1:length(t)
[CA_i,dCAdz_i]=pdeval(m,z,CA(i,:),0);
NAz(i)=-dCAdz_i*DAB; end % figure(2) subplot(211) surf(z,t/(24*3600),CA) title('case (b)') xlabel('length (m)') ylabel('time (day)') zlabel('conc. (mol/m^3)') subplot(212) plot(t/(24*3600),NAz'*24*3600) xlabel('time (day)') ylabel('flux (mol/m^2.day)')
%********************************************
% PDE 函数
%********************************************
% case (a)
%********************************************
function [c,f,s]=ex20_3_2pdefuna(z,t,CA,dCAdz) global DAB k CA0 c=1; f=DAB*dCAdz; s=0; %*********************************************
% case (a)
%*********************************************
function [c,f,s]=ex20_3_2pdefunb(z,t,CA,dCAdz) global DAB k CA0 c=1; f=DAB*dCAdz; s=k*CA; %**********************************************
% 初始条件函数
%**********************************************
function CA_i=ex20_3_2ic(z)
CA_i=0;
%************************************************
-261-

% 边界条件函数
%************************************************
function [pl,ql,pr,qr]=ex20_3_2bc(zl,CAl,zr,CAr,t) global DAB k CA0 pl=CAl-CA0; ql=0; pr=0; qr=1/DAB;

二维状态空间的偏微分方程的 MATLAB 解法
MATLAB 中的偏微分方程(PDE)工具箱是用有限元法寻求典型偏微分方程的数
值近似解,
该工具箱求解偏微分方程具体步骤与用有限元方法求解偏微分方程的过程是
一致的,包括几个步骤,即几何描述、边界条件描述、偏微分方程类型选择、有限元划
分计算网格、初始化条件输入,最后给出偏微分方程的数值解(包括画图)

下面我们讨论的方程是定义在平面上的有界区域 Ω 上,区域的边界记作 ∂Ω 。
4.1 方程类型
MATLAB 工具箱可以解决下列类型的偏微分方程:
(i)椭圆型偏微分方程

§4

− ∇ ⋅ ( c∇u ) + au = f in Ω
其中 c, a , f 和未知的 u 可以是 Ω 上的复值函数。
(ii)抛物型偏微分方程

∂u
− ∇ ⋅ ( c∇u ) + au = f
∂t
其中 c, a , f , d 可以依赖于时间 t 。 d in Ω

(iii)双曲型偏微分方程

d

∂ 2u
− ∇ ⋅ ( c∇u ) + au = f
∂t 2

in Ω

(iv)特征值问题

− ∇ ⋅ ( c∇u ) + au = λdu in Ω

其中 λ 是未知的特征值, d 是 Ω 上的复值函数。
(v)非线性椭圆偏微分方程

− ∇ ⋅ ( c(u )∇u ) + a (u )u = f (u ) in Ω
其中 c, a , f 可以是 u 的函数。
(vi)方程组

⎧− ∇ ⋅ (c11∇u1 ) − ∇ ⋅ (c12 ∇u 2 ) + a11u1 + a12 u 2 = f 1

⎩− ∇ ⋅ (c 21∇u1 ) − ∇ ⋅ (c 22 ∇u 2 ) + a 21u1 + a 22 u 2 = f 2
4.2 边界条件
边界条件有如下三种:
(i)Dirichlet 条件: hu = r on ∂Ω 。 r (ii)Neumann 条件: n ⋅ ( c∇u ) + qu = g on

∂Ω 。 r 这里 n 为区域的单位外法线, h, r, q, g 是定义在 ∂Ω 上的复值函数。
对于二维方程组情形,Dirichlet 边界条件为 h11u1 + h12 u2 = r1 ,
-262-

h21u1 + h22 u2 = r2 ;
Neumann 边界条件为:

r r n ⋅ ( c11∇u1 ) + n ⋅ ( c12 ∇u2 ) + q11u1 + q12 u2 = g1 r r n ⋅ ( c21∇u1 ) + n ⋅ ( c22 ∇u2 ) + q21u1 + q22 u2 = g 2

(iii)对于偏微分方程组,混合边界条件为

h11u1 + h12 u2 = r1 r r n ⋅ ( c11∇u1 ) + n ⋅ ( c12 ∇u2 ) + q11u1 + q12 u2 = g1 + μh11 r r n ⋅ ( c21∇u1 ) + n ⋅ ( c22 ∇u2 ) + q21u1 + q22 u2 = g 2 + μh12

这里 μ 的计算是使得满足 Dirichlet 边界条件。
4.3 求解偏微分方程
例 6 求解泊松方程

− ∇2u = 1 ,

求解区域为单位圆盘,边界条件为在圆盘边界上 u = 0 。
解 它的精确解为

u ( x, y ) =

1 − x2 − y2
4

下面求它的数值解,编写程序如下:
%(1)问题定义
g='circleg';
%单位圆
b='circleb1';
%边界上为零条件
c=1;a=0;f=1;
%(2)产生初始的三角形网格
[p,e,t]=initmesh(g);
%(3)迭代直至得到误差允许范围内的合格解
error=[]; err=1; while err > 0.01,
[p,e,t]=refinemesh(g,p,e,t);
u=assempde(b,p,e,t,c,a,f); %求得数值解 exact=(1-p(1,:).^2-p(2,:).^2)/4; err=norm(u-exact',inf); error=[error err]; end %结果显示 subplot(2,2,1),pdemesh(p,e,t); subplot(2,2,2),pdesurf(p,t,u) subplot(2,2,3),pdesurf(p,t,u-exact') 例7

考虑最小表面问题

− ∇⋅(

1
1+ | ∇u |

2

∇u ) = 0



Ω = {( x, y ) | x 2 + y 2 ≤ 1} ,

在圆盘边界上 u = x 。
2



这是椭圆型方程,其中 c =

1
1+ | ∇u |2

, a = 0, f = 0 ,编写程序如下:
-263-

g='circleg'; b='circleb2'; c='1./sqrt(1+ux.^2+uy.^2)'; rtol=1e-3; [p,e,t]=initmesh(g);
[p,e,t]=refinemesh(g,p,e,t);
u=pdenonlin(b,p,e,t,c,0,0,'Tol',rtol); pdesurf(p,t,u) 例8

求解正方形区域 {( x, y ) | −1 ≤ x, y ≤ 1} 上的热传导方程

∂u
= Δu
∂t
⎧1, x 2 + y 2 < 0.4 2
初始条件为 u (0) = ⎨
⎩0, 其它
边界条件为Dirichlet条件 u = 0 。
解 这里是抛物型方程,其中 c = 1, a = 0, f = 0, d = 1 。编写程序如下:
%(1)问题定义
g='squareg';
%定义正方形区域
b='squareb1';
%边界上为零条件
c=1;a=0;f=0;d=1;
%(2)产生初始的三角形网格
[p,e,t]=initmesh(g);
%(3)定义初始条件
u0=zeros(size(p,2),1);
ix=find(sqrt(p(1,:).^2+p(2,:).^2)

Similar Documents

Free Essay

Forecasting Models

...MATLAB® Getting Started Guide R2011b How to Contact MathWorks Web Newsgroup www.mathworks.com/contact_TS.html Technical Support www.mathworks.com comp.soft-sys.matlab suggest@mathworks.com bugs@mathworks.com doc@mathworks.com service@mathworks.com info@mathworks.com Product enhancement suggestions Bug reports Documentation error reports Order status, license renewals, passcodes Sales, pricing, and general information 508-647-7000 (Phone) 508-647-7001 (Fax) The MathWorks, Inc. 3 Apple Hill Drive Natick, MA 01760-2098 For contact information about worldwide offices, see the MathWorks Web site. MATLAB® Getting Started Guide © COPYRIGHT 1984–2011 by The MathWorks, Inc. The software described in this document is furnished under a license agreement. The software may be used or copied only under the terms of the license agreement. No part of this manual may be photocopied or reproduced in any form without prior written consent from The MathWorks, Inc. FEDERAL ACQUISITION: This provision applies to all acquisitions of the Program and Documentation by, for, or through the federal government of the United States. By accepting delivery of the Program or Documentation, the government hereby agrees that this software or documentation qualifies as commercial computer software or commercial computer software documentation as such terms are used or defined in FAR 12.212, DFARS Part 227.72, and DFARS 252.227-7014. Accordingly, the terms and conditions of this Agreement and only those rights...

Words: 36443 - Pages: 146

Free Essay

Human Step Detection and Counting with a Microphone (June 2015)

...alternative use of sensors for detecting human movements such as footsteps and that is done for various reasons such as security or just for lightning a lamp automatically. We developed a Simulink model in Matlab to simulate a system that analyses the footsteps of three 25 years old men. Those men had different heights and weights. The data were recorded and analyzed using filtering and conditioning blocks of Matlab. The System collected 3 sets of steps. The first set had 5 steps with 5 detections. The second set had 8 steps with 3 detection and the third set had 4 steps with 1 detections. In total, there were 17 steps where 9 steps were detected. I. C. Procedure During the first part of the experiment, the footsteps were recorded on the main corridor of the first floor of the house 21, located in the University of Kristianstad. We also recorded the steps at our respective houses. The experiment was carried on a floor without carpet to allow a better collection of the data. This procedure was repeated several times, until satisfactory data without much noisy could be acquired. INTRODUCTION T HE objective of this work was to detect the steps of a person using a microphone array embedded in our computer together with the Simulink library of Matlab. We have some background of the idea after reading a few articles regarding this type of experiments. Fig. 1. Simulink models used to record the steps In the articles we read, the experiment...

Words: 1833 - Pages: 8

Free Essay

Matlab

...matlab Probleme teoretice ale programării în MATLAB 1. Tipul de dată numeric. 2. Tipul de dată logic. 3. Tipul de dată caracter, şir de caractere. 4. Tipul de dată data şi ora. 5. Tipul de dată structură. 6. Tipul de dată celulă. 7. Expresii numerice şi logice în MATLAB. 8. Variabile în MATLAB. Definiţie şi tipuri de variabile. 9. Crearea variabilelor şi reguli de declarare a lor. 10. Cuvinte cheie. 11. operatori şi reguli de precedenţă. 12. Constante speciale în MATLAB. 13. Matrici, vectori, scalari. Funcţia size. Crearea cu operatorul []. 14. Crearea matricelor cu funcţii speciale. 15. Concatenarea matricelor. 16. Crearea matricelor cu blocuri pe diagonală 17. Accesarea directă şi liniară a matricelor. 18. Accesarea multiplă (cu operatorul :). 19. Accesarea logic indexată. 20. Funcţii de matrici şi funcţii de manipulare a matricelor. 21. Comanda de atribuire. Comenzi de întrerupere a execuţiei buclelor. 22. Comenzi de execuţie condiţionată. 23. Comenzi de execuţie a ciclurilor. 24. M-programe (M-scripturi şi M-funcţii) 25. Erori. Exportul şi importul datelor. Listarea pe ecran. 26. Depanarea M-programelor. 27. Utilizarea eficientă a memoriei. 28. Analiza timpului de execuţie şi principalele tehnici de reducere a timpului de execuţie. 29. Modelarea cu blocuri şi conexiuni în Simulink 30. Cele mai utilizate blocuri din biblioteca de blocuri Simulink. 1. Să se scrie...

Words: 1953 - Pages: 8

Premium Essay

Matlab

...C1: MATLAB Codes t1=[37.79 39.51 38.54 39.14 39.02 39.4 39.01 37.18] t2=[22.4 22.07 22.15 21.72 21.75 22.55 22.18 21.92] T1=mean(t1) T2=mean(t2) V1=var(t1) V2=var(t2) S1=sqrt(V1) S2=sqrt(V2) MATLAB Answers T1=38.6988 T2=22.0925 V1=0.6718 V2=0.0859 S1=0.8196 S2=0.2931 C2: MATLAB Codes beta=0.98 alpha=1-0.98 z=icdf ('norm', alpha/2, 0, 1) hatmu=mean(t1); hatmu=mean(t2) s=std(t1); s=std(t2) n=length (t1); n=length (t2) margin=z*s/sqrt(8) MATLAB Answers alpha=0.02 z=2.3263 margin(t1)=0.6741; margin(t2)=0.2931 C3: MATLAB Codes syms l s b T1 T2 l=0.0496; s=1.00; b=10; T1=0.0386988; T2=0.0220925; g=((l^2)/(2*s*sind(b)))*((1/T2^2)-(1/T1^2)) MATLAB Answers g=9.7835 C4: MATLAB Codes for Partial Derivatives g=((l^2)/(2*s*sin(b)))*((1/T2^2)-(1/T1^2)) gl=diff(g,l) gs=diff(g,s) gb=diff(g,b) gT1=diff(g,T1) gT2=diff(g,T2) MATLAB Answers for Partial Derivatives gl=-(l*(1/T1^2 - 1/T2^2))/(s*sin(b)) gs=(l^2*(1/T1^2 - 1/T2^2))/(2*s^2*sin(b)) gb=(l^2*cos(b)*(1/T1^2 - 1/T2^2))/(2*s*sin(b)^2) gT1=l^2/(T1^3*s*sin(b)) gT2=-l^2/(T2^3*s*sin(b)) MATLAB Codes for Partial Derivative Values gl0=subs(gl,[l s b T1 T2],[l0 s0 b0 T10 T20]) gs0=subs(gs,[l s b T1 T2],[l0 s0 b0 T10 T20]) gb0=subs(gb,[l s b T1 T2],[l0 s0 b0 T10 T20]) gT10=subs(gT1,[l s b T1 T2],[l0 s0 b0 T10 T20]) gT20=subs(gT2,[l s b T1 T2],[l0 s0 b0 T10 T20]) MATLAB Answers for Partial Derivative Values gl0= -125.9202 gs0=...

Words: 455 - Pages: 2

Free Essay

Matlab

...An Introduction to Matlab for Econometrics John C. Frain TEP Working Paper No. 0110 February 2010 Trinity Economics Papers Department of Economics Trinity College Dublin An Introduction to MATLAB for Econometrics John C. Frain. February 2010 ∗ Abstract This paper is an introduction to MATLAB for econometrics. It describes the MATLAB Desktop, contains a sample MATLAB session showing elementary MATLAB operations, gives details of data input/output, decision and loop structures, elementary plots, describes the LeSage econometrics toolbox and maximum likelihood using the LeSage toolbox. Various worked examples of the use of MATLAB in econometrics are also given. After reading this document the reader should be able to make better use of the MATLAB on-line help and manuals. Contents 1 Introduction 1.1 1.2 Preliminaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . The MATLAB Desktop . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 ∗ Comments 4 4 6 6 7 8 8 9 9 9 The Command Window . . . . . . . . . . . . . . . . . . . . . . . . The Command History Window . . . . . . . . . . . . . . . . . . . The Start Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . The Edit Debug window . . . . . . . . . . . . . . . . . . . . . . . . The Figure Windows . . . . . . . . . . . . . . . . . . . . . . . . . . The Workspace Browser . . . . . . . . . . . . . . . . . . . . . . . . The...

Words: 15376 - Pages: 62

Free Essay

Matlab

...Memulai Menggunakan Matlab Matlab merupakan bahasa canggih untuk komputansi teknik. Matlab merupakan integrasi dari komputansi, visualisasi dan pemograman dalam suatu lingkungan yang mudah digunakan, karena permasalahan dan pemecahannya dinyatakan dalam notasi matematika biasa. Kegunaan Matlab secara umum adalah untuk : • • • • • Matematika dan Komputansi Pengembangan dan Algoritma Pemodelan,simulasi dan pembuatan prototype Analisa Data,eksplorasi dan visualisasi Pembuatan apilikasi termasuk pembuatan graphical user interface Matlab adalah sistem interaktif dengan elemen dasar array yang merupakan basis datanya. Array tersebut tidak perlu dinyatakan khusus seperti di bahasa pemograman yang ada sekarang. Hal ini memungkinkan anda untuk memecahkan banyak masalah perhitungan teknik, khususnya yang melibatkan matriks dan vektor dengan waktu yang lebih singkat dari waktu yang dibutuhkan untuk menulis program dalam bahasa C atau Fortran. Untuk memahami matlab, terlebih dahulu anda harus sudah paham mengenai matematika terutama operasi vektor dan matriks, karena operasi matriks merupakan inti utama dari matlab. Pada intinya matlab merupakan sekumpulan fungsi-fungsi yang dapat dipanggil dan dieksekusi. Fungsi-fungsi tersebut dibagi-bagi berdasarkan kegunaannya Kuliah Berseri IlmuKomputer.Com Copyright © 2004 IlmuKomputer.Com yang dikelompokan didalam toolbox yang ada pada matlab. Untuk mengetahui lebih jauh mengenai toolbox yang ada di matlab dan fungsinya...

Words: 2781 - Pages: 12

Free Essay

Matlab

...PARTH  PATTNI     BIOENGINEERING-­‐MATLAB  ASSIGNEMENT   a) figure subplot(2,1,1) plot(ecg_emg) ylabel('Voltage,V/mV') xlabel('Time,t/ms') title('ECG which is contaminated with EMG signals from the diaphragm') axis([0 3000 -1 2]) subplot(2,1,2) plot(ecg50hz) xlabel('Time,t/ms') ylabel('Voltage,V/mV') title('ECG containing mains contamination') axis([0 3000 -1 2]) PARTH  PATTNI     BIOENGINEERING-­‐MATLAB  ASSIGNEMENT   b & c) figure subplot(2,1,1) length=5; for x=1:3000-length+1; zecg_emg(x)=(ecg_emg(x)+ecg_emg(x+1)+ecg_emg(x+2)+ecg_emg(x+3)+ ecg_emg(x+4))/5; end plot(ecg_emg) ylabel('Voltage,V/mV') xlabel('Time,t/ms') title('ECG which is contaminated with EMG signals from the diaphragm') axis([0 3000 -1 2]) subplot(2,1,2) length=5; for x=1:3000-length+1; zecg50hz(x)=(ecg50hz(x)+ecg50hz(x+1)+ecg50hz(x+2)+ecg50hz(x+3)+ecg 50hz(x+4))/5; end plot(ecg50hz) xlabel('Time,t/ms') ylabel('Voltage,V/mV') title('ECG containing mains contamination') PARTH  PATTNI     BIOENGINEERING-­‐MATLAB  ASSIGNEMENT   axis([0 3000 -1 2]) d) figure subplot(2,1,1) length=3; for x=1:3000-length+1; zecg_emg(x)=(ecg_emg(x)+ecg_emg(x+1)+ecg_emg(x+2))/3; end plot(zecg_emg) ylabel('Voltage,V/mV') xlabel('Time,t/ms') title('ECG which is contaminated with EMG signals from the diaphragm') PARTH  PATTNI     BIOENGINEERING-­‐MATLAB  ASSIGNEMENT   axis([0 3000 -1 2]) subplot(2...

Words: 645 - Pages: 3

Free Essay

Matlab

...Lab 2: Linear Time-Invariant Systems In this experiment, you will study the output response of linear time-invariant (LTI) systems using MATLAB, and learn how to use MATLAB to implement the convolution sum. You will also investigate the properties of LTI systems. The objective of this experiment is: (1) to study how to compute the output of LTI systems, and (2) to study the properties of discrete-time LTI systems. 1. Introduction to Linear Time-Invariant (LTI) Systems In discrete time, linearity provides the ability to completely characterize a system in terms of its response [pic] to a signal of the form [pic] for all [pic]. If a linear system is also time-invariant, then the responses [pic] will become [pic]. The combination of linearity and time-invariance therefore allows a system to be completely described by its impulse response [pic]. The output of the system [pic] is related to the input [pic] through the convolution sum as follows: [pic] Similarly, the output [pic] of a continuous-time LTI system is related to the input [pic] and the impulse response [pic] through the following convolution integral: [pic] The convolution of discrete-time sequences [pic] and [pic] represented mathematically by the expression given in [pic] can be viewed pictorially as the operation of flipping the time axis of the sequence [pic] and shifting it by [pic] samples, then multiplying [pic] by[pic] and summing the resulting product sequence...

Words: 1592 - Pages: 7

Free Essay

Matlab

...Matlab Assignment 7 Make the Matalb assignment discussed in the last class (least square regression estimates). Make sure that you program a function with proper comments and at least one test for sound input. Test your function with some input vectors, for example: y=[1,2,4,23,4,6,3,2] and x=[5,4,3,2,6,5,4,3] You can take any other input vectors. m.file command: function [alpha_estimate, beta_estimate] = my_regression(y,x) n = length(x) a = sum(x); b = sum(y); c = sum(x)/n; d = sum(y)/n; e = sum(x.*y); f = sum(x.*x); alpha_estimate = d-(e-n*c*d)/(f-n*c^2)*c; beta_estimate = (e-n*c*d)/(f-n*c^2); disp('alpha =') disp(alpha_estimate) disp('beta =') disp(beta_estimate) % Purpose of the function: This function is used to calculate the % coefficients of the regression formula. % Input: value of y and x % Output: alpha_estimate and beta_estimate % How to run the function: % I use n to represent the length of vector x and y % a to represent the sum of vector x % b to represent the sum of vector y % c to represent the avergae of vector x % d to represent the average of vector y % e to represent the sum of vector x and y % f to represent the sum of square of vector x %then calculating: alpha_estimate = d-(e-n*c*d)/(f-n*c^2)*c; % beta_estimate = (e-n*c*d)/(f-n*c^2); % Author: Hengya Jin % Date of last change: 11/27/2013 end Check: >> y=[1,2,4,23,4...

Words: 298 - Pages: 2

Premium Essay

Matlab Ode

...MATLAB 數值微積分與微分方程式求解 數值積分 ∫ b a f ( x) dx 等於由界限範圍 x = a 到 x = b 之間 曲線 f(x) 底下的面積 (a) 矩形以及 (b) 梯形 數值積分的圖解說明 數值積分 已知數據點的積分, 已知數據點的積分,不知函數 f(x):trapz : I = trapz(x, y) (梯形積分法 梯形積分法) 梯形積分法 x : 數據點之 x 值所構成的向量 y : 數據點之 f(x) 值所構成的向量 Ex: >>x=[0 10 20 30 40]; >>y=[0.5 0.7 0.9 0.6 0.4]; >>area=trapz(x,y) %梯形法 梯形法 area = 26.5000 數值積分 之形式: 已知函數 f(x) 之形式:quad , quadl I = quad(@fun, a, b) I = quadl(@fun, a, b) (適應性辛普森法) (羅伯特二次式) fun:定義函數的 function m-file 檔名 a :積分下限 b :積分上限 數值積分 Ex: ∫ 1 0 e − x cos( x) dx 1. edit fun.m function y=fun(x) y=exp(-x).*cos(x); 2. 求積分 回到Matlab Command Window) 求積分(回到 area=quadl(@fun,0,1) 亦可使用 area=quadl(‘exp(-x).*cos(x)’,0,1) NOTE: 函數內之數學運算必須使用向量個別元素之運算 (.* ./ .^) (註:比較此結果與利用trapz指令計算之結果) 數值微分 已知數據點的微分 在 x2 之微分 數值微分 可利用 diff 函數 Ex: >>x=0:0.1:1; >>y=[0.5 0.6 0.7 0.9 1.2 1.4 1.7 2.0 2.4 2.9 3.5]; >>dx=diff(x); >>dy=diff(y); >>dydx=diff(y)./diff(x) 數值微分 Ex: f ( x) = sin( x), f ′( x) = ? x ∈ [ 0, π ] >> >> >> >> >> >> >> x = linspace(0,pi,20); y = sin(x); d = diff(y)./diff(x); % backward or forward difference dc = (y(3:end)-y(1:end-2))./(x(3:end)-x(1:end-2)); % central difference dy = cos(x); % 實際微分值 plot(x, dy, x(2:end), d,'o', x(1:end-1), d,'x', x(2:end-1), dc,'^') xlabel('x'); ylabel('Derivative') 1 0.8 0.6 0.4 Derivative 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 0 0.5 1 1.5 x 2 2.5 3 3.5 工程問題中常微分方程式的解 常微分方程式 常微分方程式之形式: dy = f (t, y) dt 一般解之形式: yi +1 = yi + φ h ...

Words: 983 - Pages: 4

Free Essay

Matlab

...Signals and Systems Midterm 10:20a.m. ~ 12:20p.m., May 1, Fri., 2009 Closed book, but open 1 sheet (both sides, 2 pages) of personal notes of A4 size Total score: 120 Total 4 pages in one B4 sheet 1. [12] Suppose x and y denote input and output, respectively, of each of the three systems: System A: y (t ) = x(t + 2) sin(ω t + 2), ω ≠ 0 System B: y[n] = ( − 1 ) ( x[n] + 1) 2 System C: y[n] = ∑ x 2 [k + 1] − x[k ] k =1 n n Answer the following questions for each system and justify your answer. (a) Is the system linear? (b) Is the system time invariant? (c) Is the system causal? (d) Is the system stable? 2. We want to develop an edge detector that is robust against additive noise. Consider a discrete-time (DT) linear time-invariant (LTI) system H 2 with h2 [ n] = h[ n] ∗ h[ n + 1] as its impulse response shown below, where h[ n] = δ [ n] − δ [ n − 1] . (a) [4] Assume there is no noise, i.e., d [n] = 0 and x[n] = p[n] . Sketch the output y[n] of the system assuming the input p[n] to the system is the following signal: (b) [4] Assume the noise is d [ n] = −δ [ n + 1] and the input p[n] remains the same. Sketch the output y[n] of the system. (c) [4] In order to use system H 2 as a part of an edge detector, we would like to add an LTI system H s whose unit impulse response hs [n] is shown below. System H s smoothes out effect of noise on x[n] . The overall system can be represented as below: Sketch the output ys [n] of the system with d [n] and p[n] specified...

Words: 1025 - Pages: 5

Free Essay

Matlab & Ss

...Lab 1: Introduction to MATLAB Warm-up MATLAB is a high-level programming language that has been used extensively to solve complex engineering problems. The language itself bears some similarities with ANSI C and FORTRAN. MATLAB works with three types of windows on your computer screen. These are the Command window, the Figure window and the Editor window. The Figure window only pops up whenever you plot something. The Editor window is used for writing and editing MATLAB programs (called M-files) and can be invoked in Windows from the pull-down menu after selecting File | New | M-file. In UNIX, the Editor window pops up when you type in the command window: edit filename (‘filename’ is the name of the file you want to create). The command window is the main window in which you communicate with the MATLAB interpreter. The MATLAB interpreter displays a command >> indicating that it is ready to accept commands from you. • View the MATLAB introduction by typing >> intro at the MATLAB prompt. This short introduction will demonstrate some basic MATLAB commands. • Explore MATLAB’s help capability by trying the following: >> help >> help plot >> help ops >> help arith • Type demo and explore some of the demos of MATLAB commands. • You can use the command window as a calculator, or you can use it to call other MATLAB programs (M-files). Say you want to evaluate the expression [pic], where a=1.2, b=2.3, c=4.5 and d=4....

Words: 2151 - Pages: 9

Free Essay

Pelajaran Matlab

...SUPLEMEN Pemodelan Sistem / Pengolahan Sinyal / Metode Kuantitatif TUTORIAL SINGKAT MATLAB oleh: Judi Prajetno Sugiono Sekolah Tinggi Teknik Surabaya (2005, 2008, 2011) judi@stts.edu ©2005 p. 1 of 40 MATLAB Short Tutorial Reserve word (don’t used it as variable's name) · · · · · ans pi nan inf eps Special sign · · · · · % [] ; ' : line comment begin - end of matrix row separation, or not echoed command if place in the end of a statement begin - end of string indexing sign Variable is assume as matrix % empty matrix A=[] A = [] % matrix 1x1 or a constant A=[0] A = 0 % same with A=0 A = 0 % complex number: use i or j to express imaginary part z=3+4j z = 3.0000 + 4.0000i Entry a matrix % use as column separation and or as row separation A=[1 2 3; 4 5 6; 7 8 9] A = 1 4 7 2 5 8 3 6 9 Last saved by jpsugiono 9/23/2011 judi@stts.edu ©2005 p. 2 of 40 How to point element of matrix % A(row,column) A(1,3) ans = 3 % sign use as get all row or column A(2,:) ans = 4 5 6 % sign use as get from m to n cell in row or colomn A(1:2, 2:3) ans = 2 5 3 6 row and column vector % row vector a=[0 1 2 3 4 5] a = 0 1 2 3 4 5 % column vector b=[0; 1; 3; 4; 5] b = 0 1 3 4 5 % Shortcut to build a vector % init:step:final a=0:0.2:1 a = 0 0.2000 0.4000 0.6000 String % begin and end with < ' >, and act like a matrix of character ...

Words: 819 - Pages: 4

Free Essay

Ocr Matlab

...EEN 538: DIGITAL IMAGE PROCESSING Optical Character Recognition (OCR) using binary image processing with MATLAB Abstract- Nowadays, Optical Recognition is becoming a very important tool in several fields: medicine, physics, cosmology, traffic (plate numbers), etc. We can also use this to recognize character for example to digitalize a book. We will talk about this last topic in this report: Optical Character Recognition (OCR). I. INTRODUCTION Once we have the b&w image we can start the segmentation process. To do that we can use the function “bwconncomp”. This function returns us a struct from where we can obtain the characters because it gives us all the connected components. Thus, we can use it to get all the character even if they have 2 or 3 objects. This function returns us the pixels of the connected components (characters) but we have to figure out from those, the coordinates of the character in the original matrix (row and columns). To do this, we will obtain the centroid of every connected component and from it and using the first and last pixel detected of the connect component, we can figure out the exact coordinates of the image. The idea is as follows: Firstly, we can to convert the number that the function returns us to a column and a row. We can do this using the total rows of the original image. Once we have the first and last pixel detected of the connect component in (row, column) we can figure out directly the x-coordinates of the character in the image...

Words: 1132 - Pages: 5

Premium Essay

Matlab Sol

...mClassics Company paid $275,000 on May 1 to purchase $300,000, 6%, bonds that will mature in 5 years from the date of purchase. Interest on the bonds is paid May 1 and November 1 of each year. Classics Company plans to hold the bonds until maturity and amortizes the premium or discount on each interest payment date using the straight-line method. At year end, the bonds had a market value of $285,000. Prepare all necessary journal entries related to the investment in bonds. Answer: May 1 Long-Term Investment in Bonds 275,000 Cash 275,000 Nov. 1 Cash 9,000 Interest Revenue ($300,000 × 6% × 6/12) 9,000 Nov. 1 Long-Term Investment in Bonds 2,500 Interest Revenue ($300,000 - $275,000) × (6/60) 2,500 Dec 31 Interest Receivable 3,000 Interest Revenue ($300,000 × 6% × 2/12) 3,000 Dec. 31 Long-Term Investment in Bonds 833 Interest Revenue ($300,000 - $275,000) × (2/60) 833 On April 2, Smith Co. purchased 25% of Wesson Inc.’s stock for $600,000. On August 1, Wesson paid a cash dividend of $340,000 and on August 31 reported net income for the year of $2,000,000. On October 1, Smith sold all the stock in Wesson Inc. for $1,200,000. Record the Wesson-related transactions in the journal of Smith Co. Answer: April 2 Long-Term Investment in Wesson $600,000 Cash $600,000 August 1 Cash ($340,000 X .25) $85,000 Long-Term Investment in Wesson...

Words: 534 - Pages: 3