求解线性方程组,将结果限制在 0 和 1 之间

Solving system of linear equations, constraining the results between 0 and 1

我正在尝试求解以下方程组:

x1 + x2 + x3 = 1
0.5 * x1 + 0.75 * x2 + 0.25 * x3 = 0.25

我首先从均匀分布中随机 select$x3$。然后我更新我的方程组来求解剩余的 x1 和 x2。但是,我想确保 x1 和 x2 也在 0 和 1 之间。目前,求解上述方程组示例会导致负 x1 和大于 1 的 x2。有没有办法合并此约束不知何故?

library(matlib)
set.seed(3)
x3 <- runif(1, 0.01, 0.99)
A <- matrix(c(1, 2/4, 1, 3/4), 2, 2)
b <- c(1 - x3, 0.25 - 1/4 * x3)
showEqn(A, b)
> Solve(A, b)
x1    =  -0.34936139 
x2  =    1.1746807

对于两个剩余变量的两个方程,如果方程是独立的,则结果是唯一的,因此您不能约束结果。

你可以做的是分析求解你的方程,并找到 x1x2x3 在解集中介于 0 和 1 之间的位置。

否则,你可以保持你的方法并在最后检查 x1x2 是否在 0 和 1 之间。如果不是,你可以重复操作(例如你把你的代码放在一个 while(TRUE) 循环,当你找到合适的解决方案时你 break )。但是,如果这样做,您应该设置迭代限制,否则如果在您想要的范围内不存在解决方案,您的代码可能 运行 无限期。

两个线性方程的解是两个平面的交线,即一条直线。那么线上满足 x1 和 x2 约束的任何值都是有效的。在这种情况下,x2 = -x1/2x3 = 1 - x1/2所以唯一的解决方案是(x1, x2, x3) = (0, 0, 1)

如果你想要符号解决方案,那么 R 可能不是正确的选择。而是使用像 Mathematica 这样的 CAS 或约束满足来确定可行性区域:

Solve[x1 + x2 + x3 == 1 && 0.5 x1 + 0.75 x2 + 0.25 x 3 == 0.25 && 0 <= x1 <= 1 && 0 <= x2 <= 1, {x1,x2,x3}, Reals]

输出

{{x1 -> 0, x2 -> 0, x3 -> 1.}}

如果您的约束没有唯一解,例如 -1 <= x2 <= 1,您将得到类似

的结果
{{x1 -> ConditionalExpression[1. - 1. x2 - 1. (1. + x2), -0.5 <= x2 <= 0], 
  x3 -> ConditionalExpression[1. + x2, -0.5 <= x2 <= 0]}}

相反,如果您想要一个数值解,那么 LP 求解器非常适合此任务。由于您没有最大化或最小化任何东西,因此满足约束的任何解决方案都将起作用。这里我"maximize"一个零objective函数来获得任意解。

library(lpSolve)

#     x1 +      x2 +      x3 =  1
# 0.5 x1 + 0.75 x2 + 0.25 x3 =  0.25
#     x1                     >= 0
#     x1                     <= 1
#               x2           >= 0
#               x2           <= 1

f.obj <- c(0, 0, 0)
f.con <- matrix(c(1, 1, 1, 0.5, 0.75, 0.25, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0), nrow=6, byrow=TRUE)
f.dir <- c("=", "=", ">=", "<=", ">=", "<=")
f.rhs <- c(1, 0.25, 0, 1, 0, 1)

lp ("max", f.obj, f.con, f.dir, f.rhs)$solution

输出

[1] 0 0 1