数学建模社区-数学中国
标题:
numpy 实现Lesile 模型
[打印本页]
作者:
2744557306
时间:
2024-3-17 16:43
标题:
numpy 实现Lesile 模型
Leslie 模型是一种经典的人口增长模型,用于描述一个有性别、有年龄结构的人口在不同年龄段的增长和变化。它是由生态学家 Patrick H. Leslie 在 1945 年提出的,被广泛应用于人口生态学和种群生态学领域。
" k! C3 a" O0 s* A) L
Leslie 模型通常假设以下几点:
. ~$ d9 t4 k _- f- K; Z7 w
% J+ |. o$ f" a. I% z/ }+ V+ K
1.人口结构: 人口被划分为不同的年龄组或年龄段。
2 r' j; c4 J5 ^5 c
2.增长率: 每个年龄段的人口增长率可以不同。
/ |% L9 I* g5 K( t
3.繁殖率: 不同年龄段的个体具有不同的繁殖率。
0 {6 ^9 w& q7 k9 ^: l8 S
4.死亡率: 不同年龄段的个体具有不同的死亡率。
/ b! _; W& S! d$ ~( Q$ f
Leslie 模型的主要应用包括人口预测、资源管理、生态系统稳定性分析等。通过调整繁殖率和存活率等参数,可以模拟不同情景下人口的增长和变化趋势,为人口政策和资源规划提供科学依据。
9 ], z8 T+ a) z L0 y- e( E
# p' ~, k0 D. v$ {5 H! t& @$ k
接线来我们来实现Leslie模型
3 t( u+ F- c! E6 k* N! V
1.定义数据:
0 ^) _* P& z" h1 @4 d! K4 k
+ Z4 F: s" Z1 R$ d5 f- t9 G/ V
alpha = np.array([0, 4, 3])
0 G" p3 X: _7 M& s+ R r. X+ X. @
beta = np.array([.5, .25])
7 ~ y1 o" G2 G) L4 y- W/ ~3 d4 o
2 X p% M1 `7 K0 q
L = np.zeros((len(alpha), len(alpha)))
7 @1 z+ ]5 @! }
L[0, :] = alpha
0 |% j6 {; j% R: _1 J8 \3 b* T
for index, each in enumerate(beta):
2 l3 W) |' d3 e) _' y+ x- _8 h w
L[index+1, index] = each
5 o! n( e9 U4 _# O* w8 o
% U& M& M+ r% T( w4 C" `& n
x0 = np.array([1000, 1000, 1000])
' j" T E. L) ~7 a
* M1 ^4 P' ?: z; m8 g3 l
K( F' N. j+ u2 r2 c' L0 y
2.定义了初始条件 alpha、beta 和初始状态向量 x0。
4 s) |& A* |0 ?
3.创建了一个转移矩阵 L,其中第一行为 alpha,其余为 beta。
: w; H8 K( ]5 U: F
' g3 a" F3 ^- K" C! Q' R
2 `6 k/ G& q7 T6 o. @( M" S2 D5 p! d+ m
4.迭代求解:
4 [3 k, N- S- ]5 W8 t
7 s" K& [1 c" L) E
x_list = [x0]
5 I. @3 b' H9 B
for i in range(5):
% C; x: P# Q8 d- o# _) e; y
x_list.append(L.dot(x_list[-1].T))
) f& C- Z3 u( o7 B7 T0 G* M
. ]( l( M) _5 j! F) D* u
; M; m! o+ b- }' r* G
5.使用迭代方法计算了未来 5 年的状态,并将结果存储在 x_list 中。
8 A6 K/ j5 E e" }3 s7 e7 K
) b, k; J$ B) t5 h
. ?& @# w* {+ e. J2 x5 A& l1 b2 y% b9 F
6.打印结果:
/ f- h1 k5 _+ l, _# ]
& V0 D1 B4 h% d/ @' a) L9 T+ X
for index, x in enumerate(x_list):
3 d) f1 I& w) |2 W9 v* F' T5 g$ i
print('the {}th year: 1y: {}, 2y: {}, 3y: {}'.format(
/ m- g) R; T R
index, x[0], x[1], x[2]))
/ |3 a. U9 ?, H
- g- K( _3 b: ?$ V
& w/ K9 y n9 L+ z$ d8 O+ l i; F
7.打印了每一年的状态向量。
: \$ Z5 d5 u; t5 _* n0 [
+ h3 F/ T1 c9 v( ?" Q" e3 V
) y; n5 p- {+ g& T: m4 E5 m9 P
8.绘制图形:
+ s) X: X6 {! l% i9 w( f5 U" z7 V; p
& A& y' I0 G6 Z. S. O8 W
year_list = np.array(range(len(x_list)))
' p% I0 z& S& T
y1,y2,y3 = [],[],[]
4 V1 B. b- E3 s. F9 d( y i
for year in year_list:
% r, U5 T$ a% z( k7 _
y1.append(x_list[year][0])
8 w7 q$ {1 ]2 X+ p
y2.append(x_list[year][1])
" |; i; f; f8 _1 _( f4 u) h
y3.append(x_list[year][2])
6 n) f: c/ R9 w5 \5 u5 x1 Y
+ ?9 R: j* \: D- Z
w = .3
. n1 {9 b9 f- t+ r
plt.bar(year_list-w,y1, width=w, label='1y')
! u& k* L4 v. u/ P7 x
plt.bar(year_list,y2, width=w, label='2y')
u0 v! T" |8 |3 z
plt.bar(year_list+w,y3, width=w, label='3y')
( q4 t. O, z3 j/ N. u
plt.legend()
! U4 z5 G* L, M
( a; q! u' x' y
6 A6 w1 e" Q9 s( X0 A8 c
9.使用 Matplotlib 绘制了每一年不同状态的柱状图,并添加了图例。
2 R4 u. U9 o; K1 f$ t( U5 h r6 R/ l
3 k0 U2 @* T9 |8 t! m
这段代码的主要目的是模拟了基于给定的转移矩阵和初始状态的系统状态随时间的演变,并通过图形化展示了模拟结果。
4 K" C; [) g3 p) B& a8 b6 N% R
0 |' @0 Z7 Y# U! f% [2 n
% \: Y9 ?6 ?0 J4 M9 `# Q5 x* @* w
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5