使用梯度函数的 R 变量范围
R variable scope using gradient function
我在使用渐变函数时收到错误消息参数丢失且没有默认值。似乎变量没有传递给其他函数。 pi(1,3) 有效,但 gradient(pi, 1,3) 会导致错误消息“s(p1, p2) 错误:缺少参数“p2”,没有默认值” 谁能帮助解释为什么会发生这种情况以及如何解决?谢谢。请参阅下面的代码
rm(list = ls())
n = 2000
# 1 for T, 2 for S, 0 for T, 1 for S
v1 = 8
v2 = 10
mc1 = 1
mc2 = 2
tc = 2 # travel cost
s = function(p1, p2) { # share for two markets
u1 = function(x) v1- p1 - tc * x
u2 = function(x) v2 - p2 - tc * (1 - x)
udiff = function(x) u1(x) - u2(x) # x prefer 1, (1-x) prefer 2
# previous if ensures a root in uniroot function
xbar = ifelse(u1(0) < u2(0), 0, ifelse(u1(1) > u2(1), 1,
uniroot(udiff, interval = c(0, 1))$root))
# in case utility negative
x1 = ifelse(u1(0) < 0, 0, ifelse(u1(1) >= 0, 1, uniroot(u1, interval = c(0, 1))$root))
x2 = ifelse(u2(1) < 0, 0, ifelse(u2(0) >= 0, 1, 1-uniroot(u2, interval = c(0, 1))$root))
s = c(min(xbar, x1), min(1 - xbar, x2))
}
pi = function(p1, p2) {
pi1 = (p1 - mc1) * s(p1, p2)[1]
pi2 = (p2 - mc2) * s(p1, p2)[2]
return(c(pi1, pi2))
}
g = function(p1, p2) diag(gradient(pi, p1,p2))
gradient(pi, 1,3)
如果您键入 ?pracma::gradient
,您将看到
Usage: gradient(F, h1 = 1, h2 = 1)
和
F: vector of function values, or a matrix of values of a function of two variables.
在你的例子中 pi
只是函数的名称,而不是 gradient
.
的数字输入参数
我不知道您的 gradient
或 g
函数的确切 objective 是什么。使您的代码 运行 的示例可能如下所示
g = function(p1, p2) diag(gradient(pi(p1,p2), p1,p2))
我在使用渐变函数时收到错误消息参数丢失且没有默认值。似乎变量没有传递给其他函数。 pi(1,3) 有效,但 gradient(pi, 1,3) 会导致错误消息“s(p1, p2) 错误:缺少参数“p2”,没有默认值” 谁能帮助解释为什么会发生这种情况以及如何解决?谢谢。请参阅下面的代码
rm(list = ls())
n = 2000
# 1 for T, 2 for S, 0 for T, 1 for S
v1 = 8
v2 = 10
mc1 = 1
mc2 = 2
tc = 2 # travel cost
s = function(p1, p2) { # share for two markets
u1 = function(x) v1- p1 - tc * x
u2 = function(x) v2 - p2 - tc * (1 - x)
udiff = function(x) u1(x) - u2(x) # x prefer 1, (1-x) prefer 2
# previous if ensures a root in uniroot function
xbar = ifelse(u1(0) < u2(0), 0, ifelse(u1(1) > u2(1), 1,
uniroot(udiff, interval = c(0, 1))$root))
# in case utility negative
x1 = ifelse(u1(0) < 0, 0, ifelse(u1(1) >= 0, 1, uniroot(u1, interval = c(0, 1))$root))
x2 = ifelse(u2(1) < 0, 0, ifelse(u2(0) >= 0, 1, 1-uniroot(u2, interval = c(0, 1))$root))
s = c(min(xbar, x1), min(1 - xbar, x2))
}
pi = function(p1, p2) {
pi1 = (p1 - mc1) * s(p1, p2)[1]
pi2 = (p2 - mc2) * s(p1, p2)[2]
return(c(pi1, pi2))
}
g = function(p1, p2) diag(gradient(pi, p1,p2))
gradient(pi, 1,3)
如果您键入 ?pracma::gradient
,您将看到
Usage: gradient(F, h1 = 1, h2 = 1)
和
F: vector of function values, or a matrix of values of a function of two variables.
在你的例子中 pi
只是函数的名称,而不是 gradient
.
我不知道您的 gradient
或 g
函数的确切 objective 是什么。使您的代码 运行 的示例可能如下所示
g = function(p1, p2) diag(gradient(pi(p1,p2), p1,p2))