首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用matlab中拉格朗日乘子最小化函数

利用matlab中拉格朗日乘子最小化函数
EN

Stack Overflow用户
提问于 2019-06-02 22:53:09
回答 2查看 1.2K关注 0票数 1

我的MATLAB代码有一个问题,我用两个约束(其中一个是不等式,另一个是等式)用使用KKT条件的拉格朗日乘子来最小化这个函数。这一职能是:

代码语言:javascript
复制
       MIN F = 2*x1^2 + 2*x2^2-6*x1*x2
        ineq=x1+2*x2<=3
        eq=3*x1+x2=9

我个人怀疑我的if函数(语句)有问题,但不知道如何解决这个问题……

代码语言:javascript
复制
    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];

似乎我有一个问题,因为它给了我写和错误的答案,你能帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-03 00:12:35

使用if满足S(i,:)=[];条件时,只需删除相应的行即可

根据您的配方

if条件应该如下所示

代码语言:javascript
复制
if imag(S(i,3))~=0 || S(i,1)<=0 || S(i,2)<=0
    S(i,:)=[];
end

溶液

代码语言:javascript
复制
out =

  1×5 table

      x1        x2       s      u       lambda 
    ______    _______    _    ______    _______

    0.3393    0.54288    0    3.6349    -2.6402

在我看来,您的等式和不等式约束公式是错误的。

代码语言:javascript
复制
ineq = x1 + 2*x2 <= 3 -------> g1 = x1 + 2*x2 - 3 + s^2

eq = 3*x1 + x2 = 9    -------> H1 = 3*x1 + x2 - 9

if条件检查

  • 如果u(modifying g1)小于零

  • 如果s是实数或非实数
代码语言:javascript
复制
for i=M:-1:1
      if imag(S(i,3))~=0 || S(i,4)<0 
      S(i,:)=[];
      end
  end

整个代码如下

代码语言:javascript
复制
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)

溶液

代码语言:javascript
复制
out =

  1×5 table

    x1    x2    s     u      lambda
    __    __    _    ____    ______

    3     0     0    13.2     -8.4 

使用fmincon检查您的答案如下

代码语言:javascript
复制
% 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);

溶液

代码语言:javascript
复制
x_minimum =

    3.0000   -0.0000


Feval =

   18.0002
票数 1
EN

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56419540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档