【问题标题】:trying to reverse complicated function in R试图反转R中的复杂函数
【发布时间】:2020-03-17 11:43:21
【问题描述】:
myfnS <- function(S,T,pH,D,f,r,I0) {

f1 <- 0.78*sqrt(S/35)*exp(T/26)

f2 <- 42*exp(T/17)

alpha <- 0.106*((f1*f^2)/(f1^2 + f^2))*exp((pH - 8)/0.56) + 0.52*(1 + T/43)*(S/35)*((f2*f^2)/(f2^2 + f^2))*exp(-D/6) + 0.00049*f^2*exp(-(T/27 + D/16))

TLsph <- (20*log(r*1000, base = 10))

I <- I0 - TLsph - ((alpha)*r)

return(I)
}

我正在尝试插入 I,以获得 r 的值,但我不知道该怎么做。

其他事物的值保持不变; for example for (I=50, S=34, T=10.5, pH-8.1, D=0.0395, f=10.3, I0=192) - 我如何找到value of r

【问题讨论】:

  • 你的函数给我一个错误,你的意思是alpha &lt;- 0.106*((f1*f^2)/(f1^2 + f^2))*exp((pH - 8)/0.56) + 0.52(1 + T/43)(S/35)((f2*f^2)/(f2^2 + f^2))*exp(-D/6) + 0.00049*f^2*exp(-(T/27 + D/16))我在第一个exp之前添加了乘法运算符

标签: r function


【解决方案1】:

在 R 中,我不知道反向运行函数。但是,您可以使用类似于Newton's method 的方法将r 的值归零,从而得到I 的50。

首先,需要清理函数。使用T 作为参数是一个问题,因为它也是TRUE 的缩写,所以我将其更改为tt。我还添加了* 之前隐含的运算符。

myfnS <- function(S,tt,pH,D,f,r,I0) {

f1 <- 0.78*sqrt(S/35)*exp(tt/26)

f2 <- 42*exp(tt/17)

alpha <- 0.106*((f1*f^2)/(f1^2 + f^2))*exp((pH - 8)/0.56) + 
    0.52*(1 + (tt)/43)*(S/35)*((f2*f^2)/(f2^2 + f^2))*exp(-D/6) + 
    0.00049*f^2*exp(-(tt/27 + D/16))

TLsph <- (20*log(r*1000, base = 10))

I <- I0 - TLsph - ((alpha)*r)

return(I) }

然后是一种迭代 r 值以接近 50 的 I 值的方法。随着 r 上升,I 下降。一旦发现 r 的值在 50 的 1 以内,则返回 r。可以调整此阈值以获得更准确的猜测。

iterateR <- function(I=50, r=1){
    if (abs(I - myfnS(r, S=34, tt=10.5, pH=8.1, D=0.0395, f=10.3, I0=192)) < 1) {
        return(r)
    }
    else if(I - myfnS(r, S=34, tt=10.5, pH=8.1, D=0.0395, f=10.3, I0=192) > 1) {
        iterateR(r=r-1)
    }
    else if(I - myfnS(r, S=34, tt=10.5, pH=8.1, D=0.0395, f=10.3, I0=192) < 1) {
        iterateR(r=r+1)
    }
}
iterateR(I=50, r=1)
#> 47
myfnS(r=47, S=34, tt=10.5, pH=8.1, D=0.0395, f=10.3, I0=192)
#> 50.8514607488626

47 的 r 给出 50.85 的 I

【讨论】:

  • R 内置了很多相关函数。stats::uniroot 例如实现了 Newton–Raphson 方法;你可以因此例如运行 uniroot(function (r) myfnS(r, S=34, tt=10.5, pH=8.1, D=0.0395, f=10.3, I0=192) - 50, c(0, 100)),产生 47.71046。
  • 感谢您的提示。不知道那个。
猜你喜欢
  • 1970-01-01
  • 2021-04-12
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 2013-08-29
  • 2020-08-01
  • 2022-08-05
相关资源
最近更新 更多