matlab中globalsearch,MATLAB中fmincon和globalsearch、multistart优化问题
本帖最后由 wwwjjj7008 于 2018-3-21 10:24 編輯
問題描述:從四個參數(shù)的給定范圍r1[200 300]、r2[50 100]、l1[150 200]、l2[150 250]中,任取一組數(shù),代入:
h = sqrt(l2*l2-(3*r1/2-3*l1*cos(t)/2-90.9).^2 -(3^0.5*r1/2-3^0.5*l1*cos(t)/2-119.1).^2);
x = 0.39*r1-0.16*r2-0.39*l1*cos(t)-0.54*h+8.24 ;
z = 1.39*r1 - 1.16*r2 - 1.39 * l1 * cos(t) + l1*sin(t) +0.46*h+14.41;
其中t的變化范圍是:50*pi/180~57*pi/180
得到xz曲線,求曲線關(guān)于坐標(biāo)軸所圍成面積最大時的那組參數(shù),并輸出面積和最大時的圖像。
下面是我用fmincon,globalsearch和multistart分別的結(jié)果:
GetS.m:
function S = GetS(data)
% 待優(yōu)化函數(shù)
% 輸出S 為待優(yōu)化的面積 z(x)與x軸圍成的面積
r1 = data(1);r2 = data(2);l1 = data(3);l2 = data(4);
syms t;
h = sqrt(l2*l2-(3*r1/2-3*l1*cos(t)/2-90.9).^2 -(3^0.5*r1/2-3^0.5*l1*cos(t)/2-119.1).^2);
x = 0.39*r1-0.16*r2-0.39*l1*cos(t)-0.54*h+8.24 ;
z = 1.39*r1 - 1.16*r2 - 1.39 * l1 * cos(t) + l1*sin(t) +0.46*h+14.41;
% x(t)的一階導(dǎo)數(shù)
x_ = diff(x);
del = 100;
t = linspace(50*pi/180,57*pi/180,del);
% 將t代入上述表達(dá)式中 求解對應(yīng)的x,z
xda = subs(x);
zda = subs(z);
x_da = subs(x_);
digits(10);
% 將數(shù)據(jù)格式轉(zhuǎn)化為double
zda = double(vpa(zda));
xda = double(vpa(xda));
x_da = double(vpa(x_da));
% 忽略虛數(shù)解
zda = zda(abs(imag(zda))<=1e-6);
xda = xda(abs(imag(xda))<=1e-6);
x_da = x_da(abs(imag(x_da))<=1e-6);
% 參數(shù)方程的積分方法
deltat = pi/(2*del);
% 積分??原理有附圖解釋
S = sum(x_da.*zda*deltat);
% 用trapz也可以
% S = trapz(xda,zda);
% 為了優(yōu)化 取負(fù)
S = -S;
end
plotxz.m:
function y = plotxz( data )
% 輸入函數(shù)data為數(shù)組 分別對應(yīng) r1 r2 l1 l2
% 函數(shù)功能:畫函數(shù)圖像z(x)
% data分別對應(yīng)r1 r2 l1 l2
r1 = data(1);r2 = data(2);l1 = data(3);l2 = data(4);
% 定義符號變量 t
syms t;
h = sqrt(l2*l2-(3*r1/2-3*l1*cos(t)/2-90.9).^2 -(3^0.5*r1/2-3^0.5*l1*cos(t)/2-119.1).^2);
x = 0.39*r1-0.16*r2-0.39*l1*cos(t)-0.54*h+8.24 ;
z = 1.39*r1 - 1.16*r2 - 1.39 * l1 * cos(t) + l1*sin(t) +0.46*h+14.41;
% t 生成100個50*pi/180~57*pi/180之間的數(shù)
t = linspace(50*pi/180,57*pi/180,100);
% 將t代入上述表達(dá)式中 求解對應(yīng)的x,z
xda = subs(x);
zda = subs(z);
% 將數(shù)據(jù)格式轉(zhuǎn)化為double
zda = double(vpa(zda));
xda = double(vpa(xda));
% 忽略虛數(shù)解
zda = zda(abs(imag(zda))<=1e-6);
xda = xda(abs(imag(xda))<=1e-6);
figure
plot(xda,zda)
grid on
y=1;
end
%下面是主函數(shù)
% 設(shè)置優(yōu)化約束條件
options.TolCon = 1e-15;
options.TolX = 1e-15;
options.TolFun = 1e-15;
% 設(shè)置迭代優(yōu)化代數(shù):500
options = gaoptimset(options, 'Generations', 500);
%上邊界
LB = [200,50,150,150];
% 上邊界
UB = [300,100,200,250];
% 優(yōu)化初始值
x0 = [200,50,180,180];
關(guān)鍵是下面用三種不同的優(yōu)化主函數(shù),得到的結(jié)果不同,而且對初始值非常敏感:
(1)用fmincon優(yōu)化的主函數(shù)
main.m:
options = optimset('LargeScale','off');
% 優(yōu)化函數(shù) fmincon 待優(yōu)化函數(shù)為 GetS函數(shù)
[ANSW,FVAL] = fmincon(@(data)GetS(data),x0,[],[],[],[],LB,UB,[],options);
% 優(yōu)化結(jié)果r1 r2 l1 l2 存放在ANSW數(shù)組里面
plotxz( ANSW );
% 優(yōu)化求解的最大面積
S=-FVAL
結(jié)果1.png (13.45 KB, 下載次數(shù): 1)
2018-3-21 10:22 上傳
結(jié)果2.png (13.25 KB, 下載次數(shù): 1)
2018-3-21 10:22 上傳
(2)用globalsearch優(yōu)化的主函數(shù)
main.m:
f = @(data)GetS(data);
problem = createOptimProblem('fmincon','objective',f,'x0',x0,'lb',LB,'ub',UB,'options',optimset('Algorithm','SQP','DISP','none'));
gs = GlobalSearch;
xgs = run(gs,problem);
% 優(yōu)化結(jié)果r1 r2 l1 l2 存放在xgs數(shù)組里面
plotxz( xgs );
xgs
S = -GetS(xgs)
結(jié)果1.png (7.58 KB, 下載次數(shù): 1)
2018-3-21 10:23 上傳
結(jié)果2.png (12.35 KB, 下載次數(shù): 1)
2018-3-21 10:23 上傳
(3)用multistart優(yōu)化的主函數(shù)
main.m:
f = @(data)GetS(data);
problem = createOptimProblem('fmincon','objective',f,'x0',x0,'lb',LB,'ub',UB,'options',optimset('Algorithm','SQP','DISP','none'));
ms = MultiStart;
tic
xgs_m = run(ms,problem,50);
toc
% 優(yōu)化結(jié)果r1 r2 l1 l2 存放在xgs_m數(shù)組里面
plotxz( xgs_m );
xgs_m
S = -GetS(xgs_m)
結(jié)果1.png (14.02 KB, 下載次數(shù): 0)
2018-3-21 10:23 上傳
結(jié)果2.png (11.04 KB, 下載次數(shù): 2)
2018-3-21 09:55 上傳
求大神指點迷津,我這到底哪里出錯了?理論上globalsearch和multistart的結(jié)果應(yīng)該會比fmincon的結(jié)果更優(yōu)不是嗎?
總結(jié)
以上是生活随笔為你收集整理的matlab中globalsearch,MATLAB中fmincon和globalsearch、multistart优化问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Restful风格的理解
- 下一篇: 淘宝的架构