Как решить нелинейное уравнение, используя пакет nleqslv в R?

Мне нужно решить это уравнение (например, f (x, y) = 0):

library(nleqslv)
target <- function(x)
{
  z = x[1]/(x[1]+x[2])
  y = numeric(2)
  y[1] <- z*exp(-x[2]*(x[2]+z*(1-exp(-x[1]/z))))-0.00680
  y[2] <- z/x[2]*(1-exp(-x[2]))-exp(-x[2])*z/x[1]*(1-exp(-x[1]))-3.43164
  y
}

# Usage
xstart <- c(1,1)
target(xstart)
nleqslv(xstart, target, control=list(ftol=.0001, allowSingular=TRUE),jacobian=TRUE,method="Newton")

используя R с nleqslv или другой у вас есть другие :)

Спасибо

 Gauss31 июл. 2016 г., 15:59
Они являются частью уравнения :). У меня есть уравнение, подобное этому f (x, y) = (z * exp (-y * (y + z * (1-exp (-x / z)))); z / y * (1-exp (- y)) - exp (-y) * z / x * (1-exp (-x))) = (a, b), где (a, b) может принимать некоторые указанные значения. В посте я положил (а, б) = (0,00680; 3,43164).
 Jan Sila31 июл. 2016 г., 15:18
Какие цифры -0,00680 и -3,43164? Я получаю сообщение об ошибке: Ошибка в fn (par, ...): отсутствует аргумент "y" без значения по умолчанию ... Вы получаете то же самое?
 Jan Sila31 июл. 2016 г., 16:25
хорошо, это хорошее наблюдение ... :)
 Bhas31 июл. 2016 г., 16:47
В вашей функции есть ошибка при назначении вектораy. y[0] не существует в R и R полностью игнорирует это. Индексирование векторов начинается с индекса1, Так что вы должны использоватьy[1] а такжеy[2] вместо. Если вы сделаете это, вы получите плохо подготовленного якобиана. Если вы бежитеnleqslv(xstart, target, control=list(btol=.01),jacobian=TRUE,method="Newton") вы увидите, что первый столбец якобиана почти равен нулю. С помощьюallowSingular=TRUE вcontrol не помогает Так вы уверены, что функция была правильно указана?
 Gauss31 июл. 2016 г., 16:09
Ошибка вызвана неправильным определением целевой функции ... nleqslv использует векторы ... Я исправил проблему, теперь вы можете попробовать, и у вас будет другое сообщение :)

Ответы на вопрос(1)

Я экспериментировал с твоей функцией. Переписатьtarget функция использоватьa;b константы в вашем комментарии, как во втором комментарии:

target <- function(x, a=.00680,b=3.43164)
{
  z <- x[1]/(x[1]+x[2])
  y <- numeric(2)
  y[1] <- z*exp(-x[2]*(x[2]+z*(1-exp(-x[1]/z))))-a
  y[2] <- z/x[2]*(1-exp(-x[2]))-exp(-x[2])*z/x[1]*(1-exp(-x[1]))-b
  y
}

Значения по умолчанию дляa а такжеb это то, что вы изначально указали. Используя их, вы получите плохо обусловленного якобиама.

Однако если мы дадим некоторые другие значенияa а такжеb например вот так

nleqslv(xstart, target, control=list(btol=.01),jacobian=TRUE,method="Newton",a=2,b=1)

или же

nleqslv(xstart, target, control=list(btol=.01),jacobian=TRUE,method="Newton",a=2,b=2)

затем для первого выражения полное возвращаемое значениеnleqslv является

$x
[1]  2.4024092 -0.7498464

$fvec
[1] 1.332268e-15 2.220446e-16

$termcd
[1] 1

$message
[1] "Function criterion near zero"

$scalex
[1] 1 1

$nfcnt
[1] 10

$njcnt
[1] 7

$iter
[1] 7

$jac
           [,1]       [,2]
[1,] -0.2930082 -1.2103174
[2,]  0.1801120 -0.6566861

Я склонен заключить, что либо ваша функция неверна, либо вы указали невозможные значения дляa а такжеb, методBroyden также, кажется, работает хорошо.

 Gauss31 июл. 2016 г., 19:03
Спасибо вам, Бхас, за вашу помощь!
 Bhas31 июл. 2016 г., 17:51
Посмотрите, сможете ли вы найти двухмерную функцию графика в R. Изменение уравнения зависит от вас; Понятия не имею.
 Gauss31 июл. 2016 г., 17:49
Есть ли способ визуализировать это уравнение?
 Gauss31 июл. 2016 г., 17:29
Ваш пример работает хорошо! Спасибо :) Но я понятия не имею, как изменить свое уравнение, чтобы получить хорошо заданную задачу :)

Ваш ответ на вопрос