R обратная функция для определения параметра, когда выход является фиксированной константой - PullRequest
1 голос
/ 06 мая 2020

Если у меня есть функция

estimator <- function(A,B) {
 A*(B+23)
}

Как я могу изменить эту функцию, чтобы найти значение A для B как последовательность от 0 до 120 (B = 1,2,3,4 ,. .., 120), который даст фиксированный результат, скажем C = 20?

Я бы использовал его для сопоставления значений, для которых удовлетворяет уравнение A * (B + 23) = C = 20, где B - это список b.list от 0 до 120, для c .list, из разных C?

b.list <- seq(0,120,by=1)
c.list <- tibble(seq(10,32,by=2))

В конце я хотел бы построить линии кривых функция для разных C с помощью purrr или аналогичного.

То есть: учитывая, что высота дерева в метрах в возрасте 100 лет будет соответствовать функции, C = A * (B + 23), решите для A, что даст результат C = 10, когда B , Возраст - это список лет от 0 до 120?

Вот ссылка, показывающая, что я пытаюсь сделать! enter image description here

Вот еще одна

enter image description here Большое спасибо!

1 Ответ

0 голосов
/ 06 мая 2020

Для инверсии это быстрая инверсия:

A = C/(B+23)

Один ответ может быть:

B <- seq(0, 120)
C <- seq(10, 32, 2)
A <- matrix(0,
            nrow = length(B),
            ncol = length(C))

for(i in 1:ncol(M)){
    A[,i] <- C[i] / (B + 23)
}

matplot(B, A, type ="l", col = "black")

В случае более сложной функции вам действительно понадобится автомат c решение проблемы. Один из способов - рассматривать это как проблему оптимизации, когда вы хотите минимизировать расстояние от C:

B <- seq(1, 120)
C <- seq(10, 32, 2)
A <- matrix(0,
            nrow = length(B),
            ncol = length(C))
fct <- function(A, B, C){
    paramasi <- 25
    parambeta<- 7395.6
    paramb2 <- -1.7829
    refB <- 100
    d <- parambeta*(paramasi^paramb2)
    r <- (((A-d)^2)+(4*parambeta*A*(B^paramb2)))^0.5
    si_est <- (A+d+r)/ (2+(4*parambeta*(refB^paramb2)) / (A-d+r))
    return(sum(si_est - C)^2)}

for(c in 1:length(C)){
    for(b in 1:length(B)){
        # fixe parameters + optimisation
        res <- optim(par = 1, fn = fct, B = B[b], C = C[c])
        A[b, c] <- res$par
    }
}

matplot(B, A, type = "l", col = "black")

. Вам нужно быть осторожным, потому что в вашем случае я думаю, что вы могли бы найти аналитическую формулу для обратное, что было бы лучше.

Удачи!

...