[英]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 = 1
到i = 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 個未知變量x1
、 x2
和x3
的結果?
我不會顯示運行此代碼的結果,因為它會使答案太大。
解決代碼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.