基于渔获量的种群动态
在这个例子中,我们将展示创建和解决微分方程是多么容易,该微分方程允许您根据捕获量对鱼类种群的动态进行建模。
模型描述
我们将模拟受以下过程影响的水库中的鱼类种群:
*生育率和死亡率的影响由二次函数描述
*渔获任务每年减少人口 吨
*初始人口规模为 .
因此,我们创建了以下任务的模型:
流程图的一般视图可用于对此任务进行建模,如下所示:
所有参数都很容易访问,并且可以从脚本(通过变量)和画布本身进行设置。 数值积分将帮助我们解决这个系统,但值得记住:
*有输入条件的组合,使解决方案不稳定(人口进入 );
*在不稳定的情况下,恒定步长求解器可能不会报告错误,因此,在模型设置中选择了可变步长求解器。;
*最大仿真步长设置为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/Начальное количество рыбы (т)", "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="Зависимости изменения популяции от начального количества (т)", titlefont=font(10),
xlabel="Время, г", ylabel="Популяция, т" )
Out[0]:
现在我们将设置一个值 x0 我们将根据年度捕捞计划的变化绘制图表。:
In [ ]:
param_1 = engee.get_param("fish_population_diff_eq_model/Годовой план вылова (т)", "Value" );
# Поменяем параметры модели
engee.set_param!( "fish_population_diff_eq_model/Начальное количество рыбы (т)", "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="Зависимости изменения популяции от задания на вылов (т)", titlefont=font(10),
xlabel="Время, г", ylabel="Популяция, т" )
Out[0]:
并将模型返回到其原始状态。
In [ ]:
engee.set_param!("fish_population_diff_eq_model/Годовой план вылова (т)", "Value"=>param_1 );
engee.set_param!("fish_population_diff_eq_model/Начальное количество рыбы (т)", "Value"=>string(param_vector) );
结论
使用流程图和积分器求解微分方程简化了不同专业代表之间的知识转移,正如我们通过求解人口增长的微分方程所看到的那样。

