R 求解等式和不等式的混合系统
简介:我成功地使用该库象征性地解决了以下等式系统示例 x+y=20;x+2y=10R 求解等式和不等式的混合系统,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
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卡住了。