Дополнительные ограничения неотрицательности в nleqslv

Я хочу решить систему нелинейных уравнений

x1 = f(x1, x2)
x2 = g(x1, x2)

при условии x1 >= 0, x2 >= 0

Используя nleqslv, я оптимизировал возвращаемый вектор моей функции следующим образом:

y[1] = x[1] - f(x[1], x[2])
y[2] = x[2] - g(x[1], x[2])
y[3] = -x[1]
y[4] = -x[2]

где последние два должны отражать неотрицательные ограничения.

Вызов nleqslv дает:

«Якобиан в единственном числе (1/условие=0.0e+000) (см. опцию allowSingular)»

и вызов с помощью allowSingular = T дает:

"значения x в пределах допуска 'xtol'"

что имеет смысл, поскольку y[4] не меняется при изменении x[4] (по построению вообще не реагирует на это).

Как я могу сделать это правильно?


person bonifaz    schedule 27.10.2016    source источник
comment
Вы можете попробовать преобразовать свой x[..]. Назовите аргументы z вместо x. А затем используйте x <- exp(z), который заставит x>0. Вы также можете попробовать x <- z^2, то есть использовать возведение в квадрат. Однако это может сделать вашу проблему плохо обусловленной. Вам придется экспериментировать. Если вам нужна дополнительная помощь, вам нужно будет предоставить фактическое определение ваших функций f и g.   -  person Bhas    schedule 27.10.2016
comment
Так что, если я так трансформируюсь, мне придется везде использовать sqrt(x), верно? Не очень помогло. f(x1,x2) = .9- x2 и g(x1,x2) = 2 - sqrt(x1+x2). Для этого простого случая я, конечно, мог бы решить его вручную, но в конечном итоге я хочу расширить его до системы N уравнений.   -  person bonifaz    schedule 27.10.2016
comment
Нет. Ровно наоборот. Ваши функции имеют аргументы z[1] и z[2], и вы устанавливаете x <- z^2. И тогда x[1] положительный. Если вы хотите, вы можете использовать x <- x^2 напрямую, но я чувствую, что это скрывает трансформацию.   -  person Bhas    schedule 27.10.2016
comment
Да, я поставил x = z^2 в начале. Но чтобы сохранить правильное назначение y[1] и y[2], я должен использовать y[1]=sqrt(x[1]) - f(sqrt(x[1]), sqrt[x[2]]), не так ли?   -  person bonifaz    schedule 27.10.2016
comment
Нет. Просто используйте свой результат для x.   -  person Bhas    schedule 27.10.2016
comment
Нет нет нет. Используйте 1_. Не извлекайте квадратный корень.   -  person Bhas    schedule 27.10.2016
comment
В таких случаях я использую решатель нелинейного программирования, который допускает ограничения переменных. Либо используйте фиктивную цель, либо минимизируйте сумму квадратов ошибок, если трудно достичь осуществимости.   -  person Erwin Kalvelagen    schedule 28.10.2016
comment
Какой решатель нелинейного программирования допускает ограничения переменных?   -  person bonifaz    schedule 05.11.2016


Ответы (1)


Попробуй это

f <- function(z) {
    x <- z^2  # this will force x to be >= 0; other tranformations are   possible
    y <- numeric(2)
    y[1] <- x[1] - f(x[1], x[2])
    y[2] <- x[2] - g(x[1], x[2])
    y
}

а затем используйте nleqslv для решения функции f с соответствующими начальными значениями для преобразованных переменных. Итак, если ваши начальные значения сейчас xstart используются

zstart <- sqrt(xstart)

для преобразованной задачи. И чтобы получить результат решения в правильных единицах, просто используйте ^2 для результата, заданного nleqslv.

person Bhas    schedule 28.10.2016
comment
Теперь я понимаю! Теперь это отлично работает для двумерного вектора, но как только я добавляю третий, nleqslv останавливается с не найденной лучшей точкой (алгоритм застопорился). - person bonifaz; 28.10.2016
comment
Поэкспериментируйте с различными начальными значениями. Используйте testnslv в пакете, чтобы узнать, могут ли методы, отличные от используемых по умолчанию, найти решение. Это вполне возможно. - person Bhas; 28.10.2016