最高(Macsyma):KKT条件

时间:2019-04-11 23:53:17

标签: maxima

我喜欢使用maxima探索某个二次问题 具有线性约束和不等式。 即,我有以下maxima条指令集,拼写了KKT约束:

f(a11,a12,a13,a21,a22,a23,a31,a32,a33):=(1-a11)**2*(1-q1)*q1+a12**2*(1-q2)*q2+a13*(1-q3)*q3+a21*(1-q1)*q1+(1-a22)**2*(1-q2)*q2+a23**2*(1-q3)*q3+a31**2*(1-q1)*q1+a32**2*(1-q2)*q2+(1-a33)**2*(1-q3)*q3;
F:f(a11,a12,a13,a21,a22,a23,a31,a32,a33);
g1(a11,a12,a13,a21,a22,a23,a31,a32,a33):=(q1*a11+q2*a12+q3*a13)-q1;
G1:g1(a11,a12,a13,a21,a22,a23,a31,a32,a33);
g2(a11,a12,a13,a21,a22,a23,a31,a32,a33):=(q1*a21+q2*a22+q3*a23)-q2;
G2:g2(a11,a12,a13,a21,a22,a23,a31,a32,a33);
h1(a11,a12,a13,a21,a22,a23,a31,a32,a33):=a11+a21+a31-1;
H1:h1(a11,a12,a13,a21,a22,a23,a31,a32,a33);
h2(a11,a12,a13,a21,a22,a23,a31,a32,a33):=a12+a22+a32-1;
H2:h2(a11,a12,a13,a21,a22,a23,a31,a32,a33);
h3(a11,a12,a13,a21,a22,a23,a31,a32,a33):=a13+a23+a33-1;
H3:h3(a11,a12,a13,a21,a22,a23,a31,a32,a33);
KKT(a11,a12,a13,a21,a22,a23,a31,a32,a33,lambda1,lambda2,lambda3,lambda4,lambda5,mu11,mu12,mu13,mu21,mu22,mu23,mu31,mu32,mu33):=F+lambda1*G1+lambda2*G2+lambda3*H1+lambda4*H2+lambda5*H3-mu11*a11-mu12*a12-mu13*a13-mu21*a21-mu22*a22-mu23*a23-mu31*a31-mu32*a32-mu33*a33;
kkt:KKT(a11,a12,a13,a21,a22,a23,a31,a32,a33,lambda1,lambda2,lambda3,lambda4,lambda5,mu11,mu12,mu13,mu21,mu22,mu23,mu31,mu32,mu33);
gradF : jacobian([kkt],[a11,a12,a13,a21,a22,a23,a31,a32,a33,lambda1,lambda2,lambda3,lambda4,lambda5,mu11,mu12,mu13,mu21,mu22,mu23,mu31,mu32,mu33])[1];
orthogonality_constraints : [mu11*a11 = 0, mu12*a12 = 0, mu13*a13 = 0, mu21*a21 = 0, mu22*a22 = 0, mu23*a23 = 0, mu31*a31 = 0, mu32*a32 = 0, mu33*a33 = 0];

在这里,我们有9个“原始”变量a11,a12,...,a332+3 = 5约束,在上面的代码中表示为G1,G2,H1,H2,H3。 我们想对a11,a12,...,a33施加非负条件, 因此我想写一些类似的东西 solve([gradF,G1,G2,H1,H2,H3,orthogonality_constraints],[a11,...,a33,lambda1,...,lambda5,mu11,...,mu33])。 但是,我猜想orthogonality_constraints必须先被“解开”,然后再放入solve()的第一个参数中。与gradF相同。 该怎么做?

1 个答案:

答案 0 :(得分:0)

也许flatten

e: [gradF,G1,G2,H1,H2,H3,orthogonality_constraints] $
e: flatten(e) $
solve(e, [...]);

来自?flatten;

Applied to a list, 'flatten' gathers all list elements that are
lists.
(%i1) flatten ([a, b, [c, [d, e], f], [[g, h]], i, j]);
(%o1)            [a, b, c, d, e, f, g, h, i, j]