我想将一个sinc函数适用于一堆数据线。 使用高斯适合本身确实有效,但数据似乎不够高,所以我想我可以切换到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函数中获得类似的消息,当安装时,它可能是相同类型的错误。我是明星运营商的新手,因此可能会出现一个小故障......
有人有什么想法吗? :)
谢谢!
答案 0 :(得分: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)
2,将sin
版本替换为numpy
广播
注意,我认为您正在寻找array
而不是OP中的那个,这看起来没有解决方案。
答案 1 :(得分: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=Submit