You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于R的nls SSlogis模型,给定y值求解对应x值?

解决方法

报错原因

uniroot() 要求第一个参数是返回数值的函数,你直接传入nls模型对象cembra_mod,不符合函数要求,因此报错找不到函数f。

正确步骤

  1. 从拟合好的模型中提取参数
  2. 定义一个目标函数:输入时间x,返回模型预测的吸水量与目标吸水量的差值(当差值为0时,x就是所求时间)
  3. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:10:29