跳转到内容

在 ngspice 中运行网表

  • 以批处理模式(batch mode)运行库中的网表,并读取其测量结果。
  • 理解积分方法(integration rule)对比其时间步长(time step)快得多的模态有何影响,以及为什么梯形法(trapezoidal rule)会在电路本身不振铃的地方产生振铃。
  • 选择使开关波形可信的选项。

仓库的 sim/ngspice/ 文件夹以 ngspice 网表(netlist)的形式收录了每个变换器算例 [ngspice – open source SPICE simulator]。运行 ngspice -b buck-ccm.cir,它会打印最后一个周期的 .meas 结果:开关节点电压、电感电流(反激变换器中为一次电流)和输出电压的平均值、最大值和最小值。运行 ngspice buck-ccm.cir,再输入 run,即可绘制该文件夹的 README 中列出的波形。CI 会重新运行每个网表,要求每个值都在理想公式的 1 % 以内(以该物理量在一个周期内的最大绝对值为基准),并要求输出已稳定。

SPICE 在一系列时间点(time point)上计算电路。它选取每一步的步长,使其对积分方法估计的误差保持在容差(tolerance)以内;除非网表另行设定,相对容差(relative tolerance)为 0.001 [The ngspice team, Ngspice User's Manual]。在两个时间点之间,每个电容和电感都遵循 .options method 所选的积分方法:未另行指定时为梯形法,也可以选择 Gear 法,它使用后向差分公式(backward differentiation formula),默认最高用到第二个 [The ngspice team, Ngspice User's Manual]。

变换器电路中可能存在比时间步长快得多的模态,例如在二极管停止导通处。单步法(one-step rule),如梯形法或后向欧拉法(backward Euler),每一步都把这种模态的偏差乘以一个固定的放大因子。梯形法取每步两端斜率的平均值:

gTR=1−Δt2τ1+Δt2τg_\mathrm{TR} = \frac{1 - \frac{\Delta t}{2 \tau}}{1 + \frac{\Delta t}{2 \tau}}
gTRg_\mathrm{TR}
梯形法的每步放大因子
Δt\Delta t
时间步长(time step)
τ\tau
时间常数(time constant)
梯形法对衰减模态的每步放大因子✓ 经 8 项测试验证
假设、约定与出处
假设
  • 单独一个衰减模态:其变化率等于偏差除以 tau 的负值(试验方程)
  • 每一步的时间步长相同
备注
该方法取每步两端斜率的平均值。任意步长下其放大因子都在 -1 与 1 之间(该方法是 A 稳定的),但步长远大于 τ\tau 时放大因子接近 -1:该模态几乎不衰减,且每一步都改变符号,形成电路本身并不存在的逐步振铃。如无另行指定,ngspice 采用该方法积分
出处
Hairer & Wanner 1996, Sec. IV.3 (Stability Function of Implicit RK-Methods: the trapezoidal rule is A-stable, |R| tends to 1); derived here; The ngspice team, Ngspice User's Manual, .options, transient analysis: METHOD, trapezoidal by default
推导
sympy 逐步推导
公式 id
num.gain_tr · equations.yaml 条目

无论步长多大,其放大因子的绝对值都不超过 1,因此解不会发散;但当步长远大于该模态的时间常数(time constant)时,放大因子趋近 -1:该模态几乎不衰减,并在每个时间点翻转符号,形成电路中并不存在的振铃 [Hairer & Wanner 1996]。Gear 法所用的后向差分公式中,第一个就是后向欧拉法,它取每步终点的斜率:

gBE=11+Δtτg_\mathrm{BE} = \frac{1}{1 + \frac{\Delta t}{\tau}}
gBEg_\mathrm{BE}
后向欧拉法的每步放大因子
Δt\Delta t
时间步长(time step)
τ\tau
时间常数(time constant)
后向欧拉法对衰减模态的每步放大因子✓ 经 8 项测试验证
假设、约定与出处
假设
  • 单独一个衰减模态:其变化率等于偏差除以 tau 的负值(试验方程)
  • 每一步的时间步长相同
备注
该方法取每步终点的斜率。任意步长下其放大因子都在 0 与 1 之间,且随步长增大趋于零(该方法是 L 稳定的):比步长快得多的模态经过一步后几乎消失,且不产生振铃。它是后向差分公式(backward differentiation formula)中的第一个;当 .options method=gear 指定 Gear 法时,ngspice 使用这类公式,默认最高到第二个
出处
Hairer & Wanner 1996, Sec. IV.3 (implicit Euler is L-stable) and Ch. V (Multistep Methods for Stiff Problems: backward differentiation formulas, the first of which is implicit Euler); derived here; The ngspice team, Ngspice User's Manual, .options, transient analysis: METHOD=gear, and MAXORD, 2 by default
推导
sympy 逐步推导
公式 id
num.gain_be · equations.yaml 条目

其放大因子则趋于零,因此这种模态经过一步后几乎消失 [Hairer & Wanner 1996];第二个公式也能在几步之内使其衰减殆尽 [Hairer & Wanner 1996, Ch. V]。

在 ngspice 的默认设置下,即采用梯形法且相对容差为 0.001 时,库中的 DCM 反激变换器恰好表现出这种现象:二极管一停止导通,二次电流就在相邻两步之间围绕零来回振铃,漏极电压则摆到低于零约一千伏。在相同容差下改用 Gear 法可以消除振铃,但二极管导通结束时其电流仍会越过零点,漏极电压在那一瞬间下冲到低于零数十伏。采用 .options method=gear reltol=1e-4(库中每个网表和原理图都带有这一行)后,两者都消失了。

