3

curve_fitゲインと時定数を推定するために、一次動的システムのステップ応答を適合させるために使用しています。私は2つのアプローチを使用します。最初のアプローチは、関数から生成された曲線を時間領域に当てはめることです。

# define the first order dynamics in  the time domain
def model(t,gain,tau):
    return (gain*(1-exp(-t/tau)))

#define the time intervals
time_interval = linspace(1,100,100)

#genearte the output using the model with gain= 10 and tau= 4 
output= model(t,10,4)

# fit to output and estimate  parameters - gain and tau
par = curve_fit(time_interval, output)

ここでチェックするparと、完璧な 10 と 4 の配列が明らかになります。

2 番目のアプローチは、LTI システムのステップ応答に適合させることによって、ゲインと時定数を推定することです。LTI システムは、分子と分母を持つ伝達関数として定義されます。

#define function as a step response of a LTI system .
# The argument x has no significance here,
# I have included because , the curve_fit requires passing "x" data to the function

def model1(x ,gain1,tau1):
    return lti(gain1,[tau1,1]).step()[1]

#generate output using the above model
output1 = model1(0,10,4)

par1 = curve_fit(model1,1,output1)

par1 をチェックすると [ 1.00024827, 0.01071004] の配列が明らかになり、これは間違っています。ここでの私の2番目のアプローチの何が問題になっていますか? Curve_fit によってデータから伝達関数係数を推定するより効率的な方法はありますか

ありがとうございました

4

1 に答える 1

3

Curve_fit の最初の 3 つの引数は、フィットする関数、xdata および ydata です。xdata=1 を渡しました。代わりに、output1 に関連付けられた時間値を指定する必要があります。

これを行う 1 つの方法は、model() で行ったように、関数 model1 で実際に最初の引数を使用することです。例えば:

import numpy as np
from scipy.signal import lti
from scipy.optimize import curve_fit


def model1(x, gain1, tau1):
    y = lti(gain1, [tau1, 1]).step(T=x)[1]
    return y

time_interval = np.linspace(1,100,100)

output1 = model1(time_interval, 10, 4)

par1 = curve_fit(model1, time_interval, output1)

期待どおり、パラメーターの [10., 4.] を取得します。

于 2012-09-02T17:02:18.130 に答える