我有一个功能 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的最佳值?
答案 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循环。不要在内循环中使用它,因为它会更慢。