0

を使用して正弦関数を当てはめたいとしscipy.optimize.curve_fitます。関数のパラメーターがわかりません。周波数を取得するために、フーリエ変換を行い、他のすべてのパラメーター (振幅、位相、オフセット) を推測します。プログラムを実行すると、フィット感は得られますが、意味がありません。何が問題ですか?どんな助けでも大歓迎です。

import numpy as np
import matplotlib.pyplot as plt
import scipy as sp

ampl = 1
freq = 24.5
phase = np.pi/2
offset = 0.05
t = np.arange(0,10,0.001)

func = np.sin(2*np.pi*t*freq + phase) + offset

fastfft = np.fft.fft(func)
freq_array = np.fft.fftfreq(len(t),t[0]-t[1])

max_value_index = np.argmax(abs(fastfft))
frequency = abs(freq_array[max_value_index])

def fit(a, f, p, o, t):
    return a * np.sin(2*np.pi*t*f + p) + o

guess = (0.9, frequency, np.pi/4, 0.1)
params, fit = sp.optimize.curve_fit(fit, t, func, p0=guess)

a, f, p, o = params
fitfunc = lambda t: a * np.sin(2*np.pi*t*f + p) + o

plt.plot(t, func, 'r-', t, fitfunc(t), 'b-')
4

1 に答える 1

1

scipy.optimize.curve_fitあなたのプログラムの主な問題は、 がどのように設計されているか、およびその fit 関数の仮定が誤解されていたことです。

 ydata = f(xdata, *params) + eps

つまり、fit 関数は、最初のパラメーターとして x 値の配列を持ち、その後に特定の順序で関数パラメーターが続く必要があり、y 値の配列を返す必要があります。これを行う方法の例を次に示します。

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

#t has to be the first parameter of the fit function 
def fit(t, a, f, p, o):
    return a * np.sin(2*np.pi*t*f + p) + o

ampl = 1
freq = 2
phase = np.pi/2
offset = 0.5
t = np.arange(0,10,0.01)

#is the same as fit(t, ampl, freq, phase, offset)
func = np.sin(2*np.pi*t*freq + phase) + offset

fastfft = np.fft.fft(func)
freq_array = np.fft.fftfreq(len(t),t[0]-t[1])

max_value_index = np.argmax(abs(fastfft))
frequency = abs(freq_array[max_value_index])

guess = (0.9, frequency, np.pi/4, 0.1)
#renamed the covariance matrix
params, pcov = scipy.optimize.curve_fit(fit, t, func, p0=guess)
a, f, p, o = params

#calculate the fit plot using the fit function
plt.plot(t, func, 'r-', t, fit(t, *params), 'b-')
plt.show()

ご覧のとおり、プロットのフィット関数の計算方法も変更しました。別の関数は必要ありません。パラメーター リストで fit 関数を使用するだけで、fit プロシージャが返されます。
もう 1 つの問題は、共分散配列を呼び出したことでfit、以前に定義した関数を上書きしていましたfit。私もそれを修正しました。
PS: もちろん、完全にフィットするとデータ ポイントがカバーされるため、曲線は 1 つしか表示されません。

于 2018-02-10T21:22:50.013 に答える