用R中的约束求解非线性方程

时间:2017-12-04 16:02:37

标签: r constraints equation solver

我需要将VBA脚本转换为R.涉及解算器,我不知道选择哪个包或如何实现以下问题:

等式:

Y = 0.42×A +(1-0.42)* B

(y是介于0和1之间的给定值)

4.65 =(A /(1-α))/(B /(1-b))的

变量:a,b

约束:

0< a< 1; 0< b< 1

有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

构建一个像这样的函数f

f <- function(x,y) {
    z <- numeric(length(x))
    # x[1] is a
    # x[2] is b
    # y=0.42*a+(1-0.42)*b
    # 4.65=(a/(1-a))/(b/1-b))

    z[1] <- y - (.42*x[1]+(1-.42)*x[2])
    z[2] <- 4.65 - (x[1]/(1-x[1]))/(x[2]/(1-x[2]))
    z
}

要为满足您限制的y找到f个不同值的零,您可以尝试这样的事情:

xstart <- c(.5,.5)

for( y in seq(.1,.9,.1) ) {
    res <- nleqslv(xstart,f,y=y)
    cat("*** y = ", y, "***\n")
    print(res)
}

不要忘记测试是否找到了解决方案(请参阅包nleqslv的文档)。看来该解决方案满足您的限制。 如果要查找函数的零,则无法约束解。如果它不满足您的限制,则没有解决方案。 如果解决方案不满足您的限制,您可以跳过它。

答案 1 :(得分:0)

谢谢Bhas!

最后我像这样实施了

findValue = function(y){

xstart <- c(y,y)

res <- nleqslv(xstart,equations,y=y)

res = c(as.numeric(substr(res[1], 3, 11)),as.numeric(substr(res[1], 22,30)) 

return(res)

}

方程&lt; - function(x,y){

z <- numeric(length(x))

# x[1] is a

# x[2] is b

# y=0.42*a+(1-0.42)*b

# 4.65=(a/(1-a))/(b/(1-b))


z[1] <- y - (.42*x[1]+(1-.42)*x[2])

z[2] <- 4.65 - (x[1]/(1-x[1]))/(x[2]/(1-x[2]))

z

}