当前位置: 首页 > 面试题库 >

如何使用pylab和numpy将正弦曲线拟合到我的数据?

司空通
2023-03-14
问题内容

对于一个学校项目,我试图证明经济遵循相对正弦曲线的增长方式。除了它的经济性(公认的
狡猾)之外,我还在构建一个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个参数。



 类似资料:
  • 问题内容: 对于使用6阶多项式插值非线性数据,我有一个非常具体的要求。我看过numpy / scipy例程(scipy.interpolate.InterpolatedUnivariateSpline),这些例程最多只能进行5级插值。 即使没有直接函数可以执行此操作,是否有办法在Python中复制Excel的LINEST线性回归算法?LINEST允许进行6度曲线拟合,但是我不希望将Excel用于任

  • 问题内容: 我有一组近似于2D曲线的点。我想将Python与numpy和scipy配合使用,以找到近似适合这些点的三次贝塞尔曲线路径,在该路径中,我指定两个端点的确切坐标,并返回其他两个控制点的坐标。 我最初以为可以做我想做的事,但是似乎迫使曲线穿过每个数据点(因为我想您希望进行插值)。我以为我走错了路。 我的问题与此相似:如何将贝塞尔曲线拟合到一组数据?,除了他们说他们不想使用numpy。我的偏

  • 错误:C:\用户\Aidan\Anaconda3\lib\site-包\sepy\优化\minpack.py:794: OptimizeWarning:参数的协方差无法估计 类别=OptimizeWarning) ---------------------------------------------------------------------------()14 plt中的TypeErro

  • 本教程演示了如何使用TensorFlow.js运算符重头构建小型玩具模型. 我们将使用多项式函数生成一些合成数据的曲线. 先决条件 本教程假设您熟悉TensorFlow.js的基本构建块介绍在TensorFlow.js中的核心概念:张量,变量和操作.我们建议在完成本教程之前完成核心概念。 运行代码 本教程重点介绍用于构建模型和其系数的TensorFlow.js代码.可以在此处找到本教程的完整代码(

  • 主要内容:基本绘图PyLab 是一个面向 Matplotlib 的绘图库接口,其语法和 MATLAB 十分相近。它和 Pyplot 模快都够实现 Matplotlib 的绘图功能。PyLab 是一个单独的模块,随 Matplotlib 软件包一起安装,该模块的导包方式和 Pyplot 不同,如下所示: PyLab 是一个很便捷的模块,下面对它的使用方法做相应的介绍。 基本绘图 提供一对相同长度的数组(或序列),然后

  • 本文向大家介绍批处理BAT实现正弦曲线和抛物线代码,包括了批处理BAT实现正弦曲线和抛物线代码的使用技巧和注意事项,需要的朋友参考一下 先奉上正弦曲线的: 根据悬崖之树的代码改造而成,可以说是真正的抛物线了。 函数解析式:f(x)=-x2-1