如何基于R的nls SSlogis模型,给定y值求解对应x值?
解决方法
报错原因
uniroot() 要求第一个参数是返回数值的函数,你直接传入nls模型对象cembra_mod,不符合函数要求,因此报错找不到函数f。
正确步骤
- 从拟合好的模型中提取参数
- 定义一个目标函数:输入时间x,返回模型预测的吸水量与目标吸水量的差值(当差值为0时,x就是所求时间)
- 用
uniroot()求解该函数的根
完整可运行代码
# 原始数据与模型拟合 absorption <- c(297.0470936,262.809483,323.8243166,296.6731868,313.5985664,283.1004567,259.8724386,228.8903642,197.1585476,230.1674857,182.5799195,148.0262402,134.087096,77.98206413) minutes <- c(195,181,167,157,147,135,105,83,63,45,33,24,10) cembra <- data.frame(absorption, minutes) # 用data.frame替代cbind更规范 cembra_mod <- nls(absorption ~ SSlogis(minutes, Asym, xmid, scal), data = cembra) # 提取模型参数 params <- coef(cembra_mod) Asym_fit <- params["Asym"] xmid_fit <- params["xmid"] scal_fit <- params["scal"] # 定义目标函数:输入x,返回预测值与目标y的差值 target_y <- 100 # 目标吸水量 f <- function(x) { SSlogis(x, Asym = Asym_fit, xmid = xmid_fit, scal = scal_fit) - target_y } # 先验证目标y在拟合范围内(避免uniroot报错) cat("x=0时预测吸水量:", SSlogis(0, Asym_fit, xmid_fit, scal_fit), "\n") cat("x=200时预测吸水量:", SSlogis(200, Asym_fit, xmid_fit, scal_fit), "\n") # 求解对应时间 result <- uniroot(f, lower = 0, upper = 200) cat("达到", target_y, "g/m²吸水量所需时间:", round(result$root, 2), "分钟\n")
补充说明
- 函数
f(x)的核心是构建“预测值-目标值”的差值,uniroot()会找到让差值为0的x值 - 必须保证
lower和upper区间内,函数值符号相反(即目标y落在该区间的预测值范围内),否则uniroot()会抛出错误 - 若需求解其他目标吸水量,仅需修改
target_y的数值即可
内容的提问来源于stack exchange,提问作者treee
相关产品推荐
相关产品推荐

