我有一个方程式系统,我想用数值方法解决它。我想得到一个起始种子的近距离解决方案。让我解释。
我有一个常量向量X
,值为:
X <- (c(1,-2,3,4))
和权重的矢量W
:
W <- (c(0.25,0.25,0.25,0.25))
我希望W的组件总和为(sum(W)=1
),并且X
和W
元素乘以元素的总和将是给定的数字{ {1}}(N
)。
在R中有一种简单的方法吗?我在Excel中使用Solver,但我需要自动化它。
答案 0 :(得分:4)
这是你的常数和目标值:
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
元素包含您的权重。
答案 1 :(得分:2)
此问题没有独特的解决方案。如果您尝试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
进行测试。