在Python中拟合变量Sinc函数

问题描述 投票:0回答:3

我想将 sinc 函数拟合到一堆数据线上。 使用高斯拟合本身确实有效,但数据似乎不够高斯,所以我想我可以切换到正弦..

我只是试图将一小段自运行代码放在一起,但意识到我可能不完全理解,如果将数组移交给函数,则如何处理数组,这可能是我收到错误消息调用的部分原因我的程序

所以我的代码目前如下所示:

from numpy import exp
from scipy.optimize import curve_fit
from math import sin, pi

def gauss(x,*p):
    print(p)
    A, mu, sigma = p
    return A*exp(-1*(x[:]-mu)*(x[:]-mu)/sigma/sigma)

def sincSquare_mod(x,*p):
    A, mu, sigma = p
    return A * (sin(pi*(x[:]-mu)*sigma) / (pi*(x[:]-mu)*sigma))**2


p0 = [1., 30., 5.]
xpos = range(100)
fitdata = gauss(xpos,p0)
p1, var_matrix = curve_fit(sincSquare_mod, xpos, fitdata, p0)

我得到的是:

Traceback (most recent call last):
File "orthogonal_fit_test.py", line 18, in <module>
fitdata = gauss(xpos,p0)
File "orthogonal_fit_test.py", line 7, in gauss
A, mu, sigma = p
ValueError: need more than 1 value to unpack

根据我的理解,p 没有正确移交,这很奇怪,因为它在我的实际代码中。然后,当安装时,我从 sincSquare 函数中收到类似的消息,这可能是相同类型的错误。我对明星操作员还很陌生,所以可能隐藏着一个小故障......

有人有什么想法吗? :)

谢谢!

python curve-fitting
3个回答
1
投票

您需要进行三项更改,

def gauss(x, A, mu, sigma):
    return A*exp(-1*(x[:]-mu)*(x[:]-mu)/sigma/sigma)

def sincSquare_mod(x, A, mu, sigma):
    x=np.array(x)
    return A * (np.sin(pi*(x[:]-mu)*sigma) / (pi*(x[:]-mu)*sigma))**2

fitdata = gauss(xpos,*p0)

1,请参阅文档

2、将

sin
替换为
numpy
版本,用于
array
广播

3,直接前进吧? :P

注意,我认为你正在寻找

p1, var_matrix = curve_fit(gauss,...
而不是OP中的那个,它似乎没有解决方案。


0
投票

还值得注意的是,当 x*Pi 接近零时,您会得到舍入误差,并且可能会被放大。 您可以按如下所示进行近似以获得更好的结果(VB.NET,抱歉):

Private Function sinc(x As Double) As Double
    x = (x * Math.PI)
    'The Taylor Series expansion of Sin(x)/x is used to limit rounding errors for small values of x
    If x < 0.01 And x > -0.01 Then
        Return 1.0 - x ^ 2 / 6.0 + x ^ 4 / 120.0
    End If
    Return Math.Sin(x) / x
End Function

http://www.wolframalpha.com/input/?i=taylor+series+sin+%28x%29+%2F+x&dataset=&equal=提交


0
投票

我同意CT Zhu的评论: “注意,我认为你正在寻找 p1, var_matrix = curve_fit(gauss,... 而不是 OP 中的那个,它似乎没有解决方案。”

可以通过在 sincSquare_mod() 中使用更传统的 sigma 定义来找到 OP 问题的解决方案 - 将 sigma 放在分母中。

def sincSquare_mod(x, A, mu, sigma):
    x=np.array(x)
    return A * (np.sin(pi*(x[:]-mu)/sigma) / (pi*(x[:]-mu)/sigma))**2

返回 p1 = [ 0.97636428, 29.99999902, 9.8213293 ]

© www.soinside.com 2019 - 2024. All rights reserved.