模型程序控制的应用
本例展示了模型管理的工具之一--程序控制。
通过软件控制,您可以创建、运行和保存模型,还可以在脚本编辑器中使用特殊指令更改模型参数。
In [ ]:
cd( @__DIR__ ) # Переместимся в каталог, где лежит текущий скрипт
homePath = string(@__DIR__)
Out[0]:
创建和保存模型
In [ ]:
# Для повторного запуска команды create
if "model" in [m.name for m in engee.get_all_models()]
engee.close("model", force=true)
end
Out[0]:
创建模型
In [ ]:
engee.create("model")
Out[0]:
使用函数查看已打开模型的名称:
engee.get_current_model()::Model
engee.gcm()::Model
In [ ]:
m = engee.gcm()
Out[0]:
使用函数save()
保存模型:
In [ ]:
engee.save( "model", "$homePath/model.engee"; force=true )
Out[0]:
模型已保存到指定路径:

您可以使用功能get_all_models()
查看打开的模型列表:
In [ ]:
engee.get_all_models()
Out[0]:
加载模型并更改建模参数

如果模型尚未在编辑器中打开,我们将使用函数load()
加载模型。如果模型已经打开,则使用函数open()
。然后使用命令get_param()
获取建模参数:
In [ ]:
if "program_control_model" in [m.name for m in engee.get_all_models()]
m = engee.open( "program_control_model" ) # загрузка модели
else
m = engee.load( "$homePath/program_control_model.engee" ) # если модель уже открыта, выполните эту строчку
end
m_param = engee.get_param( "program_control_model" ) # получение параметров моделирования
Out[0]:
您可以使用函数set_param!()
更改模拟参数:
In [ ]:
engee.set_param!("program_control_model", "SolverName" => "Tsit5", "SolverType" => "variable-step") #= меняем постоянный шаг решателя
на переменный и изменяем сам решатель =#
engee.get_param("program_control_model") # выводим параметры с внесёнными изменениями
Out[0]:
In [ ]:
engee.set_param!("program_control_model", "MinStep" => "auto", "MaxStep" => "auto") #= меняем постоянный шаг решателя
на переменный и изменяем сам решатель =#
engee.get_param("program_control_model") # выводим параметры с внесёнными изменениями
Out[0]:
运行模拟
run([m::Model]; verbose=false)
运行模型的执行。如果没有指定模型,则运行当前模型的模拟。如果模型未打开,则会抛出 NoModelOpenedException 异常。
参数
*verbose
:是否打印进度,默认为verbose=false
。
*m::Model
: 执行操作时相对的模型,默认为当前模型。
例如
engee> m = engee.load("start/examples/powersystems/models/power_line_apv.engee")
engee> engee.run(m)
Dict{String, DataFrame} 有 6 个条目:
"Va" => 40001×2 DataFrame....
"Ia" => 40001×2 DataFrame...
"Ib" => 40001×2 DataFrame...
"Ic" => 40001×2 DataFrame...
"Vc" => 40001×2 DataFrame...
"Vb" => 40001×2 DataFrame...
运行模型并输出模拟进度:
In [ ]:
engee.run(m, verbose=true)
Out[0]:
查看模拟结果
可使用函数get_results()
检索模拟结果:
engee.get_results(model_name::String)
engee.get_results(model::Model)
engee.get_results()
以字典形式返回最后一次模型模拟的结果Dict{String, DataFrame}
,其中 key 是被跟踪端口的名称。
如果模型未打开,则会打印一个异常NoModelOpenedException
。
如果模拟未运行,则会抛出异常ModelIsNotRunningException
。
参数:
*m::Model
: 执行操作的模型,默认为当前模型。
例如
engee> m = engee.load("start/examples/powersystems/models/power_line_apv.engee")
engee> results1 = engee.run(m);
engee> results2 = engee.get_results(m)
Dict{String, DataFrame} 有 6 个条目:
"Va" => 40001×2 DataFrame....
"Ia" => 40001×2 DataFrame...
"Ib" => 40001×2 DataFrame...
"Ic" => 40001×2 DataFrame...
"Vc" => 40001×2 DataFrame...
"Vb" => 40001×2 DataFrame....
engee> 结果 1 == 结果 2
true
显示模拟结果
In [ ]:
results = engee.get_results( "program_control_model" )
Out[0]:
将模拟结果写入变量,并显示结果汇总表:
In [ ]:
sin1 = engee.get_results("program_control_model")["Sine Wave.1"]
sin2 = engee.get_results("program_control_model")["Sine Wave-1.1"]
sum_signal = engee.get_results("program_control_model")["Add.1"]
table = hcat(hcat(sin1, sin2[:,2], makeunique=true), sum_signal[:,2], makeunique=true) # используя сложение массивов по горизонтали (hcat()), составляем таблицу
first(table, 10) # выводим первые 10 значений получившейся таблицы
Out[0]:
绘制模拟所得数值的变化图:
In [ ]:
using Plots
plot(table[:,1], table[:,2])
plot!(table[:,1], table[:,3])
plot!(table[:,1], table[:,4])
Out[0]:
结论
本例演示了如何使用软件模型控制来运行脚本模拟。
在代码执行过程中,创建并保存了一个新模型,加载了已完成的模型,更改了模拟参数,并使用图形库显示了模拟结果,并将其转换为可用的形式。