求解线性方程组,将结果限制在 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
对于两个剩余变量的两个方程,如果方程是独立的,则结果是唯一的,因此您不能约束结果。
你可以做的是分析求解你的方程,并找到 x1
、x2
和 x3
在解集中介于 0 和 1 之间的位置。
否则,你可以保持你的方法并在最后检查 x1
和 x2
是否在 0 和 1 之间。如果不是,你可以重复操作(例如你把你的代码放在一个 while(TRUE)
循环,当你找到合适的解决方案时你 break
)。但是,如果这样做,您应该设置迭代限制,否则如果在您想要的范围内不存在解决方案,您的代码可能 运行 无限期。
两个线性方程的解是两个平面的交线,即一条直线。那么线上满足 x1 和 x2 约束的任何值都是有效的。在这种情况下,x2 = -x1/2
和x3 = 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
我正在尝试求解以下方程组:
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
对于两个剩余变量的两个方程,如果方程是独立的,则结果是唯一的,因此您不能约束结果。
你可以做的是分析求解你的方程,并找到 x1
、x2
和 x3
在解集中介于 0 和 1 之间的位置。
否则,你可以保持你的方法并在最后检查 x1
和 x2
是否在 0 和 1 之间。如果不是,你可以重复操作(例如你把你的代码放在一个 while(TRUE)
循环,当你找到合适的解决方案时你 break
)。但是,如果这样做,您应该设置迭代限制,否则如果在您想要的范围内不存在解决方案,您的代码可能 运行 无限期。
两个线性方程的解是两个平面的交线,即一条直线。那么线上满足 x1 和 x2 约束的任何值都是有效的。在这种情况下,x2 = -x1/2
和x3 = 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