我试图用一个函数来拟合一些数据。但是我遇到了一个问题,我得到了一个消息RuntimeWarning: invalid value encountered in sqrt return 1/(np.sqrt(x*a+1))
。我怀疑这是由于平方根下的一个负值,但是我的数据中没有任何负值,但是当我把函数的参数改为abs()
时,问题就解决了。是参数a
为负值的拟合,但在尝试使用它时崩溃?!**
我的代码和我使用的数据如下:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
omega = np.array([10, 20, 40, 80, 160, 320, 640, 1280, 2560, 5120, 10240, 20480, 40960, 81920, 163840, 327680, 655360, 1310720])*2*np.pi
U_out = np.array([5.08, 5.12, 5.12, 5.12, 5.08, 5, 4.76, 4.04, 2.76, 1.58, 0.860, 0.460, 0.260, 0.104, 0.054, 0.032, 0.0144, 0.0065])
U_in = np.array([5.20, 5.20, 5.20, 5.20, 5.20, 5.6, 5.6, 5.4, 5, 5, 5, 5, 5,5 ,5 ,5 ,5, 5])
trans = U_out/U_in
trans_ucrt = (trans*0.03)*1/np.sqrt(2)
def func_1T(x,a):
return 1/(np.sqrt(x*a+1))
def trans_func_fit():
#Dodanie punktów danych na wykresie
plt.scatter(omega, trans, color='steelblue')
plt.errorbar(omega, trans, yerr=trans_ucrt, fmt='--o')
#Dopasowanie wykresu do funckcji
w_omega = np.array(omega) # x-Variable
transmisivity = np.array(trans) # y-Variable
popt, pcov = curve_fit(func_1T, w_omega, transmisivity)
perr = np.sqrt(np.diag(pcov))
y = func_1T(w_omega, *popt)
#Stylistyka i wygląd wykresu
plt.plot(w_omega, y, '--', color = 'g', label="Dopasowanie dla: $a={:.3f}\pm{:.3f}$" .format(popt[0], perr[0]))
plt.legend(['Dane pomiarowe połączone linią przerywaną --'], loc='upper right')
plt.xlabel(r'Częstość $\omega$')
plt.ylabel(r'Transmitancja filtru $T$')
plt.xscale('log')
plt.grid(True, which="both")
plt.gca().xaxis.set_major_locator(plt.LogLocator(base=10, numticks=10))
plt.gca().xaxis.set_minor_locator(plt.LogLocator(base=10, subs='all', numticks=100))
plt.show()
trans_func_fit()
因此,简而言之,我想知道是什么原因导致了这个错误,因为数组中没有负值。感谢所有的帮助!
1条答案
按热度按时间cngwdvgl1#
首先,
RuntimeWarning
并不是真正的崩溃,您的代码确实为popt, pcov
生成了合理的返回值。出现这个警告是因为你的函数
func_1T
没有为负的a
定义,但是curve_fit
不知道这一点。尝试像这样限制a
的定义域:这样,就不会产生警告,因为函数不会尝试探索未定义函数的
a
的值。