从R中有6个未知数的6个非线性方程计算变量

时间:2019-03-17 12:43:47

标签: r equation

试图从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是什么。

1 个答案:

答案 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)