我的MATLAB代码有一个问题,我用两个约束(其中一个是不等式,另一个是等式)用使用KKT条件的拉格朗日乘子来最小化这个函数。这一职能是:
MIN F = 2*x1^2 + 2*x2^2-6*x1*x2
ineq=x1+2*x2<=3
eq=3*x1+x2=9我个人怀疑我的if函数(语句)有问题,但不知道如何解决这个问题……
clc
warning off
syms x1 x2 u s lambda
f=2*x1^2+2*x2^2-6*x1*x2;
g1=sqrt(x1^2*x2)+s^2-0.25;
H1=x1*x2^2-0.1;
Lagrange=f+u*g1+lambda*H1;
Grad=gradient(Lagrange);
S=solve(Grad);
S=double([S.x1 S.x2 S.s S.u S.lambda]);M=size(S,1);
for i=M:-1:1
if imag(S(i,3))~=0 || S(i,1)<=0 || S(i,2)<=0
end
end
x1=S(:,1);x2=S(:,2);s=S(:,3);u=S(:,4);lambda=S(:,5);
out=table(x1,x2,s,u,lambda)
x0=[1 0.5 -0.75];似乎我有一个问题,因为它给了我写和错误的答案,你能帮我吗?
发布于 2019-06-03 00:12:35
使用if满足S(i,:)=[];条件时,只需删除相应的行即可
根据您的配方
if条件应该如下所示
if imag(S(i,3))~=0 || S(i,1)<=0 || S(i,2)<=0
S(i,:)=[];
end溶液
out =
1×5 table
x1 x2 s u lambda
______ _______ _ ______ _______
0.3393 0.54288 0 3.6349 -2.6402在我看来,您的等式和不等式约束公式是错误的。
ineq = x1 + 2*x2 <= 3 -------> g1 = x1 + 2*x2 - 3 + s^2
eq = 3*x1 + x2 = 9 -------> H1 = 3*x1 + x2 - 9if条件检查
u(modifying g1)小于零或
s是实数或非实数for i=M:-1:1
if imag(S(i,3))~=0 || S(i,4)<0
S(i,:)=[];
end
end整个代码如下
syms x1 x2 u s lambda
f=2*x1^2+2*x2^2-6*x1*x2;
g1 = x1+2*x2-3 +s^2 ;
H1 = 3*x1+x2-9;
Lagrange=f+u*g1+lambda*H1;
Grad=gradient(Lagrange);
S=solve(Grad)
S=double([S.x1 S.x2 S.s S.u S.lambda]);M=size(S,1)
for i=M:-1:1
if imag(S(i,3))~=0 || S(i,4)<0
S(i,:)=[];
end
end
x1=S(:,1);x2=S(:,2);s=S(:,3);u=S(:,4);lambda=S(:,5);
out=table(x1,x2,s,u,lambda)溶液
out =
1×5 table
x1 x2 s u lambda
__ __ _ ____ ______
3 0 0 13.2 -8.4 使用
fmincon检查您的答案如下
% Check your answer using fmincon
% Inequality constraint
%ineq = x1 + 2*x2 <= 3
A = [1, 2];
b = 3;
% Equality constraint
%eq = 3*x1 + x2 = 9
Aeq = [3, 1];
beq = 9;
%F = 2*x1^2 + 2*x2^2-6*x1*x2
F = @(x)2*x(1).^2 + 2*x(2).^2-6*x(1).*x(2);
x0 = [0,0];
[x_minimum, Feval] = fmincon(F, x0, A, b, Aeq, beq);溶液
x_minimum =
3.0000 -0.0000
Feval =
18.0002发布于 2019-11-07 19:38:46
我如何用MATLAB来解决这个问题呢?我也可以在图表上显示吗?
fmin(x1,x2 )=(x1-1)^2+(x2-1)^2
H1=x1+x2-4=0;
H2=x1-x2-2=0
https://stackoverflow.com/questions/56419540
复制相似问题