洛伦谈MATLAB的艺术

将想法转化为MATLAB

寻找最优值

你是否曾经需要解决存在局部极小值的优化问题?你使用什么策略来解决它,试图找到“最佳”答案?今天,我将讨论一个简单的策略,在 全局优化工具箱 .

解决一个简单的问题

或者至少让我们试试。我有一些数据,我想用一条特定形式的曲线来拟合它。首先让我们看看药代动力学数据。参考: 非线性代数模型的全局优化参数估计。 《计算机与化学工程》,第22卷,补编1,1998年3月15日,第S213-S220页William R.Esposito,Christodoulos A.Floudas。
数据是时间与浓度的对比
T = [3.92, 7.93, 11.89, 23.90, 47.87, 71.91, 93.85, 117.84]
t = 1×8
3.9200 7.9300 11.8900 23.9000 47.8700 71.9100 93.8500 117.8400
C = [0.163, 0.679, 0.679, 0.388, 0.183, 0.125, 0.086, 0.0624]
c = 1×8
0.1630 0.6790 0.6790 0.3880 0.1830 0.1250 0.0860 0.0624
我喜欢查看数据,部分是为了确保我没有输入错误,部分是为了对整个系统有一个感觉。事实上,让我们将数据可视化。
图(t,c,“o”)
包含(“时间”)
ylabel (“浓度”)

三室模型

在参考文献中,我们拟合一个3室模型,3个衰减指数的和。
c=b1e(-b4t)+b2e(-b5t)+b3e(-b6t)" style="vertical-align:-6px"> C = B 1. E ( - B 4. T ) + B 2. E ( - B 5. T ) + B 3. E ( - B 6. T )
我们可以将该模型表示为 匿名函数 属于 T (时间)和模型参数[ b(1)b(2)…b(6)] .
模型=@(b,t)b(1)*exp(-b(4)*t)+b(2)*exp(-b(5)*t)+b(3)*exp(-b(6)*t)
模型=函数\带有值的句柄:@(b,t)b(1)*exp(-b(4)*t)+b(2)*exp(-b(5)*t)+b(3)*exp(-b(6)*t)

定义优化问题

接下来,我们将使用 具体问题具体分析公式 。这允许我们选择所需的解算器,提供数据,并自然表达约束和选项。
problem=createoptim问题(“lsqcurvefit”,...
“目标”、模型...
“扩展数据”T“伊达塔”C...
“x0”,一(1,6),...
“磅”, [-10 -10 -10 0 0 0 ],...
“ub”, [ 10 10 10 0.5 0.5 0.5],...
“选项”,最佳选择(“lsqcurvefit”,...
“OutputFcn”,@curvefittingplots迭代,...
“显示”,“没有”))
问题=带字段的结构:
目标:@(b,t)b(1)*exp(-b(4)*t)+b(2)*exp(-b(5)*t)+b(3)*exp(-b(6)*t)x0:[11]扩展数据:[3.9200 7.9300 11.8900 23.9000 47.8700 71.9100 93.8500 117.8400]ydata:[0.1630.6790 0.6790 0.6790 0.3880 0.1830.1250.0860 0.0624]lb:[10-10-10-10-10.000]ub:[10 10 10.5000]选项:'0.5000]

解决问题

首先直接解决问题一次。
b = lsqcurvefit(问题)
b = 1×6
0.1842 0.1836 0.1841 0.0172 0.0171 0.0171
您会注意到,模型没有很好地拟合数据,甚至没有遵循数据的形状。

多部分