时间常数为一纳秒的模态,以二十纳秒为步长计算:

刚性模态示例
符号数值求法
τ\tau 时间常数(time constant)1 ns已知
Δt\Delta t 时间步长(time step)20 ns已知
gTRg_\mathrm{TR} 梯形法的每步放大因子−0.818梯形法对衰减模态的每步放大因子
gBEg_\mathrm{BE} 后向欧拉法的每步放大因子0.0476后向欧拉法对衰减模态的每步放大因子

梯形法每一步把该模态乘以 −0.818:十步之后仍剩下约七分之一,且其符号在每个时间点都翻转。后向欧拉法把它乘以 0.0476:两步之后剩下的不到四百分之一。

▶ 在公式浏览器中打开:梯形法对衰减模态的每步放大因子
预设取自例题 num-stiff

扫描步长:放大因子在步长为时间常数的两倍处穿过零,步长更长时趋近 -1。

▶ 在公式浏览器中打开:后向欧拉法对衰减模态的每步放大因子
预设取自例题 num-stiff

后向欧拉法的放大因子则朝零减小。

在实验台上捕获 DCM 变换器在二极管停止导通时的开关节点波形。那里的振铃是真实的:电感与开关节点处的电容一起振铃,频率由这些元件决定。对同一电路仿真两次:一次采用梯形法和较长的最大步长,另一次采用 Gear 法和足够短的最大步长,短到能分辨真实的振铃,即取振铃周期的一小部分。在每个时间点都来回交替、且随最大步长改变而移动的振铃是数值性的;频率保持不变的振铃属于电路本身,除实验台附加的损耗外,它应与实验台上的结果相符。

  • 在每个时间点都翻转符号的振铃来自积分方法,而不是电路(梯形法的放大因子)。
  • Gear 法也会使其未能分辨的真实振铃衰减。对于无阻尼振荡,后向欧拉法的放大因子绝对值小于 1,而梯形法的恰好为 1 [Hairer & Wanner 1996]:除非步长相对于振铃周期很短,否则轻阻尼的 L-C 振铃在 Gear 法仿真中比在实际电路中衰减得更快。
  • 更严格的容差是有代价的。它使步长变短、运行时间变长。库是为了 DCM 反激变换器的二极管关断而选用它的,并对所有算例一律采用。
  • 工具 ngspice — the ngspice project · 访问于 2026-09-24
    开源 SPICE 仿真器;本站的仿真器在 CI 中与其交叉校验。
  • 工具 Ngspice User's Manual — the ngspice team · 访问于 2026-09-25
    网表中每一行的参考文档:.tran 和 .meas 语句,以及设置积分方法和容差的 .options。
  1. 若网表未另行指定,ngspice 采用哪种积分方法?

    1. 后向欧拉法
    2. 梯形法
    3. 前向欧拉法
    4. Gear 法
    答案与解析

    正确答案:B 手册给出的 .options method 默认值是梯形法;Gear 法需要专门指定。

  2. 用梯形法以 20 ns 的步长计算时间常数为 1 ns 的模态。每一步把它乘以多少?

    1. 约 0.05
    2. 约 1
    3. 约 -19
    4. 约 -0.82
    答案与解析

    正确答案:D 步长的一半与时间常数之比为 10,放大因子为 (1 - 10)/(1 + 10),即 -9/11:该模态保留其大部分幅度,并改变符号。

  3. 这个放大因子在仿真波形中表现为什么?

    1. 在每个时间点都翻转符号的振铃
    2. 缓慢的指数衰减
    3. 一次阶跃
    4. 什么也看不到:该模态太快,显示不出来
    答案与解析

    正确答案:A 接近 -1 的放大因子使该模态几乎不衰减,并在每个时间点翻转其符号:这是积分方法造成的振铃,而不是电路的振铃。

  4. 用后向欧拉法,即 Gear 法所用后向差分公式中的第一个,以 20 ns 的步长计算同一模态。它会怎样?

    1. 在每个时间点振铃
    2. 增长
    3. 一两步之后几乎消失
    4. 保持不衰减
    答案与解析

    正确答案:C 放大因子为 1/(1 + 20),约为 0.05:两步之后,该模态剩下的不到四百分之一。

  5. 为什么 Gear 法仿真可能错误地表现轻阻尼的 L-C 振铃?

    1. 它使振铃增长
    2. 它使振铃频率加倍
    3. 它无法仿真电感
    4. 它会使步长未能精细分辨的振荡衰减,因此振铃比在实际电路中衰减得更快
    答案与解析

    正确答案:D 对于无阻尼振荡,后向欧拉法的放大因子绝对值小于 1,而梯形法的恰好为 1;步长较短时,两者的差别很小。

  6. 在 ngspice 的默认设置下,库中的 DCM 反激变换器表现出什么?

    1. 二极管停止导通后,二次电流在相邻两步之间围绕零来回振铃,漏极电压远低于零
    2. 正确的波形
    3. 比预期更高的输出电压
    4. 没有任何结果
    答案与解析

    正确答案:A 二极管关断后留下的快速模态在梯形法下振铃;采用 Gear 法并将相对容差设为 1e-4 后,振铃消失。

本站例题、预设和练习中的数值均为合成值:为教学而凑整的数值,并非来自任何实际设计的数据。