пытаясь повернуть сложную функцию в R - PullRequest
1 голос
/ 17 марта 2020
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?

1 Ответ

0 голосов
/ 17 марта 2020

В 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

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...