gpt4 book ai didi

scipy - 即使是正弦波,curve_fit 也会失败

转载 作者:行者123 更新时间:2023-12-04 22:24:09 25 4
gpt4 key购买 nike

我正在尝试使用 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])

然后,如果我尝试初步猜测(比如 1.5):
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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com