You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:19:18