让我们看看我们是否可以从不同的角度出发做得更好。
ms=多段;
女士显示器=“国际热核实验堆”;
rng违约
图形
抽搐
[~,fval,exitflag,output,金宝搏官方网站solutions]=运行(毫秒,问题,50)
运行本地一阶索引exitflag f(x)#国际热核聚变实验堆F计数最优性13 0.2228 63 0.0006396 2 3 0.000154 21 154 0.001864 3 0.009442 44 315 0.01989 4 3 1.462e-05 34 245 0.002586 5 3 1.454e-05 19 140 1.079e-05 6 3 1.475e-05 24 175 0.006883 0.0094450.002266 8 3 1.495e-05 32 231 0.006853 9 3 1.466e-05 10 0.079e-05 31.079 E-05 31.475 0.017 0.077 0.077 0.00883 1 0.017-053 1.566e-05 24175 0.001576 13 0.009439 24175 0.0005121 14 0.009451 41 294 0.02935 15 3 0.009493 26 1890.004837 16 3 1.476e-05 40287 0.006352 17 3 1.494e-05 40287 0.008288 18 3 0.009446 62 441 0.01296 19 3 1.457e-05 22 161 0.001755 20 3 21.488e-05 53 378 0.007608 21 0.00944 00337 266 0.0724 E-469308 0.02515 24 3 0.009447 47 336 0.007942 25 3 1.455e-05 23 168 0.001621 26 3 0.009442 32 231 0.01328 27 3 1.479e-05 40 287 0.004821 28 3 1.479e-05 18 133 0.006878 29 3 1.456e-05 72 511 0.0009721 30 3 1.455e-05 42 301 0.001122 31 0.009441 47 336 0.01537 32 3 0.009451 336 0.0013 942 33 0.000723 34.3150.31503 0.0001751 21 154 7.71e-05 36 3 1.509e-05 26 189 0.009896 37 0.009458 39 280 0.02208 38 1 1.454e-05 24 175 7.815e-08 39 3 0.009441 60 427 0.0107 40 3 1.472e-05 34 245 0.002981 41 3 1.503e-05 22 161 0.00585 42 3 0.00952 15 112 0.008492 43 0.009439 21 154 0.000769 44 3 1.462 E-05 64 455 0.00045 430.017.017-452170.001973 47 3 0.009444 38 273 0.02022 48 3 1.474e-05 24 175 0.004799 49 3 1.522e-05 42 301 0.008228
50 3 0.009445 40 287 0.02166 MultiStart已完成从所有起点开始的运行。所有50次局部解算器运行均与正局部解算器退出标志收敛。
fval=1.4540e-05
exitflag=1
输出=带字段的结构:
funcCount:12726 localSolverTotal:50 localSolverSuccess:50 localSolverIncomplete:0 localSolverNoSolution:0消息:“MultiStart已完成所有起点的运行。↵↵所有50个局部解算器运行都与正的局部解算器退出标志聚合。”
金宝搏官方网站解决方案= 1×50物体
1. 2. 3. 4. 5. 6. 7. 8. 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
1. 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解 1×1全局最优解
serialTime=toc;

设想最佳解决方案

上面绘制的第50个解决方案不一定是最好的。幸运的是, 多部分 从最佳到最差排序解决方金宝搏官方网站案。所以我们只需要看第一个。
曲线设置图迭代(解决方案)金宝搏官方网站
您现在可以看到,第50个不是最佳解决方案,因为最后一个显示的均方误差超过了10倍。

MultiStart与并行计算

