数学建模例题:差分方程模型,山猫数量演化模型

实验目的:

掌握差分方程模型的建模方法,理解平衡点,会作稳定性分析.

实验题目

某地区有一种山猫,在较好、中等及较差的自然环境下,年平均增长率分别为1.68%,0.55%和-4.5%.

该地区在初始时刻有100只山猫,按以下情况分别讨论山猫数量逐年变化的过程及趋势:

(1)描述山猫在较好、中等及较差三种自然环境下25年的变化过程,计算结果要列表并画图;说明每种自然环境下山猫数量是否趋于稳定?

(2)如果每年捕获3只,画图描述山猫数量的变化过程,并说明山猫会灭绝吗?

如果每年捕获1只,画图描述山猫数量的变化过程,并说明山猫会灭绝吗?

(3)在较差的自然环境下,如果要使山猫数量稳定在60只左右,每年要人工繁殖多少只?画图描述山猫数量的变化过程.

实验内容:

第一问求解:

首先讨论自然环境下山猫数量的演变。记第k年山猫的数量为x_k,设自然环境下的年平均增长率为r,则列式得:

x_{k+1}=(1+r)x_k,k=0,1,2,3...

其解为等比数列

x_{k}=x_0(1+r)^k,k=0,1,2,3...

在MATLAB程序中,分别取r_1=0.0168r_0.0055r_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<1x_0>0,所以x_k单调递增趋于无穷大,即山猫的数量无限增长;增长率在0到1范围内,其值越大,山猫增加得越快;

(2)在较差的自然环境下,由于-1<r<0x_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)

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值