Matlab Pso算法

Matlab Pso Algorithm

我正在尝试使用 MATLAB 中的 PSO 优化器解决符号优化问题。变量 r x a c n theta z 是符号变量,CD 是通过对 r 积分计算的。 CD 是具有自由变量 a、n、theta 和 lb 的 objective 函数,并且 ub 是边界。完整代码如下:

    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)

这是我得到的错误:

@(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.

fun只有一个参数,它是一个包含nvars个元素的向量。来自 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.

因此您需要声明一个新的 objective 函数,它只接受 1 个参数:

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