我想解决一个非线性方程组
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 会产生:
“Jacobian是单数(1 / condition = 0.0e + 000)(参见allowSingular选项)”
并使用allowSingular = T调用:
“容差范围内的x值'xtol'”
这是有道理的,因为y [4]不会随着x [4]的改变而改变(通过构造,根本不会对它做出响应)。
我该如何正确地做到这一点?
答案 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
。