基于渔获量的种群动态
在本例中,我们将展示创建和解决微分方程是多么容易,该微分方程允许您根据捕获量对鱼类种群的动态进行建模。
模型描述
我们将模拟受以下过程影响的水库中的鱼类种群:
*生育率和死亡率的影响由二次函数描述
*渔获任务每年减少人口 吨
*初始人口规模为 .
因此,我们创建了以下任务的模型:
流程图的一般视图可用于对此任务进行建模,如下所示:
所有参数都很容易访问,并且可以从脚本(通过变量)和画布本身进行设置。 数值积分将帮助我们解决这个系统,但值得记住:
*有输入条件的组合,使解决方案不稳定(人口进入 );
*在不稳定的情况下,恒定步长求解器可能不会报告错误,因此,在模型设置中选择了可变步长求解器。;
*最大仿真步长设置为0.01,使间隔为0。.1我们仍然得到了一个顺利的时间表,即使我们可以根据任务的条件采取更长的步骤。
启动和分析结果
让我们使用软件管理工具运行模型:
In [ ]:
# 如果模型尚未在画布上打开,我们将加载它。
if "fish_population_diff_eq_model" ∉ getfield.(engee.get_all_models(), :name)
engee.load( "$(@__DIR__)/fish_population_diff_eq_model.engee");
end
让我们绘制人口动态对其初始大小变化的依赖性。:
In [ ]:
# 让我们启动模型
model_data = engee.run( "fish_population_diff_eq_model" );
# 让我们阅读图形输出的必要参数。
param_vector = engee.get_param("fish_population_diff_eq_model/初始鱼数(t)", "Value");
param_vector = eval(Meta.parse(param_vector)); # 将字符串转换为向量
plot( model_data["x"].time, hcat( model_data["x"].value... )',
label=reshape(param_vector, 1, :), lw=2,
title="人口变化对初始数量(t)的依赖性", titlefont=font(10),
xlabel="时间,g", ylabel="人口,t" )
Out[0]:
现在我们将设置一个值 x0 我们将根据年度捕捞计划的变化绘制图表。:
In [ ]:
param_1 = engee.get_param("fish_population_diff_eq_model/年度捕捞计划(吨)", "Value" );
# 更改模型参数
engee.set_param!( "fish_population_diff_eq_model/初始鱼数(t)", "Value"=>"5.0" );
engee.set_param!( "fish_population_diff_eq_model/年度捕捞计划(吨)", "Value"=>"0.5:0.2:2" );
# #让我们启动模型
model_data = engee.run( "fish_population_diff_eq_model" );
# #获取图形的模型参数
param_2 = engee.get_param("fish_population_diff_eq_model/年度捕捞计划(吨)", "Value" );
param_2 = eval(Meta.parse(param_2));
plot( model_data["x"].time, hcat( model_data["x"].value... )',
label=reshape(param_2, 1, :), lw=2,
title="种群变化对捕获任务的依赖性(t)", titlefont=font(10),
xlabel="时间,g", ylabel="人口,t" )
Out[0]:
并将模型返回到其原始状态。
In [ ]:
engee.set_param!("fish_population_diff_eq_model/年度捕捞计划(吨)", "Value"=>param_1 );
engee.set_param!("fish_population_diff_eq_model/初始鱼数(t)", "Value"=>string(param_vector) );
结论
使用流程图和积分器求解微分方程简化了不同专业代表之间的知识转移,正如我们通过求解人口增长的微分方程所看到的那样。

