首页 > 解决方案 > 试图反转R中的复杂函数

问题描述

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

标签: rfunction

解决方案


在 R 中,我不知道反向运行函数。但是,您可以使用类似于牛顿法的方法r将50的值归零I

首先,需要清理该功能。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


推荐阅读