Scipy Optimize Curve tidak pas dengan data sebenarnya

Nov 04 2020

Saya mencoba menyesuaikan fungsi eksponensial yang membusuk dengan data dunia nyata. Saya mengalami masalah saat menyelaraskan fungsi dengan data aktual.

Ini kode saya:

def test_func(x, a, b, c):
    return a*np.exp(-b*x)*np.sin(c*x)

my_time = np.linspace(0,2.5e-6,25000)
p0 = [60000, 700000, 2841842]

params, params_covariance = curve_fit(test_func, my_time, my_amp,p0)

Sinyal saya dan fungsi yang dipasang

Pertanyaan saya: mengapa fungsi yang dipasang tidak dimulai di mana data saya mulai meningkat dalam amplitudo?

Jawaban

Mr.T Nov 04 2020 at 03:50

Seperti yang saya katakan dalam komentar saya, masalahnya adalah fungsi Anda tidak memperhitungkan bahwa kurva eksponensial dapat digeser. Jika Anda menyertakan pergeseran ini sebagai parameter tambahan, kecocokan mungkin akan bertemu.

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

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

my_time = np.linspace(0,2.5e-6,25000)

#generate fake data
testp0 = [66372, 765189, 2841842, -1.23e-7]
test_amp = test_func(my_time, *testp0)
my_amp = test_func(my_time, *testp0)
my_amp[:2222] = my_amp[2222]

p0 = [600, 700000, 2000, -2e-7]
params, params_covariance = curve_fit(test_func, my_time, test_amp, p0)
print(params)
fit_amp = test_func(my_time, *params)

plt.plot(my_time, my_amp, label="data")
plt.plot(my_time, fit_amp, label="fit")
plt.legend()

plt.show()

Keluaran sampel