3

我想我的数据代入(cos(x))^n配件。的n在理论上谷是2,但我的数据应该围绕1.7给我。当我定义我的拟合功能,我尝试curve_fit,我得到一个错误曲线与Python错误

def f(x,a,b,c): 
    return a+b*np.power(np.cos(x),c) 

param, extras = curve_fit(f, x, y) 

这是我的数据

x y    error 
90 3.3888756187 1.8408898986 
60 2.7662844365 1.6632150903 
45 2.137309503  1.4619540017 
30 1.5256883339 1.2351875703 
0 1.4665463518 1.2110104672 

错误看起来是这样的:

在/ usr /本地/ LIB/python3.5/DIST-包/ ipykernel_launcher.py:4: RuntimeWarning:在功率遇到移除 从sys.path中的CWD后无效值。

/usr/lib/python3/dist-packages/scipy/optimize/minpack.py:690: OptimizeWarning:参数的协方差无法估计
类别= OptimizeWarning)

+0

是否还有一些人失踪/不工作?如果是这样,让我知道我可以修改我的答案,如果没有,请考虑给予好评,并接受了答案是否能解决你的问题:)所有的 – Cleb

+1

首先非常感谢你,这是真的很有帮助。问题是x数据是以度为单位,它应该是弧度。除此之外,我学会了使用* popt来调用数组中的所有项目,所以它非常棒! –

回答

4

问题是cos(x)可以变成负数,然后cos(x)^n可以是不确定的。插图:

np.cos(90) 
-0.44807361612917013 

和例如

np.cos(90) ** 1.7 
nan 

这会导致您收到两条错误消息。

它工作正常,如果你修改了模型,例如到a + b * np.cos(c * x + d)。随后的情节如下所示:

enter image description here

的代码可以在下面找到一些在线评论:

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


def f(x, a, b, c, d): 

    return a + b * np.cos(c * x + d) 

# your data 
xdata = [90, 60, 45, 30, 0] 
ydata = [3.3888756187, 2.7662844365, 2.137309503, 1.5256883339, 1.4665463518] 

# plot data 
plt.plot(xdata, ydata, 'bo', label='data') 

# fit the data 
popt, pcov = curve_fit(f, xdata, ydata, p0=[3., .5, 0.1, 10.]) 

# plot the result 
xdata_new = np.linspace(0, 100, 200) 
plt.plot(xdata_new, f(xdata_new, *popt), 'r-', label='fit') 
plt.legend(loc='best') 
plt.show()