主要内容

面向定制并行仿真的矢量代理优化

的用法surrogateoptUseVectorized选项执行自定义并行优化。方法时,可以使用此技术UseParallel成功的选择。例如,UseParallel选项可能不适用于需要parsim针对并行评估。优化向量化并行模拟需要相当大的开销,因此该技术对于耗时的模拟最有用。

本例中的并行策略是将优化分解为多个大小的块N,在那里N是并行工人的数量。准备的例子N参数的集合仿真软件。SimulationInput向量,然后调用parsim在向量。当所有N模拟完成后,surrogateopt更新代理并计算另一个代理N设置的参数。

模型系统

本例试图拟合洛伦兹动力系统在短时间间隔内的匀速圆周运动。例子中描述了洛伦兹系统及其均匀圆近似拟合常微分方程(ODE)

Lorenz_system.slxSimulink模型实现了Lorenz ODE系统。当您使用实时脚本运行此示例时,会包含此模型。

fitlorenzfn的辅助功能此示例结束从匀速圆周运动中计算点。从示例中设置圆周运动参数拟合常微分方程(ODE)很好地匹配洛伦兹动力学。

x = 0 (1);x (1) = 1.2814;x (2) = -1.4930;x (3) = 24.9763;x (4) = 14.1870;x (5) = 0.0545;x (8) = (13.8061; 1.5475; 25.3616);

该系统模拟时间短,并行优化的时间不少于串行优化的时间。本例的目的是展示如何创建向量化并行模拟,而不是提供一个在并行中运行得更好的特定示例。

目标函数

目标函数是在从0到1/10的一组时间内使洛伦兹系统和匀速圆周运动之间的差的平方和最小。为次xdata,目标函数为

objective = sum((fitlorenzfn(x,xdata) - lorenz(xdata)).^2) - (F(1) + F(end))/2

在这里,洛伦茨(xdata)代表洛伦兹系统的三维演化xdata,F表示圆系和洛伦兹系中对应点之间距离的平方向量。目标减去一半的值在端点处,以最好地近似一个积分。

以匀速圆周运动作为匹配曲线,修改仿真中的洛伦兹参数使目标函数最小化。

计算特定参数的洛伦兹系统

为洛伦兹的原始参数计算并绘制洛伦兹系统。

模型=“Lorenz_system”;open_system(模型);在= Simulink.SimulationInput(模型);% params (X0, Y0, Z0、σβ,ρ)Params = [10,20,10,10,8 / 3,28];原始的参数在= setparam(模型,params);= sim(中);你= out.yout;h =图;plot3(你{1}.Values.Data,你{2}.Values.Data,你{3}.Values.Data,“软”);视图(-70 [-30])

计算均匀圆周运动

计算匀圆运动x在洛伦兹计算的时间间隔内给出的参数,并将结果与洛伦兹图一起绘制。

tlist =你{1}.Values.Time;M = fitlorenzfn (x, tlist);持有plot3 (M (: 1), M (:, 2), M (:, 3),“kx”)举行

objfun的辅助功能此示例结束计算洛伦兹系统与匀速圆周运动之间的平方和差。目标是使这个平方和最小化。

ssq = objfun (params, M,模型)
ssq = 26.9975

平行拟合洛伦兹系统

为了优化适合,使用surrogateopt修改Simulink模型参数。的parobjfun的辅助功能此示例结束接受一个参数矩阵,其中矩阵的每一行表示一组参数。函数调用setparam的辅助功能此示例结束设置参数仿真软件。SimulationInput向量。的parobjfun然后调用函数parsim对模型的参数进行并行评价。

打开一个并行池并指定N就像池中工人的数量。

池= gcp (“nocreate”);检查是否存在并行池如果isempty(池)%如果没有,创建一个池= parpool;结束
使用“本地”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:6)。
N =池。NumWorkers
N = 6

设置BatchUpdateInterval选项N并设置UseVectorized选项真正的.这些设置的原因surrogateopt通过N每次指向目标函数。将初始点设置为前面使用的参数,因为它们对均匀圆周运动具有相当好的拟合性。设置MaxFunctionEvaluations选项设置为600,该选项是用于此示例的计算机上的6个工作人员的整数倍。

