使用PySpice在循环中模拟初始条件的电路

Simulating a circuit with initial conditions given in a loop with PySpice

提问人:ck1987pd 提问时间:10/23/2023 更新时间:10/24/2023 访问量:53

问:

我尝试模拟以下简单的RC电路,使用有限元方法来验证我对传输线问题的解决方案。

enter image description here

虽然它与问题没有直接关系,或者不一定彼此相等。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()
Python 初始化 仿真 电路 PSpice

评论

0赞 ck1987pd 10/24/2023
我发布了一个解决方案,以防有人需要一些有效的东西,即使它不是最优的。我的方法绝不是最好的解决方案。如果有人发布一个解决方案,展示如何在循环中或使用字典传递初始条件,我将接受。

答:

0赞 ck1987pd 10/24/2023 #1

作为临时解决方案,我决定使用开关。

我使用开关将上轨中的所有节点连接到保持在节点上的节点,并将下轨中的所有节点连接到保持在节点上的节点。交换机最初是关闭的,这会强制所有节点达到所需值。它们在某个时间打开,之后我假设模拟开始。nccVccnddVdd

在代码方面,我删除了以下行。

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 个有效数字处。

这种方法存在一些相关的计算负担。开关过程似乎会带来一次性的额外负担,但对于长时间的仿真来说,这种负担会按比例消散。

评论

0赞 ck1987pd 10/24/2023
这比手动通过所有初始条件仅好一步。因此,我将接受一个解决方案,该解决方案显示了如何在循环中或使用字典传递初始条件。