nleqslv 中的附加非负性约束
Additional non-negativity constraints in nleqslv
我想求解一个非线性方程组
x1 = f(x1, x2)
x2 = g(x1, x2)
受制于x1 >= 0
、x2 >= 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
我想求解一个非线性方程组
x1 = f(x1, x2)
x2 = g(x1, x2)
受制于x1 >= 0
、x2 >= 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