罗兰关于MATLAB的艺术

将想法转化为MATLAB

求最优值

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

解决一个简单的问题

或者至少让我们试试。我有一些数据,我想拟合一个特定形式的曲线。首先让我们看看药代动力学数据。参考资料如下: 基于全局优化的非线性代数模型参数估计。 计算机与化学工程,第22卷,增编1,1998年3月15日,S213-S220页。
数据是时间与注意力的对比
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”
xlabel(“时间”
伊拉贝尔(“专注”

三室模型

如参考文献中所述,我们拟合了一个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 (时间)及模型参数[ (1) b(2)……b (6)]
模型= @ (b, t) b (1) * exp (t - b (4) *) + b (2) * exp (t - b (5) *) + b (3) * exp (t - b (6) *)
模型=function_handle与价值:@ (b, b t) (1) * exp (t - b (4) *) + b (2) * exp (t - b (5) *) + b (3) * exp (t - b (6) *)

定义优化问题

接下来,我们定义优化问题来解决使用 基于问题的公式 .这允许我们选择我们想要的求解器,提供数据,并自然地表达约束和选项。
问题= createOptimProblem (“lsqcurvefit”...
“目标”模型...
“xdata”t“ydata”c...
“x0”的(6),...
“磅”, [-10 -10 -10 0 0 0],...
乌兰巴托的, [10 10 10 0.5 0.5 0.5],...
“选项”optimoptions (“lsqcurvefit”...
“OutputFcn”@curvefittingPlotIterates,...
“显示”“没有”))
问题=结构体字段:
摘要目的:@ (b, b t) (1) * exp (t - b (4) *) + b (2) * exp (t - b (5) *) + b (3) * exp (t - b (6) *) x0: [1 1 1 1 1 1] xdata: [3.9200 7.9300 11.8900 23.9000 47.8700 71.9100 93.8500 117.8400] ydata:[0.1630 0.6790 0.6790 0.3880 0.1830 0.1250 0.0860 0.0624]磅:[-10 -10 -10 0 0 0]乌兰巴托:[10 10 10 0.5000 0.5000 0.5000]解算器:“lsqcurvefit”选项:[1×1 optim.options.Lsqcurvefit]

解决这个问题

首先直接解决问题一次。
b=lsqcurvefit(问题)
b = 1×6
0.1842 0.1836 0.1841 0.0172 0.0171 0.0171
您会注意到,该模型在拟合数据甚至跟踪数据的形状方面做得并不出色。

MultiStart

我们看看能不能从不同的点开始。
女士= MultiStart;
ms.Display =“通路”
rng默认的
数字
抽搐
[~,fval,exitflag,output,金宝搏官方网站solutions] = run(ms, problem, 50)
运行当地当地当地一阶指数exitflag f (x) # iter F-count最优1 3 0.222 8 0.000154 21 154 0.001864 63 0.0006396 - 2 3 3 3 0.009442 44 315 0.01989 4 3 e-05 34 245 0.002586 1.462 1.454 e-05 19 140 1.079 e-05 6 3 1.475 e-05 24 175 0.009445 357 0.002266 0.006883 7 3 8 3 1.495 e-05 32 231 0.006853 9 3 1.466 e-05 35 252 0.004783 0.00944 80 567 0.01042 11 3 1.471 e-05 175 0.001576 287 1.566 0.005472 12 3 e-05 24 13 3 0.009439 24 175 0.0005121 14 3 0.009451 41 294 0.02935 189年15 3 0.009493 26日0.004837 16 3 1.476 e-05 287 0.008288 287 1.494 0.006352 17 3 e-05 40 18 62 441 0.009446 1.457 0.01296 19 3 e-05 22 161 1.488 0.001755 20 3 e-05 53 266 378 0.00944 0.007608 21 3 3722 3 1.464 e-05 24 175 0.006878 0.009449 0.003709 23 3 43 308 0.02515 24 336 0.007942 0.009447 47 25 3 1.455 e-05 23 168 0.009442 0.001621 26 3 32 231 0.01328 27日3 1.479 e-05 40 287 0.004821 28日3 1.479 e-05 18 133 0.0009721 0.006878 1.456 e-05 72 29 511 30 31 3 1.455 e-05 42 301 0.001122 336 0.01537 0.009441 47 32 3 0.009451 47 336 0.008942 33 30.0001729 315 0.01062 105 0.009442 0.0003276 34 3 44 35 3 0.0001751 21 154 1.509 7.71 e-05 36 3 e-05 26 189 0.009458 0.009896 37 3 39 280 0.02208 1.454 e-05 24 38 175 0.009441 427 0.0107 7.815 e-08 39 3 40 245 0.002981 1.472 e-05 34 41 3 1.503 e-05 22 161 0.00585 42 3 0.00952 112 0.009439 0.008492 43 3 21 154 0.000769 1.462 e-05 44 64 4550.0005576 45 3 0.009439 17 126 0.0001567 46 3 1.471e-05 30 217 0.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
MultiStart从所有起始点完成运行。所有50个本地求解器都以一个正的本地求解器退出标志运行。
fval = 1.4540 e-05
exitflag = 1
输出=结构体字段:
funcCount: 12726 localSolverTotal: 50 localSolverSuccess: 50 localSolverIncomplete: 0 localSolverNoSolution: 0 message: 'MultiStart completed the runs from all start points。↵↵所有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 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution 1×1 GlobalOptimSolution
serialTime = toc;

设想最佳解决方案

第50个解,也就是上面画的,不一定是最好的。幸运的是, MultiStart 按最好到最坏的顺序排列金宝搏官方网站解决方案。所以我们只需要看第一个。
curvefittingPlotIterates(金宝搏官方网站解决方案)
你现在可以看到,第50个不是最好的解决方案,因为最后一个显示的均方误差要高出10倍。

多部分并行计算

现在,我将看看是否可以在本地使用所有4个内核作为并行工作器来提高性能。
ms.UseParallel = true;
gcp;
抽搐;
rng默认的
运行(女士,问题,50);
并行运行本地解算器。运行本地一阶索引exitflag f(x)#iter F计数最优性1 30.222 8 63 0.0006396 10 3 0.00944 80 567 0.01042 9 3 1.466e-05 35 252 0.00478 2 3 0.000154 21 154 0.001864 16 3 1.476e-05 40 287 0.006352 15 0.009493 26 189 0.004837 14 0.009451 41 294 0.02935 3 0.009442 44 315 0.01989 22 3 1.464e-05 24 175 0.003709 21 0.006352 15 0.009493 26 189 0.00878 E-8 83 1.462e-05 34 245 0.002588 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 28 31.479e-05 18 133 0.006878 27 3 1.479e-05 40 287 0.004821 26 0.009442 32 231 0.01328 25 3 1.455e-05 23 0.001621 13 168 0.430.00112 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17.079 E-079e-17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17287 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 0.009447 47 336 0.007942 23 0.009449 43 308 0.02515 31 3 0.009441 47 336 0.01537 30 1 1.455 1 1 1 1 1 1 1 0.00142 511 972 0.013 0.00952 15 112 0.008492 45 3 0.009439 17 126 0.0001567 37 3 0.009458 39 280 0.020836 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.454e-05 24 175 7.815e-08 41 3 1.503e-05 22 161 0.00585 49 3 1.522e-05 42 0.0080.023 464 2455 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多批次从所有起点完成运行。所有50个局部解算器运行都与正的局部解算器退出标志会合。
并行时间=toc;

计算加速比

由于水池启动时间的关系,在第二轮之前速度可能不会明显加快。自从我更早开始,我就看到了不错的速度。
加速= serialTime / parallelTime
加速= 2.5014

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

告诉我们 关于你对问题解决方案空间的探索。如果解决方案对起始位置敏感,则可以考虑使用 MultiStart 以及全局优化工具箱中的其他技术。
版权所有:The MathWorks, Inc.

附录

下面是绘制迭代的代码。
dbtypecurvefittingPlotIterates
1函数停止=curvefittingPlotIterates(x,optimValues,state)2%输出函数,用于绘制优化算法的迭代。3 4%版权2010年MathWorks,Inc.5 6 r;7如果nargin==1 8显示图(x(1).x(1).X0{:},x(1).Fval)9其他10开关状态11 case'init'%存储初始点供以后使用12 X0=x;13案例“完成”14如果优化后~(optimValues.iteration==0)15%,则在绘图标题16 r=optimValues.resnorm中显示解决方案;17显示图(x,x0,r)18结束19结束20结束21如果nargout>0 22停止=错误;23清除功能24结束25结束26 27功能显示图(b,b0,r)28 f=@(b,x)b(1)*exp(-b(4)。*x)+b(2)。*exp(-b(5)。*x)+。。。29 b(3)。*exp(-b(6)。*x);30 31持续性h ha 32如果是空的(h)| | ~是有效的(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图(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轴([0 120 0 0.8]);40 h=直线(3:120,f(b,3:120),‘颜色’、‘r’、‘标记’、‘绘图迭代’);41 42其他43组(h,'YData',f(b,get(h,'XData'));44 end 45 s=sprintf(“起始值拟合值\n\n”);46 47对于i=1:length(b)48 s=[s,sprintf('b(%d):%2.4fb(%d):%2.4f\n',i,b0(i),i,b(i));49结束50秒=[s,sprintf('\nMSE=%2.4e',r)];51 52如果isempty(ha)| | ~ isvalid(ha)53%创建文本框54 ha=注释(gcf,'textbox',…55[0.50.50.31 0.32],…56'String',s,…57'FitBoxToText','on',…58'Tag','CoefDisplay');59端60公顷。串=s;61现在62 63结束
|
  • 打印
  • 发送电子邮件

评论

要发表评论,请点击此处登录到您的 数学作品帐户或创建一个新帐户。