我尝试使用余弦函数作为我的模型来拟合数据,但有些不起作用。
这是我的代码:
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
def model(x,a,psi,b):
return a*np.cos(x + psi)+b
err_y = 0.5
err_x = 2
x = np.arange(10, 370,20)
x_r = x* (np.pi/180)
y = np.array([5.7, 7.9, 8, 6.6, 4.4, 1.3, 0.09, 1.2, 2.9, 5.9, 7.8, 9, 7, 4.2, 1.5, 0.17, 0.57, 2.5])
error = err_y * np.ones(y.size)
popt, pcov = curve_fit(model, x_r, y,p0 = (4, 3.14, 4), sigma = error,absolute_sigma = True)
print(popt)
plt.scatter(x,y)
plt.errorbar(x, y, yerr=err_y, fmt='none', c='k')
plt.xlabel('Angle(degree)')
plt.ylabel('Readout (V)')
plt.plot(x, model(x_r, *popt), color='red')
我对参数进行了许多不同的初始猜测,但没有一个起作用。
您的数据在 0 到 360 度范围内有两个周期 - 但您的拟合函数只允许一个。
尝试考虑余弦内的频率以及相位。
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
def model(x,a,omega,psi,b):
return a*np.cos(omega*x + psi)+b
err_y = 0.5
err_x = 2
x = np.arange(10, 370,20)
x_r = x* (np.pi/180)
y = np.array([5.7, 7.9, 8, 6.6, 4.4, 1.3, 0.09, 1.2, 2.9, 5.9, 7.8, 9, 7, 4.2, 1.5, 0.17, 0.57, 2.5])
error = err_y * np.ones(y.size)
popt, pcov = curve_fit(model, x_r, y,p0 = (4, 2.0, 3.14, 4), sigma = error,absolute_sigma = True)
print(popt)
plt.scatter(x,y)
plt.errorbar(x, y, yerr=err_y, fmt='none', c='k')
plt.xlabel('Angle(degree)')
plt.ylabel('Readout (V)')
plt.plot(x, model(x_r, *popt), color='red')
plt.show()
输出(角频率为 1.98...或者,实际上是 2)
[4.16352559 1.98440219 4.77715943 4.26330405]