gpt4 book ai didi

scipy - 在 Scipy.signal 中拟合传递函数模型

转载 作者:行者123 更新时间:2023-12-01 15:20:31 30 4
gpt4 key购买 nike

我正在使用 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从数据中估计传递函数系数

谢谢

最佳答案

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.] 作为参数,正如预期的那样。

关于scipy - 在 Scipy.signal 中拟合传递函数模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12233702/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com