人口模型(Malthus+Logistic)附Matlab代码

本文探讨了两种人口增长模型:Malthus指数模型和Logistic阻滞增长模型。Malthus模型假设人口增长率恒定,适合短期预测,但长期误差较大。Logistic模型考虑了环境承载力,模拟了人口增长先快后慢的现象,更适用于长期预测。通过Matlab代码示例展示了两种模型的拟合过程,强调了Logistic模型在人口控制和种群管理中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.Malthus模型(指数模型)

(1)提出以及假设

指数增长模型,由马尔萨斯在1798年提出

基本假设:人口(相对)增长率r是常数(r很小)
相对增长率 = 出生率 - 死亡率

(2)影响人口增长的因素

人口的基数
出生率和死亡率
年龄结构
性别比例
工农业生产水平
医疗水平
政府出台的政策
民族政策

(3)建立模型

我们用 x(t) 表示 t 时刻的人口

那么有 x ( t + △ t ) − x ( t ) = r x ( t ) △ t x(t+△t) - x(t) = rx(t)△t x(t+t)x(t)=rx(t)t (其中x为人口基数)

所以 ( x ( t + △ t ) − x ( t ) ) △ t = r x ( t ) \frac{(x(t+△t) - x(t)) }{ △t} = rx(t) t(x(t+t)x(t))=rx(t)

根据高数知识,求得 d x d t = r x , x ( 0 ) = x 0 \frac{dx }{dt} = rx, x(0) = x_{0} dtdx=rx,x(0)=x0

求得: x ( t ) = x 0 e r t x(t) = x_{0}e^{rt} x(t)=x0ert

结论:随着时间的增加,人口按指数规律无限增长

(4)结论

可以进行短期的人口预测,较为符合
但是之后误差就很大了

(5)举例(Matlab代码)

eg:已知一组数据如下:

t = [1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900];
p = [3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0];
t为年份,p为对应的人口数量,单位为:百万

因为马尔萨斯模型为指数函数为了线性拟合数据,我们对其进行如下操作:

两边同时取对数:

可得: l n ( x ) = l n ( x 0 ) + r t ln(x) = ln(x_{0}) + rt ln(x)=ln(x0)+rt

t = [1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900];
p = [3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0];
y = log(p);  %ln(p)函数值
a = polyfit(t,y,1)  %用一次多项式对t和y进行拟合
z = polyval(a,t);  %求得以a为系数的多项式在t处的函数值
z1 = exp(z)
r = a(1)
plot(t,p,'bo',t,z1,'r')  %分别画出散点图以及拟合曲线图
xlabel('时间');
ylabel('人口数量');
legend('实际数据','理论曲线');

作图如下(短期内基本吻合)

在这里插入图片描述
输出结果如下

%结果如下,增长率r=0.0274
a =

    0.0274  -47.6717


z1 =15

    4.1884    5.5105    7.2498    9.5382   12.5488610

   16.5097   21.7209   28.5769   37.5969   49.46401112

   65.0769   85.6179


r =

    0.0274

当 我 们 用 更 多 的 数 据 进 行 长 期 拟 合 是 就 会 发 现 该 方 法 做 出 来 的 差 别 较 大 ! {\color{Red}当我们用更多的数据进行长期拟合是就会发现该方法做出来的差别较大!}


二.Logistic模型(阻滞增长模型)

(1)背景

由于人口不可能无限制的增长,当人口达到一定数量后,那么增长率就会下降。
我们要模拟这种增长率的变化
这里简化的将增长率 r 看做是人口 x 的减函数

(2)建立 r 的关系式

假设 r ( x ) = r − s x ( r , s > 0 ) r(x) = r - sx (r,s>0) r(x)=rsx(r,s>0) 当x很小时,r仍为固有增长率,s为待求系数

xm 是当前环境可以容纳的最大人口容量

r ( x m ) = 0 − − > s = r x m − − > r ( x ) = r ( 1 − x x m ) r(x_{m}) = 0 --> s = \frac{r }{ x_{m}} --> r(x) = r(1-\frac{x}{x_{m}}) r(xm)=0>s=xmr>r(x)=r(1xmx)

(3)模型建立

指数增长模型: d x d t = r x \frac{dx }{ dt} = rx dtdx=rx

所以 d x d t = r ( x ) x = r x ( 1 − x x m ) \frac{dx }{ dt} = r(x)x = rx(1-\frac{x}{x_{m}}) dtdx=r(x)x=rx(1xmx)

最终得到: x ( t ) = x m ( 1 + ( x m x 0 − 1 ) e − r t ) x(t) =\frac{x_{m}} {(1+(\frac{x_{m}}{x_{0}} - 1) e^{-rt})} x(t)=(1+(x0xm1)ert)xm

(4)结论

最终得到 s 型增长曲线,x增长先快后慢,最终接近峰值 xm

该模型同样可以用于种群数量中(鱼群的捕捞要控制在 xm/2 附近,而害虫的防治要远远低于 xm / 2)

(5)举例(Matlab代码)

已知一组数据同上:
t = [1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900];
p = [3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0];
t为年份,p为对应的人口数量,单位为:百万

我 们 使 用 非 线 性 拟 合 法 来 计 算 参 数 r 以 及 x m {\color{Red}我们使用非线性拟合法来计算参数 r 以及 x_{m}} 使线rxm

下面代码由两个文件构成:

∙ \bullet 主函数文件(脚本文件)

