python设计状态观测器的问题

num=[3.08];
den=[1080,1620,72,1];

[A,B,C,D]=tf2ss(num,den);

A=[-1/30 1/30 0;0 -1/30 1/30;0 0 -1/12];
B=[0 0 1.1*2.8/12]';
C=[1 0 0];
D=0;

N=[-3 -3 -8];
L=acker(A',C',N)';
est=estim(G,L)
step(est)
tf(est)

img

img

在matlab中给定了传递函数,可以通过上述的代码生成状态观测器,并画出阶跃响应图像,输出了观测状态的传递函数

sys = ctrl.tf([3.08], [10800, 1620, 72,1])
sys_ss = control.ss(sys) 
N=np.array([-3,-3,-8]);

上面已经给出了传递函数sys和要配置的状态观测器的极点N,我想通过python(不能用其他语言),实现给定一个传递函数,生成系统状态估计器并画出阶跃响应图像,输出观测状态的传递函数,应该怎么做?求详细可行的过程

可以使用python的控制系统库Control来实现状态观测器的设计。首先,需要将给定的传递函数转换为状态空间形式,可以通过Control的tf2ss函数来实现。然后,通过LQR算法,你可以用acker函数来配置状态观测器的极点,然后再用estim函数生成状态观测器。最后,你可以通过step函数画出阶跃响应图像,通过tf函数计算观测状态的传递函数。

下面是一份参考代码:

import control
import numpy as np

# 将给定的传递函数转换为状态空间形式
num = [3.08]
den = [1080, 1620, 72, 1]
sys = control.tf(num, den)
sys_ss = control.ss(sys)

# 设置状态观测器的极点
N = np.array([-3, -3, -8])
L = control.acker(sys_ss.A.T, sys_ss.C.T, N).T

# 生成状态观测器并画出阶跃响应图像
est = control.estim(sys, L)
control.step(est)

# 计算观测状态的传递函数
control.tf(est)

您可以使用Python的控制系统库“control”来生成状态观测器。首先,将传递函数转换为状态空间模型:

import control
sys = control.tf([3.08], [1080, 1620, 72, 1])
sys_ss = control.ss(sys) 

接下来,您可以使用control.acker()函数计算状态观测器的状态空间表示:

import numpy as np
N = np.array([-3, -3, -8])
L = control.acker(sys_ss.A.transpose(), sys_ss.C.transpose(), N)

最后,您可以使用control.estim()函数将状态观测器附加到状态空间模型上:

sys_est = control.estim(sys_ss, L)

您可以使用control.step()函数画出阶跃响应图像:

import matplotlib.pyplot as plt
t, y = control.step(sys_est)
plt.plot(t, y)
plt.xlabel('Time (s)')
plt.ylabel('Output')
plt.title('Step Response')
plt.show()

观察状态的传递函数可以使用sys_est.C和sys_est.D属性:

print("Observer State Transfer Function:")
print("C = ", sys_est.C)
print("D = ", sys_est.D)

以上就是完整的过程
如果我的回答对您有帮助,请采纳我的答案

您可以使用Python的Control系统工具包来实现这个任务。该工具包提供了用于生成状态估计器和画出阶跃响应图的功能。

首先,您需要使用Control包中的ss函数将传递函数转换为状态空间形式:

from control import *
import numpy as np

num = [3.08]
den = [1080, 1620, 72, 1]
sys = tf(num, den)
sys_ss = ss(sys)


接下来,您可以使用Control包中的acker函数来生成状态估计器:

N = np.array([-3, -3, -8])
L = acker(sys_ss.A.T, sys_ss.C.T, N)
L = L.T


最后,您可以使用Control包中的step函数画出阶跃响应图:

sys_est = ss(sys_ss.A - np.dot(L, sys_ss.C), L, sys_ss.C, 0)
t, y = step(sys_est)

import matplotlib.pyplot as plt
plt.plot(t, y)
plt.xlabel('Time (s)')
plt.ylabel('Response')
plt.title('Step Response of Estimated System')
plt.grid()
plt.show()


同时,您可以使用Control包中的tf函数输出传递函数

print(tf(sys_est))


请注意,如果您没有安装Control系统工具包,您需要在命令行中运行“pip install control”来安装该工具包。

设计过程中遇到的问题发过来我看看

1将传递函数转换为状态空间表示:
import control
sys = control.tf([3.08], [10800, 1620, 72,1])
sys_ss = control.ss(sys)
2计算状态观测器的系数:
N=np.array([-3,-3,-8])
L,, = control.acker(sys_ss.A, sys_ss.C, N)
3用状态观测器的系数构造状态估计器:
est = control.dstate(sys_ss, L)
4画出阶跃响应图像:
T, yout = control.step_response(est)
import matplotlib.pyplot as plt
plt.plot(T,yout)
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.title('Step Response')
plt.grid()
plt.show()