繁体   English   中英

曲线拟合

[英]Curve Fitting scipy

为什么这个配件这么差?

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def fit(x, a, b, c, d):
    return a * np.sin(b * x + c) + d

xdata = np.linspace(0, 360, 1000)
ydata = 89.9535 + 60.9535 * np.sin(0.0174 * xdata - 1.5708)

popt, pcov = curve_fit(fit, xdata, ydata)

plt.plot(xdata, 89.9535 + 60.9535 * np.sin(0.0174 * xdata - 1.5708))
plt.plot(xdata, fit(xdata, popt[0], popt[1], popt[2], popt[3]))
plt.show()

拟合的曲线看起来很奇怪,或者也许我很想念它,谢谢您的帮助。

结果如下:

这是结果

curve_fit查找最小二乘问题的局部最小值。 在这种情况下,有很多局部最小值。

解决此问题的一种方法是使用尽可能好的初始猜测。 对于具有多个局部最小值的问题, curve_fit的默认值(默认值)可能非常糟糕。 对于您的功能,关键参数是b ,即频率。 如果您知道该值会很小,即约为0.01,请使用0.01作为初始猜测:

In [77]: (a, b, c, d), pcov = curve_fit(fit, xdata, ydata, p0=[1, .01, 1, 1])

In [78]: a
Out[78]: 60.953499999999998

In [79]: b
Out[79]: 0.017399999999999999

In [80]: c
Out[80]: -102.10176491487339

In [81]: ((c + np.pi) % (2*np.pi)) - np.pi
Out[81]: -1.570800000000002

In [82]: d
Out[82]: 89.953500000000005

或者,仅绘制原始数据,然后使用它对参数进行初始猜测。 对于周期函数,可以很容易地估计周期和幅度。 在这种情况下,猜测不必太接近。

然后我在curve_fit中使用了这些:

popt, pcov = curve_fit(fit, xdata, ydata, [ 80., np.pi/330, 1., 1. ])

它返回的结果本质上是原始值。

array([  6.09535000e+01,   1.74000000e-02,  -1.57080000e+00,
         8.99535000e+01])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM