假设我有以下方程组:
a * b = 5
sqrt(a * b^2) = 10
如何求解 R 中 a 和 b 的这些方程?
我想这个问题可以说是一个优化问题,具有以下功能......?
fn <- function(a, b) {
rate <- a * b
shape <- sqrt(a * b^2)
return(c(rate, shape) )
}
最佳答案
在评论中,海报特别询问如何使用 solve
和 optim
所以我们展示了如何手动解决这个(1),(2)使用 solve
, (3) 使用 optim
(4) 定点迭代。
1) 手工 首先注意,如果我们写 a = 5/b
基于第一个方程并将其代入第二个方程,我们得到 sqrt(5/b * b^2) = sqrt(5 * b) = 10
所以 b = 20 和 a = 0.25。
2)解决关于solve
的使用通过取两边的对数,这些方程可以转化为线性形式:
log(a) + log(b) = log(5)
0.5 * (loga + 2 * log(b)) = log(10)
可以表示为:
m <- matrix(c(1, .5, 1, 1), 2)
exp(solve(m, log(c(5, 10))))
## [1] 0.25 20.00
3) 优化 使用
optim
我们可以把这个写在 fn
是从问题。 fn2
通过减去方程的 RHS 并使用 crossprod
形成形成平方和。fn2 <- function(x) crossprod( fn(x[1], x[2]) - c(5, 10))
optim(c(1, 1), fn2)
给予:
$par
[1] 0.2500805 19.9958117
$value
[1] 5.51508e-07
$counts
function gradient
97 NA
$convergence
[1] 0
$message
NULL
4) 定点为此,以不动点形式重写方程,即形式 c(a, b) = f(c(a, b)) 然后迭代。一般来说,有几种方法可以做到这一点,并不是所有的方法都会收敛,但在这种情况下,这似乎有效。我们对
a
都使用起始值 1和 b
并将第一个方程的两边除以 b
得到不动点形式的第一个方程,我们将第二个方程的两边除以 sqrt(a)
得到定点形式的第二个方程:a <- b <- 1 # starting values
for(i in 1:100) {
a = 5 / b
b = 10 / sqrt(a)
}
data.frame(a, b)
## a b
## 1 0.25 20
关于r - 求解 R 中的非线性方程组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48832731/