带额外参数的并行优化(fmincon)

时间:2015-11-26 01:08:39

标签: matlab optimization parallel-processing

我有一个功能     F = P1 + 2 *一个 C P2 + 2 *一个 B'/ EM> P3 + 2 * B C P4

,其中

p1=-sin(((x(2)-x(1))/2)+((x(4)-x(3))/2)+((x(6)-x(5))/2))+sin(((x(4)-   x(3))/2)+((x(6)-x(5))/2)-((x(2)-x(1))/2))+sin(((x(2)-x(1))/2)+((x(6)-x(5))/2)-((x(4)-x(3))/2))+sin(((x(2)-x(1))/2)+((x(4)-x(3))/2)-((x(6)-x(5))/2));
p2=sin(((x(2)-x(1))/2)+((x(4)-x(3))/2)+((x(6)-x(5))/2))+sin(((x(4)-x(3))/2)+  ((x(6)-x(5))/2)-((x(2)-x(1))/2))-sin(((x(2)-x(1))/2)+((x(6)-x(5))/2)-((x(4)-x(3))/2))+sin(((x(2)-x(1))/2)+((x(4)-x(3))/2)-((x(6)-x(5))/2));
p3=sin(((x(2)-x(1))/2)+((x(4)-x(3))/2)+((x(6)-x(5))/2))-sin(((x(4)-x(3))/2)+((x(6)-x(5))/2)-((x(2)-x(1))/2))+sin(((x(2)-x(1))/2)+((x(6)-x(5))/2)-((x(4)-x(3))/2))+sin(((x(2)-x(1))/2)+((x(4)-x(3))/2)-((x(6)-x(5))/2));

P4 = SIN(((X(2)-x(1))/ 2)+((X(4)-x(3))/ 2)+((X(6)-x(5) )/ 2))+ SIN(((X(4)-x(3))/ 2)+((X(6)-x(5))/ 2) - ((X(2)-X(1 ))/ 2))+ SIN(((X(2)-x(1))/ 2)+((X(6)-x(5))/ 2) - ((X(4)-x( 3))/ 2)) - 罪(((X(2)-x(1))/ 2)+((X(4)-x(3))/ 2) - ((X(6)-x (5))/ 2));

和x1直到x6是受0到pi的约束约束的角度。

我希望在a = [0:0.01:1]和b = [0:0.01:1]的范围内最小化此函数。 (也就是说,我想最小化每个a的函数,b = 0,a,b = 0.01,a,b = 0.02 ......等等。)

所以这是我的代码

第1步:写一个文件objfun.m。

function f= objfun (x,a,b,c)

a=.57;

b=.57;    % i pick a number for a,b

c=sqrt(1-a*a-b*b);
p1=-sin(((x(2)-x(1))/2)+((x(4)-x(3))/2)+((x(6)-x(5))/2))+sin(((x(4)-  x(3))/2)+((x(6)-x(5))/2)-((x(2)-x(1))/2))+sin(((x(2)-x(1))/2)+((x(6)-x(5))/2)-  ((x(4)-x(3))/2))+sin(((x(2)-x(1))/2)+((x(4)-x(3))/2)-((x(6)-x(5))/2));
p2=sin(((x(2)-x(1))/2)+((x(4)-x(3))/2)+((x(6)-x(5))/2))+sin(((x(4)-x(3))/2)+((x(6)-x(5))/2)-((x(2)-x(1))/2))-sin(((x(2)-x(1))/2)+((x(6)-x(5))/2)-((x(4)-x(3))/2))+sin(((x(2)-x(1))/2)+((x(4)-x(3))/2)-((x(6)-x(5))/2));
p3=sin(((x(2)-x(1))/2)+((x(4)-x(3))/2)+((x(6)-x(5))/2))-sin(((x(4)-x(3))/2)+((x(6)-x(5))/2)-((x(2)-x(1))/2))+sin(((x(2)-x(1))/2)+((x(6)-x(5))/2)-((x(4)-x(3))/2))+sin(((x(2)-x(1))/2)+((x(4)-x(3))/2)-((x(6)-x(5))/2));
p4=sin(((x(2)-x(1))/2)+((x(4)-x(3))/2)+((x(6)-x(5))/2))+sin(((x(4)-x(3))/2)+((x(6)-x(5))/2)-((x(2)-x(1))/2))+sin(((x(2)-x(1))/2)+((x(6)-x(5))/2)-((x(4)-x(3))/2))-sin(((x(2)-x(1))/2)+((x(4)-x(3))/2)-((x(6)-x(5))/2));
f=p1+2*a*c*p2+2*a*b*p3+2*b*c*p4;

第2步:调用约束优化例程。

x=[x(1),x(2),x(3),x(4),x(5),x(6)]; % angles;
lb=[0,0,0,0,0,0];
ub=[pi,pi,pi,pi,pi,pi];
x0=[pi/8;pi/3;0.7*pi;pi/2;.5;pi/4];
[x,fval]=fmincon(@objfun,x0,[],[],[],[],lb,ub)

产生的解决方案是

x=
   2.5530
   0.6431
   2.5305
   0.6195
   2.5531
   0.6421

   fval= -4.3546 

我需要做什么来为a和b运行优化范围为0:0.01:1,并保存每个a,b的最佳值?

1 个答案:

答案 0 :(得分:1)

您可以在Mathworks找到关于此主题的详尽的文档

您的问题由两部分组成。首先,传递附加参数 a和b,例如可以使用匿名函数 (参见上面的链接)。这样做是这样的:

f = @(x)objfun(x,a,b);

其次,将函数包装成for循环或(如果你有并行计算工具箱,我会从你的标题和注释中假设)在parfor循环中。

a = 0:0.01:1;
b = 0:0.01:1;
xvals = zeros(length(a), length(b));

for i = 1 : length(a)
    for i = 1 : length(b)
        .
        . invoke your routine here
        .
         f = @(x)objfun(x,a(i),b(i));
         [x,fval]=fmincon(@objfun,x0,[],[],[],[],lb,ub);
         x_cell{i, j} = x;
         fvals(i, j) = fval;
    end
end

在完成之后,您可以访问各个值和参数集,例如通过索引x_cell {1,2}获得a = 0和b = 0.01;类似于fvals,但带有圆括号。

并行处理:如果您要执行此操作,请为外循环使用parfor循环。不要在内循环中使用它,因为它会更慢。