现在,我将看看是否可以在本地使用我的所有4个内核作为并行工作线程来提高性能。
ms.UseParallel=true;
gcp;
抽搐;
rng违约
运行(ms,问题,50);
并行运行本地求解器。运行当地当地当地一阶指数exitflag f (x) # iter F-count最优1 3 8 0.222 63 0.0006396 567 0.00944 80 0.01042 252 0.00478 1.466 e-05 35 2 3 154 21 0.000154 1.476 0.001864 16 3 e-05 189 0.004837 287 0.009493 0.006352 15 3 26 14 3 0.009451 41 294 0.02935 315 0.01989 0.009442 44 22 175 0.003709 1.464 e-05 24 21 30.009443.7.266.0.006878 20 3 1.488e-05 53 378 0.007608 4 3 1.462e-05 34 245 0.002586 8 3 1.495e-05 32 231 0.006853 7 3 0.009445 50 357 0.002266 6 3 1.475e-05 24 175 0.006883 5 3 1.454e-05 19 140 1.079e-05 28 3 1.479e-05 18 133 0.006878 27 3 1.479e-05 40 287 0.004821 26 3 0.009442 32 231 0.01328 25 3 1.455e-05 23 168 0.001621 13 3 0.009439 24 175 0.0005121 12 3 1.566e-05 24 175 0.001576 11 3 1.471e-05 40 287 0.005472 34 3 0.009442 44 315 0.01062 33 3 0.0001729 14 105 0.0003276 32 3 0.009451 47 336 0.008942 19 3 1.457e-05 22 161 0.001755 18 3 0.009446 62 441 0.01296 17 3 1.494e-05 40 287 0.008288 24 3 0.009447 47 336 0.007942 23 3 0.009449 43 308 0.02515 31 3 0.009441 47 336 0.01537 30 3 1.455e-05 42 301 0.001122 29 3 1.456e-05 72 511 0.0009721 42 3 0.00952 15 112 0.008492 45 3 0.009439 17 126 0.0001567 37 3 0.009458 39 280 0.02208 36 3 1.509e-05 26 189 0.009896 35 3 0.0001751 21 154 7.71e-05 40 3 1.472e-05 34 245 0.002981 39 3 0.009441 60 427 0.0107 38 1 1.454e-05 24 175 7.815e-08 41 3 1.503e-05 22 161 0.00585 49 3 1.522e-05 42 301 0.008228 47 3 0.009444 38 273 0.02022 44 3 1.462e-05 64 455 0.0005576 43 3 0.009439 21 154 0.000769 48 3 1.474e-05 24 175 0.004799 50 3 0.009445 40 287 0.02166 46 3 1.471e-05 30 217 0.001973 MultiStart completed the runs from all start points. All 50 local solver runs converged with a positive local solver exit flag.
parallelTime = toc;

计算加速

由于游泳池启动时间的原因,在第二次跑步之前,速度可能并不明显。因为我之前就开始了跑步,所以我看到了不错的速度。
加速比=串行时间/并行时间
加速比=2.5014

您是否存在解决方案对起点敏感的问题?

告诉我们 关于你的问题的解决空间的探索。如果解决方案对你开始的地方敏感,你可以考虑使用。 多部分 以及全局优化工具箱中的其他技术。
版权所有2021年MathWorks公司。

附录

下面是绘制迭代的代码。
数据库类型曲线点阵图迭代
1 function stop = curvefittingPlotIterates(x,optimValues,state) 2%用于绘制优化算法迭代图的输出函数。3 4%版权所有2010 The MathWorks, Inc. 5 6 persistent x0 r;7 if nargin == 1 8 showPlot(x(1).X,x(1).X0{:},x(1).Fval) 9 else 10 switch state 11 case 'init' % store initial point for later use 12 x0 = x;13 case 'done'优化后,显示解决方案在plot title 16 r = optimValues.resnorm;7 showPlot(x,x0,r) 18 end 19 end 20 end 21 if nargout > 0 22 stop = false;28 if = @(b,x) b(1)*exp(-b(4).*x) + b(2).*exp(-b(5).*x) +…29 b(3)。* exp (- b (6) . * x);30 31 persistent h ha 32 if is空(h) || ~isvalid(h) 33 x = [3.92, 7.93, 11.89, 23.90, 47.87, 71.91, 93.85, 117.84];34 y = [0.163, 0.679, 0.679, 0.388, 0.183, 0.125, 0.086, 0.0624]; 35 plot(x,y,'o'); 36 xlabel('t') 37 ylabel('c') 38 title('c=b_1e^{-b_4t}+b_2e^{-b_5t}+b_3e^{-b_6t}') 39 axis([0 120 0 0.8]); 40 h = line(3:120,f(b,3:120),'Color','r','Tag','PlotIterates'); 41 42 else 43 set(h,'YData',f(b,get(h,'XData'))); 44 end 45 s = sprintf('Starting Value Fitted Value\n\n'); 46 47 for i = 1:length(b) 48 s = [s, sprintf('b(%d): % 2.4f b(%d): % 2.4f\n',i,b0(i),i,b(i))]; 49 end 50 s = [s,sprintf('\nMSE = %2.4e',r)]; 51 52 if isempty(ha) || ~isvalid(ha) 53 % Create textbox 54 ha = annotation(gcf,'textbox',... 55 [0.5 0.5 0.31 0.32],... 56 'String',s,... 57 'FitBoxToText','on',... 58 'Tag','CoeffDisplay'); 59 end 60 ha.String = s; 61 drawnow 62 63 end
|
  • 打印
  • 发送电子邮件

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。