求解 R 中的不定方程组
Solve indeterminate equation system in R
我有一个方程组,我想用数值方法求解它。给定起始种子,我想得到一个接近的解决方案。让我解释。
我有一个常数向量,X
,值:
X <- (c(1,-2,3,4))
和权重向量 W
:
W <- (c(0.25,0.25,0.25,0.25))
我希望 W 的分量之和为 (sum(W)=1
),并且给定 X
和 W
元素相乘的和编号 N
(sum(W*X)=N
)。
在 R 中有没有简单的方法来做到这一点?我在 Excel 中使用了 Solver,但我需要将其自动化。
这是您的常量和目标值:
x <- c(1, -2, 3, 4)
n <- 10
您需要一个函数来最小化。第一行包含您的每个条件,第二行提供如何将错误组合成一个分数的度量。您可能想要更改第二行。例如,您可以使用 sum(c(1, 5) * errs ^ 2)
.
使一个错误项的权重高于另一个项
fn <- function(w)
{
errs <- c(sum(w) - 1, sum(x * w) - n)
sum(errs ^ 2)
}
最简单的事情就是从所有权重开始时使用相同的值。
init_w <- rep.int(1 / length(x), length(x))
使用optim
进行优化。
optim(init_w, fn)
## $par
## [1] 0.1204827 -1.2438883 1.1023338 1.0212406
##
## $value
## [1] 7.807847e-08
##
## $counts
## function gradient
## 111 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
par
元素包含您的权重。
这个问题没有唯一的解决办法。如果您尝试 w
的其他初始值,您很可能会从 optim
.
得到不同的结果
问题可以表述为求解欠定线性方程组。
A <- matrix(c(rep(1,4),x), nrow=2,byrow=TRUE)
b <- matrix(c(1,n), nrow=2)
我们寻求满足A %*% w = b
的解决方案,但哪一个?最小范数解?或者也许是其他的?解有无穷多个。可以使用矩阵 A
的伪逆给出解。为此使用包 MASS
。
library(MASS)
Ag <- ginv(A)
最小范数解是
wmnorm <- Ag %*% b
并检查 A %*% wmnorm - b
和 fn(wmnorm)
。
请参阅维基百科页面 System of linear equations
Matrix solutions
.
部分
解决方案由
给出
Az <- diag(nrow=nrow(Ag)) - Ag %*% A
w <- wmnorm + Az %*% z
其中 z
是 ncol(Az)
元素的任意向量。
现在生成一些解决方案并检查
xb <- wmnorm
z <- runif(4)
wsol.2 <- xb + Az %*% z
wsol.2
A %*% wsol.2 - b
fn(wsol.2)
z <- runif(4)
wsol.3 <- xb + Az %*% z
wsol.3
A %*% wsol.2 - b
fn(wsol.3)
你会发现这两个解决方案在作为参数提供给 fn
时是有效的解决方案。并且与 optim
找到的解决方案有很大不同。您可以通过选择不同的起点 init_w
进行测试,例如 init_w1 <- runif(4)/4
.
我有一个方程组,我想用数值方法求解它。给定起始种子,我想得到一个接近的解决方案。让我解释。
我有一个常数向量,X
,值:
X <- (c(1,-2,3,4))
和权重向量 W
:
W <- (c(0.25,0.25,0.25,0.25))
我希望 W 的分量之和为 (sum(W)=1
),并且给定 X
和 W
元素相乘的和编号 N
(sum(W*X)=N
)。
在 R 中有没有简单的方法来做到这一点?我在 Excel 中使用了 Solver,但我需要将其自动化。
这是您的常量和目标值:
x <- c(1, -2, 3, 4)
n <- 10
您需要一个函数来最小化。第一行包含您的每个条件,第二行提供如何将错误组合成一个分数的度量。您可能想要更改第二行。例如,您可以使用 sum(c(1, 5) * errs ^ 2)
.
fn <- function(w)
{
errs <- c(sum(w) - 1, sum(x * w) - n)
sum(errs ^ 2)
}
最简单的事情就是从所有权重开始时使用相同的值。
init_w <- rep.int(1 / length(x), length(x))
使用optim
进行优化。
optim(init_w, fn)
## $par
## [1] 0.1204827 -1.2438883 1.1023338 1.0212406
##
## $value
## [1] 7.807847e-08
##
## $counts
## function gradient
## 111 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
par
元素包含您的权重。
这个问题没有唯一的解决办法。如果您尝试 w
的其他初始值,您很可能会从 optim
.
问题可以表述为求解欠定线性方程组。
A <- matrix(c(rep(1,4),x), nrow=2,byrow=TRUE)
b <- matrix(c(1,n), nrow=2)
我们寻求满足A %*% w = b
的解决方案,但哪一个?最小范数解?或者也许是其他的?解有无穷多个。可以使用矩阵 A
的伪逆给出解。为此使用包 MASS
。
library(MASS)
Ag <- ginv(A)
最小范数解是
wmnorm <- Ag %*% b
并检查 A %*% wmnorm - b
和 fn(wmnorm)
。
请参阅维基百科页面 System of linear equations
Matrix solutions
.
解决方案由
给出Az <- diag(nrow=nrow(Ag)) - Ag %*% A
w <- wmnorm + Az %*% z
其中 z
是 ncol(Az)
元素的任意向量。
现在生成一些解决方案并检查
xb <- wmnorm
z <- runif(4)
wsol.2 <- xb + Az %*% z
wsol.2
A %*% wsol.2 - b
fn(wsol.2)
z <- runif(4)
wsol.3 <- xb + Az %*% z
wsol.3
A %*% wsol.2 - b
fn(wsol.3)
你会发现这两个解决方案在作为参数提供给 fn
时是有效的解决方案。并且与 optim
找到的解决方案有很大不同。您可以通过选择不同的起点 init_w
进行测试,例如 init_w1 <- runif(4)/4
.