我正在使用curve_fit
来拟合一阶动态系统的阶跃响应来估计增益和时间常数。我用两种方法。第一种方法是在时域中拟合函数生成的曲线。
# 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的数组,这是完美的。
第二种方法是通过拟合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]的数组,这是错误的。我的第二种方法有什么问题?是否有更有效的方法通过curve_fit
从数据中估计传递函数系数谢谢
答案 0 :(得分:3)
curve_fit的前三个参数是要适合的函数, xdata和ydata。您已通过xdata = 1。相反,你应该 给它与output1相关的时间值。
这样做的一种方法是实际使用函数中的第一个参数 model1,就像你在model()中所做的那样。例如:
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。]参数。