求解 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),并且给定 XW 元素相乘的和编号 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 - bfn(wmnorm)。 请参阅维基百科页面 System of linear equations Matrix solutions.

部分

解决方案由

给出
Az <- diag(nrow=nrow(Ag)) - Ag %*% A
w <- wmnorm + Az %*% z

其中 zncol(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.