数学建模——人口预测模型

article/2025/11/7 23:10:35

人口预测模型

  • 多项式拟合
    • 假设
    • 特点
    • 代码实现
      • 代码实现思路
      • 代码
  • BP神经网络
    • 特点
    • 代码实现
      • 实现思路
      • 代码
  • Logistic模型
    • 特点
    • 代码实现
      • 原理
      • 代码

多项式拟合

假设

  1. 把人口增长看做是一个多项式函数
  2. 人口增长没有限制,可以一直增长

特点

  1. 已有数据拟合的很好,不论数据有没有规律可言
  2. 预测未来一两年比较准确,越往后越不准确
  3. 预测的人口数量在未来会超出人口限制,且增长速度变快

代码实现

代码实现思路

以年份为x轴变量,当年人口为y轴变量,将两者进行拟合得到人口数模型与时间的关系式
,选取某城市2008到2019年老年人口数量进行模拟测试

代码

首先是将已有的数据拟合成一条曲线,过程代码如下所示

close
clc;
clear all           %清除所有
n=5;%拟合多项式的次数
year=2008:2019;
num=[97.42 102.36	105.78	111.16	116.04	121.71	126.26	134.93	137 139 141.89 146];%户籍人口; 
p5= polyfit(year,num,n);       %5阶拟合 
%绘制原始数据和拟合曲线图
figure(1)
hold on;
xlabel('year');     %设置横坐标名
ylabel('num');      %设置纵坐标名
title('2008-2019人口增长曲线');   %设置标题
grid on      %网格线
plot(year,num,'r*',year,polyval(p5,year)) 
legend('人口数量','拟合曲线')

运行结果图
在这里插入图片描述

然后预测未来几年的人口增长数

figure(2)
year1=2008:2025;
plot(year1,polyval(p5,year1)) 
people=polyval(p5,year1);
legend('人口预测数量')

运行的结果图
在这里插入图片描述

BP神经网络

特点

  1. BP神经网络预测人口模型不需要任何假设
  2. BP神经网络根据已有的数据推算数据内部之间的关系
  3. BP神经网络是非线性的方法

代码实现

实现思路

采用三层BP神经网络,利用已有数据推算出关系式,然后推算出下一年的人口,然后以下一年的人口为基础继续推算下下一年的人口

代码

clear all
close
clc
%原始数据
P=[97.42 102.36	105.78	111.16	116.04	121.71	126.26	134.93	137;102.36	105.78	111.16	116.04	121.71 126.26 134.93 137 139;105.78	111.16	116.04	121.71	126.26 134.93 137 139 141.89];
T=[111.16	116.04	121.71	126.26	134.93 137 139 141.89 146];
%归一化处理
[P,Pmin,Pmax,T,Tmin,Tmax]=premnmx(P,T);
%神经网络
net=newff(minmax(P),[5,1],{'tansig','purelin'});
net.trainFcn='trainbr';
%设置训练参数
net.trainParam.show=50;
net.trainParam.lr=0.05;
net.trainParam.epochs=500;
net.trainParam.goal=1e-5;
%训练
[net,tr]=train(net,P,T);
%仿真
A=sim(net,P);
a=postmnmx(A,Tmin,Tmax);
T=postmnmx(T,Tmin,Tmax);
%优化后输入层权值和阙值
inputWeights=net.IW{1,1};
inputbias=net.b{1};
%优化后网络层权值和阙值
layerWeights=net.LW{2,1};
layerbias=net.b{2};
%画图输出
x=2011:2019;
newk=a(1,:);
figure(1)
plot(x,newk,'r-o',x,T,'b--*')
xlabel('年份')
ylabel('人口数量/万人')
legend('预测人口数量','实际人口数量')

结果图像
在这里插入图片描述
预测未来几年的人口数量

