求解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) )
}

在评论中,海报专门询问了有关使用solveoptim的信息,因此我们使用solve,(3(使用optim和(4(固定点迭代。

1(手工第一个注意,如果我们基于第一个方程式编写a = 5/b并将其替换为第二个方程式,我们将获得sqrt(5/b * b^2) = sqrt(5 * b) = 10,因此B = 20和A = 0.25。

2(关于使用solve的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((形式,然后迭代。通常,将有几种方法可以做到这一点,但并非所有人都会汇聚,但是在这种情况下,这似乎有效。我们对ab使用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

使用此库。

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的区域,然后大概将heck回到了平面的右侧。

最新更新