当输出为固定常数时,用R逆向函数求解参数。

问题描述 投票:0回答:1

如果我有一个函数

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是0和120之间的列表b.list,对于c.list,不同的C?

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

最后,我想用purrr或类似的方法绘制不同C的函数曲线线。

即:给定一棵树在100岁时的高度(单位:米),将遵循函数,C=A*(B+23),解A将得到结果C=10,当B。年龄 是一个0到120之间的年份列表?

这里有一个链接,显示了我想做的东西!enter image description here

这里还有一个

enter image description here谢谢

r function purrr equation equation-solving
1个回答
0
投票

对于逆向是快速反转 。

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的距离。

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")

你需要小心,因为在你的情况下,我认为你可以找到一个反演的分析公式,这将是更好的。

祝您好运!

© www.soinside.com 2019 - 2024. All rights reserved.