Search code examples
matlaboptimizationsymbolic-mathparticle-swarm

Matlab Pso Algorithm


I'm trying to solve a symbolic optimization problem using PSO optimizer in MATLAB. The variables r x a c n theta z are symbolic and CD is calculated by integrating r. The CD is the objective function with free variables a,n, theta and lb and ub are bounds. Full code is as follows:

    syms r x a c n theta z
    assume(n,'positive');
    D=0.24; 
    L=2;   
    f=L/D;  
    b=.8;   
    a0=0.02; 
    db=0.05;  
    V=1;    
    Re=(V*(D/2))/0.000001; 
    Cf=(0.075/(((log10(Re))-2)^2))+0.00025;
    
    % Define r(x) 
    c=L-a-b-a0;

    r1=0.5*D*(2*x/a)^(1/n);
    I1=simplify(int(2*pi*r1,x,a0,a));
    r2=D/2;
    I2=simplify(int(2*pi*r2,x,a,a+b));
    r3=(0.5*D)-((((3*D)/(2*(c)^2))-(tan(theta)/c))*(x-a-b)^2)+(((D/c^3 ... 
    (tand(theta)/c^2))*(x-a-b)^3); 
    I3=simplify(int(2*pi*r3,x,a+b,L));
    A=simplify(I1+I2+I3);
    Sn=pi*(D^2/4);
    Cdstar=Cf*(1+(60*f^-3 )+(0.0025*f))*(A/(L^2));
    Cdb=0.029*((db/D)^3)*(Cdstar^-0.5)*(Sn/(L^2));
    CD=simplify(Cdstar+Cdb);

    %optimization problem

    objective=matlabFunction(CD,'Vars',[a,n,theta])
    nVar=3;
    
    lb = [deg2rad(5),0.25,a0];
    ub = [deg2rad(60),5,L/2];


    options = 
    optimoptions('particleswarm','SwarmSize',100,'HybridFcn',@fmincon);

    [z,fval,exitflag,output] = particleswarm(objective,nVar,lb,ub,options)

And this is the error I get:

@(a,n,theta)pi.*4.404634153141517e-4+pi.*1.0./sqrt(pi.4.404634153141517e-4-pi.(a.*5.0-6.0).*1.0./(a.5.0e+1-5.9e+1).^3.(a.*2.32335e+6+tan((theta.*pi)./1.8e+2).*4.779e+6-tan(theta).*6.2658e+6-a.^2.*tan(theta).*2.655125e+7+a.^3.*tan(theta).*1.4875e+7-a.^4.*tan(theta).*3.125e+6-a.*tan((theta.*pi)./1.8e+2).*1.59975e+7+a.*tan(theta).*2.1063e+7+a.^2.*tan((theta.*pi)./1.8e+2).*2.008125e+7-a.^3.*tan((theta.*pi)./1.8e+2).*1.1203125e+7+a.^4.*tan((theta.*pi)./1.8e+2).*2.34375e+6-a.^2.*1.98e+6+a.^3.*5.625e+5-9.08811e+5).*1.223509486983755e-5-(n.pi.((a.*2.5e+1).^(-1.0./n)-2.0.^(1.0./n+1.0).*a.*2.5e+1).*1.101158538285379e-5)./(n+1.0)).9.440104166666668e-7-pi.(a.*5.0-6.0).*1.0./(a.5.0e+1-5.9e+1).^3.(a.*2.32335e+6+tan((theta.*pi)./1.8e+2).*4.779e+6-tan(theta).*6.2658e+6-a.^2.*tan(theta).*2.655125e+7+a.^3.*tan(theta).*1.4875e+7-a.^4.*tan(theta).*3.125e+6-a.*tan((theta.*pi)./1.8e+2).*1.59975e+7+a.*tan(theta).*2.1063e+7+a.^2.*tan((theta.*pi)./1.8e+2).*2.008125e+7-a.^3.*tan((theta.*pi)./1.8e+2).*1.1203125e+7+a.^4.*tan((theta.*pi)./1.8e+2).*2.34375e+6-a.^2.*1.98e+6+a.^3.*5.625e+5-9.08811e+5).*1.223509486983755e-5-(n.pi.((a.*2.5e+1).^(-1.0./n)-2.0.^(1.0./n+1.0).*a.*2.5e+1).*1.101158538285379e-5)./(n+1.0)

Not enough input arguments.

Error in symengine>@(a,n,theta)pi.*4.404634153141517e-4+pi.*1.0./sqrt(pi.4.404634153141517e-4-pi.(a.*5.0-6.0).*1.0./(a.5.0e+1-5.9e+1).^3.(a.*2.32335e+6+tan((theta.*pi)./1.8e+2).*4.779e+6-tan(theta).*6.2658e+6-a.^2.*tan(theta).*2.655125e+7+a.^3.*tan(theta).*1.4875e+7-a.^4.*tan(theta).*3.125e+6-a.*tan((theta.*pi)./1.8e+2).*1.59975e+7+a.*tan(theta).*2.1063e+7+a.^2.*tan((theta.*pi)./1.8e+2).*2.008125e+7-a.^3.*tan((theta.*pi)./1.8e+2).*1.1203125e+7+a.^4.*tan((theta.*pi)./1.8e+2).*2.34375e+6-a.^2.*1.98e+6+a.^3.*5.625e+5-9.08811e+5).*1.223509486983755e-5-(n.pi.((a.*2.5e+1).^(-1.0./n)-2.0.^(1.0./n+1.0).*a.*2.5e+1).*1.101158538285379e-5)./(n+1.0)).9.440104166666668e-7-pi.(a.*5.0-6.0).*1.0./(a.5.0e+1-5.9e+1).^3.(a.*2.32335e+6+tan((theta.*pi)./1.8e+2).*4.779e+6-tan(theta).*6.2658e+6-a.^2.*tan(theta).*2.655125e+7+a.^3.*tan(theta).*1.4875e+7-a.^4.*tan(theta).*3.125e+6-a.*tan((theta.*pi)./1.8e+2).*1.59975e+7+a.*tan(theta).*2.1063e+7+a.^2.*tan((theta.*pi)./1.8e+2).*2.008125e+7-a.^3.*tan((theta.*pi)./1.8e+2).*1.1203125e+7+a.^4.*tan((theta.*pi)./1.8e+2).*2.34375e+6-a.^2.*1.98e+6+a.^3.*5.625e+5-9.08811e+5).*1.223509486983755e-5-(n.pi.((a.*2.5e+1).^(-1.0./n)-2.0.^(1.0./n+1.0).*a.*2.5e+1).*1.101158538285379e-5)./(n+1.0)

Error in particleswarm>makeState (line 694) firstFval = objFcn(state.Positions(1,:));

Error in particleswarm>pswcore (line 169) state = makeState(nvars,lbMatrix,ubMatrix,objFcn,options);

Error in particleswarm (line 151) [x,fval,exitFlag,output] = pswcore(objFcn,nvars,lbRow,ubRow,output,options);

Error in MYRING_SYMS_optimisation_K (line 56) [z,fval,exitflag,output] = particleswarm(objective,nVar,lb,ub,options)

Caused by: Failure in initial objective function evaluation. PARTICLESWARM cannot continue.


Solution

  • The fun takes only one argument, which is a vector with nvars elements. From particleswarm doc:

    x = particleswarm(fun,nvars) attempts to find a vector x that achieves a local minimum of fun. nvars is the dimension (number of design variables) of fun.

    So you need to declare a new objective function that only takes 1 argument:

    [z,fval,exitflag,output] = particleswarm( ...
        @(x) objective(x(1), x(2), x(3)), ...
        nVar,lb,ub,options)