gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:30:19 31 4
gpt4 key购买 nike

假设我有以下方程组:

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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com