选择= optimoptions (“surrogateopt”“BatchUpdateInterval”N...“UseVectorized”,真的,“MaxFunctionEvaluations”, 600,...“InitialPoints”、参数);

在当前参数上下设置20%的界限。

磅= 0.8 *参数;乌兰巴托= 1.2 *参数;

为了增加速度,将模拟设置为使用快速重启。

set_param(模型,“FastRestart”“上”);

创建一个矢量N目标函数的仿真输入。

思敏(1:N) = Simulink.SimulationInput(模型);

为了再现性,设置随机流。

rng (100)

通过调用向量化并行方式优化目标parobjfun

tic [fittedparams,fval] = surrogateopt(@(params)parobjfun(simIn,params,M,model),lb,ub,options)

surrogateopt停止,因为它超过了'options. maxfunctionevaluments '设置的函数求值限制。
fittedparams =1×610.5627 19.8962 9.8420 8.9616 2.5723 27.9687
fval = 23.6361
paralleltime = toc
paralleltime = 457.9271

目标函数值提高(降低)。显示原始和改进的值。

disp ([ssq fval])
26.9975 - 23.6361

画出拟合点。

图(h)在= setparam(模型,fittedparams);= sim(中);你= out.yout;plot3(你{1}.Values.Data,你{2}.Values.Data,你{3}.Values.Data,“处方”);传奇(“不适合的洛伦兹”“均匀运动”“拟合洛伦兹”)举行

要关闭模型,必须首先禁用快速重新启动。

set_param(模型,“FastRestart”“关闭”);close_system(模型)

结论

当您不能使用UseParallel选项成功后,可以通过设置并行优化模拟surrogateoptUseVectorized选项真正的BatchUpdateInterval选项设置为并行工作线程数的倍数。这个过程加快了并行优化,但涉及开销,因此最适合耗时的模拟。

辅助函数

下面的代码创建fitlorenzfnhelper函数。

函数F = fitlorenzfn(x,xdata) = x(1:2);R = x (3);V = x (4);t0 = x (5);δ= x (8);f = 0(长度(xdata), 3);f (: 3) = R * sin(θ(1))* sin (V * (xdata - t0)) +δ(3);f(:,1) = R*cos(V*(xdata - t0))*cos((2))...- R * sin (V * (xdata - t0)) * cos(θ(1))* sin(θ(2))+δ(1);f (: 2) = R * sin (V * (xdata (t0)) * cos(θ(1))* cosθ((2))...- R*cos(V*(xdata - t0))*sin((2)) + (2);结束

下面的代码创建objfunhelper函数。

函数f = objfun(in,params,M,model) in = setparams(in,model,params);= sim(中);你= out.yout;瓦尔斯=[你{1}.Values.Data,你{2}.Values.Data,你{3}.Values.Data);f = sum((M - vals).^2,2);F = sum(F) - (F (1) + F (end))/2;结束

下面的代码创建parobjfunhelper函数。

函数f = parobjfun(simIn,params,M,model) N = size(params,1);f = 0 (N, 1);i = 1:N simIn(i) = setparams(simIn(i),model,params(i,:));结束simOut = parsim(思敏,“ShowProgress”“关闭”);%抑制输出i = 1:N yout = simOut(i).yout;瓦尔斯=[你{1}.Values.Data,你{2}.Values.Data,你{3}.Values.Data);g = sum((M - vals).^2,2);F (i) = sum(g) - (g(1) + g(end))/2;结束结束

下面的代码创建setparamhelper函数。

函数页= setparam(模型,参数)%参数(X0, Y0, Z0、σβ,ρ)页= in.setVariable (“X0”参数(1)“工作区”模型);页= pp.setVariable (“Y0”参数(2)“工作区”模型);页= pp.setVariable (“Z0”params (3),“工作区”模型);页= pp.setVariable (“σ”参数(4)“工作区”模型);页= pp.setVariable (“β”params (5),“工作区”模型);页= pp.setVariable (的ρparams (6),“工作区”模型);结束

另请参阅

|(模型)

相关的话题

Baidu
map