如何逼近几何增长序列的函数?
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 - 不趋于无穷大。
我有创建函数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 - 不趋于无穷大。