试图从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是什么。
答案 0 :(得分:0)
检查:
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
,但是如果您认为它足够接近,你很好。
无论如何,正如@Bs正确地指出的那样:求解器产生了“超出迭代极限”,这通常意味着它尝试了许多值,而没有使结果接近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)