在R语言中求解线性曲线y2与非线性曲线RRpm的交点x值
求解RRpm与y2交点的SSpm值
问题分析
你的代码中,RRpm是非线性指数曲线,y2是线性直线,两者的交点无法通过解析公式直接求解,需用数值方法找根。先整理方程(排除SSpm=0的无效情况),最终要解的等式为:
114.8393 * exp(-0.1945079*SSpm) == log(114.8393)/0.1945079
R实现步骤
- 定义误差函数:计算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) }
- 用
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")
- 可选:绘制曲线直观查看交点
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
相关产品推荐
相关产品推荐

