- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 curve_fit
来拟合一个简单的正弦波(甚至没有任何噪声)作为测试,然后再继续解决更复杂的问题。不幸的是,它甚至没有给出正确的答案。这是我的语法:
x = linspace(0,100,300)
y = sin(1.759*x)
def mysine(x, a):
return sin(a*x)
popt, pcov = curve_fit(mysine, x, y)
popt
array([ 0.98679056])
popt, pcov = curve_fit(mysine, x, y, p0=1.5)
popt
array([ 1.49153365])
最佳答案
曲线拟合并不总是那么简单。 curve_fit
算法基于最小二乘曲线拟合,通常需要对输入参数进行初始猜测。根据您想要拟合的函数类型,您的初始猜测必须是正确的。
即使您尝试了初步猜测,我还是会说您还有一个问题,这与您的采样频率和波的频率有关。有关更多信息,您可以查看 Wikipedia 上的 Nyquist-Shannon sampling theorem。简而言之,您的 wave 的频率为 1.759/(2 * pi) = 0.28,结果非常接近 x
数组的采样频率 (~0.33)。另一个可能出现的问题是振荡过多,无法适应您的功能。
为了让您的代码正常工作,我建议您增加波的频率(a > 4 * 0.33)或增加采样频率并减少空间向量 x
的长度。
我运行了以下代码并获得了如图 here 所示的结果:
# -*- coding: utf-8 -*-
import numpy as np
import pylab as pl
from scipy.optimize import curve_fit
def mysine(x, a):
return 1. * np.sin(a * x)
a = 1.759 # Wave frequency
x = np.linspace(0, 10, 100) # <== This is what I changed
y = np.sin(a * x) + 0. * np.random.normal(size=len(x))
# Runs curve fitting with initial guess.
popt, pcov = curve_fit(mysine, x, y, p0=[1.5])
# Calculates the fitted curve
yf = mysine(x, *popt)
# Plots results for comparison.
pl.ion()
pl.close('all')
fig = pl.figure()
ax = fig.add_subplot(111)
ax.plot(x, y, '-', c=[0.5, 0.5, 0.5])
ax.plot(x, yf, 'k-', linewidth=2.0)
ax.text(0.97, 0.97, ur'a=%.4f, ã=%.4f' % (a, popt[0]), ha='right', va='top',
fontsize=14, transform=ax.transAxes)
fig.savefig('stow_curve_fit.png')
关于scipy - 即使是正弦波,curve_fit 也会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8126001/
我写的函数有问题。想法是使用 taylor 展开而不是 js 数学对象来计算 sin 和 cosin 值(在 radians 上运行) .这些是方程式: sin(x) = (x^1)/1! - (x^
我不知道这是编程还是数学问题,但我整理了一些FFT的简短示例。我加载了440hz的波并在顶部添加了一些正弦波,但是由于某种原因,频谱中存在一个我不理解的“波”。 据我了解,频谱应该具有相同的| Y(f
这个问题在这里已经有了答案: Java Math.cos(Math.toRadians()) returns weird values (4 个答案) 关闭 10 年前。 我正在编写一个程序,我必须
我想在 ios4 中实现一个正弦和余弦计算器: if([operation isEqual:@"sin"]){ operand = (operand*M_PI/180.0); oper
我使用 256 个元素为 VHDL 制作了一个正弦 LUT。 我使用 MIDI 输入,因此值范围为 8.17Hz(注 #0)到 12543.85z(注 #127)。 我有另一个 LUT 计算必须发送到
我想在ios4中实现一个正弦和余弦计算器: if([operation isEqual:@"sin"]){ operand = (operand*M_PI/180.0); operan
我是一名优秀的程序员,十分优秀!