python绘制根轨迹
时间: 2023-07-22 17:33:48 浏览: 377
在控制系统中,根轨迹是描述系统特性的一种图形化方法之一,它是描绘系统极点随着增加增益K而移动的轨迹。下面是一个使用Python绘制根轨迹的示例代码:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义系统的传递函数
s = np.linspace(-10, 10, 1000)
G = (s + 1) / (s * (s + 3) + 2)
# 计算系统的根轨迹
K = np.linspace(0, 100, 1000)
r = []
for k in K:
poles = np.roots([1, 3, 2 + k])
r.append(poles)
# 绘制根轨迹
plt.plot(np.real(r), np.imag(r), '-')
plt.xlabel('Real')
plt.ylabel('Imaginary')
plt.title('Root Locus')
plt.grid(True)
plt.show()
```
在这个例子中,我们定义了一个传递函数G,并且使用numpy和matplotlib库计算和绘制了根轨迹。我们通过改变增益K的值来显示系统极点如何随着增加的增益而移动。最终,我们使用Matplotlib绘制了根轨迹的实部和虚部,从而得到了一个描述系统特性的图形化表示。
相关问题
通过control绘制根轨迹
控制系统工具箱(Control System Toolbox)是MATLAB中用于分析和设计控制系统的一个集合,其中包含了许多用于绘制根轨迹的函数。下面是一个使用Control Toolbox绘制根轨迹的示例代码:
```python
import control
import matplotlib.pyplot as plt
# 定义系统的传递函数
num = [1, 1]
den = [1, 3, 2]
sys = control.tf(num, den)
# 绘制根轨迹
rlist, klist = control.rlocus(sys)
# 在根轨迹上标记极点和零点
control.rlocus(sys, kvect=np.linspace(0, 100, 1000))
control.pzmap(sys, Plot=False)
# 显示根轨迹
plt.grid(True)
plt.xlabel('Real')
plt.ylabel('Imaginary')
plt.title('Root Locus')
plt.show()
```
在这个例子中,我们使用control库定义了系统的传递函数,并使用`control.rlocus()`函数计算了根轨迹的位置。我们还使用`control.pzmap()`函数绘制了系统的零点和极点,并将它们标记在根轨迹上。最后,我们使用Matplotlib绘制了根轨迹的实部和虚部,从而得到了一个描述系统特性的图形化表示。
开环函数为G(s)=k/s(s+1)(s+5),编写脚本程序,绘制根轨迹图确定k=1,10,100时的闭环特征根
好的,我可以用Python编写脚本程序来绘制根轨迹图,并确定不同k值下的闭环特征根。
首先,我们需要导入必要的库:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import tf2zpk
```
然后,我们定义开环传递函数:
```python
num = 1
den = [1, 6, 5, 0]
G = tf2zpk(num, den)
```
接下来,我们定义一个函数来计算根轨迹的路径:
```python
def root_locus(G, k_min, k_max):
poles = G[1]
zeros = G[0]
num_poles = len(poles)
num_zeros = len(zeros)
angles = np.linspace(0, 2*np.pi, 1000)
roots = np.zeros((num_poles + num_zeros, len(angles)), dtype=np.complex_)
for i in range(len(angles)):
root_angle = angles[i]
for j in range(num_zeros):
roots[j, i] = zeros[j]
for j in range(num_poles):
roots[num_zeros+j, i] = -1/float(k_min) * (poles[j] + abs(poles[j]) * np.exp(1j*root_angle))
return roots
```
该函数接受开环传递函数、k的最小值和最大值作为输入,并返回根轨迹的路径。
接下来,我们使用Matplotlib来绘制根轨迹:
```python
k_values = [1, 10, 100]
plt.figure(figsize=(10, 6))
for k in k_values:
roots = root_locus(G, k, k)
plt.plot(roots.real, roots.imag)
plt.title('Root Locus for G(s)=k/s(s+1)(s+5)')
plt.xlabel('Real Axis')
plt.ylabel('Imaginary Axis')
plt.grid(True)
plt.show()
```
最后,我们使用Numpy来计算每个根的值:
```python
for k in k_values:
closed_loop_poles = np.roots([1, 6, 5, k])
print('k = {}: {}'.format(k, closed_loop_poles))
```
这样就可以得到不同k值下的闭环特征根了。完整的代码如下:
阅读全文