回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我在想我不明白的是什么。</p>
<p>我正在跟踪<a href="http://www.scipy.org/Cookbook/FittingData" rel="nofollow noreferrer">http://www.scipy.org/Cookbook/FittingData</a>并尝试拟合正弦波。真正的问题是卫星磁强计数据在旋转的航天器上产生一个很好的正弦波。我创建了一个数据集,然后尝试对其进行调整以恢复输入。</p>
<p>这是我的代码:</p>
<pre><code>import numpy as np
from scipy import optimize
from scipy.optimize import curve_fit, leastsq
import matplotlib.pyplot as plt
class Parameter:
def __init__(self, value):
self.value = value
def set(self, value):
self.value = value
def __call__(self):
return self.value
def fit(function, parameters, y, x = None):
def f(params):
i = 0
for p in parameters:
p.set(params[i])
i += 1
return y - function(x)
if x is None: x = np.arange(y.shape[0])
p = [param() for param in parameters]
return optimize.leastsq(f, p, full_output=True, ftol=1e-6, xtol=1e-6)
# generate a perfect data set (my real data have tiny error)
def mysine(x, a1, a2, a3):
return a1 * np.sin(a2 * x + a3)
xReal = np.arange(500)/10.
a1 = 200.
a2 = 2*np.pi/10.5 # omega, 10.5 is the period
a3 = np.deg2rad(10.) # 10 degree phase offset
yReal = mysine(xReal, a1, a2, a3)
# plot the real data
plt.figure(figsize=(15,5))
plt.plot(xReal, yReal, 'r', label='Real Values')
# giving initial parameters
amplitude = Parameter(175.)
frequency = Parameter(2*np.pi/8.)
phase = Parameter(0.0)
# define your function:
def f(x): return amplitude() * np.sin(frequency() * x + phase())
# fit! (given that data is an array with the data to fit)
out = fit(f, [amplitude, frequency, phase], yReal, xReal)
period = 2*np.pi/frequency()
print amplitude(), period, np.rad2deg(phase())
xx = np.linspace(0, np.max(xReal), 50)
plt.plot( xx, f(xx) , label='fit')
plt.legend(shadow=True, fancybox=True)
</code></pre>
<p>这使得这个情节:
<img src="https://i.stack.imgur.com/91cGN.png" alt="enter image description here"/></p>
<p>恢复的<code>[44.2434221897 8.094832581 -61.6204033699]</code>拟合参数与我开始使用的参数没有相似之处。</p>
<p>有没有想过我不理解或做错了什么?</p>
<pre><code>scipy.__version__
'0.10.1'
</code></pre>
<hr/>
<p>编辑:
建议修正一个参数。在上面的例子中,将振幅固定到<code>np.histogram(yReal)[1][-1]</code>仍然会产生不可接受的输出。拟合:<code>[175.0 8.31681375217 6.0]</code>我应该尝试不同的拟合方法吗?建议是什么?</p>
<p><img src="https://i.stack.imgur.com/KFEwf.png" alt="enter image description here"/></p>