Leslie矩阵模型是一种经典的离散人口预测模型,通过年龄结构分组和生育/死亡率参数,能够有效预测中长期人口变化趋势。本实现提供完整的Leslie模型构建、参数估计和长期预测功能。
一、Leslie模型理论基础
1.1 模型原理
Leslie模型将人口按年龄分组(通常5岁一组),通过两个关键参数描述人口动态:
- 生育率 :fif_ifi(第i年龄组女性人均生育女儿数)
- 存活率 :sis_isi(第i年龄组存活到下一年龄组的比例)
模型核心方程:
L(t+1)=A⋅L(t)L(t+1)=A⋅L(t)L(t+1)=A⋅L(t)
其中:
- L(t)=[l1(t),l2(t),...,ln(t)]L(t)=[l1(t),l2(t),...,ln(t)]L(t)=[l1(t),l2(t),...,ln(t)] TTT为年龄别人口向量
- AAA为Leslie矩阵
1.2 Leslie矩阵结构

1.3 长期人口预测
通过特征值分析可得人口长期增长率:

稳定年龄分布由主特征向量给出
二、MATLAB实现
2.1 主程序框架
matlab
function leslie_population_model()
% Leslie人口模型主程序
% 步骤:
% 1. 加载人口数据
% 2. 构建Leslie矩阵
% 3. 参数估计与校准
% 4. 中长期人口预测
% 5. 结果可视化与分析
% 参数设置
params = configure_parameters();
% 加载人口数据(示例数据)
[age_groups, pop_data] = load_population_data(params);
% 构建Leslie矩阵
leslie_matrix = build_leslie_matrix(pop_data, params);
% 中长期人口预测
[future_pop, growth_rate] = project_population(pop_data, leslie_matrix, params);
% 结果分析与可视化
analyze_results(pop_data, future_pop, growth_rate, params);
end
2.2 参数配置
matlab
function params = configure_parameters()
% 模型参数配置
params.age_group_width = 5; % 年龄组宽度(岁)
params.max_age = 90; % 最大年龄
params.projection_years = 50; % 预测年数
params.fertility_adjustment = 0.98; % 生育率调整因子
params.mortality_adjustment = 0.99; % 死亡率调整因子
params.data_year = 2020; % 基准年
% 年龄组划分
params.age_groups = 0:params.age_group_width:params.max_age;
params.num_groups = length(params.age_groups) - 1;
end
2.3 人口数据加载与处理
matlab
function [age_groups, pop_data] = load_population_data(params)
% 生成模拟人口数据(实际应用中替换为真实数据)
age_groups = params.age_groups(1:end-1); % 年龄组下限
num_groups = params.num_groups;
% 中国2020年人口结构(单位:百万人)[示例数据]
base_pop = [6.8, 7.2, 8.5, 8.0, 7.5, 7.0, 6.5, 6.0, 5.5, 5.0, ...
4.5, 4.0, 3.5, 3.0, 2.5, 2.0, 1.5, 1.0]; % 18个年龄组
% 调整数据长度
if length(base_pop) < num_groups
base_pop = [base_pop, zeros(1, num_groups - length(base_pop))];
else
base_pop = base_pop(1:num_groups);
end
% 转换为列向量
pop_data = base_pop(:);
% 可视化基础数据
figure;
bar(age_groups, pop_data);
title('基准年人口年龄结构');
xlabel('年龄组(岁)');
ylabel('人口(百万人)');
grid on;
end
2.4 Leslie矩阵构建
matlab
function leslie_matrix = build_leslie_matrix(pop_data, params)
% 构建Leslie矩阵
num_groups = params.num_groups;
width = params.age_group_width;
% 1. 计算生育率(年龄别生育率)
fertility_rates = calculate_fertility_rates(params);
% 2. 计算存活率
survival_rates = calculate_survival_rates(pop_data, params);
% 3. 构建Leslie矩阵
leslie_matrix = zeros(num_groups, num_groups);
% 第一行:生育率
leslie_matrix(1, :) = fertility_rates;
% 次对角线:存活率
for i = 1:num_groups-1
leslie_matrix(i+1, i) = survival_rates(i);
end
% 显示矩阵
disp('Leslie矩阵:');
disp(leslie_matrix);
end
function fertility_rates = calculate_fertility_rates(params)
% 计算年龄别生育率(使用Coale-Demeny模型)
num_groups = params.num_groups;
width = params.age_group_width;
% 生育年龄范围(15-49岁)
fertility_ages = 15:width:45;
fertility_idx = round(fertility_ages/width) + 1;
% 生育率曲线(Beta函数近似)
age_midpoints = (0:num_groups-1)*width + width/2;
fertility_rates = zeros(1, num_groups);
for i = 1:num_groups
age = age_midpoints(i);
if age >= 15 && age <= 49
% 生育高峰在25岁左右
fertility_rates(i) = 0.2 * exp(-(age-25)^2/(2 * 5^2));
end
end
% 标准化使总和≈1.0(每位女性生育1个孩子)
fertility_rates = fertility_rates / sum(fertility_rates) * params.fertility_adjustment;
end
function survival_rates = calculate_survival_rates(pop_data, params)
% 计算年龄别存活率
num_groups = params.num_groups;
width = params.age_group_width;
% 简化的存活率模型(实际应使用生命表数据)
survival_rates = zeros(1, num_groups);
age_midpoints = (0:num_groups-1)*width + width/2;
for i = 1:num_groups-1
age = age_midpoints(i);
if age < 60
survival_rates(i) = 0.99 - 0.005*(age/10);
else
survival_rates(i) = 0.85 - 0.015*((age-60)/10);
end
end
% 最后一组存活率设为0
survival_rates(end) = 0;
% 应用调整因子
survival_rates = survival_rates * params.mortality_adjustment;
end
2.5 人口预测引擎
matlab
function [future_pop, growth_rate] = project_population(init_pop, leslie_matrix, params)
% 中长期人口预测
projection_years = params.projection_years;
num_groups = params.num_groups;
% 初始化结果矩阵
population_projection = zeros(num_groups, projection_years+1);
population_projection(:, 1) = init_pop;
% 逐年迭代预测
for year = 1:projection_years
population_projection(:, year+1) = leslie_matrix * population_projection(:, year);
end
% 计算长期增长率(特征值分析)
[eigenvectors, eigenvalues] = eig(leslie_matrix);
eigenvalues = diag(eigenvalues);
[max_eigenvalue, idx] = max(abs(eigenvalues));
growth_rate = real(max_eigenvalue);
% 稳定年龄分布
stable_distribution = eigenvectors(:, idx);
stable_distribution = stable_distribution / sum(stable_distribution);
% 返回预测结果
future_pop = population_projection;
% 显示关键指标
fprintf('长期人口增长率: %.4f (年均%.2f%%)\n', growth_rate, (growth_rate-1)*100);
fprintf('稳定年龄分布峰值: %d-%d岁\n', ...
find(stable_distribution==max(stable_distribution))-1, ...
find(stable_distribution==max(stable_distribution))*params.age_group_width);
end
2.6 结果分析与可视化
matlab
function analyze_results(init_pop, future_pop, growth_rate, params)
% 结果分析与可视化
years = 0:params.projection_years;
num_groups = params.num_groups;
age_groups = params.age_groups(1:end-1);
% 1. 总人口变化趋势
total_pop = sum(future_pop, 1);
figure;
plot(years, total_pop/1e6, 'b-o', 'LineWidth', 2);
title('中长期总人口变化趋势');
xlabel('年份');
ylabel('总人口(百万)');
grid on;
% 标记关键节点
[peak_pop, peak_year] = max(total_pop);
fprintf('人口峰值: %.2f亿 (%.0f年后)\n', peak_pop/100, peak_year);
% 2. 年龄结构变化(人口金字塔)
figure;
for year = [1, floor(params.projection_years/2), params.projection_years]
subplot(1,3,year/(floor(params.projection_years/2))+1);
pyramid_data = future_pop(:, year+1);
barh(age_groups, pyramid_data/1e6, 'stacked');
title(sprintf('%.0f年后人口结构', year));
xlabel('人口(百万)');
ylabel('年龄组');
grid on;
end
% 3. 抚养比分析
dependency_ratio = calculate_dependency_ratio(future_pop, params);
figure;
plot(years, dependency_ratio, 'r-s', 'LineWidth', 2);
title('总抚养比变化趋势');
xlabel('年份');
ylabel('抚养比(%)');
grid on;
% 4. 人口稳定性分析
stability_analysis(future_pop, growth_rate, params);
end
function ratio = calculate_dependency_ratio(pop_matrix, params)
% 计算抚养比(0-14岁和65岁以上为被抚养人口)
years = size(pop_matrix, 2);
ratio = zeros(1, years);
for t = 1:years
pop = pop_matrix(:, t);
working_age = sum(pop(4:13)); % 15-64岁组索引
dependent = sum(pop) - working_age;
ratio(t) = dependent / working_age * 100;
end
end
function stability_analysis(pop_matrix, growth_rate, params)
% 人口稳定性分析
years = size(pop_matrix, 2);
final_pop = pop_matrix(:, end);
initial_pop = pop_matrix(:, 1);
% 计算年龄结构变化
structure_change = zeros(params.num_groups, 1);
for i = 1:params.num_groups
structure_change(i) = (final_pop(i) - initial_pop(i)) / initial_pop(i) * 100;
end
% 可视化
figure;
bar(params.age_groups(1:end-1), structure_change);
title('各年龄组人口变化百分比');
xlabel('年龄组');
ylabel('变化百分比(%)');
grid on;
% 老龄化指数
elderly_index = sum(final_pop(13:end)) / sum(final_pop(1:12));
fprintf('老龄化指数(老年/少年比): %.2f\n', elderly_index);
end
2.7 政策情景模拟
matlab
function policy_simulation()
% 政策干预情景模拟
% 情景1:生育率提升
% 情景2:死亡率降低
% 情景3:移民政策调整
% 基准情景
params = configure_parameters();
[age_groups, pop_data] = load_population_data(params);
leslie_matrix = build_leslie_matrix(pop_data, params);
[future_pop_base, growth_rate_base] = project_population(pop_data, leslie_matrix, params);
% 情景1:生育率提升10%
params1 = params;
params1.fertility_adjustment = 1.10; % 生育率增加10%
leslie_matrix1 = build_leslie_matrix(pop_data, params1);
[future_pop1, growth_rate1] = project_population(pop_data, leslie_matrix1, params1);
% 情景2:死亡率降低10%
params2 = params;
params2.mortality_adjustment = 0.90; % 死亡率降低10%
leslie_matrix2 = build_leslie_matrix(pop_data, params2);
[future_pop2, growth_rate2] = project_population(pop_data, leslie_matrix2, params2);
% 结果比较
years = 0:params.projection_years;
total_pop_base = sum(future_pop_base, 1);
total_pop1 = sum(future_pop1, 1);
total_pop2 = sum(future_pop2, 1);
figure;
plot(years, total_pop_base/1e6, 'b-', 'LineWidth', 2);
hold on;
plot(years, total_pop1/1e6, 'r--', 'LineWidth', 2);
plot(years, total_pop2/1e6, 'g-.', 'LineWidth', 2);
title('不同政策情景下的人口预测');
xlabel('年份');
ylabel('总人口(百万)');
legend('基准情景', '生育率+10%', '死亡率-10%', 'Location', 'best');
grid on;
% 计算差异
pop_diff1 = (total_pop1 - total_pop_base)/1e6;
pop_diff2 = (total_pop2 - total_pop_base)/1e6;
fprintf('50年后人口差异:\n');
fprintf('生育率提升: +%.2f百万\n', pop_diff1(end));
fprintf('死亡率降低: +%.2f百万\n', pop_diff2(end));
end
三、模型优化与扩展
3.1 参数校准与敏感性分析
matlab
function sensitivity_analysis()
% Leslie模型参数敏感性分析
params = configure_parameters();
[age_groups, pop_data] = load_population_data(params);
% 测试参数范围
fertility_factors = 0.8:0.05:1.2; % 生育率调整因子
mortality_factors = 0.8:0.05:1.2; % 死亡率调整因子
results = zeros(length(fertility_factors), length(mortality_factors));
% 网格搜索
for i = 1:length(fertility_factors)
for j = 1:length(mortality_factors)
params_temp = params;
params_temp.fertility_adjustment = fertility_factors(i);
params_temp.mortality_adjustment = mortality_factors(j);
leslie_matrix = build_leslie_matrix(pop_data, params_temp);
[~, growth_rate] = project_population(pop_data, leslie_matrix, params_temp);
results(i, j) = growth_rate;
end
end
% 可视化结果
figure;
surf(fertility_factors, mortality_factors, results);
xlabel('生育率调整因子');
ylabel('死亡率调整因子');
zlabel('人口增长率');
title('参数敏感性分析');
colorbar;
% 寻找最优参数
[max_growth, idx] = max(results(:));
[i_opt, j_opt] = ind2sub(size(results), idx);
fprintf('最大增长率: %.4f (生育率因子=%.2f, 死亡率因子=%.2f)\n', ...
max_growth, fertility_factors(i_opt), mortality_factors(j_opt));
end
3.2 考虑迁移因素的扩展模型
matlab
function extended_leslie_model()
% 考虑迁移因素的扩展Leslie模型
params = configure_parameters();
[age_groups, pop_data] = load_population_data(params);
% 添加迁移向量(净迁移率)
migration_rates = calculate_migration_rates(params);
% 构建扩展Leslie矩阵
leslie_matrix = build_leslie_matrix(pop_data, params);
extended_matrix = leslie_matrix;
% 在矩阵中添加迁移项(简化处理)
for i = 1:params.num_groups
extended_matrix(i,i) = extended_matrix(i,i) + migration_rates(i);
end
% 预测
[future_pop, growth_rate] = project_population(pop_data, extended_matrix, params);
% 与传统模型比较
traditional_matrix = build_leslie_matrix(pop_data, params);
[future_pop_trad, growth_rate_trad] = project_population(pop_data, traditional_matrix, params);
% 可视化比较
years = 0:params.projection_years;
total_pop_ext = sum(future_pop, 1);
total_pop_trad = sum(future_pop_trad, 1);
figure;
plot(years, total_pop_ext/1e6, 'b-', 'LineWidth', 2);
hold on;
plot(years, total_pop_trad/1e6, 'r--', 'LineWidth', 2);
title('考虑迁移因素的人口预测');
xlabel('年份');
ylabel('总人口(百万)');
legend('扩展模型', '传统模型', 'Location', 'best');
grid on;
end
function migration_rates = calculate_migration_rates(params)
% 计算年龄别净迁移率(示例)
num_groups = params.num_groups;
migration_rates = zeros(1, num_groups);
% 青年移民较多
migration_rates(3:5) = 0.002; % 10-24岁组
migration_rates(6:8) = 0.001; % 25-39岁组
% 老年迁出较多
migration_rates(12:end) = -0.001; % 60岁以上组
end
3.3 随机Leslie模型(蒙特卡洛模拟)
matlab
function stochastic_leslie_model()
% 随机Leslie模型(考虑参数不确定性)
params = configure_parameters();
[age_groups, pop_data] = load_population_data(params);
num_simulations = 100;
projection_years = params.projection_years;
num_groups = params.num_groups;
% 初始化结果矩阵
all_populations = zeros(num_groups, projection_years+1, num_simulations);
% 蒙特卡洛模拟
for sim = 1:num_simulations
% 随机生成参数(正态分布)
fertility_adj = normrnd(params.fertility_adjustment, 0.05);
mortality_adj = normrnd(params.mortality_adjustment, 0.03);
% 构建随机Leslie矩阵
params_temp = params;
params_temp.fertility_adjustment = max(0.5, fertility_adj); % 限制范围
params_temp.mortality_adjustment = max(0.7, mortality_adj);
leslie_matrix = build_leslie_matrix(pop_data, params_temp);
% 预测
[pop_sim, ~] = project_population(pop_data, leslie_matrix, params_temp);
all_populations(:, :, sim) = pop_sim;
end
% 统计分析
mean_population = mean(all_populations, 3);
percentile_5 = prctile(all_populations, 5, 3);
percentile_95 = prctile(all_populations, 95, 3);
% 可视化
years = 0:projection_years;
total_mean = sum(mean_population, 1);
total_p5 = sum(percentile_5, 1);
total_p95 = sum(percentile_95, 1);
figure;
fill([years, fliplr(years)], [total_p5/1e6, fliplr(total_p95/1e6)], 'b', 'FaceAlpha', 0.3);
hold on;
plot(years, total_mean/1e6, 'r-', 'LineWidth', 2);
title('随机Leslie模型预测(含95%置信区间)');
xlabel('年份');
ylabel('总人口(百万)');
legend('95%置信区间', '平均预测', 'Location', 'best');
grid on;
% 计算人口峰值概率分布
peak_pops = zeros(1, num_simulations);
for sim = 1:num_simulations
pop_sim = squeeze(all_populations(:, :, sim));
total_sim = sum(pop_sim, 1);
[peak_pops(sim), ~] = max(total_sim);
end
figure;
histogram(peak_pops/100, 20); % 转换为亿人
title('人口峰值分布');
xlabel('峰值人口(亿)');
ylabel('频数');
grid on;
end
四、实际应用案例
4.1 中国人口预测(2020-2070)
matlab
function china_population_projection()
% 中国人口中长期预测(2020-2070)
params = configure_parameters();
params.max_age = 90;
params.age_group_width = 5;
params.projection_years = 50; % 2020-2070
% 使用真实数据(示例)
age_groups = [0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85];
base_pop = [69.5, 73.2, 82.1, 81.6, 79.8, 84.5, 92.3, 97.8, 96.2, 93.5, ...
89.7, 83.4, 76.8, 67.3, 54.8, 41.2, 27.5, 16.8]; % 2020年数据(百万)
% 构建Leslie矩阵
leslie_matrix = build_china_leslie_matrix(base_pop, params);
% 预测
[future_pop, growth_rate] = project_population(base_pop(:), leslie_matrix, params);
% 结果分析
analyze_china_results(future_pop, growth_rate, params);
end
function leslie_matrix = build_china_leslie_matrix(pop_data, params)
% 构建中国特定Leslie矩阵
num_groups = length(pop_data);
% 中国生育率(2020年数据)
fertility_rates = [0, 0, 0.01, 0.15, 0.25, 0.22, 0.18, 0.12, 0.05, 0, 0, 0, 0, 0, 0, 0, 0, 0];
% 中国存活率(基于2020年生命表)
survival_rates = [0.985, 0.995, 0.996, 0.995, 0.994, 0.993, 0.990, 0.985, 0.978, 0.970, ...
0.960, 0.940, 0.910, 0.870, 0.800, 0.700, 0.550, 0.300];
% 构建矩阵
leslie_matrix = zeros(num_groups, num_groups);
leslie_matrix(1, :) = fertility_rates;
for i = 1:num_groups-1
leslie_matrix(i+1, i) = survival_rates(i);
end
end
function analyze_china_results(future_pop, growth_rate, params)
% 中国人口预测结果分析
years = 0:params.projection_years;
total_pop = sum(future_pop, 1);
% 关键指标
[peak_pop, peak_year] = max(total_pop);
current_pop = total_pop(1);
reduction = (current_pop - peak_pop)/current_pop * 100;
% 老龄化分析
elderly_pop = sum(future_pop(13:end, :), 1); % 65+岁
elderly_ratio = elderly_pop ./ total_pop * 100;
% 劳动力分析
working_pop = sum(future_pop(4:12, :), 1); % 15-64岁
working_ratio = working_pop ./ total_pop * 100;
% 可视化
figure;
yyaxis left;
plot(years, total_pop/100, 'b-', 'LineWidth', 2); % 转换为亿
ylabel('总人口(亿)');
yyaxis right;
plot(years, elderly_ratio, 'r--', 'LineWidth', 2);
ylabel('老龄人口比例(%)');
title('中国人口预测(2020-2070)');
xlabel('年份');
grid on;
legend('总人口', '老龄人口比例', 'Location', 'best');
% 显示关键结论
fprintf('===== 中国人口预测结果(2020-2070)=====\n');
fprintf('当前人口(2020): %.2f亿\n', current_pop/100);
fprintf('人口峰值(%.0f): %.2f亿\n', peak_year, peak_pop/100);
fprintf('人口减少: %.2f%%\n', reduction);
fprintf('2070年老龄人口比例: %.1f%%\n', elderly_ratio(end));
fprintf('2070年劳动力比例: %.1f%%\n', working_ratio(end));
end
4.2 日本人口老龄化分析
matlab
function japan_aging_analysis()
% 日本人口老龄化专题分析
params = configure_parameters();
params.max_age = 100;
params.age_group_width = 5;
params.projection_years = 40; % 2020-2060
% 日本2020年人口数据(示例)
age_groups = 0:5:100;
base_pop = [3.5, 3.8, 4.2, 4.0, 3.8, 4.2, 4.5, 4.8, 4.6, 4.3, ...
4.0, 3.8, 3.5, 3.2, 3.0, 2.8, 2.5, 2.2, 1.8, 1.5, ...
1.2, 0.9]; % 22个年龄组(百万)
% 日本特定参数(低生育率、长寿命)
params.fertility_adjustment = 0.8; % 极低生育率
params.mortality_adjustment = 0.95; % 低死亡率(长寿命)
% 构建Leslie矩阵
leslie_matrix = build_japan_leslie_matrix(base_pop, params);
% 预测
[future_pop, growth_rate] = project_population(base_pop(:), leslie_matrix, params);
% 老龄化专题分析
analyze_aging_impact(future_pop, params);
end
function leslie_matrix = build_japan_leslie_matrix(pop_data, params)
% 构建日本特定Leslie矩阵
num_groups = length(pop_data);
% 日本生育率(极低)
fertility_rates = zeros(1, num_groups);
fertility_rates(4:7) = [0.02, 0.08, 0.12, 0.10]; % 15-34岁组
% 日本存活率(长寿国家)
survival_rates = zeros(1, num_groups);
for i = 1:num_groups-1
age = (i-1)*5;
if age < 60
survival_rates(i) = 0.99 - 0.002*(age/10);
else
survival_rates(i) = 0.88 - 0.008*((age-60)/10);
end
end
survival_rates(end) = 0.1; % 最高年龄组存活率
% 构建矩阵
leslie_matrix = zeros(num_groups, num_groups);
leslie_matrix(1, :) = fertility_rates;
for i = 1:num_groups-1
leslie_matrix(i+1, i) = survival_rates(i);
end
end
function analyze_aging_impact(future_pop, params)
% 老龄化影响分析
years = 0:params.projection_years;
total_pop = sum(future_pop, 1);
% 老龄化指数
young_pop = sum(future_pop(1:3, :), 1); % 0-14岁
working_pop = sum(future_pop(4:12, :), 1); % 15-59岁
elderly_pop = sum(future_pop(13:end, :), 1); % 60+岁
aging_index = elderly_pop ./ young_pop; % 老少比
dependency_ratio = (young_pop + elderly_pop) ./ working_pop * 100; % 总抚养比
% 医疗支出估计(随年龄增长)
medical_cost = zeros(1, length(years));
for t = 1:length(years)
cost_per_age = [0.5, 0.6, 0.7, 0.8, 1.0, 1.2, 1.5, 2.0, 2.5, 3.0, ...
3.5, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 12.0, 15.0, 20.0]; % 每5岁成本系数
weighted_cost = future_pop(:, t)' * [cost_per_age, zeros(1, length(cost_per_age))]';
medical_cost(t) = weighted_cost / sum(future_pop(:, t));
end
% 可视化
figure;
subplot(2,2,1);
plot(years, total_pop/100, 'b-');
title('总人口变化');
ylabel('人口(亿)');
grid on;
subplot(2,2,2);
plot(years, aging_index, 'r-');
title('老龄化指数(老年/少年比)');
ylabel('比值');
grid on;
subplot(2,2,3);
plot(years, dependency_ratio, 'g-');
title('总抚养比');
ylabel('%');
grid on;
subplot(2,2,4);
plot(years, medical_cost, 'm-');
title('人均医疗成本指数');
ylabel('相对成本');
grid on;
% 政策建议
fprintf('===== 日本老龄化分析结果 =====\n');
fprintf('预计%.0f年后老龄化指数超过%.1f(超老龄化社会)\n', ...
find(aging_index>0.7, 1), 0.7);
fprintf('%.0f年后总抚养比将超过%.0f%%\n', ...
find(dependency_ratio>70, 1), 70);
fprintf('建议政策:提高退休年龄、鼓励生育、引进移民、发展银发经济\n');
end
五、模型验证与评估
5.1 历史数据回测
matlab
function historical_backtesting()
% 历史数据回测(验证模型准确性)
% 使用2000年数据预测2010年,与实际数据比较
% 2000年中国人口数据(示例)
pop_2000 = [35.2, 38.1, 42.3, 48.5, 50.1, 48.7, 46.2, 44.5, 42.3, 40.1, ...
37.8, 33.5, 28.9, 23.5, 18.2, 12.8, 8.5, 5.2]; % 18个年龄组(百万)
% 构建2000年Leslie矩阵
params = configure_parameters();
params.max_age = 85;
leslie_matrix = build_leslie_matrix(pop_2000, params);
% 预测10年
[pop_2010_pred, ~] = project_population(pop_2000(:), leslie_matrix, params);
pop_2010_pred = pop_2010_pred(:, 11); % 第10年(含初始年)
% 实际2010年数据(示例)
pop_2010_actual = [36.5, 39.2, 43.5, 49.8, 51.4, 50.0, 47.5, 45.8, 43.6, 41.4, ...
39.1, 34.8, 30.2, 24.8, 19.5, 14.1, 9.8, 6.5]; % 百万
% 比较预测与实际
comparison = [pop_2010_pred, pop_2010_actual(:)];
figure;
bar(comparison/100); % 转换为亿
legend('预测值', '实际值');
title('2010年人口预测 vs 实际值');
xlabel('年龄组');
ylabel('人口(亿)');
grid on;
% 计算误差
error = abs(pop_2010_pred - pop_2010_actual(:)) ./ pop_2010_actual(:) * 100;
mape = mean(error);
fprintf('平均绝对百分比误差(MAPE): %.2f%%\n', mape);
end
5.2 模型精度评估
matlab
function model_accuracy_assessment()
% 模型精度综合评估
% 使用多种指标评估模型预测精度
% 生成测试数据集(不同国家/地区)
test_cases = {
struct('name', '中国', 'data', [69.5, 73.2, 82.1, 81.6, 79.8, 84.5, 92.3, 97.8, 96.2, 93.5]),
struct('name', '印度', 'data', [120.5, 118.2, 112.3, 105.6, 100.2, 95.8, 90.5, 85.2, 78.9, 72.1]),
struct('name', '美国', 'data', [20.1, 20.5, 21.0, 20.8, 20.2, 20.5, 21.2, 20.8, 20.0, 19.2])
};
results = struct();
for i = 1:length(test_cases)
case_data = test_cases{i};
name = case_data.name;
pop_data = case_data.data';
% 构建模型
params = configure_parameters();
params.num_groups = length(pop_data);
leslie_matrix = build_leslie_matrix(pop_data, params);
% 预测5年
[pred_pop, ~] = project_population(pop_data, leslie_matrix, params);
pred_5yr = pred_pop(:, 6);
% 实际5年后数据(模拟)
actual_5yr = pop_data .* (1 + 0.01*randn(size(pop_data))); % 添加随机波动
% 计算评估指标
mae = mean(abs(pred_5yr - actual_5yr)); % 平均绝对误差
rmse = sqrt(mean((pred_5yr - actual_5yr).^2)); % 均方根误差
mape = mean(abs((pred_5yr - actual_5yr)./actual_5yr)) * 100; % 平均绝对百分比误差
% 存储结果
results(i).name = name;
results(i).mae = mae;
results(i).rmse = rmse;
results(i).mape = mape;
end
% 显示评估结果
fprintf('===== 模型精度评估 =====\n');
fprintf('地区\tMAE(百万)\tRMSE(百万)\tMAPE(%%) \n');
for i = 1:length(results)
fprintf('%s\t%.2f\t\t%.2f\t\t%.2f\n', ...
results(i).name, results(i).mae, results(i).rmse, results(i).mape);
end
% 可视化
figure;
bar([results.mape]);
set(gca, 'XTickLabel', {results.name});
title('各地区预测误差(MAPE)');
ylabel('平均绝对百分比误差(%)');
grid on;
end
参考代码 Leslie人口模型matlab实现,预测中长期人口模型 www.youwenfan.com/contentcss/79367.html
六、总结与应用
6.1 Leslie模型特点
- 结构化建模:考虑年龄结构,优于简单指数模型
- 政策敏感性:通过参数调整反映政策影响
- 长期预测能力:揭示人口转型的长期趋势
- 计算高效:矩阵运算实现快速预测
6.2 应用场景
- 国家人口发展战略:预测人口红利与负担期
- 社会保障体系规划:养老金、医疗资源需求预测
- 教育资源配置:学龄人口变化趋势分析
- 劳动力市场分析:劳动力供给与结构变化
- 城市化进程研究:人口流动与迁移模式
6.3 模型局限性及改进
-
局限性:
- 忽略个体差异和迁移因素
- 假设生育/死亡模式稳定
- 未考虑社会经济因素动态变化
-
改进方向:
matlabfunction improved_leslie_model() % 改进的Leslie模型(考虑社会经济因素) % 1. 时变参数:生育率随教育水平变化 % 2. 空间异质性:城乡人口差异 % 3. 政策干预:二孩/三孩政策影响 % 4. 国际迁移:移民政策变化 end
6.4 实施建议
- 数据要求 :
- 详细年龄别人口数据
- 分年龄生育率、死亡率
- 历史人口变迁数据
- 参数校准 :
- 使用最小二乘法拟合历史数据
- 考虑地区差异调整参数
- 定期更新模型参数
- 结果解读 :
- 关注长期趋势而非短期波动
- 结合多情景分析(乐观/悲观)
- 注意模型外推的可靠性限制