Giter Club home page Giter Club logo

Comments (1)

mengchaoheng avatar mengchaoheng commented on August 30, 2024

I have a LP problem in matlab code is:

% If we use the Standard Forms for Linear Programming Problems
% min c'x subj. to A*x <= b
%                    0 <= x
%% so we have to reformula the direction-preserving control allocation
% problem to:
% min z=[0; -1]'[u; a]   s.t.  [B -v][u; a] = 0
%                                umin <= u <= umax
%                                   0 <= a
% and set x=u-umin, then
% min z=[0; -1]'[x; a]   s.t.  [B -v][x; a] = -B*umin
%                                        x <= umax-umin
%                                        0 <= x 
%                                        0 <= a
% min z=[0; -1]'[x; a]   s.t.  [B -v][x; a] <= -B*umin
%                              [-B v][x; a] <=  B*umin
%                              [I  0][x; a] <= umax-umin
%                                        -x <= 0 
%                                        -a <= 0
% set X=[x;a]
l1=0.148;l2=0.069;k=3;
B=k*[-l1     0       l1     0;
     0      -l1     0       l1;
     l2    l2    l2    l2];
umin=ones(m,1)*(-20)*pi/180;
umax=ones(m,1)*20*pi/180;
[k,m] = size(B);
v=[0.2;0.1;0.1];
A=[B -v;-B v; eye(m) zeros(m,1)];
b=[-B*umin; B*umin; umax-umin];
c=[zeros(m,1); -1];
[X,fval,exitflag,output,lambda]= linprog(c,A,b,[],[],zeros(2*m+1,1),[]);
u = X(1:m)+umin;
a = X(m+1);
% Scale down u if a>1
if a>1
    u = u/a;
end
u

I have sole this by matlab function linprog.
and then solve this by SDLP, for SDLP , A, b and c is

% A=[B -v;-B v; eye(m) zeros(m,1);-eye(m) zeros(m,1);zeros(1,m) -1]
% b=[-B*umin; B*umin; umax-umin;0;0;0;0;0]
% c=[zeros(m,1); -1]
% or
A=[B -v;-B v; eye(m) zeros(m,1)]
b=[-B*umin; B*umin; umax-umin]
c=[zeros(m,1); -1]

setup A, b and c to sdlp_example and then run :

build git:(main) ✗ make          
[ 50%] Building CXX object CMakeFiles/sdlp_example.dir/example/sdlp_example.cpp.o
[100%] Linking CXX executable sdlp_example
[100%] Built target sdlp_examplebuild git:(main) ✗ ./sdlp_example
optimal sol: 0.155327 0.426713   0.6981   0.6981  1.20496
u: -0.193773 0.0776133     0.349     0.349
optimal obj: -1.20496

get the solution:

u_SDLP=[-0.193773; 0.0776133;     0.349;     0.349];

the optimal obj is the same, but B*u_SDLP != v, u != u_SDLP. why? @ZhepeiWang

the sdlp_example code is

#include <iostream>

#include "sdlp/sdlp.hpp"

using namespace std;
using namespace Eigen;

int main(int argc, char **argv)
{
    // int m = 2 * 7;
    int m = 10;
    Eigen::Matrix<double, 5, 1> x;        // decision variables
    Eigen::Matrix<double, 5, 1> c;        // objective coefficients
    Eigen::Matrix<double, -1, 5> A(m, 5); // constraint matrix
    Eigen::VectorXd b(m);                 // constraint bound
    A <<   -0.4440,         0,              0.4440,    0,        -0.2000,
            0,             -0.4440,         0,         0.4440,   -0.1000,
            0.2070,         0.2070,         0.2070,    0.2070,   -0.1000,
            0.4440,         0,             -0.4440,    0,         0.2000,
            0,              0.4440,         0,        -0.4440,    0.1000,
           -0.2070,        -0.2070,        -0.2070,   -0.2070,    0.1000,
            1.0000,         0,              0,         0,         0,
            0,              1.0000,         0,         0,         0,
            0,              0,              1.0000,    0,         0,
            0,              0,              0,         1.0000,    0;
    b <<0, 0, 0.2890, 0, 0, -0.2890, 0.6981, 0.6981, 0.6981, 0.6981;
    c << 0.0, 0.0, 0.0, 0.0, -1.0;
    double minobj = sdlp::linprog<5>(c, A, b, x);
    Eigen::Matrix<double, 4, 1> u_={x(0)-0.3491, x(1)-0.3491, x(2)-0.3491, x(3)-0.3491};
    Eigen::Matrix<double, 4, 1> u=u_;
    if(minobj>=1)
    {
        for(int i=0;i<4;i++)
        {
            u(i)=u_(i)/minobj;
        }
    }
    std::cout << "optimal sol: " << x.transpose() << std::endl;
    std::cout << "u: " << u.transpose() << std::endl;
    std::cout << "optimal obj: " << minobj << std::endl;
    return 0;
}

from sdlp.

Related Issues (3)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.