Engee 文档
Notebook

有渔获量的种群动态

在本示例中,我们将向您展示如何轻松创建并求解微分方程,从而建立渔获量加权鱼类种群动态模型。

模型描述

我们将对水体中的鱼类种群进行建模,建模过程如下:

  • 生育率和死亡率的影响由二次函数描述$ax + bx^2$
  • 渔获量目标每年减少$h$ 吨
  • 初始种群数量为$x_0$ 。

因此,我们创建了以下问题的模型:

$$\frac{dx}{dt} = (a + bx) x - h$$

$$x(0) = x_0$$

该问题的一般建模流程图如下:

image.png

所有参数都易于访问,可以通过脚本(通过变量)或画布本身进行设置。数值积分将帮助我们求解这个系统,但值得注意的是:

  • 有些输入条件的组合会导致求解不稳定(种群数量会下降到$\pm \infty$ );

  • 不稳定时,恒步求解器可能不会报错,这就是在模型设置中选择变步求解器的原因

  • 最大模拟步长设置为 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
Out[0]:
Model(
	name: fish_population_diff_eq_model
	id: bed18597-4e29-47c9-8729-257f0e2e80b6
)

显示种群动态与初始规模变化的关系图:

In [ ]:
# Запустим модель
model_data = engee.run( "fish_population_diff_eq_model" );

# Прочитаем нужные параметры для вывода графика
param_vector = engee.get_param("fish_population_diff_eq_model/Начальное количество рыбы (т)", "Value");

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" );

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) );

结论

使用流程图和积分器求解微分方程简化了不同专业代表之间的知识传递,正如我们在求解人口增长微分方程的例子中看到的那样。

示例中使用的块