对于一个学校项目,我试图证明经济遵循相对正弦曲线的增长方式。除了它的经济性(公认的 狡猾)之外,我还在构建一个python模拟程序,以显示即使我们让某种程度的随机性成立,我们仍然可以产生相对 正弦的东西。我对自己生成的数据感到满意,但现在我想找到某种方法来获取与数据非常匹配的正弦图。我知道您 可以进行多项式拟合,但是您可以进行正弦拟合吗?
感谢您的帮助。让我知道您是否想查看代码的任何部分。
您可以 在scipy中使用最小二乘优化函数,以将任意函数拟合到另一个函数。如果拟合 正弦函数,则要拟合的三个参数是偏移量(’a’),幅度(’b’)和相位(’c’)。
只要您对参数进行合理的初步猜测,优化就可以很好地收敛。幸运的是,对于正弦函数, 可以很容易地对其中的2个进行首次估算:可以通过取数据平均值和幅值来估算偏移量。 RMS(3 *标准偏差/ sqrt(2))。
注意:作为以后的编辑,还添加了频率拟合。这不能很好地工作(可能导致极差的拟合)。因此,根据您的 判断,我的建议是除非频率误差小于百分之几,否则不要使用频率拟合。
这将导致以下代码:
import numpy as np from scipy.optimize import leastsq import pylab as plt N = 1000 # number of data points t = np.linspace(0, 4*np.pi, N) f = 1.15247 # Optional!! Advised not to use data = 3.0*np.sin(f*t+0.001) + 0.5 + np.random.randn(N) # create artificial data with noise guess_mean = np.mean(data) guess_std = 3*np.std(data)/(2**0.5)/(2**0.5) guess_phase = 0 guess_freq = 1 guess_amp = 1 # we'll use this to plot our first estimate. This might already be good enough for you data_first_guess = guess_std*np.sin(t+guess_phase) + guess_mean # Define the function to optimize, in this case, we want to minimize the difference # between the actual data and our "guessed" parameters optimize_func = lambda x: x[0]*np.sin(x[1]*t+x[2]) + x[3] - data est_amp, est_freq, est_phase, est_mean = leastsq(optimize_func, [guess_amp, guess_freq, guess_phase, guess_mean])[0] # recreate the fitted curve using the optimized parameters data_fit = est_amp*np.sin(est_freq*t+est_phase) + est_mean # recreate the fitted curve using the optimized parameters fine_t = np.arange(0,max(t),0.1) data_fit=est_amp*np.sin(est_freq*fine_t+est_phase)+est_mean plt.plot(t, data, '.') plt.plot(t, data_first_guess, label='first guess') plt.plot(fine_t, data_fit, label='after fitting') plt.legend() plt.show()
编辑:我假设您知道正弦波中的周期数。如果您不这样做,则安装起来会有些棘手。您可以尝试 通过手动绘制来猜测周期数,并尝试将其优化为第6个参数。