数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-3-16 18:54
标题: 使用 Logistic 模型拟合人口数据
这段代码执行了如下操作:
; o0 M" c! F2 k) I" M: |/ K
' _0 t- z, ~- h& B. _& W7 e1.导入模块:
' L8 Z2 o2 ~+ B+ m) `( L. F3 [- }, g1 D5 u$ f
   import numpy as np
. o& {5 @9 C0 M$ t+ {   import pandas as pd
) l+ z; u1 N8 w; B8 G0 M   from scipy.optimize import curve_fit4 g8 |8 J) P7 B. E2 E! ]
$ Z2 Q5 w8 R. m

; A$ G9 K: u1 J+ N7 j$ Y- M2.导入了 NumPy、Pandas 和 SciPy 中的 curve_fit 函数。
$ b8 r5 K- R$ J
6 x- _) ]- t( ?# s
# c+ Y$ R# w, \" J: a% U' h5 P3.准备数据:
9 `$ [" P9 C& s' s8 d! u! [" V  d9 u0 L. I0 O6 L/ q4 Z/ I
   df = pd.DataFrame({
3 i0 T0 H( K& j2 Y! S3 n6 E8 A* f       'year': [1790, 1800, 1810, 1820, 1830, 1840, 1850, 1860, 1870],
0 L/ J8 P0 q& G9 i" ]$ Y       'population': [3.9, 5.3, 7.2, 9.6, 12.9, 17.1, 23.2, 31.4, 38.6],/ @0 ?8 J: W. p" j$ x2 w: m
   })' n7 X" B4 V1 T* D# P
   x0 = float(df['population'][0])- x8 ^3 q9 D! o
   t0 = float(df['year'][0])7 n6 g# k; P, J) [% N9 W

. e8 Y( R: r8 f' w, N% y
6 P" ^1 {/ E7 a0 d' z" D4.创建了一个 Pandas DataFrame 来存储年份和人口数据。
7 B6 W- p) D. w- `3 O" g$ }- f1 n5.提取了初始年份和初始人口数。9 S5 K  X8 X2 E' C
! w: i& X; I* a4 @/ u4 u

* P  a- ~* N4 t6.定义 Logistic 模型函数:% Q, D# v% L8 m% z' Y* _
6 Y2 u0 C' @% }/ @$ @  e: I6 o
   def x(t, r, xm):* X4 y* C4 u3 W
       return xm / (1 + (xm/x0-1)*np.exp(-r*(t-t0)))
4 f5 |  N: U- E
+ m% l2 C6 X' g
; `1 S3 K  s. d' p7.定义了 Logistic 函数,该函数接受时间 t、增长率 r 和最大人口数 xm 作为参数,并返回人口数。
+ k# Q" u8 U0 m, U+ K: m( I
1 h  `4 w3 {' }
2 ]# d' c6 L; O& T# S3 T3 I8.拟合参数:
; B2 }/ _9 l5 L+ `" c0 ]4 |+ x% c% h. T5 w! \
   popt, pcov = curve_fit(x, df['year'], df['population'], bounds=((0, 1), (.1, np.inf)))# O& a$ z' u/ z! t4 W% J, b
   r, xm = popt[0], popt[1]
: z7 g  c1 X6 b+ Y  ~# _  L7 ]* H  ~% i2 m. G8 p" N. P
" [' Z& a8 o$ x+ l' V
9.使用 curve_fit 函数拟合了 Logistic 函数的参数 r 和 xm,以最小化实际人口数据与 Logistic 模型的拟合误差。. a9 ?: E" _* H9 W8 W
: A9 G% k3 X. G) E

1 y( O1 T' t5 a6 B10.预测 1900 年人口:
' p+ `# V8 `9 B, p3 T8 A" l  x! `% v! I" E6 g
   print('population in 1900 =', x(1900, r, xm))
* Z3 _& N, G* t( d  N9 K" h1 i0 t4 A

; {- j5 N! }: n11.使用拟合的参数预测了 1900 年的人口数。8 {/ f! W, [* R, |/ @% Y& n
; L8 r& u$ O1 \7 z0 D) I: u- y- A

' b- B1 @& S1 q/ S- ]" R12.绘制预测曲线:: c; G! g. p9 W) P. g
8 F7 I  D) a3 t8 }( P' F, }! M
   year = np.linspace(1790, 2000, 21)
  A9 ?. b  z8 w   population = [x(each, r, xm) for each in year]# X- [( U% |: i
   plt.scatter(df['year'], df['population'], label='actual')7 L- T6 G; ^+ {! `
   plt.plot(year, population, label='predict', color='coral')0 w9 L  U+ J2 C) f& X
   plt.legend()( ^! A' l5 P% s$ F  p7 w

* \0 G+ J. X1 g' N7 ^4 G' F( e4 _; c
13.创建了一个时间范围 year,并使用拟合的参数计算了对应的人口数。
9 ]* t4 F2 Y; l/ t( j# S" _14.使用 Matplotlib 绘制了实际人口数据的散点图和 Logistic 模型的预测曲线,并添加了图例。
5 M) @2 Q+ Y- R# j" O7 Z7 @: Z9 o7 s5 F7 b2 a8 J0 ^+ j- Y6 \+ Z
这段代码的核心是使用 Logistic 模型拟合了给定的人口数据,并利用拟合的参数进行了未来人口的预测。
  y9 A* P5 u$ s1 z! T) J% O) ], ]% f9 J* x3 }! m5 q0 N+ J
: J6 ~. j# ]9 T: d* w

13.logistic_model.py

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

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






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