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

在R语言中求解线性曲线y2与非线性曲线RRpm的交点x值

求解RRpm与y2交点的SSpm值

问题分析

你的代码中,RRpm是非线性指数曲线,y2是线性直线,两者的交点无法通过解析公式直接求解,需用数值方法找根。先整理方程(排除SSpm=0的无效情况),最终要解的等式为:

114.8393 * exp(-0.1945079*SSpm) == log(114.8393)/0.1945079

R实现步骤

  1. 定义误差函数:计算RRpm与y2的差值,差值为0时即为交点
error_fun <- function(x) {
  RRpm_part <- x * 114.8393 * exp(-0.1945079 * x)
  y2_part <- (log(114.8393)/0.1945079) * x
  return(RRpm_part - y2_part)
}
  1. 用uniroot函数找根:先确定根所在的区间(观察曲线趋势,这里选择1到20)
# 在区间(1,20)内找交点
result <- uniroot(error_fun, interval = c(1, 20))

# 输出交点的SSpm值
cat("使RRpm = y2的SSpm值为:", result$root, "\n")

# 验证结果
x_val <- result$root
RRpm_val <- x_val * 114.8393 * exp(-0.1945079 * x_val)
y2_val <- (log(114.8393)/0.1945079) * x_val
cat("验证:RRpm =", RRpm_val, ",y2 =", y2_val, "\n")
  1. 可选:绘制曲线直观查看交点
SSpm <- seq(1, 50, 0.01)
RRpm <- SSpm * 114.8393 * exp(-0.1945079 * SSpm)
y2 <- (log(114.8393)/0.1945079) * SSpm

plot(SSpm, RRpm, type = "l", col = "blue", xlab = "SSpm", ylab = "Value")
lines(SSpm, y2, col = "red")
points(result$root, RRpm_val, pch = 16, col = "green")
legend("topright", legend = c("RRpm", "y2", "交点"), col = c("blue", "red", "green"), lty = c(1,1,NA), pch = c(NA,NA,16))

注意事项

  • uniroot仅能查找单根区间内的根,若存在多个交点,需拆分多个区间分别计算
  • 选择区间时,要确保误差函数在区间两端符号相反(一正一负),保证函数能找到有效根

内容的提问来源于stack exchange,提问作者vermicellion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:52:21