使用for循环和if语句的额外参数(fmincon)的并行优化

时间:2015-11-29 01:51:40

标签: matlab if-statement for-loop

我正在尝试使用for循环为每个a进行并行处理优化(fmincon),b = 0:。01:1包括if语句因为我有一个标准化条件,即^ 2 + b ^ 2 + c ^ 2 = 1然后c = sqrt(1-a ^ 2-b ^ 2)。我对编码感到困惑。 我尝试了这段代码(见下文),但它无法正常工作。 我写了一个文件objfun.m。

function f= objfun (x,a,b,c)
    load test.mat a 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;

我写了主文件

%x=[x(1),x(2),x(3),x(4),x(5),x(6)]; % angles;
clc;
p=0:0.1:1;q=0:0.1:1;
for m=1:length(p)
for n=1:length(q)
    a=p(m);b=q(n);
    if a^2+b^2+c^2=1 Then c=sqrt(1-a*a-b*b) 
    save test.mat a b
    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);
    clear a b
    opt_val(m,n)=fval;
    end 
end
end

要使此代码有效,我需要做些什么?我需要一些关于构造主文件的帮助。

1 个答案:

答案 0 :(得分:0)

正如您的错误消息所述,主代码中的此行存在问题:

if a^2+b^2+c^2=1 Then c=sqrt(1-a*a-b*b)

这里有一些问题。首先,这不是if子句的有效MATLAB语法。有关正确的语法,请参阅the documentation

其次,MATLAB中的单个=赋值运算符,而不是比较。为了测试相等性,您需要使用==,例如:如果a==b等于truea将产生b,否则将产生false