Pnew=[139;141.89;146];
OldNum=zeros(15,1);
for i=1:15SamNum=size(Pnew,2);Pnewn=tramnmx(Pnew,Pmin,Pmax);HiddenOut=tansig(inputWeights*Pnewn+repmat(inputbias,1,SamNum));anewn=purelin(layerWeights*HiddenOut+repmat(layerbias,1,SamNum));anewn=postmnmx(anewn,Tmin,Tmax);Pnew(1:3,:)=[Pnew(2:3,:);anewn];OldNum(i)=anewn;
end
%画图输出
x1=2011:2034;
figure(2)
NUM=[newk,OldNum'];
plot(x1,NUM,'r--o')
xlabel('年份')
ylabel('人口数量/万人')
legend('预测人口数量')

结果展示
在这里插入图片描述

Logistic模型

特点

  1. 考虑了人口能够承受的最大值
  2. 数据出错时拟合的不够好,必须要有正确的数据才能够拟合
  3. 数学模型简单,有一定的公式

代码实现

原理

Logistic模型认为人口增长有最大值Xm和人口的固有增长率r0。当人口增长到Xm附近,人口将保持这个水准不会有大的变动,数学公式如下
dx/dt=r0(1-x/Xm)x
x(0)=x0
x是人口数量,x0是初始人口数量
解这个方程组得到
x=Xm/(1+(Xm/x0-1)exp(-r0
t))

代码

clc
clear
close all
x=[97.42 102.36	105.78	111.16	116.04	121.71	126.26	134.93	141.24	141.89	143.2	147];%常驻老年人口
n=length(x);
t=0:1:n-1;
rk=zeros(1,n);
rk(1)=(-3*x(1)+4*x(2)-x(3))/2;
rk(n)=(x(n-2)-4*x(n-1)+3*x(n))/2;
for i=2:n-1rk(i)=(x(i+1)-x(i-1))/2;
end
rk=rk./x;
p=polyfit(x,rk,1);
b=p(2);
a=p(1);
r0=b;
xm=-r0/a;
%输出
pnum=zeros(n,1);
for i=0:1:n-1pnum(i+1)=xm/(1+(xm/x(1)-1)*exp(-r0*i));
end
year1=2008:2019;
plot(year1,pnum,'r--o',year1,x,'k-*')
xlabel('年份')
ylabel('老年人口数量/万人')
legend('预测老年人口数量','实际老年人口数量')

计算结果
在这里插入图片描述
预测

figure(2)
fnum=zeros(n+16,1);
for i=0:1:n+15fnum(i+1)=xm/(1+(xm/x(1)-1)*exp(-r0*i));
end
year2=2008:2035;
plot(year2,fnum,'r--o')
xlabel('年份')
ylabel('老年人口数量/万人')
legend('预测老年人口数量')

计算结果
在这里插入图片描述


http://chatgpt.dhexx.cn/article/Ar285OjQ.shtml

相关文章

uC/OS任务创建函数OSTaskCreate ()参数详解

要使用 uC/OS 的任务必须先声明任务控制块和创建任务,调用 OSTaskCreate () 函数可以创建一个任务。OSTaskCreate () 函数的信息如下表所示。

UCOSIII os_task函数

认识任务管理的函数 建立任务:OSTaskCreate()堆栈检验:OSTaskStkChk()删除任务:OSTaskDel()改变任务优先级:OSTaskChangePrio()挂起任务:OSTaskSuspend()恢复任务:OSTaskResume() 任务可以是一个无线的循…

[uCOS/RTOS]uC/OS-II中的任务堆栈大小检测

在uC/OS-II系统中,创建任务的时候除了需要配置任务的优先级以外,还需要对任务堆栈大小进行分配。而对于单片机这种RAM并不是非常大的微控制器来说,RAM显得格外珍贵,如果任务堆栈分配大了,会导致RAM不够用,分…

FreeRTOS-Task

Task FreeRTOS中Task为调度单位,是独立的运行实例,具有自己的堆栈空 间。Task通常是无限循环执行,不允许以任何方式退出实现函数(return 语句或者运行结束)。如果Task真的不需要了,需要显式的调用delete 函…

AUTOSAR OS Introduction -- Part 2(Task Property)

Event Event 主要用于为Extended Task 提供多个同步点,每个Event 可以关联多个Task Event Trigger condition 显示调用SetEvent通过Alarm TriggerCallback & OS API WaitEvent 只要表达式中任意一个EVENT 被收到,Task state则切换至Ready, 等待调度表按照优先级进行…

UCOS-Ⅲ查看任务堆栈空间:OSTaskStkChk()函数

UCOS-Ⅲ查看任务堆栈空间:OSTaskStkChk()函数 文章目录 前言一、准备工作二、使用步骤1.创建堆栈检测任务2.在头文件os_cfg.h开启宏OS_CFG_STAT_TASK_STK_CHK_EN3.在堆栈检测任务使用OSTaskStkChk()函数 三、结果 前言 硬件的RAM资源有限,UCOSⅢ提供了一…

【UCOSIII操作系统】任务篇(1)创建任务

UCOSIII操作系统 UCOSIII操作系统——任务篇(1)创建任务一、UCOSIII——任务 简介二、创建任务流程1、定义任务栈2、定义任务控制块TCB3、定义任务主体函数4、创建任务 三、任务的状态 UCOSIII其他内容导航不迷路 UCOSIII操作系统-简介 【UCOSIII操作系统…

FreeRTOS中taskENTER_CRITICAL()和taskEXIT_CRITICAL()函数运用

以下转载自安富莱电子: http://forum.armfly.com/forum.php 临界段 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断。为确保临界段代码 的执行不被中断,在进入临界段之前须关中断,而临界段代…

OSTaskCreateExt()建立任务

ucosII创建任务的硬性要求: 1.任务必须被创建在多任务启动前或运行的任务中 2.任务不能在ISR(中断)中创建 3.任务必须在死循环中,且不能有返回 OSTaskCreateExt()建立任务 NT8U OSTaskCreateExt (void (*task)(void *pd), …

赢在微点答案专区英语_英语u校园读写2答案unit3,u校园新标准大学英语视听说3单元测试答案搜题公众号...

英语u校园读写2答案unit3,u校园新标准大学英语视听说3单元测试答案搜题公众号,u校园大学英语读写4第一单元答案查题APP更多相关问题A.婴儿期 B.幼儿期 C.学龄前期 D.学龄期 E.青春期关于自我,正确的说法是(…

新视野大学英语视听说第三版答案

Unit 1 Unit 2 Unit 3 Unit 4 Unit 5 Unit 6 Unit 7 Unit 8

视听说教程(第三版)4 quiz 1

视听说教程(第三版)4 quiz 1 Reading Comprehension Section A Passage One Questions 1 to 5 are based on the following passage. We all want to raise kids who are happy and successful, but we often mistakenly think that money is the key …

welearn 视听说1-4

词汇题(55道) 1. You should carefully think over_____ the manager said at the meeting. A. that B. which C. what D. whose 1.选C,考察宾语从句连接词,主句谓语动词think over后面缺宾语,后面的宾语从句谓语动…

使用RemObjects Pascal Script

摘自RemObjects Wiki 本文提供RemObjects Pascal Script的整体概要并演示如何创建一些简单的脚本. Pascal Script包括两个不同部分: 编译器 (uPSCompiler.pas)运行时 (uPSRuntime.pas) 两部分彼此独立.可以分开使用,或通过TPSScript 控件使用他们,这个控件定义在uPSComponent.p…

搭建一个简单的Pascal脚本开发环境

使用innosetup进行打包,涉及到需要编写一些Pascal脚本,所以了解了下Pascal的相关语法。 这里主要介绍如何搭建一个简单的Pascal开发环境。 一、Free Pascal Free Pascal(全称 FPK Pascal)是一个32位和64位专业Pascal编译器。它…

pascal编程语言介绍

Pascal是一种过程式编程语言,由Niklaus Wirth于1968年设计并于1970年发布,并以法国数学家和哲学家Blaise Pascal的名字命名。Pascal可以运行在多种平台上,例如Windows、Mac OS和各种版本的UNIX/Linux。[3] 软件名称 Pascal 软件平台 Windows、…

Free Pascal IDE安装

1. Free Pascal IDE 安装 首先,去 https://www.freepascal.org/download.var 下载Free Pascal IDE。我选择的sourceforge镜像 fpc-3.0.2.i386-win32.exe,下载比较慢,请耐心等待。下载完成后,双击exe文件进行安装&#xf…

[pascal入门]数组

一、本节目标 本节我们将要讲述数组。本节目标: 一维数组二维数组字符数组 二、一维数组 我们通过一个案例来简单的理解数组。班主任要计算班级里面50个同学数学成绩的平均成绩,道理上讲这是一个比较简单的问题,只需要把每个人的成绩加起来除…

linux的pascal语言,pascal语言视频教程 Linux GCC常用命令详解

GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言&#xff0…

vscode 配置 pascal环境

vscode 配置 pascal环境 网上关于配置pascal的教程不太多,我试验了好几个,都没搞对,其中有很多原因吧,最后从较多、较熟悉的c环境开始配置理解,才算是慢慢懂得了这个配置过程,前前后后大概花一个星期&…