nleqslv 中的附加非负性约束

Additional non-negativity constraints in nleqslv

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

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

受制于x1 >= 0x2 >= 0

使用 nleqslv,我设置要优化的函数的 return 向量如下:

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 is singular (1/condition=0.0e+000) (see allowSingular option)"

并使用 allowSingular = T 调用会产生:

"x-values within tolerance 'xtol'"

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

我怎样才能正确地做到这一点?

试试这个

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)

转换后的问题。 要获得以正确单位求解的结果,只需对 nleqslv.

给出的结果使用 ^2