如何逼近几何增长序列的函数?

How to approximate function for geometrically growing sequence?

我有创建函数x0:

x0 = []
    for i in range(0,N):
        if i == 0:
            a =  0.4
        else:
            a = round(0.4 + 0.3*2**(i-1), 1)
        print(i, a)
        x0.append(a)

这给了我增长序列的数据: [0.4, 0.7, 1.0, 1.6, 2.8, 5.2, 10.0, 19.6, 38.8, 77.2, ...] 我想找到一个适合这些点的函数。我不想使用多项式,因为 N 可以不同但需要找到单参数函数。投影需要很笼统。

我的方法是使用代码:

def fun(x, a, b):    
    return np.cos(x**(2/3) * a + b) 
    
# Make fit #
y0 = [0]*len(x0)
p, c = curve_fit(f=fun, xdata=np.array(x0), ydata=y0)
  
x = np.linspace(0, max(x0), 10000)    
plt.plot(x, fun(x, *p))    
plt.scatter(x0, y0)

该功能的进度对于起点来说似乎太宽了,并且非常适合最后一个。我还尝试通过将此函数乘以 x 来降低初始振荡,但开始时周期仍然太宽。是否有可能找到良好的振荡函数来通过(几乎)所有这些点?我不知道如何在 x**(...) 下设置参数,因为在那里放置一个变量会导致拟合估计它接近 1,这不是我需要的。我可以那样设置 sin(x**b) 的功率吗?如果不是,我应该尝试什么函数系列?

下面是函数乘以 b*x 的图。第一点的振荡应该更密集。

多亏了建议,我找到了最合适的,我认为再好不过了。

解决方法是:

 def fun(x, a, b, c):
        return np.cos(np.pi*(np.log2((x-a)/b) + c))

拟合方法看起来像

p, c = curve_fit(f=fun, xdata=np.array(x0), ydata=y0, bounds=([0, -np.inf, -np.inf], [x0[0], np.inf, np.inf]))

a 设置初始边界很重要,以避免收敛失败或“初始点的残差不是有限的”问题。最后,尽管域中接近 0 的疯狂行为,每个点都有自己的交叉点。参数非常接近 0 或 1 - 不趋于无穷大。