我需要将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
有人可以帮我吗?
答案 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
}