尝试曲线拟合时Scipy curve_fit崩溃

pw136qt2  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(130)

我试图用一个函数来拟合一些数据。但是我遇到了一个问题,我得到了一个消息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()

因此,简而言之,我想知道是什么原因导致了这个错误,因为数组中没有负值。感谢所有的帮助!

cngwdvgl

cngwdvgl1#

首先,RuntimeWarning并不是真正的崩溃,您的代码确实为popt, pcov生成了合理的返回值。
出现这个警告是因为你的函数func_1T没有为负的a定义,但是curve_fit不知道这一点。尝试像这样限制a的定义域:

popt, pcov = curve_fit(func_1T, w_omega, transmisivity, bounds=(0, np.inf))

这样,就不会产生警告,因为函数不会尝试探索未定义函数的a的值。

相关问题