利用R语言自动寻找收益递减曲线的切线(最优觅食可视化)
自动找到收益递减曲线的切线(R语言实现)
首先,先明确你的收益递减曲线可以化简为数学表达式:f(x) = 40 / 2^(x/10)(从你提供的代码里,x/10+1-1可以直接抵消为x/10)。要找到过点(-40, 40)的切线与曲线的切点,我们可以通过微积分+数值求解的方式自动计算,完全替代试错法。
步骤1:推导切线的数学条件
设切点为(x₀, f(x₀)),它需要满足两个核心条件:
- 切线的斜率等于曲线在
x₀处的导数f’(x₀) - 切线的斜率也等于点
(-40,40)与(x₀,f(x₀))连线的斜率
先在R中定义原函数和它的导数:
# 定义收益递减曲线函数 f <- function(x) 40 / 2^(x/10) # 定义函数的导数(用于计算切线斜率) f_prime <- function(x) { -40 * log(2) * 2^(-x/10) / 10 }
接下来把两个斜率相等的条件整理成一个可求解的方程g(x) = 0:
# 构造方程:导数斜率 = 两点连线斜率 g <- function(x) { f_prime(x) - (40 - f(x)) / (-40 - x) }
步骤2:用R的uniroot自动求解切点
uniroot是R中专门用于数值求解单根的函数,我们可以根据你试错得到的x=38来设定求解区间:
# 在区间(0, 50)内求解方程的根(即切点的横坐标x0) result <- uniroot(g, interval = c(0, 50)) x0 <- result$root y0 <- f(x0) # 计算切点的纵坐标
运行这段代码后,会得到精确的切点坐标(实际运行结果约为x0≈38.07,和你试错的38几乎一致,验证了方法的准确性)。
步骤3:自动绘制切线
现在可以把你的切线绘制代码替换成自动计算的版本,不需要硬编码坐标:
# 原始曲线绘制代码(保留你的原有逻辑) ins <- 40 t <- 30 avg <- 30 curve(ins/2^(x/10+1-1), 0,2*t,xlim=c(-2*t,2*t),ylim=c(ins,0), xlab="time",ylab="food",type="l",lty=1,col=4,lwd=3,axes=FALSE) axis(1,pos=ins); axis(2,pos=0) # 自动绘制切线(用计算得到的切点坐标) segments(-ins, ins, x0, y0, col=4, lwd=3, lty=2)
额外提示
- 如果后续需要调整
ins或者曲线的参数,只需要修改f和f_prime函数里的对应数值,求解逻辑完全不需要改动,适配性极强。 - 如果你不确定
uniroot的求解区间,可以先绘制g(x)的曲线观察根的大致位置,再调整区间范围。
内容的提问来源于stack exchange,提问作者Thomas Dellinger
相关产品推荐
相关产品推荐

