数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-3-16 18:54
标题: 使用 Logistic 模型拟合人口数据
这段代码执行了如下操作:
8 v' H  [: m- K- s, K) q$ p, w  F% B/ }4 U& [
1.导入模块:/ G+ Q: _* X8 V) p' Y
! C- R$ S1 ]" ?  l$ L, E+ G. s* z6 t
   import numpy as np2 E: q7 N$ f0 C
   import pandas as pd  H  \, z7 ^. D1 h
   from scipy.optimize import curve_fit- g8 M9 L  D! P: O

/ h; J' p% |2 Z* `
- ~  {, A* ?. F( C8 L1 F! E0 w2.导入了 NumPy、Pandas 和 SciPy 中的 curve_fit 函数。
* ^: e+ j1 L8 P" ^; I" t6 m  m* ]% R8 e( J% }
& j, T- R  R2 s
3.准备数据:* T2 l9 m+ w4 g2 \# C. c

  k; q' [# G) M% L( ~, ]   df = pd.DataFrame({) H. n$ }, A/ H: ]0 J
       'year': [1790, 1800, 1810, 1820, 1830, 1840, 1850, 1860, 1870],( W) u5 V. @8 x- d7 F$ P5 A
       'population': [3.9, 5.3, 7.2, 9.6, 12.9, 17.1, 23.2, 31.4, 38.6],
) m, |0 Q  k  ^7 L" P: W5 B, \7 v   })
  r+ @, U* \% P1 c: u   x0 = float(df['population'][0])3 Z; D. o! V; I# P8 `
   t0 = float(df['year'][0])3 }5 n% d; E" ~- s- m% z
$ w" ~2 a5 H+ Y9 x4 Y
; ]3 ?. h: t( P$ t2 J
4.创建了一个 Pandas DataFrame 来存储年份和人口数据。
; P2 x( c# q/ H2 [: x3 Y5.提取了初始年份和初始人口数。
9 C3 S: D- A9 ^5 C/ n  t3 K- r! ?- F
9 i  }7 B$ s% Y4 t
6.定义 Logistic 模型函数:
$ b- r6 s$ b% [, ?' z' a2 W) T
8 M- w. w- I9 w   def x(t, r, xm):
  `2 K3 F2 H5 Z% |4 G& P$ o% {       return xm / (1 + (xm/x0-1)*np.exp(-r*(t-t0)))- U5 a6 k+ Q+ N) |! n
' I0 b! g9 |% a' @3 o+ B
2 I8 g+ t- ~8 V7 m# J: Y1 G2 u2 Q
7.定义了 Logistic 函数,该函数接受时间 t、增长率 r 和最大人口数 xm 作为参数,并返回人口数。
) U0 L. a4 B. }% _1 d- P& F7 O" I. H0 T: Z; A4 I1 Z
) m7 q5 n4 O8 O! m: c7 s
8.拟合参数:
. L  g' h, `( }6 c- m7 U/ M* }  R1 X
   popt, pcov = curve_fit(x, df['year'], df['population'], bounds=((0, 1), (.1, np.inf)))' p, ~) W. Q) M1 I- B
   r, xm = popt[0], popt[1]
" a# x5 j" v1 j" A/ z  Z7 ~
( U8 q+ q' ^, K; {
: _# _9 c8 m$ L$ W  f7 e9.使用 curve_fit 函数拟合了 Logistic 函数的参数 r 和 xm,以最小化实际人口数据与 Logistic 模型的拟合误差。, m9 X  p, Z5 O6 y) U- m) h' J
: D, Z- M6 T$ u  \

1 m: J, f$ \: I3 F2 C10.预测 1900 年人口:' v5 F! B) J" h+ @
4 N  c! d- t9 T, q9 m( F
   print('population in 1900 =', x(1900, r, xm))* Z. `0 z7 x( l' ~+ M1 m5 D6 P) `  k
* p6 ?- F! j$ |( B8 L7 a

0 z: x" W2 [, O9 a11.使用拟合的参数预测了 1900 年的人口数。: |& Q7 [) B# ^% a" {5 y9 l

  r1 f" @" T7 M+ S3 I1 D4 i  [0 C2 U$ s- b' r/ r1 c2 Y, m. [2 d4 E
12.绘制预测曲线:- {/ I: L8 F$ G! ^" W

5 n! C/ }" @; K2 j# _- k: L- u   year = np.linspace(1790, 2000, 21)
" B: M6 k7 z" X% {7 w/ |! `) ~" Z0 n   population = [x(each, r, xm) for each in year]7 A* ]1 C2 p+ D% I2 z, U
   plt.scatter(df['year'], df['population'], label='actual')
, o/ Y3 G) N  x   plt.plot(year, population, label='predict', color='coral')( O. g: r2 g0 V; A4 _5 }
   plt.legend()
& ]! v7 u9 S" z7 @2 R) O7 Q+ [0 e4 M/ w% k8 ~

4 N2 r, z4 L( T' b' L0 b. G13.创建了一个时间范围 year,并使用拟合的参数计算了对应的人口数。
* V+ U+ a- E, Q; A  w14.使用 Matplotlib 绘制了实际人口数据的散点图和 Logistic 模型的预测曲线,并添加了图例。
1 ~1 o. N" m$ [& A/ N, j. ~8 ~
. D) L3 z8 c5 T# F" h! H这段代码的核心是使用 Logistic 模型拟合了给定的人口数据,并利用拟合的参数进行了未来人口的预测。
( t% P5 H# z1 m
) J' P7 b% u& c# G4 M7 y
5 ]" y) D0 E) c; i, Y

13.logistic_model.py

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

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






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