实验目的:
掌握差分方程模型的建模方法,理解平衡点,会作稳定性分析.
实验题目:
某地区有一种山猫,在较好、中等及较差的自然环境下,年平均增长率分别为1.68%,0.55%和-4.5%.
该地区在初始时刻有100只山猫,按以下情况分别讨论山猫数量逐年变化的过程及趋势:
(1)描述山猫在较好、中等及较差三种自然环境下25年的变化过程,计算结果要列表并画图;说明每种自然环境下山猫数量是否趋于稳定?
(2)如果每年捕获3只,画图描述山猫数量的变化过程,并说明山猫会灭绝吗?
如果每年捕获1只,画图描述山猫数量的变化过程,并说明山猫会灭绝吗?
(3)在较差的自然环境下,如果要使山猫数量稳定在60只左右,每年要人工繁殖多少只?画图描述山猫数量的变化过程.
实验内容:
第一问求解:
首先讨论自然环境下山猫数量的演变。记第k年山猫的数量为x_k,设自然环境下的年平均增长率为r,则列式得:
其解为等比数列
在MATLAB程序中,分别取r_1=0.0168,r_0.0055和r_3=-0.0450,取初始值x_0=100,用循环语句迭代计算出25年内不同自然环境下山猫的数量的演变过程。其中因增长率不为整数,因此计算每年山猫数量时向下取整,将结果列表,并绘图。
年 | 较好 | 中等 | 较差 |
1 | 101 | 100 | 95 |
2 | 103 | 101 | 91 |
3 | 105 | 101 | 87 |
4 | 106 | 102 | 83 |
5 | 108 | 102 | 79 |
通过观察演变情况,可得到如下结论:
(1)在较好和中等的自然环境下,由于0<r<1且x_0>0,所以x_k单调递增趋于无穷大,即山猫的数量无限增长;增长率在0到1范围内,其值越大,山猫增加得越快;
(2)在较差的自然环境下,由于-1<r<0且x_0>0,,所以x_k单调递减趋于0,即山猫将濒临灭绝。
% 第一问代码
% 三种自然环境
% 山猫数量初始值
x0 = 100;
% 不同环境下的增长率
r = [0.0168, 0.0055, -0.0450];
t = [];
y = [];
for k = 1:1:25
y(k,1) = k;
% 计算数量并取整
xk = floor(x0 .* (1+r).^k);
% 添加每年的年份和山猫数量
t = [t; k, xk];
end
% 绘制图像
plot(y, t(:,2), 'k+', y, t(:,3), "ko", y, t(:,4), "k*");
xlabel('年','FontSize',12);
ylabel('数量','FontSize',12);
title("山猫数量演变",'FontSize',14)
legend('r1较好', "r2中等", "r3较差",'FontSize',10);
% 转换数据为元组
lable = {"year", "r1", "r2", "r3"};
[m, n] = size(t2)
data_cell = mat2cell(t, ones(m,1), ones(n,1));
result = [lable; data_cell]
% 储存到.xlsx
xlswrite("E:\数学建模\cats.xlsx",result)
第二问求解:
1、条件为每年捕获3只
讨论在每年捕获3只条件下,山猫数量的演化。在捕获条件下,设自然环境下的年增长率为r,并且每年捕获的数量为b只,则列式得
其解为数列
年 | 较好 | 中等 | 较差 |
1 | 98 | 97 | 92 |
2 | 97 | 95 | 85 |
3 | 95 | 92 | 78 |
4 | 94 | 90 | 71 |
5 | 93 | 87 | 65 |
% T2第1问代码
% 三种自然环境
% 山猫数量初始值
x0 = 100;
% 不同环境下的增长率
r = [0.0168, 0.0055, -0.0450];
t = [];
y = [];
for k = 1:1:25
y(k,1) = k;
% 计算数量并取整
xk = floor(x0 .* (1+r).^k);
% 添加每年的年份和山猫数量
t = [t; k, xk];
end
% 绘制图像
plot(y, t(:,2), 'k+', y, t(:,3), "ko", y, t(:,4), "k*");
xlabel('年','FontSize',12);
ylabel('数量','FontSize',12);
title("山猫数量演变",'FontSize',14)
legend('r1较好', "r2中等", "r3较差",'FontSize',10);
% 转换数据为元组
lable = {"year", "r1", "r2", "r3"};
[m, n] = size(t2)
data_cell = mat2cell(t, ones(m,1), ones(n,1));
result = [lable; data_cell]
% 储存到.xlsx
xlswrite("E:\Learning materials\数学建模\wild_cats_data.xlsx",result)
2、条件为每年捕获1只
讨论在每年捕获1只条件下,山猫数量的演化。在MATLAB程序中,用循环语句迭代计算出25年内在每年捕获1只山猫条件下,在不同自然环境下山猫的数量的演变过程。其中因增长率不为整数,因此计算每年山猫数量时向下取整,将结果列表,并绘图:
% T2第2问代码
% 三种自然环境,并每年捕获3/1只条件下
t2 = [];
b = 1;
for k = 1:1:25
% 计算数量并取整
xk = floor((x0 - b./r) .* (1+r) .^ k + b./r);
% 添加每年的年份和山猫数量
t2 = [t2; k, xk];
end
% 绘制图像
plot(y, t2(:,2), 'k+', y, t2(:,3), "ko", y, t2(:,4), "k*");
xlabel('年','FontSize',12);
ylabel('数量','FontSize',12);
title("山猫数量演变(每年捕获1只)",'FontSize',14)
legend('r1较好', "r2中等", "r3较差",'FontSize',10);
% 转换数据为元组
lable2 = {"year", "r11", "r22", "r33"};
[m2, n2] = size(t2)
data_cell2 = mat2cell(t2, ones(m,1), ones(n,1));
result2 = [lable2; data_cell2]
% 储存到.xlsx
xlswrite("E:\Learning materials\数学建模\wild_cats_capture_data.xlsx",result2)
第三问求解:
这里选择使用了二分搜索来找到一个合适的整数n值,该值可以使山猫数量稳定在60左右。设置上下界和一个收敛阈值,以便在动态搜索过程中不断缩小范围。最终,求得一个最合适的整数n值为3只,用于每年人工繁殖的山猫数量以稳定其总数量在60左右。演化如下:
% 第三问代码
clc;
clear;
r3 = -0.0450;
x0 = 100;
% 设定搜索的上下界
lower_bound = 0;
upper_bound = 10;
% 定义收敛阈值
threshold = 1; % 根据需要可以调整
% 开始二分搜索
while (upper_bound - lower_bound) > threshold
% 取中间值
n = round((lower_bound + upper_bound) / 2);
% 初始化山猫数量
xk = x0;
% 迭代计算
for k = 1:1:70
xk = (xk + n/r3) * (1 + r3) ^ k - n/r3;
end
% 根据计算结果更新上下界
if xk > 60
upper_bound = n;
elseif xk < 60
lower_bound = n;
else
% 如果已经接近了目标值,可以跳出循环
break;
end
end
% 最终的合适整数n值
appropriate_n = round((lower_bound + upper_bound) / 2);
% 打印结果
disp(['要使山猫数量稳定在60只左右,每年应人工繁殖的合适的整数n值为: ', num2str(appropriate_n)]);
% 未来150年的演变
t = [];
for k = 1:1:150
xk = (x0 + appropriate_n/r3) * (1 + r3) ^ k - appropriate_n/r3;
t = [t, xk];
end
% 绘制散点图
x = 1:1:150;
scatter(x, t, "black", "o", "LineWidth", 0.5)
title("山猫演化(人工繁殖3只)", "FontSize", 13)
ylabel("数量", "FontSize", 12)
xlabel("年", "FontSize", 12)