期待从6个非线性方程计算a,b,c,d,e,f(6个变量):
以下是我的代码
library('BB')
library('nleqslv')
y <- rep(NA,6)
params <- function (x) {
a <- x[1]
b <- x[2]
c <- x[3]
d <- x[4]
e <- x[5]
f <- x[6]
y[1] <- 1960*b - 10000*c^2 +1
y[2] <- a + 980*d -10000*c*f
y[3] <- -2.8*b - 100*c + 980*e -10000*c*f
y[4] <- 2*b -10000*e^2
y[5] <- -2.8*d -100*e + c -10000*e*f
y[6] <- -5.6*e -200*f -10000*f^2
return(y)
}
x <-c(0,0,0,0,0,0)
params(x)
nleqslv(x, params)
我不确定我所做的是否正确。任何人都可以帮助我。谢谢。预期输出将是找出变量a,b,c,d,e,f是什么。
检查一下:
library('BB')
library('nleqslv')
y <- rep(0,6)
params <- function (x) {
a <- x[1]
b <- x[2]
c <- x[3]
d <- x[4]
e <- x[5]
f <- x[6]
y[1] <- 1960*b - 10000*c^2 +1
y[2] <- a + 980*d -10000*c*f
y[3] <- -2.8*b - 100*c + 980*e -10000*c*f
y[4] <- 2*b -10000*e^2
y[5] <- -2.8*d -100*e + c -10000*e*f
y[6] <- -5.6*e -200*f -10000*f^2
return(y)
}
x <-c(0,0,0,0,0,0)
params(x)
results <-nleqslv(x, params)
results$x # x values
results$fvec #y values
a <- results$x[1]
b <- results$x[2]
c <- results$x[3]
d <- results$x[4]
e <- results$x[5]
f <- results$x[6]
#Check
y[1] <- 1960*b - 10000*c^2 +1
y[2] <- a + 980*d -10000*c*f
y[3] <- -2.8*b - 100*c + 980*e -10000*c*f
y[4] <- 2*b -10000*e^2
y[5] <- -2.8*d -100*e + c -10000*e*f
y[6] <- -5.6*e -200*f -10000*f^2
y
如果我们使用x vector
AKA c(a,b,c,d,e,f)
值并尝试解决y
,我们得到非常接近0的值.results$x
给你六个值,使y(results$fvec
)接近0.你得到的最差的是y[4]
,这是-1.020406e-03
但是如果你认为它足够接近,你很好。
无论如何,正如@Bhas正确地说的那样:求解器产生了“超出迭代限制”,这通常意味着它已尝试了许多值而没有将结果接近0到某个容差。因此,如果您对结果不满意(并且您可能不是因为您需要解决问题),也许您想尝试迭代更多。也可能发生足够接近的解决方案......或者不存在。
例如,如果你向y[4]
调整一点y[4] <- 2*b +10000*e^2
你就足够接近了(这只是为了展示一个例子,不是你可以自由地改变你的功能):
y <- rep(0,6)
params <- function (x) {
a <- x[1]
b <- x[2]
c <- x[3]
d <- x[4]
e <- x[5]
f <- x[6]
y[1] <- 1960*b - 10000*c^2 +1
y[2] <- a + 980*d -10000*c*f
y[3] <- -2.8*b - 100*c + 980*e -10000*c*f
y[4] <- 2*b +10000*e^2
y[5] <- -2.8*d -100*e + c -10000*e*f
y[6] <- -5.6*e -200*f -10000*f^2
return(y)
}
x <-c(0,0,0,0,0,0)
params(x)
results <-nleqslv(x, params)