Matlab中的非线性约束优化

时间:2016-03-29 14:46:27

标签: matlab optimization

给定函数f(k',w')=((k' -k)^ 2 +(w' -w)^ 2)^(1/2),其中k和w是已知的实际参数。目的是找到一对(k',w'),使f(k',w')在以下约束条件下最小

b(v,s,w')< 10s< =>瓦特'< 10s

B(V,S,W')< a(v,s,k')^ 2< => (w' -10s) - (k' -3)^ 2 / s< 0

q(a(v,s,k'),b(v,s,w'))< S [v ^(1/2)]

其中b(v,s,w')=(v / s)(w' -10s)和a(v,s,k')=(1 / s)(k&#) 39 -3)v ^(1/2)。在此之上,v(= vari)> 0和s(= skew)< 0是已知参数。此外q(a,b)是四次多项式的根:

(48a ^ 2 + 16b)x ^ 4 +( - 40a ^ 3 - 168ab)x ^ 3 +( - 45a ^ 4 + 225a ^ 2b + 72b ^ 2)x ^ 2 +(27a ^ 3b - 162ab ^ 2)x + 27b ^ 3.

更确切地说,每当四次有四个真正的根时,q就是第二个最大的根。如果四次有两个真实和两个复杂的根,则q是最大的真实根。问题是q的代数表达式是非常可怕的。理想情况下,我想要一个解决上述非线性约束优化问题的解决方案。但是,我认为这可能会变得非常丑陋。因此,我认为通过使用 fmincon 等约束优化器,使用 Matlab 进行数字化更好。

f = @(x) sqrt((x(1)-hyp_skew)^2+(x(2)-kurt)^2); 
        A = [1,0];
        d = 10*skew;
        Aeq = [];
        beq = [];
        ub = [];
        lb = [];
        [x,fval,exitflag] = fmincon(f,[w,k],A,d,Aeq,beq,lb,ub,@(x)quarticcondition2(x,skew,vari),options);

其中(非线性)优化函数由

给出
function [c, ceq] = quarticcondition2(x,skew,vari)

av = ((x(2)-3)*sqrt(vari))/skew;
bv = (vari/skew)*(x(1)-10*skew);

A = (-40*av^3-168*av*bv)/(48*av^2+16*bv);
B = (-45*av^4+225*av^2*bv+72*bv^2)/(48*av^2+16*bv);
C = (27*av^3*bv-162*av*bv^2)/(48*av^2+16*bv);
D = (27*bv^3)/(48*av^2+16*bv);

    roots_quartic = roots([1,A,B,C,D]);
    z = imag(roots_quartic);
    in = find(z ~= 0);
    if isempty(in)
       r = sort(roots_quartic);
       c2 = r(2)-skew*sqrt(vari); 
    else 
    index = find(z == 0);
    c2 = max(roots_quartic(index))-skew*sqrt(vari);
    end 
    c1 = ((x(2)-3)^2/skew)-(x(1)-10*skew);
    c = [c1 c2];
    ceq = [];
end

我的代码适用于一些初始参数集[w,k]。然而,找到这个初始参数集变得非常困难(因为约束很难处理)。我需要在很多可能的情况下运行程序,因此在选择我的起始值时有一些逻辑会很好。我知道使用优化求解器时这是一个众所周知的问题。但是,有没有一种好的/正确的方法来查找起始值?

谢谢!

干杯

0 个答案:

没有答案