簡體   English   中英

解決R中的非線性方程組

[英]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的區域,然后大概將點頭點回到了平面的右側。

在評論中,發帖人特別詢問如何使用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寫入問題中。 通過減去方程式的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))形式)重寫方程,然后進行迭代。 通常,有幾種方法可以做到這一點,但並非所有方法都可以收斂,但是在這種情況下,這似乎可行。 我們對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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM