如果我有一个函数
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之间的年份列表?
这里还有一个
对于逆向是快速反转 。
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")
你需要小心,因为在你的情况下,我认为你可以找到一个反演的分析公式,这将是更好的。
祝您好运!