数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-3-16 18:54
标题: 使用 Logistic 模型拟合人口数据
这段代码执行了如下操作:% X: f1 b8 ^( o5 M0 N+ H

5 `' i. X7 s! V; _2 N" M1.导入模块:
. m* q+ ^6 F7 f. x0 V+ f5 |4 _! J6 i) O4 }' h  m3 o9 m" @
   import numpy as np& G( k$ N0 C7 R. S! F
   import pandas as pd
' o. C! ~; T2 o   from scipy.optimize import curve_fit
( p& z( A' `. y7 O3 V; `/ v4 [" s4 l( k; k/ ?( p

  }/ P8 Z3 `! N( }/ ?2.导入了 NumPy、Pandas 和 SciPy 中的 curve_fit 函数。5 P8 `; [" i) h2 N, ?0 \
+ J  `' S& H3 b1 a

$ B7 m3 z# N8 j3 ^3.准备数据:
: I% j$ J) W( y5 G4 ]8 `0 \' s2 g/ M% C) v/ Q
   df = pd.DataFrame({
! b; I" w5 z3 c8 f% C       'year': [1790, 1800, 1810, 1820, 1830, 1840, 1850, 1860, 1870],' U) k0 i# k+ v& I4 ^
       'population': [3.9, 5.3, 7.2, 9.6, 12.9, 17.1, 23.2, 31.4, 38.6]," U. _5 y, F) E, `
   })6 P- q- _( A" c$ w4 g" {
   x0 = float(df['population'][0])6 n4 X- B1 x. O1 `5 u1 ~3 [
   t0 = float(df['year'][0])
" d2 Q! Y3 b8 t) l# Q' o3 \/ D. T
( I2 ?1 M0 l' J, \' o$ @' N4 k0 r4 g. f7 j2 }  X/ u
4.创建了一个 Pandas DataFrame 来存储年份和人口数据。8 O1 j% f0 u$ q: R4 O8 o$ W* A
5.提取了初始年份和初始人口数。
# P2 x: a" V* Y/ U0 z5 `& j; l2 O1 r+ e9 Q1 X* D) p6 u6 E7 B

: q" ?# f! T& {6.定义 Logistic 模型函数:
% ~$ s, P: F' f8 N! `( {  x
$ ^; Q4 ~. e5 F   def x(t, r, xm):$ Q. d; V8 Q( p$ R) a5 Y, g
       return xm / (1 + (xm/x0-1)*np.exp(-r*(t-t0)))
  S# h9 d" a) c( C' X4 ^$ C  S8 `3 V

; N+ s9 X5 Y3 N1 f( s1 m- k4 \3 U7.定义了 Logistic 函数,该函数接受时间 t、增长率 r 和最大人口数 xm 作为参数,并返回人口数。% Y% `# g1 O0 `- V# s# D' W

1 L0 U, b. {, `5 r/ E  _7 t. g# @$ z+ s0 @1 t6 V* A
8.拟合参数:2 G1 E( M& F' _4 B
2 f8 |0 t! _8 z9 E' K3 B* W. M- a
   popt, pcov = curve_fit(x, df['year'], df['population'], bounds=((0, 1), (.1, np.inf)))
, x1 M9 z/ ]* g5 \  T   r, xm = popt[0], popt[1]" m- F' A2 ?2 p  s& Z
& U* h: f$ a$ B- u+ r( r* i3 K

: s: r% P0 j9 V+ u# K4 q, w9.使用 curve_fit 函数拟合了 Logistic 函数的参数 r 和 xm,以最小化实际人口数据与 Logistic 模型的拟合误差。
" f. s) Y% @: O  I  n7 C; Y0 X+ C  [

. A! ?  |* ?$ l5 h10.预测 1900 年人口:
7 u9 Y. z2 u2 _$ y
8 k* i: j  d* l6 U  v   print('population in 1900 =', x(1900, r, xm))
5 c& C& ]7 J, R0 p0 Q# s' A- [# w7 @
( ~5 x) N9 U) W* g$ R
/ A: v5 T1 i/ X' K) F8 B0 C11.使用拟合的参数预测了 1900 年的人口数。
& C" s0 ?; f# j7 A
% c9 r/ R5 _$ T: f4 a: }8 d+ d5 T) c7 @! m
12.绘制预测曲线:9 Q: o. U7 d6 h5 V

+ @; S! N- z% m$ @, S   year = np.linspace(1790, 2000, 21)
% n$ j0 o- ]+ _5 ?5 T   population = [x(each, r, xm) for each in year]
; W; f2 W% M8 Q- S9 }, f5 g* u   plt.scatter(df['year'], df['population'], label='actual')
& K1 \, k, T% M- K0 q: G   plt.plot(year, population, label='predict', color='coral')/ |0 u7 h, @" M" w4 ?, t+ f# f1 H
   plt.legend()& W4 m! x( y7 Q
2 ]/ \  H3 K9 r: ^" R( |, x

! O) b$ f, R7 L8 V& P( C, x) W13.创建了一个时间范围 year,并使用拟合的参数计算了对应的人口数。; V, n( M- G7 h
14.使用 Matplotlib 绘制了实际人口数据的散点图和 Logistic 模型的预测曲线,并添加了图例。& s' F; m7 a% w! w7 V" f  d
1 A, y8 @: E2 A* x% A9 |* E% G9 P
这段代码的核心是使用 Logistic 模型拟合了给定的人口数据,并利用拟合的参数进行了未来人口的预测。4 }: |6 Z( \8 u+ M  L

4 m6 o2 U( `. V4 g& z- M5 l" {1 x  Y

13.logistic_model.py

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

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






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