面向自定义并行仿真的矢量代理优化
方法的使用surrogateopt
UseVectorized
选项执行自定义并行优化。方法时,可以使用此技术UseParallel
成功的选择。例如,UseParallel
选项可能不适用于需要的Simulink®仿真金宝appparsim
用于并行计算。优化向量化并行模拟需要相当大的开销,因此这种技术对于耗时的模拟最有用。
本例中的并行策略是将优化分解为大小的块N
,在那里N
是并行工作者的数量。示例准备N
的参数集金宝app仿真软件。SimulationInput
向量,然后调用parsim
在向量上。当所有N
模拟完成,surrogateopt
更新代理程序并计算另一个代理程序N
参数集。
模型系统
本例试图使洛伦兹动力系统适应短时间间隔内的均匀圆周运动。在例子中描述了洛伦兹系统及其均匀圆近似拟合常微分方程(ODE).
的Lorenz_system.slx
金宝app采用Simulink模型实现Lorenz ODE系统。当您使用活动脚本运行此示例时,将包含此模型。
的fitlorenzfn
的辅助函数。本例结束从匀速圆周运动中计算点。从示例中设置圆周运动参数拟合常微分方程(ODE)能很好地匹配洛伦兹动力学。
X = 0 (8,1);X (1) = 1.2814;X (2) = -1.4930;X (3) = 24.9763;X (4) = 14.1870;X (5) = 0.0545;X (6: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(模型);in = 金宝appSimulink.SimulationInput(model);% params [X0,Y0,Z0,Sigma,Beta,Rho]Params = [10,20,10,8 / 3,28];原始参数Sigma, Beta, RhoIn = setparams(In,model,params);Out = sim(in);Yout = out.yout;H =数字;plot3(你{1}.Values.Data,你{2}.Values.Data,你{3}.Values.Data,“软”);视图(-70 [-30])
均匀圆周运动计算
计算的均匀圆周运动x
在洛伦兹计算的时间间隔内给出的参数,并将结果与洛伦兹图一起绘制。
tlist = yout{1}.Values.Time;M = fitlorenzfn(x,tlist);持有在plot3 (M (: 1), M (:, 2), M (:, 3),“kx”)举行从
的objfun
的辅助函数。本例结束计算洛伦兹系统与匀速圆周运动之间的平方和差。目标是使平方和最小化。
ssq = objfun(in,params,M,model)
SSQ = 26.9975
平行拟合洛伦兹系统
要优化适合度,请使用surrogateopt
修改Simulink模型参数。金宝app的parobjfun
的辅助函数。本例结束接受一个参数矩阵,其中矩阵的每一行表示一组参数。函数调用setparam
的辅助函数。本例结束设置参数金宝app仿真软件。SimulationInput
向量。的parobjfun
函数,然后调用parsim
对模型参数进行并行评估。
打开一个并行池并指定N
等于池子里的工位数。
池= gcp(“nocreate”);%查看是否存在并行池如果isempty(池)%如果没有,创建一个Pool = 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%的界限。
Lb = 0.8*params;Ub = 1.2*params;
为了提高速度,将模拟设置为使用快速重启。
set_param(模型,“FastRestart”,“上”);
创建矢量N
目标函数的仿真输入。
simIn(1:N) = 金宝appSimulink.SimulationInput(model);
为了重现性,设置随机流。
rng (100)
通过调用以向量化的并行方式优化目标parobjfun
.
tic [fittedparams,fval] = surrogateopt(@(params)parobjfun(simIn,params,M,model),lb,ub,options)
surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数计算限制。
fittedparams =1×610.5627 19.8962 9.8420 8.9616 2.5723 27.9687
Fval = 23.6361
并行时间= toc
并行时间= 457.9271
目标函数值提高(降低)。显示原始值和改进后的值。
disp ([ssq fval])
26.9975 - 23.6361
画出拟合点。
图(h)在In = setparams(In,model,fittedparams);Out = sim(in);Yout = out.yout;plot3(你{1}.Values.Data,你{2}.Values.Data,你{3}.Values.Data,“处方”);传奇(“不适合的洛伦兹”,“均匀运动”,“拟合洛伦兹”)举行从
要关闭模型,必须首先禁用快速重启。
set_param(模型,“FastRestart”,“关闭”);close_system(模型)
结论
当你不能使用UseParallel
选项成功后,可以通过设置并行优化模拟surrogateopt
UseVectorized
选项真正的
和BatchUpdateInterval
并行工作人员数量的倍数选项。这个过程加快了并行优化,但涉及开销,因此最适合耗时的模拟。
辅助函数
下面的代码创建fitlorenzfn
helper函数。
函数F = fitlorenzfn(x,xdata) theta = x(1:2);R = x(3);V = x(4);T0 = x(5);= x(6:8);F = 0(长度(xdata),3);f (: 3) = R * sin(θ(1))* sin (V * (xdata - t0)) +δ(3);f(:,1) = R*cos(V*(xdata - t0))*cos(theta(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(theta(2)) + (2);结束
下面的代码创建objfun
helper函数。
函数f = objfun(in,params,M,model) in = setparams(in,model,params);Out = sim(in);Yout = out.yout;vals = [yout{1}.Values.Data,yout{2}.Values.Data,yout{3}.Values.Data];f = sum((M - vals).^2,2);F = sum(F) - (F (1) + F (end))/2;结束
下面的代码创建parobjfun
helper函数。
函数f = parobjfun(simIn,params,M,model) N = size(params,1)f = 0 (N,1);为simIn(i) = setparams(simIn(i),model,params(i,:));结束simOut = parsim(simIn,“ShowProgress”,“关闭”);抑制输出为i = 1:N yout = simOut(i).yout;vals = [yout{1}.Values.Data,yout{2}.Values.Data,yout{3}.Values.Data];g = sum((M - vals).^2,2);F (i) = sum(g) - (g(1) + g(end))/2;结束结束
下面的代码创建setparam
helper函数。
函数Pp = setparams(in,model,params)%参数[X0,Y0,Z0,Sigma,Beta,Rho]pp = in.setVariable(“X0”参数(1)“工作区”模型);pp = pp. setvariable (“Y0”参数(2)“工作区”模型);pp = pp. setvariable (“Z0”params (3),“工作区”模型);pp = pp. setvariable (“σ”参数(4)“工作区”模型);pp = pp. setvariable (“β”params (5),“工作区”模型);pp = pp. setvariable (的ρparams (6),“工作区”模型);结束
另请参阅
surrogateopt
|parsim
(金宝app模型)