为 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

在这种情况下,解决方案不太准确。

如果你不能得到区间或保证,那么通常没有解决方案,但你可以尝试一堆不同的猜测,有时会很幸运。