Вычислить переменные из 6 нелинейных уравнений с 6 неизвестными в R - PullRequest
0 голосов
/ 17 марта 2019

Хотите вычислить a, b, c, d, e, f (6 переменных) из 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 голосов
/ 18 марта 2019

Проверьте это:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...