【问题标题】:Non-conformable arguments error in root finding function求根函数中的参数不一致错误
【发布时间】:2018-07-02 13:16:06
【问题描述】:

我正在尝试解决 x in:

R 中的两个实现:

H <- diag(2)  # 2-dimensional diagonal matrix with ones on the diagonal
uniroot.all(function(x, y, H) {c(t(x)) %*% solve(H) %*% c(x) - y}, y=y, H=H, lower=0, upper=10) 
uniroot.all(function(x, y, H) {t(x) %*% solve(H) %*% x - y}, y=y, H=H, lower=0, upper=10) 

但是,两者都给出了相同的不一致参数错误:

Error in c(t(x)) %*% solve(H) : non-conformable arguments
Error in t(x) %*% solve(H) : non-conformable arguments

我理解这个错误,但也许有人可以阐明如何在上面的等式中求解 x,因为我没有得出一个解决方案(R 或 Python 都可以)

提前谢谢你。

【问题讨论】:

  • 你能举一个满足上面等式的例子吗?
  • @Onyambu 我实际上想要实现的是找到定义 N(0,H) 随机变量的最高密度区域的椭圆体的截止值,例如 here

标签: python r function syntax-error


【解决方案1】:

将有许多满足条件的值。例如,举一个例子,其中 H 是单位矩阵,y 是例如 5,那么 x 可以是 c(1,2) 或 (2,1) 或 (1.656615, 1.501874) 或 (2.2184971, 0.2797686) 等等。所以所有这形成了一个 sol 为 5 的椭圆:

我们可以这样做:

 optim(c(0,1.9),function(x,H,y)abs(c(crossprod(x,solve(H,x)))-y),H=diag(2),y=5)

你可以测试上面代码给出的解决方案,你会发现它们实际上给出了 5. 选择任何起始值:

s=function(w,u)optim(c(w,u),function(x,H,y)abs(c(crossprod(x,solve(H,x)))-y),H=diag(2),y=5)$par
a=1:4
r=t(mapply(s,a,rep(a,each=length(a))))
cbind(r,rowSums(r^2))
           [,1]      [,2] [,3]
 [1,] 1.2216786 1.8728325    5
 [2,] 2.0000000 1.0000000    5
 [3,] 1.1964828 1.8890286    5
 [4,] 0.2209853 2.2251215    5
 [5,] 1.0000000 2.0000000    5
 [6,] 1.6566155 1.5018739    5
 [7,] 0.1675176 2.2297843    5
 [8,] 1.2257806 1.8701503    5
 [9,] 1.8890286 1.1964828    5
[10,] 2.2297843 0.1675176    5
[11,] 1.6043461 1.5575857    5
[12,] 1.2658540 1.8432617    5
[13,] 2.2251215 0.2209853    5
[14,] 1.8701503 1.2257806    5
[15,] 1.8432617 1.2658540    5
[16,] 1.6636298 1.4941003    5

你看他们都给你5个。

【讨论】:

  • 感谢@Onyambu 的澄清。鉴于方程描述了一个椭球体,因此存在满足该条件的多个解是有意义的。但是可以肯定地说原则上存在无限数量的解决方案吗?再次感谢。
  • 还有,在函数中使用abs的目的是什么。我知道它将计算 c(crossprod(x,solve(H,x)))-y 的绝对值。但是为什么要使用它呢?
  • 只是为了确保函数不会产生小于零的值。我们正在最小化两个值之间的距离。为了最小化,那么我们应该有一个尽可能小的值。如果你不使用 abs,你会得到负值,这永远不会解决,因为它仍然会继续最小化梯度和函数值,得到非常大的负值。但我们的目标是获得接近零的值
  • 阅读函数 optim 使用的最小化算法后的最后一个问题。我相信默认值是“Nelder-Mead”,但我相信“L-BFGS-B”在提供 jacobian/hessian 时可能会更快一些。我关心这个的原因是,作为进一步分析的一部分,我将检索许多满足相当大量不同正定矩阵 H(约 500)的方程的解。我相信最小化问题是无约束凸优化之一,“L-BFGS-B”将适合获得令人满意的解决方案。有什么想法吗?
  • @Paul 我主要使用 BFGS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多