import matplotlib.pyplot as plt
import numpy as np

# ---------------- 参数（ωn=1） ----------------
wn = 1
xi_underd = 0.6       # 欠阻尼
xi_over = 1.5         # 过阻尼

# 计算各根坐标
# 无阻尼
s_undamp1 = 0 + 1j*wn
s_undamp2 = 0 - 1j*wn
# 欠阻尼
sigma_u = -xi_underd * wn
omega_d = np.sqrt(1 - xi_underd**2) * wn
s_under1 = sigma_u + 1j*omega_d
s_under2 = sigma_u - 1j*omega_d
# 临界阻尼
s_crit = -wn
# 过阻尼
sigma_o = -xi_over * wn
omega_o = np.sqrt(xi_over**2 - 1) * wn
s_over1 = sigma_o + omega_o
s_over2 = sigma_o - omega_o

# ---------------- 绘图 ----------------
plt.figure(figsize=(9,8), dpi=120)
ax = plt.gca()
ax.set_aspect('equal')

# 坐标轴
ax.axhline(y=0, color='k', lw=1.2)
ax.axvline(x=0, color='k', lw=1.2)
plt.text(0.05, 0.05, "O", fontsize=13)
plt.xlabel(r'$\sigma$ (实轴)', fontsize=12)
plt.ylabel(r'$j\omega$ (虚轴)', fontsize=12)

# 单位圆
theta = np.linspace(0, 2*np.pi, 200)
xc = np.cos(theta)
yc = np.sin(theta)
ax.plot(xc, yc, c='gray', ls='--', lw=1, label='单位圆')

# 画各阻尼极点（不同颜色）
# 无阻尼：红色
ax.plot(s_undamp1.real, s_undamp1.imag, 'ro', markersize=8)
ax.plot(s_undamp2.real, s_undamp2.imag, 'ro', markersize=8)
plt.text(0.08, 1.05, r'无阻尼: $\lambda_{1,2}=\pm j\omega_n$', color='r', fontsize=10)

# 欠阻尼：蓝色
ax.plot(s_under1.real, s_under1.imag, 'bo', markersize=8)
ax.plot(s_under2.real, s_under2.imag, 'bo', markersize=8)
plt.text(sigma_u-0.32, omega_d+0.12,
         r'欠阻尼: $\lambda_{1,2}=-\xi\omega_n\pm j\sqrt{1-\xi^2}\omega_n$',
         color='b', fontsize=10)

# 临界阻尼：绿色（重根，一个点）
ax.plot(s_crit.real, s_crit.imag, 'gs', markersize=9)
plt.text(s_crit-0.38, -0.13,
         r'临界阻尼: $\lambda_1=\lambda_2=-\omega_n$',
         color='g', fontsize=10)

# 过阻尼：橙色
ax.plot(s_over1.real, s_over1.imag, 'o', c='#ff8822', markersize=8)
ax.plot(s_over2.real, s_over2.imag, 'o', c='#ff8822', markersize=8)
plt.text(s_over2-0.35, 0.13,
         r'过阻尼: $\lambda_{1,2}=-\xi\omega_n\pm\sqrt{\xi^2-1}\omega_n$',
         color='#ff8822', fontsize=10)

plt.xlim(-2.2, 1.2)
plt.ylim(-1.6, 1.6)
plt.grid(True, alpha=0.3)
plt.title("二阶系统：不同阻尼下特征根在s复平面上的位置示意图", fontsize=13)
plt.tight_layout()
plt.show()