%代码如下
t = [1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900 1910 1920 1930 1940 1950 1960 1970 1980 1990];
p = [3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0 92.0 106.5 123.2 131.7 150.7 179.3 204.0 226.5 251.4];
t = t-1780; %整体减去1780
x0 = [150,0.15]; %待定参数x的初值(自己根据实际情况给出初值,之后再不断调整;其中第一个参数为最大人口数,第二个参数为人口增长率)
x = lsqcurvefit('population',x0,t,p) %使用函数求得最终的(xm,r)
p1 = population(x,t);
plot(t+1780,p,'o',t+1780,p1,'-r*')
title('Logistic模型拟合图')
xlabel('年');
ylabel('人口数');
legend('实际数据','理论数据')

∙ \bullet 函数m文件(注意文件名称与函数名称相同)

%population.m函数文件
function g = population(x,t)
%UNTITLED2 此处显示有关此函数的摘要
%   此处显示详细说明
g = x(1)./(1+(x(1)/3.9-1)*exp(-x(2)*t));  %这里的公式代入的是3.9,也就是初始数据,根据自己的初值进行修改
end

如图所示两个文件:
在这里插入图片描述


作 图 如 下 : {\color{Red}作图如下:}

在这里插入图片描述
结 果 如 下 : {\color{Red}结果如下:}

%第一个参数为 Xm,第二个参数为 r
x =

  337.4308    0.0257

三.总结

Malthus 和 Logistic 均为宏观模型,它们考虑的方面比较少。而且不考虑年龄分布。

以下的微观模型考虑年龄结构
∙ \bullet Leslie差分方程模型
∙ \bullet Verhulst偏微分方程模型
∙ \bullet Pollard随机方程模型

### 回答1: logistic模型是一种经典的回归模型,可以使用matlab实现。其代码如下: 1. 准备数据 首先需要准备数据,包括自变量X和因变量Y。 2. 定义模型 接下来需要定义logistic模型,其中包括sigmoid函数和损失函数。sigmoid函数可以使用matlab内置函数sigmoid实现,其代码为: y = 1./(1+exp(-x)) 损失函数需要使用最大似然估计方法,其中包括似然函数和对数似然函数。对数似然函数可以使用matlab内置函数loglikelihood实现,其代码为: logL = -sum(y .* log(sigmoid(X*beta)) + (1-y) .* log(1-sigmoid(X*beta))) 3. 最优化 接下来通过最优化方法求解模型参数beta,即最小化损失函数。常用的最优化算法有梯度下降、牛顿法等。这里以梯度下降为例,其代码为: lr = 0.001; n_epoch = 10000; beta = zeros(size(X,2),1); for i=1:n_epoch grad = X'*(sigmoid(X*beta)-y); beta = beta - lr * grad; end 4. 预测 最后,使用求得的模型参数beta进行预测即可。代码如下: y_pred = sigmoid(X * beta); 总的来说,matlab实现logistic模型可以分为数据准备、模型定义、最优化和预测四个步骤。 ### 回答2: Matlab logistic模型代码如下: 1.数据准备 x = [1,2,3,4,5,6,7,8,9,10]; %自变量 y = [0,0,0,0,1,1,1,1,1,1]; %因变量 2.建立logistic模型 logistic=fitglm(x',y','Distribution','binomial','Link','logit'); %使用fitglm函数建立logistic模型 3.预测 x_test = [1,2,3,4,5,6,7,8,9,10]; %测试数据 y_predict = predict(logistic,x_test'); %预测y值 4.结果输出 y_predict %输出预测结果 说明: logistic模型是一种用于分类问题的模型,它通过将数据映射到sigmoid函数上,将样本分为两类。logistic回归模型可以使用matlab中的fitglm函数进行建模,其中 'Distribution' 参数设置为 'binomial' 表示二项分布, 'Link' 参数设置为 'logit' 表示应用对数几率函数。预测时,将测试数据传入模型,使用 predict 函数预测输出结果。 ### 回答3: MATLAB中的logistic模型是常用的分类模型之一,它可以用来预测二分类问题中某个类别的概率。以下是一个简单的MATLAB logistic模型代码: %% 加载数据集 load('data.mat'); %% 数据预处理 X = data(:, 1:end-1); % 特征数据 Y = data(:, end); % 标签数据 [m, n] = size(X); % 获取数据大小 X = [ones(m, 1) X]; % 添加偏置项 %% 设置超参数 alpha = 0.01; % 学习率 num_iters = 1000; % 迭代次数 %% 初始化参数 theta = zeros(n+1, 1); % 初始化参数 J_history = zeros(num_iters, 1); % 用来保存每次迭代后的损失函数值 %% 训练模型 for iter = 1:num_iters % 计算预测值 h = sigmoid(X * theta); % 计算梯度 grad = (1/m) * X' * (h - Y); % 更新参数 theta = theta - alpha * grad; % 计算损失函数值 J_history(iter) = (-1/m) * sum(Y .* log(h) + (1 - Y) .* log(1 - h)); end %% 绘制损失函数曲线 plot(1:num_iters, J_history, '-b', 'LineWidth', 2); xlabel('迭代次数'); ylabel('损失函数值'); title('损失函数曲线'); %% 预测 prob = sigmoid([1, 50, 75] * theta); % 预测值为第一个样本的概率 fprintf('预测值为 %f\n', prob); 其中,sigmoid函数的代码可以如下实现: function g = sigmoid(z) % 计算Sigmoid函数值 g = 1 ./ (1 + exp(-z)); end 该函数接受一个参数z,计算并返回Sigmoid函数值。
评论 183
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比奇堡咻飞兜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值