数学建模社区-数学中国

标题: 使用 Logistic 模型拟合人口数据 [打印本页]

作者: 2744557306    时间: 2024-3-16 18:54
标题: 使用 Logistic 模型拟合人口数据
这段代码执行了如下操作:
3 Y5 f) h0 X5 r( U' T& ?7 K, b" v! a8 v
1.导入模块:
/ v0 p( }% w# M6 ~
; y" |/ ^. r. D$ C: h) ], r4 B   import numpy as np
. k4 p5 W' i  t   import pandas as pd0 J  Z% t1 y1 r! P+ b
   from scipy.optimize import curve_fit
- Q2 B! y" O' g, o& z! e' j( y9 l( l- ]( a
  j1 V. L# W0 V+ Y
2.导入了 NumPy、Pandas 和 SciPy 中的 curve_fit 函数。
7 o! L; S7 P* U8 D* W( y1 f$ B; t( M6 p: p$ f1 G
3 E  q; ~/ u3 H! ?
3.准备数据:
$ w/ Y8 U2 {9 n" [) P
9 H5 I$ I: |+ s$ W7 V7 Z9 F7 w( Y   df = pd.DataFrame({
7 d1 [! z0 ?' Y6 @& o+ a       'year': [1790, 1800, 1810, 1820, 1830, 1840, 1850, 1860, 1870],/ S5 ]. S. V' L, W! h, U* p# \
       'population': [3.9, 5.3, 7.2, 9.6, 12.9, 17.1, 23.2, 31.4, 38.6],9 m$ k  ]9 {; B) w% j
   })9 w- p5 }1 l2 n$ n
   x0 = float(df['population'][0])7 W- @; ~3 p! p- F
   t0 = float(df['year'][0])6 R: C) X" x1 z) F& z( Y2 {

/ b* o( k: M7 \: a& T- x; \$ a8 D6 \5 a! ~- P- k+ ~9 N
4.创建了一个 Pandas DataFrame 来存储年份和人口数据。
  A5 S: W( v9 B. Y5.提取了初始年份和初始人口数。
3 j1 e0 `8 m0 H& ]# d- h9 G" v! ^' V3 a0 f
( w) i6 T/ Q  W' {2 y& @2 e; ?
6.定义 Logistic 模型函数:% q6 d* f$ e# k  h* V1 e

8 q; Y8 u( o/ l2 |   def x(t, r, xm):/ K5 a& _7 r; c- l6 t3 c6 r
       return xm / (1 + (xm/x0-1)*np.exp(-r*(t-t0)))
6 e2 B/ x% V6 J* ~) r5 `% e5 S8 ^, l- A0 I- B3 V
0 Z! _5 D7 i& ~5 a1 s! u  p
7.定义了 Logistic 函数,该函数接受时间 t、增长率 r 和最大人口数 xm 作为参数,并返回人口数。
4 y! [; l. @' y: R) p# Y/ C% l4 Q5 b1 L/ g9 e: i7 a

3 G' n& @6 M1 {: ], C" O" A  X6 k- t8 u8.拟合参数:4 l' u4 i1 ^( I9 r

- `* m+ I! m5 g9 R1 ~5 u& W# z   popt, pcov = curve_fit(x, df['year'], df['population'], bounds=((0, 1), (.1, np.inf)))
. {" L0 h0 W, q" D   r, xm = popt[0], popt[1]  C& M2 q' J" m+ c( ?( y
+ g" \; {5 ~, j& n6 ]

! s2 z) S9 d2 y0 [/ w- q+ r9.使用 curve_fit 函数拟合了 Logistic 函数的参数 r 和 xm,以最小化实际人口数据与 Logistic 模型的拟合误差。
; l1 z9 i: N- V5 |& v- _2 z% Q
; ^8 d( A' a7 B* D+ A
% K% L, L4 B& L  {$ j6 K10.预测 1900 年人口:+ |7 s6 F% J" w9 x2 j- w' v! U0 `

! f5 q: ]. N, D7 f$ e9 E% c   print('population in 1900 =', x(1900, r, xm))
+ O; K' C' ?; a, Q( k! x9 N3 w0 a- d
. z8 `+ Y3 k9 J$ V# v
11.使用拟合的参数预测了 1900 年的人口数。
5 w' J9 D8 R% j; N# n+ j; G+ M6 c
( n, T) }6 Z# W& N# Y+ j
- G, k5 \/ ?6 M0 a  D12.绘制预测曲线:% l9 I' }) ~) \2 L5 R- o( a+ D

, h- Q* T$ ^8 F4 Z, U* ?   year = np.linspace(1790, 2000, 21)# d! Y- D+ k7 Z; v: y8 C5 V
   population = [x(each, r, xm) for each in year]
: N( C1 {, n& }" {' S   plt.scatter(df['year'], df['population'], label='actual')
7 B+ n; r( C0 L( {! R   plt.plot(year, population, label='predict', color='coral')/ N4 {7 D5 l% u5 a4 P
   plt.legend()
, n* ~; {5 e+ v0 f
( X" \: f. @; R: u' I: h' d9 q5 S, x6 W, @6 \& C* D
13.创建了一个时间范围 year,并使用拟合的参数计算了对应的人口数。; A+ f& S2 m3 |9 B9 w1 m
14.使用 Matplotlib 绘制了实际人口数据的散点图和 Logistic 模型的预测曲线,并添加了图例。7 D8 c& A7 O: Q! S
& V+ W! D7 N* n
这段代码的核心是使用 Logistic 模型拟合了给定的人口数据,并利用拟合的参数进行了未来人口的预测。
6 U8 g* A1 h8 P) u" E
* _0 d: [1 z* y) g
8 {, y0 x. N. F9 }8 u% _% `

13.logistic_model.py

1.13 KB, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5