@c /simplex.texi/1.2/Mon May 15 07:55:16 2006//
@menu
* Introdução a simplex::
* Definições para simplex::
@end menu

@node Introdução a simplex, Definições para simplex, simplex, simplex
@section Introdução a simplex

@code{simplex} é um pacote para optimização linear usando o algoritmo simplex.

Exemplo:

@c ===beg===
@c load("simplex")$
@c minimize_sx(x+y, [3*x+2*y>2, x+4*y>3]);
@c ===end===
@example
(%i1) load("simplex")$
(%i2) minimize_sx(x+y, [3*x+2*y>2, x+4*y>3]);
                  9        7       1
(%o2)            [--, [y = --, x = -]]
                  10       10      5
@end example

@node Definições para simplex,  , Introdução a simplex, simplex
@section Definições para simplex

@defvr {Variável de opção} epsilon_sx
Valor por omissão: @code{10^-8}

Epsilon usando para cálculos numéricos em @code{linear_program}.

Veja também: @code{linear_program}.

@end defvr

@deffn {Função} linear_program (@var{A}, @var{b}, @var{c})

@code{linear_program} é uma implementação do algoritmo simplex.
@code{linear_program(A, b, c)} calcula um vetor @var{x} para o qual @code{c.x} é o mínimo
possível entre vetores para os quais @code{A.x = b} e @code{x >= 0}. O argumento
@var{A} é uma matriz e os argumentos @var{b} e @var{c} são listas.

@code{linear_program} retorna uma lista contendo o vetor minimizado @var{x} e o
valor mínimo @code{c.x}. Se o problema for não associado, é retornado "Problem not bounded!" e
se o problema for não viável, é retornado "Problem not feasible!".

Para usar essa função primeiramente chame o pacote @code{simplex} com @code{load(simplex);}.

Exemplo:

@c ===beg===
@c A: matrix([1,1,-1,0], [2,-3,0,-1], [4,-5,0,0])$
@c b: [1,1,6]$
@c c: [1,-2,0,0]$
@c linear_program(A, b, c);
@c ===end===
@example
(%i2) A: matrix([1,1,-1,0], [2,-3,0,-1], [4,-5,0,0])$
(%i3) b: [1,1,6]$
(%i4) c: [1,-2,0,0]$
(%i5) linear_program(A, b, c);
                   13     19        3
(%o5)            [[--, 4, --, 0], - -]
                   2      2         2
@end example

Veja também: @code{minimize_sx}, @code{scale_sx}, e @code{epsilon_sx}.

@end deffn

@deffn {Função} maximize_sx (@var{obj}, @var{cond}, [@var{pos}])

Maximiza a função linear objetiva @var{obj} submetida a alguma restrição linear
@var{cond}. Veja @code{minimize_sx} para uma descrição detalhada de argumentos e valores de
retorno.


Veja também: @code{minimize_sx}.

@end deffn

@deffn {Função} minimize_sx (@var{obj}, @var{cond}, [@var{pos}])

Minimiza uma função linear objetiva @var{obj} submetida a alguma restrição
linear @var{cond}. @var{cond} é uma lista de equações lineares ou
desigualdades. Em desigualdades estritas @code{>} é  substituido por @code{>=}
e @code{<} por @code{<=}. O argumento opcional @var{pos} é uma lista de
variáveis de decisão que são assumidas como sendo positivas.

Se o mínimo existir, @code{minimize_sx} retorna uma lista que contém
o menor valor da função objetiva e uma lista de valores de variáveis de
decisão para os quais o mínimo é alcançado. Se o problema for não associado,
@code{minimize_sx} retorna "Problem not bounded!" e se o problema for
não viável, é retornado "Ploblem not feasible!".

As variáveis de decisão não são assumidas para serem não negativas por padrão. Se todas
as variáveis de dicisão forem não negativas, escolha @code{nonegative_sx} para @code{true}.
Se somente algumas das variáveis de decisão forem positivas, coloque-as então no argumento
opcional @var{pos} (note que isso é mais eficiente que adicionar
restrições).

@code{minimize_sx} utiliza o algoritmo simplex que é implementado na função
@code{linear_program} do Maxima.

Para usar essa função primeiramente chame o pacote @code{simplex} com @code{load(simplex);}.

Exemplos:

@c ===beg===
@c minimize_sx(x+y, [3*x+y=0, x+2*y>2]);
@c minimize_sx(x+y, [3*x+y>0, x+2*y>2]), nonegative_sx=true;
@c minimize_sx(x+y, [3*x+y=0, x+2*y>2]), nonegative_sx=true;
@c minimize_sx(x+y, [3*x+y>0]);
@c ===end===
@example
(%i1) minimize_sx(x+y, [3*x+y=0, x+2*y>2]);
                      4       6        2
(%o1)                [-, [y = -, x = - -]]
                      5       5        5
(%i2) minimize_sx(x+y, [3*x+y>0, x+2*y>2]), nonegative_sx=true;
(%o2)                [1, [y = 1, x = 0]]
(%i3) minimize_sx(x+y, [3*x+y=0, x+2*y>2]), nonegative_sx=true;
(%o3)                Problem not feasible!
(%i4) minimize_sx(x+y, [3*x+y>0]);
(%o4)                Problem not bounded!
@end example


Veja também: @code{maximize_sx}, @code{nonegative_sx}, @code{epsilon_sx}.

@end deffn

@defvr {Variável de opção} nonegative_sx
Valor por omissão: @code{false}

Se @code{nonegative_sx} for verdadeiro (true) todas as variáveis de decisão para @code{minimize_sx}
e @code{maximize_sx} são assumidas para serem positivas.

Veja também: @code{minimize_sx}.

@end defvr

