为 R 中的期望输出值提供一个可能的输入
Give one possible input for a desired output value in R
假设下面的函数 d
可以针对其两个输入值的不同组合输出相同的答案。
例如,要输出 0.8164966
,可以输入 d(2, 12)
或类似地 d(1, 3)
以及两个输入值的更多组合。
问题如果我提供所需的输出d
,有没有办法得到一对可能的输入值?
例如,如果我想要 d = 0.8164966
,R 能否只给我 1 and 3
作为导致 d = 0.8164966
的一对可能输入值?
注意:我在问如何解决只有一对可能的(有很多)输入值 给定任何 d
(输出)。
d <- function(mean_dif, Vmax) mean_dif/sqrt(Vmax/2)
d(2, 12) # 0.8164966
d(1, 3) # 0.8164966
这归结为将小数转换为有理数。一种方法是使用 MASS::fractions
。这意味着我们可以这样写你的反函数:
inv_d <- function(d) {
ratio <- MASS::fractions(d^2/2)
result <- as.numeric(strsplit(attr(ratio, "fracs"), "/")[[1]])
result[1] <- result[1]^2
setNames(result, c("mean_dif", "Vmax"))
}
所以你可以这样做:
inv_d(d(2, 12))
#> mean_dif Vmax
#> 1 3
inv_d(d(1, 3))
#> mean_dif Vmax
#> 1 3
inv_d(d(5, 100))
#> mean_dif Vmax
#> 1 4
如果您希望它适用于一般 d
,您需要给求解器一个提示。例如,是否保证第一个参数等于 1 的解决方案?如果第一个参数是 1,第二个参数的可能取值范围是多少?
根据您给出的d
,答案是“是的,这是有保证的”,明确的解决方案是Vmax = 2/d^2
,即
inv_d <- function(d) {
c(mean_dif = 1, Vmax = 2/d^2)
}
你得到
inv_d(pi)
# mean_dif Vmax
# 1.0000000 0.2026424
现在,如果您不知道 Vmax
的解决方案,您可以尝试使用 uniroot
:
inv_d <- function(dval) {
Vmax <- uniroot(function(Vmax) d(1, Vmax) - dval, c(0, 10/dval^2))$root
c(mean_dif = 1, Vmax = Vmax)
}
inv_d(pi)
# mean_dif Vmax
# 1.0000000 0.2026534
在这种情况下,解决方案不太准确。
如果你不能得到区间或保证,那么通常没有解决方案,但你可以尝试一堆不同的猜测,有时会很幸运。
假设下面的函数 d
可以针对其两个输入值的不同组合输出相同的答案。
例如,要输出 0.8164966
,可以输入 d(2, 12)
或类似地 d(1, 3)
以及两个输入值的更多组合。
问题如果我提供所需的输出d
,有没有办法得到一对可能的输入值?
例如,如果我想要 d = 0.8164966
,R 能否只给我 1 and 3
作为导致 d = 0.8164966
的一对可能输入值?
注意:我在问如何解决只有一对可能的(有很多)输入值 给定任何 d
(输出)。
d <- function(mean_dif, Vmax) mean_dif/sqrt(Vmax/2)
d(2, 12) # 0.8164966
d(1, 3) # 0.8164966
这归结为将小数转换为有理数。一种方法是使用 MASS::fractions
。这意味着我们可以这样写你的反函数:
inv_d <- function(d) {
ratio <- MASS::fractions(d^2/2)
result <- as.numeric(strsplit(attr(ratio, "fracs"), "/")[[1]])
result[1] <- result[1]^2
setNames(result, c("mean_dif", "Vmax"))
}
所以你可以这样做:
inv_d(d(2, 12))
#> mean_dif Vmax
#> 1 3
inv_d(d(1, 3))
#> mean_dif Vmax
#> 1 3
inv_d(d(5, 100))
#> mean_dif Vmax
#> 1 4
如果您希望它适用于一般 d
,您需要给求解器一个提示。例如,是否保证第一个参数等于 1 的解决方案?如果第一个参数是 1,第二个参数的可能取值范围是多少?
根据您给出的d
,答案是“是的,这是有保证的”,明确的解决方案是Vmax = 2/d^2
,即
inv_d <- function(d) {
c(mean_dif = 1, Vmax = 2/d^2)
}
你得到
inv_d(pi)
# mean_dif Vmax
# 1.0000000 0.2026424
现在,如果您不知道 Vmax
的解决方案,您可以尝试使用 uniroot
:
inv_d <- function(dval) {
Vmax <- uniroot(function(Vmax) d(1, Vmax) - dval, c(0, 10/dval^2))$root
c(mean_dif = 1, Vmax = Vmax)
}
inv_d(pi)
# mean_dif Vmax
# 1.0000000 0.2026534
在这种情况下,解决方案不太准确。
如果你不能得到区间或保证,那么通常没有解决方案,但你可以尝试一堆不同的猜测,有时会很幸运。