nleqslv中的其他非负性约束

时间:2016-10-27 13:55:11

标签: r nonlinear-optimization

我想解决一个非线性方程组

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

x1 >= 0x2 >= 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 会产生:

“Jacobian是单数(1 / condition = 0.0e + 000)(参见allowSingular选项)”

并使用allowSingular = T调用:

“容差范围内的x值'xtol'”

这是有道理的,因为y [4]不会随着x [4]的改变而改变(通过构造,根本不会对它做出响应)。

我该如何正确地做到这一点?

1 个答案:

答案 0 :(得分: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