RLC电路元件电压绘图代码求助:TypeError错误排查
解决RLC元件电压计算的代码错误与实现方案
首先,咱们先理清楚你的问题核心:你遇到的TypeError 'function' object is not subscriptable是因为你把函数v_cap当成数组来用了(v_cap[i][0]),函数得通过调用(比如v_cap(t, C))来获取返回值,而不是下标访问。另外,你的电容电压积分函数也有几个逻辑问题,咱们一步步来解决。
先明确输入信号
你说输入是1000Hz、峰峰值1mA的余弦波,这里应该是电流源(因为电容电压是电流的积分),所以电流的数学表达式是:I(t) = 0.5e-3 * cos(2 * π * 1000 * t)
(峰峰值1mA → 峰值0.5mA,角频率ω=2πf=2000π rad/s)
逐个元件的电压计算与代码实现
1. 电阻电压(最简单)
根据欧姆定律,Vr(t) = R * I(t),直接计算即可:
import numpy as np import matplotlib.pyplot as plt from scipy import integrate # 定义参数 R = 1 # 1Ω L = 120e-3 # 120mH C = 1e-6 # 1µF f = 1000 # 1000Hz peak_current = 0.5e-3 # 峰峰值1mA → 峰值0.5mA # 生成时间轴,比如从0到2个周期,步长0.1ms t_total = 2 / f t = np.linspace(0, t_total, 1000) # 输入电流函数 def I(t_val): return peak_current * np.cos(2 * np.pi * f * t_val) # 电阻电压 Vr = R * I(t)
2. 电感电压
电感电压是电流对时间的导数:Vl(t) = L * dI/dt,用两种方式实现:
# 方法1:直接用数学求导(更准确) # I(t)的导数是 -0.5e-3 * 2π*1000 * sin(2π*1000*t) Vl = L * (-peak_current * 2 * np.pi * f * np.sin(2 * np.pi * f * t)) # 方法2:用numpy的gradient数值求导(适合复杂电流) # dI_dt = np.gradient(I(t), t) # Vl = L * dI_dt
3. 电容电压(修正你的错误)
你的积分函数有几个问题:
integrate.quad的第一个参数是被积函数,你写的lambda k: (x)不对,应该是电流函数在k时刻的值- 积分上下限应该是从0到当前时间
t_val,而不是固定的k_low/k_high - 调用函数时不能用下标,要传当前时间和电容值
修正后的电容电压函数:
def v_cap(t_val, c): # 积分从0到t_val的电流,再除以C,加上初始电压(这里设为0) integral, _ = integrate.quad(lambda k: I(k), 0, t_val) return (1 / c) * integral + 0 # Vc(0)=0,如果有初始电压可以修改 # 计算所有时间点的电容电压 Vc = np.array([v_cap(t_val, C) for t_val in t])
整合代码并绘图
把上面的部分整合起来,就能得到三个元件的电压曲线:
# 绘图 plt.figure(figsize=(12, 8)) plt.subplot(3,1,1) plt.plot(t, Vr, label='Resistor Voltage (1Ω)') plt.title('Resistor Voltage') plt.ylabel('Voltage (V)') plt.legend() plt.subplot(3,1,2) plt.plot(t, Vl, label='Inductor Voltage (120mH)', color='orange') plt.title('Inductor Voltage') plt.ylabel('Voltage (V)') plt.legend() plt.subplot(3,1,3) plt.plot(t, Vc, label='Capacitor Voltage (1µF)', color='green') plt.title('Capacitor Voltage') plt.xlabel('Time (s)') plt.ylabel('Voltage (V)') plt.legend() plt.tight_layout() plt.show()
为什么你的原代码报错?
y_vC[i]=v_cap[i][0]:v_cap是你定义的函数,必须通过v_cap(i, c)来调用,不能用v_cap[i]这种数组下标访问- 你的
v_cap函数里,integrate.quad(lambda k: (x), k_low,k_high)中的x是传入的参数,但这里应该是电流函数在k处的值,而且积分上下限应该是随时间变化的(从0到当前t)
这样修改后,就能正确计算并绘制三个元件的电压曲线了。
内容的提问来源于stack exchange,提问作者rilke-nz
相关产品推荐
相关产品推荐

