В R я не знаю, как запустить функцию в обратном порядке. Однако вы можете использовать что-то похожее на метод Ньютона , чтобы обнулить значение 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, чтобы приблизиться к I, равному 50. По мере того, как r повышается, я понижаюсь. Как только значение для r найдено в пределах 1 из 50, возвращается 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
Значение r 47 дает I 50,85
.