R 求解等式和不等式的混合系统

R 求解等式和不等式的混合系统,r,sympy,R,Sympy,简介:我成功地使用该库象征性地解决了以下等式系统示例 x+y=20;x+2y=10 library(rSymPy) sympy("var('x')") sympy("var('y')") sympy("solve([ Eq(x+y, 20), Eq(x+2*y, 10) ], [x,y])") # output #[1] "{x: 30, y: -10}" 用例:在我的用例中,我想象征性地解决一个由等式和不等式组成的混合系统。下面是一个可复制的示例: x+y=2

简介:我成功地使用该库象征性地解决了以下等式系统示例

x+y=20;x+2y=10

library(rSymPy)
sympy("var('x')")
sympy("var('y')")  
sympy("solve([
  Eq(x+y, 20),     
  Eq(x+2*y, 10)
  ], 
  [x,y])")
# output
#[1] "{x: 30, y: -10}"
用例:在我的用例中,我想象征性地解决一个由等式和不等式组成的混合系统。下面是一个可复制的示例: x+y=20;x+2y>10

可以使用
Gt
在rSymPy中成功地对不等式进行编码:

sympy("Gt(x+2*y, 10)")
# output
# [1] "10 < x + 2*y"
sympy(“Gt(x+2*y,10)”)
#输出
#[1]“10
问题:混合系统的代码出现错误:

sympy("solve([
      Eq(x + y, 20),     
      Gt(x+2*y, 10)
      ], 
      [x,y])")

# output    
# Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl,  : 
#   Traceback (most recent call last):
#   File "<string>", line 1, in <module>
#   File "/Users/.../R/3.0/library/rSymPy/Lib/sympy/solvers/solvers.py", line 308, in solve 
#   raise NotImplementedError()
# NotImplementedError
sympy(“求解([
等式(x+y,20),
燃气轮机(x+2*y,10)
], 
[x,y]))
#输出
#.jcall(“RJavaTools”、“Ljava/lang/Object;”、“invokeMethod”、cl中出现错误:
#回溯(最近一次呼叫最后一次):
#文件“”,第1行,在
#文件“/Users/../R/3.0/library/rSymPy/Lib/symphy/solvers/solvers.py”,第308行,在solve中
#引发未实现的错误()
#未实现错误
问题:如何成功重构代码以解决混合系统?

1)定义一个正变量
z
。然后,该系统可以按照
z
重新构建为一个等式系统:

x <- Var('x')
y <- Var('y')
z <- Var('z')
sympy("solve( [ Eq(x+y, 20), Eq(x + 2*y - z, 10) ], [x, y] )")
2)这是一个线性规划问题,因此,如果您只是在寻找约束的任何可行解决方案,则可以提供这样的解决方案。在这种情况下,它给出了(1)中对应于
z=10的解:

库(lpSolve)
out1)定义一个正变量
z
。然后,该系统可以按照
z
重新构建为一个等式系统:

x <- Var('x')
y <- Var('y')
z <- Var('z')
sympy("solve( [ Eq(x+y, 20), Eq(x + 2*y - z, 10) ], [x, y] )")
2)这是一个线性规划问题,因此,如果您只是在寻找约束的任何可行解决方案,则可以提供这样的解决方案。在这种情况下,它给出了(1)中对应于
z=10的解:

库(lpSolve)

out它看起来像是
notimplementederror
来自
SymPy
本身。看起来它不能解决多元不等式。它只能减少它们(这就是您的示例所做的)。该库似乎不支持这种类型的系统

def _solve_inequality(ie, s, assume=True):
    """ A hacky replacement for solve, since the latter only works for
        univariate inequalities. """
    if not ie.rel_op in ('>', '>=', '<', '<='):
        raise NotImplementedError
    expr = ie.lhs - ie.rhs
    try:
        p = Poly(expr, s)
        if p.degree() != 1:
            raise NotImplementedError
    except (PolynomialError, NotImplementedError):
        try:
            n, d = expr.as_numer_denom()
            return reduce_rational_inequalities([[ie]], s, assume=assume)
        except PolynomialError:
            return solve_univariate_inequality(ie, s, assume=assume)
    a, b = p.all_coeffs()
    if a.is_positive:
        return ie.func(s, -b/a)
    elif a.is_negative:
        return ie.func(-b/a, s)
    else:
        raise NotImplementedError
def\u solve\u不等式(即,s,假设=True):
“solve是一个老套的替代品,因为后者只适用于
一元不等式

