Python控制系统仿真案例-RLC电路系统

文章目录

  • [1 问题描述](#1 问题描述)
  • [2 研究分析](#2 研究分析)
  • [3 建立系统的数学模型](#3 建立系统的数学模型)
  • [4 Python仿真程序](#4 Python仿真程序)
  • [5 仿真结果](#5 仿真结果)

1 问题描述

RLC电路是电子学中最基础也最重要的电路系统之一。它由电阻、电感和电容三大无源元件构成,因能产生振荡和谐振现象,常用于滤波、选频、阻抗匹配等。

如图所示是RLC电路系统,取 L = 1 H , C = 1 F L=1H,C=1F L=1H,C=1F,考虑系统在单位阶跃输入情况下,讨论系统不产生振荡时电阻R的取值,其中R的取值不大于 0.1 Ω 0.1Ω 0.1Ω。

2 研究分析

要求研究的问题是:当 L = 1 H , C = 1 F L=1H,C=1F L=1H,C=1F时,分析系统在输入作用 u r ( t ) = 1 ( t ) u_r(t)=1(t) ur(t)=1(t) 的作用下,要使响应不发生振荡,通过计算机仿真研究 R R R应在什么范围内取值。

3 建立系统的数学模型

(1)根据电学中的基尔霍夫定律,可写出原始方程:
L d i ( t ) d t + R i ( t ) + 1 C ∫ i ( t ) d t = u r ( t ) (1.1) L\frac{di(t)}{dt} + Ri(t)+\frac{1}{C}\int i(t)dt=u_r(t) \tag{1.1} Ldtdi(t)+Ri(t)+C1∫i(t)dt=ur(t)(1.1)

(2)式 ( 1.1 ) (1.1) (1.1) 中 i i i 是中间变量,它与输出有如下关系:

u c ( t ) = 1 C ∫ i ( t ) d t (1.2) u_c(t) = \frac{1}{C} \int i(t)dt \tag{1.2} uc(t)=C1∫i(t)dt(1.2)

(3)消去式 ( 1.1 ) (1.1) (1.1)、式 ( 1.2 ) (1.2) (1.2)的中间变量 i i i后,便得输入与输出的微分方程式:
L C d 2 u c ( t ) d t 2 + R C d u c ( t ) d t + u c ( t ) = u r ( t ) (1.3) LC\frac{d^2 u_c(t)}{dt^2} + RC \frac{du_c(t)}{dt} + u_c(t) = u_r(t) \tag{1.3} LCdt2d2uc(t)+RCdtduc(t)+uc(t)=ur(t)(1.3)

(4)将式 ( 1.3 ) (1.3) (1.3)转换成状态方程及输出方程形式:

x 1 ˙ ( t ) x 2 ˙ ( t ) = 0 1 − R L − 1 L C x 1 ( t ) x 2 ( t ) + 0 1 L C u r ( t ) u c ( t ) = 1 0 x 1 ( t ) x 2 ( t ) (1.4) \begin{bmatrix} \dot{x_1}(t) \\ \dot{x_2}(t) \end{bmatrix} = \begin{bmatrix} 0 & 1 \\ -\frac{R}{L} & -\frac{1}{LC} \end{bmatrix} \begin{bmatrix} x_1(t) \\ x_2(t) \end{bmatrix} + \begin{bmatrix} 0 \\ \frac{1}{LC} \end{bmatrix} u_r(t) \\ u_c(t)=\begin{bmatrix} 1 & 0 \end{bmatrix}\begin{bmatrix} x_1(t) \\ x_2(t) \end{bmatrix} \tag{1.4} x1˙(t)x2˙(t)=0−LR1−LC1x1(t)x2(t)+0LC1ur(t)uc(t)=10x1(t)x2(t)(1.4)

  • 注:状态方程和输出方程的形式为:
    d x d t = A x + B u y = C x + D u \frac{dx}{dt}=Ax+Bu \\ y=Cx+Du dtdx=Ax+Buy=Cx+Du

    其中, x x x是状态向量, u u u是控制向量, y y y是被测信号, A A A、 B B B、 C C C和 D D D是常数矩阵。

(5)将第(4)步转换成离散的状态方程及输出方程,用于计算仿真及编程:
x 1 ( ( k + 1 ) T ) x 2 ( ( k + 1 ) T ) = x 1 ( k T ) x 2 ( k T ) + 0 1 − R L − 1 L C x 1 ( k T ) x 2 ( k T ) T + 0 1 L C u r ( k T ) T u c ( ( k + 1 ) T ) = x 1 ( ( k + 1 ) T ) (1.5) \begin{bmatrix} x_1((k+1)T) \\ x_2((k+1)T) \end{bmatrix} = \begin{bmatrix} x_1(kT) \\ x_2(kT) \end{bmatrix} + \begin{bmatrix} 0 & 1 \\ -\frac{R}{L} & -\frac{1}{LC} \end{bmatrix} \begin{bmatrix} x_1(kT) \\ x_2(kT) \end{bmatrix}T + \begin{bmatrix} 0 \\ \frac{1}{LC} \end{bmatrix} u_r(kT)T \\ u_c((k+1)T)= x_1((k+1)T) \tag{1.5} x1((k+1)T)x2((k+1)T)=x1(kT)x2(kT)+0−LR1−LC1x1(kT)x2(kT)T+0LC1ur(kT)Tuc((k+1)T)=x1((k+1)T)(1.5)

    式中, T T T为采样周期。

4 Python仿真程序

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
# 设置字体为 SimHei(黑体)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号

L = 1  # 输入RLC电路的电感值
C = 1  # 输入RLC电路的电容值
R = float(input('请输入R的电阻值(Ω):'))  # 输入R的电阻值(Ω) 0.1、0.25、0.3、1、3、6
t = 0
T = 0.001  # 设置系统采样时间T的值

A = np.array([[0, 1], [-R/L, -1/(L*C)]])  # 计算系统状态方程矩阵的值
B = np.array([[0], [1/(L*C)]])
tmax = 60  # 设置系统的仿真总时间tmax
x = np.array([[0], [0]])  # 设置状态变量初值
Y = [0]  # Y为记录输出
H = [t]  # H用于记录t的值

while t < tmax:
    xs = x + (A @ x + B) * T  # 计算离散状态方程
    y = xs[0, 0]  # 计算离散输出方程
    t = t + T
    Y.append(y)
    H.append(t)  # 记录y和t的值
    x = xs

plt.plot(H, Y, 'k')  # 绘制输出曲线
plt.xlabel('时间 (s)')
plt.ylabel('输出 y')
plt.title('RLC电路响应')
plt.grid(True)
plt.show()

5 仿真结果

相关推荐
老白干2 小时前
jjwt 0.9.1 在 JDK 11+ 上的两个“坑”与完整解决方案
java·python·log4j
笨鸟先飞,勤能补拙8 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能9 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂10 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study10 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境11 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境11 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd12311 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy123931021612 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb0012 小时前
一个项目带你入门AI应用开发01
python