r - 求解 R 中的非线性方程组

标签 r equation-solving

假设我有以下方程组:

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) )

}

最佳答案

在评论中,海报特别询问如何使用 solveoptim所以我们展示了如何手动解决这个(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/

相关文章:

r - Data.table:与 j 一起使用的方括号

r - 在包函数中使用 data.table 失败

matlab - Matlab求解方程中多变量的顺序

java - 使用法拉利方法求四次方程的实根

r - 在 R 中,get ("abc") 和 eval(parse(text ="abc")) 有什么区别

删除散布在字符串中的多个标点符号

wolfram-mathematica - 是否有内置的 Mathematica 函数来查找方程中的运算符而不是数字?

c++ - 检查三点是否共线

python - 在 SciPy 中将复杂函数的根存储在数组中

r - 根据 R 中的行差异对行进行分组