求解R中的不确定方程组

时间:2015-09-17 07:55:06

标签: r solver equation-solving

我有一个方程式系统,我想用数值方法解决它。我想得到一个起始种子的近距离解决方案。让我解释。

我有一个常量向量X,值为:

X <- (c(1,-2,3,4))

和权重的矢量W

W <- (c(0.25,0.25,0.25,0.25))

我希望W的组件总和为(sum(W)=1),并且XW元素乘以元素的总和将是给定的数字{ {1}}(N)。

在R中有一种简单的方法吗?我在Excel中使用Solver,但我需要自动化它。

2 个答案:

答案 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 - 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进行测试。