如果不是ie.rel_op in(“>”、“>=”、“它看起来像是
notimplementederror
SymPy
本身来的。它看起来无法解决多元不等式。它只能减少它们(这就是您的示例所做的)。库似乎不支持那种类型的系统

def _solve_inequality(ie, s, assume=True):
    """ A hacky replacement for solve, since the latter only works for
        univariate inequalities. """
    if not ie.rel_op in ('>', '>=', '<', '<='):
        raise NotImplementedError
    expr = ie.lhs - ie.rhs
    try:
        p = Poly(expr, s)
        if p.degree() != 1:
            raise NotImplementedError
    except (PolynomialError, NotImplementedError):
        try:
            n, d = expr.as_numer_denom()
            return reduce_rational_inequalities([[ie]], s, assume=assume)
        except PolynomialError:
            return solve_univariate_inequality(ie, s, assume=assume)
    a, b = p.all_coeffs()
    if a.is_positive:
        return ie.func(s, -b/a)
    elif a.is_negative:
        return ie.func(-b/a, s)
    else:
        raise NotImplementedError
def\u solve\u不等式(即,s,假设=True):
“solve是一个老套的替代品,因为后者只适用于
一元不等式

如果没有ie.rel_op in(“>”、“>=”、“”,我同时发现了一个非常好的方法,可以很好地用符号方法解决各种线性反问题:

ASCII文件
linprog.lim
包含人类可读形式的符号问题(它与R代码位于同一目录中):

以下R代码提供了线性规划问题的解决方案:

require(LIM)

model= Setup("linprog.lim")
model.solved= Linp(model, ispos=F, verbose=T)
model.solved
输出:

$residualNorm
[1] 3.552714e-15

$solutionNorm
[1] 20

$X
      X Y
[1,] 20 0

与此同时,我发现了一个非常好的方法,可以很好地用符号方法解决各种线性反问题:

ASCII文件
linprog.lim
包含人类可读形式的符号问题(它与R代码位于同一目录中):

以下R代码提供了线性规划问题的解决方案:

require(LIM)

model= Setup("linprog.lim")
model.solved= Linp(model, ispos=F, verbose=T)
model.solved
输出:

$residualNorm
[1] 3.552714e-15

$solutionNorm
[1] 20

$X
      X Y
[1,] 20 0

下面是使用库的另一种方法,它可以读入并解决GNU在R中的脚本问题:

# in case CRAN install does not work
install.packages("Rglpk", repos="http://cran.us.r-project.org")

library(Rglpk)

## read file
x= Rglpk_read_file("mathprog1.mod", type = "MathProg", verbose=T)

## optimize
Rglpk_solve_LP(obj= x$objective, 
               mat= x$constraints[[1]], 
               dir= x$constraints[[2]], 
               rhs= x$constraints[[3]], 
               bounds= x$bounds,
               types= x$types,
               max= x$maximum)
文件
mathprog1.mod

# Define Variables
var x;
var y;

# Define Constraints
s.t. A: x + y = 20;
s.t. B: x + 2*y >= 10;

# Define Objective
maximize z: x + y;

# Solve
solve;
end;
R控制台输出:

# $optimum
# [1] 20

# $solution
# [1]  0 20

# $status
# [1] 0

下面是使用库的另一种方法,它可以读入并解决GNU在R中的脚本问题:

# in case CRAN install does not work
install.packages("Rglpk", repos="http://cran.us.r-project.org")

library(Rglpk)

## read file
x= Rglpk_read_file("mathprog1.mod", type = "MathProg", verbose=T)

## optimize
Rglpk_solve_LP(obj= x$objective, 
               mat= x$constraints[[1]], 
               dir= x$constraints[[2]], 
               rhs= x$constraints[[3]], 
               bounds= x$bounds,
               types= x$types,
               max= x$maximum)
文件
mathprog1.mod

# Define Variables
var x;
var y;

# Define Constraints
s.t. A: x + y = 20;
s.t. B: x + 2*y >= 10;

# Define Objective
maximize z: x + y;

# Solve
solve;
end;
R控制台输出:

# $optimum
# [1] 20

# $solution
# [1]  0 20

# $status
# [1] 0

Thx,但需要一个符号化的解决方案。这是一个很好的技巧。我们应该直接在Symphy中实现。Thx,但需要一个符号化的解决方案。这是一个很好的技巧。我们应该直接在Symphy中实现。老实说,任何R语言之外的解决方案都超出了我的限制。无论如何,Thx-看起来我一直使用rSymPy来实现这个特定用途老实说,R语言之外的任何解决方案都超出了我的限制。无论如何,Thx——看起来我在这个特定的用例中被rSymPy卡住了。