提问人:ck1987pd 提问时间:10/23/2023 更新时间:10/24/2023 访问量:53
使用PySpice在循环中模拟初始条件的电路
Simulating a circuit with initial conditions given in a loop with PySpice
问:
我尝试模拟以下简单的RC电路,使用有限元方法来验证我对传输线问题的解决方案。
虽然它与问题没有直接关系,或者不一定彼此相等。R(i)
R(0i)
C(i)
在仿真开始时,下轨中的所有节点彼此具有相同的电位。同样,顶部导轨中的所有节点在开始时都具有相同的电位。
我可以在循环中使用 PySpice 生成此电路,即
for i in range(1, number_of_branches - 1):
circuit.R('R'+str(i), 'n'+str(i), 'n'+str(i+1), 1000@u_Ω)
for i in range(1, number_of_branches - 1):
circuit.R('R_'+str(i), 'n_'+str(i), 'n_'+str(i+1), 1000@u_Ω)
for i in range(1, number_of_branches-1):
circuit.C('C'+str(i), 'n'+str(i), 'n_'+str(i), 100@u_μF)
但是,我无法在循环中生成初始条件。如果我单独键入所有节点,即
simulator.initial_condition(n1=ic,n2=ic,n3=ic,n4=ic,n_2=0,n_3=0,n_4=0)
仿真结果给了我想要的。但这对于大量分支机构来说是不可能的。主要问题是只有电路方法才能识别的变量。这些节点是使用创建电路元素时传递的字符串名称创建的(如果它们尚不存在)。我深入研究了代码。我试图检查该方法创建的所有对象,以获取可用于传递初始条件的节点列表,但这似乎超出了我的 python 技能。n1, n2, n_1, n_2...
circuit
如何在循环中提供初始条件?这也可以通过传递字典来实现。我在下面有最小的工作示例。
import PySpice.Logging.Logging as Logging
logger = Logging.setup_logging()
import matplotlib.pyplot as plt
from PySpice.Probe.Plot import plot
from PySpice.Spice.Netlist import Circuit
from PySpice.Unit import *
circuit = Circuit('Test')
steptime=.1@u_us
finaltime = 1000@u_ms
number_of_branches = 6
ic=100@u_mV
for i in range(1, number_of_branches - 1):
circuit.R('R'+str(i), 'n'+str(i), 'n'+str(i+1), 1000@u_Ω)
for i in range(1, number_of_branches - 1):
circuit.R('R_'+str(i), 'n_'+str(i), 'n_'+str(i+1), 1000@u_Ω)
for i in range(1, number_of_branches-1):
circuit.C('C'+str(i), 'n'+str(i), 'n_'+str(i), 100@u_μF)
circuit.C('C'+str(number_of_branches-1), 'n'+str(number_of_branches-1), circuit.gnd, 100@u_μF)
ra = circuit.R('Ra', 'n1', 'n_1', 10@u_Ω)
simulator = circuit.simulator(temperature=25, nominal_temperature=25)
simulator.initial_condition(n1=ic,n2=ic,n3=ic,n4=ic,n_2=0,n_3=0,n_4=0)
analysis = simulator.transient(step_time=steptime, end_time=finaltime)
figure = plt.subplots(figsize=(11, 6))
axe = plt.subplot(111)
plot(analysis['n3']-analysis['n_3'], axis=axe)
plt.show()
答:
作为临时解决方案,我决定使用开关。
我使用开关将上轨中的所有节点连接到保持在节点上的节点,并将下轨中的所有节点连接到保持在节点上的节点。交换机最初是关闭的,这会强制所有节点达到所需值。它们在某个时间打开,之后我假设模拟开始。ncc
Vcc
ndd
Vdd
在代码方面,我删除了以下行。
simulator.initial_condition(n1=ic,n2=ic,n3=ic,n4=ic,n_2=0,n_3=0,n_4=0)
并添加以下功能。
def switch_generator(circuit, number_of_branches, switchingtime):
circuit.PulseVoltageSource('SV', 'SVN', circuit.gnd,initial_value=1, pulsed_value=-1,
pulse_width=finaltime, period=finaltime, delay_time=switchingtime)
circuit.R('SR1', 'SVN', circuit.gnd, 1@u_kΩ)
circuit.V('Vcc', 'ncc', circuit.gnd, 100@u_mV)
circuit.V('Vdd', 'ndd', circuit.gnd, 0@u_mV)
for i in range(1, number_of_branches - 1):
circuit.VoltageControlledSwitch('S'+str(i), 'n'+str(i), 'ncc','SVN', circuit.gnd, model='switch')
for i in range(2, number_of_branches - 1):
circuit.VoltageControlledSwitch('S_'+str(i), 'n_'+str(i), 'ndd','SVN', circuit.gnd, model='switch')
return circuit
我正在寻找的值在两个模拟之间几乎相同。差异在小数点后的第 7 个有效数字处。
这种方法存在一些相关的计算负担。开关过程似乎会带来一次性的额外负担,但对于长时间的仿真来说,这种负担会按比例消散。
评论
上一个:BSIM4 型号温度注意事项
下一个:仅在从 0 到 1 时切换的开关
评论