数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-3-16 18:54
标题: 使用 Logistic 模型拟合人口数据
这段代码执行了如下操作:! `+ o! L5 y4 \* f
2 s& Y: L1 A0 M* c3 W
1.导入模块:
' u. E0 A/ x( \) f  c+ l4 V5 O3 F% j( s/ {0 o$ |
   import numpy as np
% X: E9 k" A; Q" D! s$ ]   import pandas as pd
4 h1 Y) w  r9 F   from scipy.optimize import curve_fit
  P  ?# Z, Q, X; f1 [5 n. g$ C
; {& f4 W( W: Z$ P7 }: j. s1 u9 ]+ A( L* I4 _
2.导入了 NumPy、Pandas 和 SciPy 中的 curve_fit 函数。
" O2 a5 j7 d* M- }3 y  X( e, K7 Q5 J0 d$ Q6 Q% [
. q: J3 Q+ d# q( u9 i
3.准备数据:
( v" b: u* p  k3 w1 N/ ?: }- j( n/ \& E: ?& o* n- i
   df = pd.DataFrame({
1 z( ]3 j, F5 H, o7 T8 K" V$ f       'year': [1790, 1800, 1810, 1820, 1830, 1840, 1850, 1860, 1870],
# W* E4 {  m  a, S* X       'population': [3.9, 5.3, 7.2, 9.6, 12.9, 17.1, 23.2, 31.4, 38.6],1 m$ S/ I! r  P) y5 x  s
   })
2 i+ P1 v# U; Z8 q   x0 = float(df['population'][0])
% ]& a: z* f" D3 o+ E   t0 = float(df['year'][0])4 W/ A' }5 ^9 H7 J  a1 _

) G1 g1 h8 S' q3 U- q+ A* N; x+ C
- m5 c4 \- o$ ]4.创建了一个 Pandas DataFrame 来存储年份和人口数据。
* i5 B# E0 p2 P9 p( g5.提取了初始年份和初始人口数。
2 b: D- F8 D! D  {0 V5 f- F
; R2 M9 U- [% d* _" d9 q
9 f: W1 W% o) X/ P8 N" N6.定义 Logistic 模型函数:2 y  `$ C/ x: G' e+ t0 L/ O

  H, u$ t; X4 H  n- `+ Q   def x(t, r, xm):- L6 _4 ^) M9 Y4 R/ a1 W* B+ `
       return xm / (1 + (xm/x0-1)*np.exp(-r*(t-t0))); x( ?! ]4 p; A; p* @4 s
- V2 A% x2 a; n' J0 J& G

* J; G1 u6 R7 q+ v3 @$ \# q7.定义了 Logistic 函数,该函数接受时间 t、增长率 r 和最大人口数 xm 作为参数,并返回人口数。
, R+ j. Z$ H" a) \" `7 q
& J0 t" f1 N/ ?8 D. L
) L5 y7 _0 ]3 ]) E8.拟合参数:
  t; V$ }/ Y9 y2 g$ C$ Z0 F1 Y; S9 o0 Y! P, M8 Q* ~7 m
   popt, pcov = curve_fit(x, df['year'], df['population'], bounds=((0, 1), (.1, np.inf)))
! ]; Q- K8 ~# l- y. e* f   r, xm = popt[0], popt[1]
$ U" @6 Z/ b' R1 Z* e! r7 X# ?* }$ V. Q% I2 o7 |  u
( B5 s( A& ^- p. R3 G
9.使用 curve_fit 函数拟合了 Logistic 函数的参数 r 和 xm,以最小化实际人口数据与 Logistic 模型的拟合误差。
9 v0 \/ v2 \, p2 n0 W3 w- @* X- y: R7 y# s3 t% t
' f  [& K" C5 j2 j; d
10.预测 1900 年人口:9 B7 v, r- i$ q: {& b% j: b

6 Y/ j1 X) L3 u! I. n4 b   print('population in 1900 =', x(1900, r, xm))& q" q1 B9 q- I1 Q

! x4 O0 m1 U* _  [5 e
/ A0 B/ I' |# H11.使用拟合的参数预测了 1900 年的人口数。
1 K  j. w& O! C0 a4 e
# t& C# S$ v3 P+ x3 y! N! d
$ Q% b6 k& s, w; B" {4 f12.绘制预测曲线:
" q! t; i: k/ _; k: \" E4 @2 k# L+ e( }
   year = np.linspace(1790, 2000, 21)0 L, P0 p, V( O1 y6 ?6 V: J
   population = [x(each, r, xm) for each in year]0 ^% z# y% z* J, u
   plt.scatter(df['year'], df['population'], label='actual')4 Q4 f" ]. i4 M, y3 K* l
   plt.plot(year, population, label='predict', color='coral')
, N' q. ~$ ?0 q& I4 z   plt.legend()
' O, k5 f  N) |$ o4 o- U  o2 J/ X
/ B. v% b# Z5 T! m& J" d# M0 M6 T, I+ z2 u7 X
13.创建了一个时间范围 year,并使用拟合的参数计算了对应的人口数。
& s' ~# |, {1 @) P14.使用 Matplotlib 绘制了实际人口数据的散点图和 Logistic 模型的预测曲线,并添加了图例。  i0 R" K) [: W9 M5 O

9 ?3 u6 |! ?9 j5 ^3 o这段代码的核心是使用 Logistic 模型拟合了给定的人口数据,并利用拟合的参数进行了未来人口的预测。
% J8 y8 Y/ |6 O+ T- {* G
9 z0 M0 S" @' D- e% Y! z
/ D8 L- B6 i( B* y

13.logistic_model.py

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

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






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