主要内容

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

这个例子展示了如何使用surrogateoptUseVectorized选择执行定制的并行优化。您可以使用这种技术时不能使用UseParallel成功的选择。例如,UseParallel选项可能不适用于仿真软件®仿真要求万博1manbetxparsim针对并行评估。优化矢量化并行仿真涉及相当大的开销,所以这对耗时的模拟技术是最有用的。

本例中的并行策略是优化分解成小块的大小N,在那里N是平行的工人的数量。准备的例子N设置的参数万博1manbetxSimulink.SimulationInput向量,然后调用parsim在向量。当所有N模拟完成后,surrogateopt更新代理和评估N设置的参数。

模型系统

这个例子试图适应洛伦茨动力系统在短时间间隔匀速圆周运动。洛伦兹系统及其匀速圆周近似描述的例子适合一个常微分方程(ODE)

Lorenz_system.slx万博1manbetx系统实现了洛伦茨颂歌仿真软件模型。这个模型包含当您运行这个示例使用脚本。

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,目标函数

目标=总和((fitlorenzfn (x, xdata) -洛伦兹(xdata)) ^ 2)——(F (1) + F(结束))/ 2

在这里,洛伦茨(xdata)代表三维洛伦兹系统的进化xdata,F代表了向量对应点之间的距离平方的圆形和洛伦兹系统。客观减去一半的端点的值最好的近似积分。

考虑匀速圆周运动的曲线匹配,和修改的洛伦茨参数模拟最小化目标函数。

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

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

模型=“Lorenz_system”;open_system(模型);在= Si万博1manbetxmulink.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修改模型的参数模型。万博1manbetx的parobjfun辅助函数在这个例子接受一个参数矩阵,矩阵的每一行表示一组参数。的函数调用setparam辅助函数在这个例子设置参数万博1manbetxSimulink.SimulationInput向量。的parobjfun然后调用函数parsim并行评估模型参数。

打开一个平行池并指定N随着工人数量的池中。

池= gcp (“nocreate”);%检查并行池是否存在如果isempty(池)%如果没有的话,创建一个池= parpool;结束
开始平行池(parpool)使用“本地”概要文件…连接到平行池(工人数量:6)。
N = pool.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) = Sim万博1manbetxulink.SimulationInput(模型);

再现性,设置随机流。

rng (100)

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

(fittedparams抽搐,fval] = surrogateopt (@ (params) parobjfun (params思敏,M,模型),磅,乌兰巴托,选项)

surrogateopt停止,因为它超过了设定的评价函数极限“options.MaxFunctionEvaluations”。
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)) *罪(θ(2))+δ(2);结束

下面的代码创建objfunhelper函数。

函数f = objfun (params, M,模型)= setparam(模型,params);= sim(中);你= out.yout;瓦尔斯=[你{1}.Values.Data,你{2}.Values.Data,你{3}.Values.Data);f =总和((M - val)。^ 2, 2);f = (f)和f (f(1) +(结束))/ 2;结束

下面的代码创建parobjfunhelper函数。

函数f = parobjfun (params思敏,M,模型)N =大小(params, 1);f = 0 (N, 1);i = 1: N思敏(i) = setparam(思敏(i)、模型参数(我,:));结束simOut = parsim(思敏,“ShowProgress”,“关闭”);%抑制输出i = 1: N你= simOut .yout;瓦尔斯=[你{1}.Values.Data,你{2}.Values.Data,你{3}.Values.Data);g =总和((M - val)。^ 2, 2);f (i) =总和(g) - (g (1) + g(结束))/ 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),“工作区”模型);结束

另请参阅

|(万博1manbetx模型)

相关的话题