簡體   English   中英

使用“nleqslv”package 求解非線性方程組

[英]Solving Nonlinear System of Equation using 'nleqslv' package

我需要一些幫助來了解nleqslv中的 package nleqslv。 給定下面的代碼,我希望求解一個 3 變量非線性方程。

例如:

library(nlseqslv)
f <- function(x) {
  y <- numeric(3)
  y[1] <- x[1] + x[2] - x[1] * x[2] - 2
  y[2] <- x[1] + x[3] - x[1] * x[3] - 3
  y[3] <- x[2] + x[3] - 4
  return(y)
}

xstart <- c(2, 1, 0.5)
fstart <- dslnex(xstart)

# Newton start
nleqslv(xstart, f, 
        control = list(trace = 1, btol = .01, delta = "newton"))

考慮i = 1i = 100的常量變量i ,例如:

For i = 1:100 {
  f <- function(x) {
    y <- numeric(3)
    y[1] <- i * (x[1] + x[2] - x[1] * x[2]) - 2
    y[2] <- i * (x[1] + x[3] - x[1] * x[3]) - 3
    y[3] <- i * (x[2] + x[3]) - 4
    return(y)
  }
}

xstart <- c(2, 1, 0.5)
fstart <- dslnex(xstart)

# Newton start
nleqslv(xstart, f, 
        control = list(trace = 1, btol = .01, delta = "newton"))

對於每個 i = 1、2、3、...、100,我能否獲得 3 個未知變量x1x2x3的結果?

我不會顯示運行此代碼的結果,因為它會使答案太大。

解決代碼function

library(nleqslv)

f <- function(x) {
  y <- numeric(3)
  y[1] <- x[1] + x[2] - x[1] * x[2] - 2
  y[2] <- x[1] + x[3] - x[1] * x[3] - 3
  y[3] <- x[2] + x[3] - 4
  return(y)
}

起始值

xstart <- c(2, 1, 0.5)

nleqslv(xstart, f,
        control = list(trace = 1, btol = .01, delta = "newton"))

現在運行testnslv以查看其他方法或全局搜索是否效果更好

testnslv(xstart,f)

查看結果可以看出,使用沒有全局搜索機制的牛頓方法是最快的。

用額外的參數 i 定義 function

f2 <- function(x,i) {
    y <- numeric(3)
    y[1] <- i * (x[1] + x[2] - x[1] * x[2]) - 2
    y[2] <- i * (x[1] + x[3] - x[1] * x[3]) - 3
    y[3] <- i * (x[2] + x[3]) - 4
    return(y)
}

nleqslv(xstart, f2,i=1,
        control = list(trace = 1, btol = .01, delta = "newton"))

與上述相同的解決方案

i從 1 變化到 100 並將(可能的)解決方案與終止代碼一起存儲在矩陣中,以便您可以檢查是否找到解決方案

xstart <- rep(0.5,3)
zR <- matrix(NA,nrow=100,ncol=4)
for( i in 1:100 ) {
   z <-  nleqslv(xstart,f2,i=i,control = list(btol = .01, delta = "newton"))
   zR[i,] <- c(z$x,z$termcd)
   xstart <- z$x
}
zR

i=2沒有解決方案。

為什么會這樣? 通過一些代數操作,可以得出一個明確的解決方案。

zsol <- matrix(NA,nrow=100,ncol=4)
for( i in 1:100 ) {
zsol[i,1] <- 1/(2*i-4)
zsol[i,2] <- (2/i-zsol[i,1])/(1-zsol[i,1])
zsol[i,3] <- (3/i-zsol[i,1])/(1-zsol[i,1])
zsol[i,4] <- 1
}
zsol
# check the explicit solution with the solution found by `nleqslv`
zsol - zR

i=2時,解向量的第一個元素除以 0。

運行此代碼並享受。

暫無
暫無

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

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