r - R中不等式系统的解决方案
问题描述
假设我有以下不等式系统:
-2x + y <= -3
1.25x + y <= 2.5
y >= -3
我想找到(x, y)
满足上述不等式的多个元组。
library(Rglpk)
obj <- numeric(2)
mat <- matrix(c(-2, 1, 1.25, 1, 0, 1), nrow = 3)
dir <- c("<=", "<=", ">=")
rhs <- c(-3, 2.5, -3)
Rglpk_solve_LP(obj = obj, mat = mat, dir = dir, rhs = rhs)
使用上面的代码似乎只返回 1 个可能的解决方案 tuple (1.5, 0)
。是否可以返回其他解决方案元组?
编辑:根据评论,我有兴趣了解是否有任何功能可以帮助我找到角点。
解决方案
实际上,要了解给定问题的可能答案,我们可以尝试以图形方式解决不等式系统。
关于在stackowerflow中绘制R中的不等式有一个很好的答案。使用给定的方法,我们可以绘制下图:
library(ggplot2)
fun1 <- function(x) 2*x - 3 # this is the same as -2x + y <= -3
fun2 <- function(x) -1.25*x + 2.5 # 1.25x + y <= 2.5
fun3 <- function(x) -3 # y >= -3
x1 = seq(-1,5, by = 1/16)
mydf = data.frame(x1, y1=fun1(x1), y2=fun2(x1),y3= fun3(x1))
mydf <- transform(mydf, z = pmax(y3,pmin(y1,y2)))
ggplot(mydf, aes(x = x1)) +
geom_line(aes(y = y1), colour = 'blue') +
geom_line(aes(y = y2), colour = 'green') +
geom_line(aes(y = y3), colour = 'red') +
geom_ribbon(aes(ymin=y3,ymax = z), fill = 'gray60')
所有可能的(数量无限)元组都位于灰色三角形内。可以使用以下代码找到顶点。
obj <- numeric(2)
mat <- matrix(c(-2, 1.25, 1, 1), nrow = 2)
rhs <- matrix(c(-3, 2.5), nrow = 2)
aPoint <- solve(mat, rhs)
mat <- matrix(c(-2, 0, 1, 1), nrow = 2)
rhs <- matrix(c(-3, -3), nrow = 2)
bPoint <- solve(mat, rhs)
mat <- matrix(c(1.25, 0, 1, 1), nrow = 2)
rhs <- matrix(c(2.5, -3), nrow = 2)
cPoint <- solve(mat, rhs)
注意矩阵参数的顺序。
你得到坐标:
> aPoint
[,1]
[1,] 1.6923077
[2,] 0.3846154
> bPoint
[,1]
[1,] 0
[2,] -3
> cPoint
[,1]
[1,] 4.4
[2,] -3.0
推荐阅读
- java - 用于 java war 和 php 的 Apache Web 服务器或 Tomcat
- android - 我应该如何在两个片段中使用 ViewModel?
- bash - 谁能帮我理解这个 bash 脚本?
- python - 在python中查找从低到高的状态转换(使用二进制搜索)
- python - 如何用代码块装饰实例并访问/使用实例的变量?
- python - 将文件拆分为列表,然后拆分为单独的部分 - Python
- forms - 使用表单中的条件访问插入
- windows - 从 Windows cmd 提示符读取和编辑文本文件
- python - 如何在 Python 中创建一个上下数字的列表?
- docker - 并行运行 docker 的最佳方法