[英]Solving a system of nonlinear equations in R
假设我有以下方程组:
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) )
}
使用此库。
library("nleqslv")
您需要定义要求解的多元函数。
fn <- function(x) {
rate <- x[1] * x[2] - 5
shape <- sqrt(x[1] * x[2]^2) - 10
return(c(rate, shape))
}
那你很好。
nleqslv(c(1,5), fn)
始终查看详细结果。 数值计算可能很棘手。 在这种情况下,我得到了:
Warning message:
In sqrt(x[1] * x[2]^2) : NaNs produced
这仅意味着该程序搜索了一个包含x[1] < 0
的区域,然后大概将点头点回到了平面的右侧。
在评论中,发帖人特别询问如何使用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
写入问题中。 通过减去方程式的RHS并使用crossprod
来形成平方和,从而形成fn2
。
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
和b
都使用1的起始值,并将第一个方程的两边除以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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.