在Matlab中使用fmincon进行非线性优化时索引分配错误无效

时间:2017-02-16 11:59:24

标签: matlab

我试图找出具有2个等式约束的目标函数的5个参数& 2优化求解器的不等式约束" fmincon"。

objective function & constraints

我写了4个函数来定义约束和& 1个非lcon功能。它们如下:

约束(等式3):

function [C1] = s_1(w)
x = sym('x', [1 5]);
GC = (x(1)+x(2)/(j*w)^x(3)+x(4)*(j*w)^x(5))*(0.55/(62*j*w+1));
C1 = rad2deg(angle(GC))+100;
end

约束(等式4):

function [C2] = s_2(w)
x = sym('x', [1 5]);
GC = (x(1)+x(2)/(j*w)^x(3)+x(4)*(j*w)^x(5))*(0.55/(62*j*w+1));
GC1 = angle(GC);
C2 = diff(GC1,w);
end

约束(等式5):

function [T1] = s_4(w)
x = sym('x', [1 5]);
GC = (x(1)+x(2)/(j*w)^x(3)+x(4)*(j*w)^x(5))*(0.55/(62*j*w+1));
T = GC/(1+GC);
T1 = 20*log10(abs(T)) + 20;
end

约束(等式6)

 function [S1] = s_5(w)  
 x = sym('x', [1 5]);
 GC = (x(1)+x(2)/(j*w)^x(3)+x(4)*(j*w)^x(5))*(0.55/(62*j*w+1));
 S = 1/(1+GC);
 S1 = 20*log10(abs(S)) + 20;
 end

' nonlcon'功能

function [ c,ceq ] = cons_mo(x)
ceq(1) =(s_1(1));
ceq(2) =(s_2(1));
c(1) = (s_4(10));
c(2) = (s_5(0.01)) ;
end

优化脚本:

f=@(x)20*log10(abs((x(1)+x(2)/(j*1)^x(3)+x(4)*(j*1)^x(5))*(0.55/(62*j*1+1))));
x = fmincon(f,[0.5,0.5,0.5,0.5,0.5],[],[],[],[],[],[],[],cons_mo)

执行后,我得到无效的索引分配错误以及其他错误。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

fmincon是一个数值求解器。您的函数是根据符号变量定义的。如果要以符号方式解决,则需要使用solve。但是,在我的计算机上,Matlab无法找到以下符号解决方案:

function x = solveme()
x = sym('x', [1 5]);
[c,ceq] = cons_mo(x);
f = 20*log10(abs((x(1)+x(2)/(j*1)^x(3)+x(4)*(j*1)^x(5))*(0.55/(62*j*1+1))));
% x = fmincon(f,[0.5,0.5,0.5,0.5,0.5],[],[],[],[],[],[],[],cons_mo)
x = solve([f,c,ceq],x);
end

function [C1] = s_1(w)
x = sym('x', [1 5]);
GC = (x(1)+x(2)/(j*w)^x(3)+x(4)*(j*w)^x(5))*(0.55/(62*j*w+1));
C1 = 180/pi*(angle(GC))+100;
end

function [C2] = s_2(w)
x = sym('x', [1 5]);
GC = (x(1)+x(2)/(j*w)^x(3)+x(4)*(j*w)^x(5))*(0.55/(62*j*w+1));
GC1 = angle(GC);
C2 = diff(GC1,w);
end


function [T1] = s_4(w)
x = sym('x', [1 5]);
GC = (x(1)+x(2)/(j*w)^x(3)+x(4)*(j*w)^x(5))*(0.55/(62*j*w+1));
T = GC/(1+GC);
T1 = 20*log10(abs(T)) + 20;
end


 function [S1] = s_5(w)  
 x = sym('x', [1 5]);
 GC = (x(1)+x(2)/(j*w)^x(3)+x(4)*(j*w)^x(5))*(0.55/(62*j*w+1));
 S = 1/(1+GC);
 S1 = 20*log10(abs(S)) + 20;
 end


function [ c,ceq ] = cons_mo(x)
ceq(1) =(s_1(1));
ceq(2) =(s_2(1));
c(1) = (s_4(10));
c(2) = (s_5(0.01)) ;
end

因此,您需要重新格式化函数以将x作为变量:

function x = solveme()
f = @(x)20*log10(abs((x(1)+x(2)/(j*1)^x(3)+x(4)*(j*1)^x(5))*(0.55/(62*j*1+1))));
aa = 1;
bb = 1;
cc = 10;
dd = 0.01;
x = fmincon(f,[0.5,0.5,0.5,0.5,0.5],[],[],[],[],[],[],@cons_mo)

    function [ c,ceq ] = cons_mo(x)
        ceq(1) =(s_1(x,aa));
        ceq(2) =(s_2(x,bb));
        c(1) = (s_4(x,cc));
        c(2) = (s_5(x,dd)) ;
    end

end

function [C1] = s_1(x,w)
GC = (x(1)+x(2)/(j*w)^x(3)+x(4)*(j*w)^x(5))*(0.55/(62*j*w+1));
C1 = 180/pi*(angle(GC))+100;
end

function [C2] = s_2(x,w)
% GC = (x(1)+x(2)/(j*w)^x(3)+x(4)*(j*w)^x(5))*(0.55/(62*j*w+1));
% GC1 = angle(GC);
% C2 = diff(GC1,w);
C2 = (real((x(1) + x(4)*(w*1i)^x(5) + x(2)/(w*1i)^x(3))/(1 + w*62i))^2*((imag(-((x(1) + x(4)*(w*1i)^x(5) + x(2)/(w*1i)^x(3))*62i)/(1 + w*62i)^2) - imag((x(2)*x(3) - x(4)*x(5)*(w*1i)^(x(3) + x(5)))/(w*(1 + w*62i)*(w*1i)^x(3))))/real((x(1) + x(4)*(w*1i)^x(5) + x(2)/(w*1i)^x(3))/(1 + w*62i)) - (imag((x(1) + x(4)*(w*1i)^x(5) + x(2)/(w*1i)^x(3))/(1 + w*62i))*(real(-((x(1) + x(4)*(w*1i)^x(5) + x(2)/(w*1i)^x(3))*62i)/(1 + w*62i)^2) - real((x(2)*x(3) - x(4)*x(5)*(w*1i)^(x(3) + x(5)))/(w*(1 + w*62i)*(w*1i)^x(3)))))/real((x(1) + x(4)*(w*1i)^x(5) + x(2)/(w*1i)^x(3))/(1 + w*62i))^2))/(imag((x(1) + x(4)*(w*1i)^x(5) + x(2)/(w*1i)^x(3))/(1 + w*62i))^2 + real((x(1) + x(4)*(w*1i)^x(5) + x(2)/(w*1i)^x(3))/(1 + w*62i))^2);
end


function [T1] = s_4(x,w)
GC = (x(1)+x(2)/(j*w)^x(3)+x(4)*(j*w)^x(5))*(0.55/(62*j*w+1));
T = GC/(1+GC);
T1 = 20*log10(abs(T)) + 20;
end


function [S1] = s_5(x,w)
GC = (x(1)+x(2)/(j*w)^x(3)+x(4)*(j*w)^x(5))*(0.55/(62*j*w+1));
S = 1/(1+GC);
S1 = 20*log10(abs(S)) + 20;
end