我需要实现有限的指数增长插值。我在Wikipedia上找到了该公式:
B(t)=S-(S-B(0))*e^(-k*t)
我只需要整数区间的曲线值,例如0,1,2,3,结束 因此,从我的角度来看,我需要解决上述k的方程,因为我已经给出了其他所有内容。
这个问题是方程式
B(END_X)=END_Y-(END_Y-START_Y)*e^(-k*END_X)
没有解决方案,因为它仅近似于所需的END_Y值,而从未达到该值。
我的问题是我将如何最有效地实现k的计算,而又不会遇到很多麻烦。将END_Y增加一点,使其超出实际所需的端点? (语言是C ++)
编辑://
END_Y-(END_Y-START_Y)*e^(-k*END_X)=END_Y+sgn(END_Y-START_Y)*G
其中G是一个接近参数。
答案 0 :(得分:2)
指数增长对应于指数变化的函数。在这种情况下,通常在对数域中执行线性插值,或者在线性域中执行等效操作。
让我们调用(x 0 ,y 0 )和(x 1 ,y 1 )第一点。插值包括为每个输入 x i
计算近似值 y i
对数域中的线性插值:
这将导致线性域:
最后一个指数对应于一个简单变量 t ,该变量以线性方式在0到1之间变化。这意味着该计算可以迭代执行,只需要调用pow()
答案 1 :(得分:1)
对于指数衰减插值
y = A*exp(-k*x) (1)
图片中显示的内容,您至少需要知道两个点(x0,y0),(x1,y1)。在这种情况下,您有
y0 = A*exp(-k*x0)
y1 = A*exp(-k*x1)
y0/y1 = exp(-k*x0)/exp(-k*x1) = exp(-k(x0-x1))
k = log(y0/y1)/(x1-x0).
首先找到 k ,然后找到 A
A = y0 / exp(-k*x0)
获得 k 和 A 后,您可以在内部点找到 y(x)
(x0<x<x1)
按公式(1)