← Back to blog

April 2026

Eigenvalue analysis of the IEEE 39-Bus model in DIgSILENT PowerFactory

MCP Toolcall and Eigenvalue Analysis

The basic concept of this exercise is to continue the work on the IEEE 39-bus model, and in this scenario carry out an Eigenvalue analysis of the system against a few established operating points, that have been linearised and tested in the standards.

For those who are not familiar with Eigenvalue analysis, refer to the post here. In simple terms it is a way to identify potential unstable operating modes on a network by solving the various state space equations to identify any poles or zeros.

IEEE 39-Bus Model

The IEEE 39-Bus model is discussed in a previous post, and on the about page. It is an ideal system for Eigenvalue analysis as it has been studied extensively in literature and its modes and behaviours are well known.

What does the Eigenvalue analysis tell us?

The key point of this exercise is to carry out an Eigenvalue analysis and then understand it in real world terms. As an engineer I am fully capable of carrying out Eigenvalue analysis on large power systems, but they are not a skill that I use often and some of the finer details escape me. Carrying out an analysis by hand, would usually require a lot of thinking, considering use cases and identifying specific scenarios i wanted to consider. I would probably have needed to create my own python script to carry out any large scale analysis.

After completing the analysis, I interrogated the AI, with a simple question:

“Ok, so tell me about the system overall. What can you tell me about how strong it is, what outage scenarios or loading scenarios could put the system at significant risk?”

The IEEE 39-Bus model in its as-found state is a moderately strong, well-conditioned system carrying ~6 100 MW of load on a 345 kV transmission backbone. It has nine controlled synchronous machines (G 02–G 10) plus a 10 GVA system-equivalent (G 01) representing the rest of the NY–NE interconnection, giving roughly 78 GW·s of stored kinetic energy in total. The load flow converges cleanly in four iterations, all bus voltages sit between 0.98 and 1.06 pu, and small-signal stability is healthy — the inter-area mode at 0.64 Hz is damped at 7.8 % and the eight local plant modes range 5.8–9.0 %. Benchmark literature on IEEE 39 (Pai 1989, Rogers, Kundur §16) puts these numbers squarely within expectations, so the model passes the obvious sanity checks.

That said, the operating point is closer to the edge than the headline numbers suggest. Generator step-up transformers are running at 75–88 % across nearly the whole fleet, Line 21–22 is already at 99 % loading with no N-1 headroom, and most non-equivalent machines (G 03, G 06, G 09 in particular) are dispatched at 95–98 % of nameplate — so spinning reserve is thin. The hydro unit G 10 sits on a local mode damped at only 2.8 %, the lowest in the system. There are three single-point structural exposures worth flagging: Trf 19–20 is the only 345/230 kV link to Bus 20 (loss of it isolates 628 MW of load and G 05 entirely), Bus 16 is the load-centre hub for four lines (loss splits east/west corridors), and G 01’s tie back to the study area (Lines 01–39, 01–02, 09–39) carries 1 000 MW of import — losing those islands the study area and forces G 02 to ramp from zero. On top of that, the dynamic analysis revealed a model-integrity issue: the PSSs are wired into the composite frame but appear decoupled from the AVR’s stabilising input — disabling them entirely doesn’t move the eigenvalues. The 7.8 % inter-area damping you observe is therefore coming from AVR action and inherent rotor damping, not the PSSs, which means there’s no PSS backstop if anything erodes those primary damping sources. The scenarios most likely to turn this from “comfortable” into “incident” are heavy-load growth (>10 % above current), simultaneous loss of Trf 19–20 and any line in the 21-22/16-19 corridor, or a large generator trip near the inter-area swing axis (G 09 being the highest-risk single unit).

The detailed outputs are given below.

IEEE 39-Bus eigenvalue analysis — final report

Phase 1 — Baseline (all controllers nominally active)

System: 166 state variables, 30 oscillatory eigenvalue pairs, 9 in the electromechanical band. All stable. Slack = G 02 (ip_ctrl=1), reference = Bus 31. G 01 is the rest-of-system equivalent (no controllers).

The 9 electromechanical modes

# f (Hz) ζ (%) Type Dominant participation
1 0.639 7.80 Inter-area G 01 φ + speeds of G 04/05/06/07/09 (broad swing of study area against system equivalent)
2 0.979 6.80 Local G 09 (clean, single-machine)
3 1.053 5.80 Cluster G 02 ω + G 03/05/06 — multi-machine swing
4 1.110 2.82 ⚠ Local G 10 (hydro) — least damped
5 1.190 7.69 Cluster G 05/06/07 swing
6 1.196 6.16 Local G 03 vs G 02
7 1.410 8.01 Local G 08
8 1.423 7.76 Cluster G 06 vs G 07
9 1.450 8.97 Local G 04 vs G 05

Benchmark validation against IEEE 39 literature

Property Literature (Pai 1989, Rogers, Kundur §16) This model Verdict
EM mode count 9 9
Inter-area mode count 1 dominant 1 (mode at 0.64 Hz)
Inter-area frequency 0.5–0.7 Hz 0.639 Hz
Inter-area damping (with PSS) 5–10 % 7.80 %
Local mode frequency range 0.9–1.6 Hz 0.98–1.45 Hz
Local damping (with PSS) 5–15 %, hydro often outlier 2.8 (G 10) – 9.0 % ✓ G 10 outlier as expected
Hydro is most lightly damped Common literature finding Confirmed (2.82 %)

The baseline matches benchmark IEEE 39 to within typical operating-point sensitivity.


Phase 2 — PSS-off variation (V1)

Method

Set Kpss (params[0]) to 0 on all 9 PSS DSL blocks (PSS 02 … PSS 10), plus the same parameter on the duplicate PSS 02 inside the EMT generator-modelling variation. Original Kpss values varied by plant:

Plant Kpss (orig.) Plant Kpss (orig.)
PSS 02 0.5 PSS 07 7.5
PSS 03 0.5 PSS 08 2.0
PSS 04 2.0 PSS 09 2.0
PSS 05 1.0 PSS 10 1.0
PSS 06 4.0 PSS 02 (EMT var) 1.0

Re-ran ComLdf → ComCheckctrl → ComInc → ComModSystem dimension grew from 166 → 193 state variables. The extra 27 states are the PSS internal dynamics (xw washout + x2/x3 lead-lag) of all 9 PSSs becoming explicit when their gain is zeroed (with Kpss > 0 they were partly absorbed by PowerFactory’s automatic state reduction).

Result

EM mode Baseline f / ζ Kpss=0 f / ζ Δ damping
Inter-area 0.6386 Hz / 7.80 % 0.6386 Hz / 7.80 % 0.00 %
G 09 local 0.9792 Hz / 6.80 % 0.9792 Hz / 6.80 % 0.00 %
G 02-cluster 1.0529 Hz / 5.80 % 1.0529 Hz / 5.80 % 0.00 %
G 10 hydro 1.1101 Hz / 2.82 % 1.1101 Hz / 2.82 % 0.00 %
G 5-6-7 1.1900 Hz / 7.69 % 1.1900 Hz / 7.69 % 0.00 %
G 03 / G 02 1.1965 Hz / 6.16 % 1.1965 Hz / 6.16 % 0.00 %
G 08 1.4100 Hz / 8.01 % 1.4100 Hz / 8.01 % 0.00 %
G 06-07 1.4226 Hz / 7.76 % 1.4226 Hz / 7.76 % 0.00 %
G 04 / G 05 1.4501 Hz / 8.97 % 1.4501 Hz / 8.97 % 0.00 %

EM eigenvalues are bit-identical, despite Kpss truly being zero (verified by reading back). Only the non-electromechanical eigenvalue list grows (the 27 PSS internal dynamics now appear as additional poles).

Interpretation — the model finding

This is contrary to the classic IEEE 39 benchmark expectation (where removing PSSs typically drops damping into the 0–2 % range and can destabilise the ~0.85 Hz / G 09 mode). The conclusion is:

The pss_CONV.BlkDef PSS blocks in this project’s composite frame are not coupled into the AVR’s stabilising-input pathway — i.e. the PSS computes its washout + lead-lag output internally, but that output is not reaching the AVR’s Vstab summing junction in the BlkDef wiring. Disabling them therefore has no effect on the EM modes.

The 7.8 % inter-area / 2.8 % G 10 damping observed in baseline is coming entirely from:

  • AVR action (high-gain voltage regulation introduces some damping)
  • Inherent rotor mechanical damping coefficient (Kd in the swing equation)
  • Network resistive losses

…not from the PSSs.

IEEE 39-Bus — system strength & risk assessment

1. Headline numbers (canonical, deduplicated)

Metric Value Comment
Total system load 6 097 MW + ~1 409 MVAr matches Pai 1989 within 1 %
Study-area generation (G 02–G 10) ~5 874 MW (heavy 95–98 % loaded on most units) leaves little spinning reserve
G 01 import (system equivalent) 1 000 MW flexible — Pmax is 8 500 MW
Stored kinetic energy (all 10 machines) ~78 GW·s on own bases (~50 from G 01 alone) study area only ≈ 28 GW·s
Voltage profile All buses 0.98–1.06 pu high-side bias (Q surplus, lightly loaded lines charging)
LF convergence 4 Newton iterations well-conditioned at this OP
Inter-area damping ζ 7.8 % good (with caveat below)
Worst local damping 2.8 % (G 10 hydro) thin

2. Static asset utilisation — the squeeze points

Lines at risk under N-1

Line Loading Why it matters
Line 21–22 99.1 % already at thermal limit — no N-1 headroom on this branch. Any contingency that diverts flow this way trips it
Line 16–19 81.9 % feeds G 04/G 05/G 06/G 07 generation pocket; loss with 21–22 already at 99 % cascades
Line 05–06 76.2 % corridor between G 02/G 03 area and Bus 06 hub
Line 06–07 71.9 % parallel to 05–06; together they carry G 02/G 03 export
Lines 10–11, 02–03, 06–11 60–62 % second tier — moderate headroom

Transformers — every gen step-up is loaded

Transformer Loading Notes
Trf 20–34 (G 05 step-up via 230 kV) 88.0 % and is single corridor — see §3
Trf 10–32 (G 03 step-up) 86.7 %
Trf 22–35 (G 06 step-up) 81.5 %
Trf 29–38 (G 09 step-up) 80.9 % G 09 is highest-dispatched non-equivalent gen
Trf 19–33 (G 04 step-up) 80.4 %
Trf 06–31 (G 02 step-up) 79.6 % slack machine pathway
Trf 23–36, 25–37 (G 07, G 08) 75–76 %
Trf 02–30 (G 10 step-up) 27.7 % hydro is lightly dispatched
Trf 11–12, 13–12 (138 kV island) 14–16 % plenty of headroom — Bus 12 is a small island
Trf 19–20 (only 345/230 link) 12.4 % lightly loaded but single-point — see §3

The picture: gen step-ups are running 75–88 % across most of the fleet. Any thermal de-rate (summer ambient) tightens this further. Lines are mostly comfortable except the 21–22 / 16–19 / 05–06 / 06–07 set.

3. Single-point structural vulnerabilities (worst N-1 contingencies)

These are the contingencies I’d put first on a study list — without yet running them:

Contingency Consequence Severity
Trf 19–20 outage (only 345/230 kV link) Isolates Bus 20 (628 MW load) and G 05 (508 MW). G 05 alone cannot supply Bus 20 → ~120 MW must be shed or G 05 is also lost. Critical — single asset, no alternate path
Trf 20–34 outage (G 05 step-up) G 05 (508 MW, 12.7 % of remaining gen) trips. Inter-area mode strongly excited. Bus 20 then must be supplied entirely from 345 kV via Trf 19–20 (12 → ~85 % loaded) High
Line 21–22 trip while at 99 % Diverts ~270 MW; Lines 23–24, 21–22-parallels (none — it’s the only direct path) → cascading on 16–21 and 22–23 corridors High
Loss of any single 345 kV gen step-up (G 03/G 06/G 09 step-ups all 80–87 %) Loss of 595–850 MW gen → frequency dip ≈ 0.3–0.5 Hz in study area (78 GW·s inertia, 0.7–1.0 GW loss) Medium-High
Bus 16 outage (4 lines + load) Splits east/west corridors; ~329 MW load lost; G 04–G 07 pocket loses connection to load centre Critical
Line 16–19 + Line 16–21 simultaneous (or Bus 16 fault) G 04/G 05/G 06/G 07 generation pocket disconnected from load centre — mass islanding Critical
Loss of G 01 connection (Lines 01–39 / 01–02 / 09–39) Study area islands from system equivalent. 1 000 MW import vanishes → frequency drops, inter-area mode goes hard. Recovery needs G 02 to ramp from 0 to ~1 000 MW. Critical for system survival
Loss of G 09 (830 MW) Highest single-machine dispatch. Inter-area mode at 0.64 Hz strongly excited (G 09 is a top participant). 2.8 % G 10 hydro local mode could be aggravated. High
Loss of G 02 (slack, 0 MW dispatch) Another machine takes over reference; voltage at Bus 31 wobbles. Mostly graceful. Low

4. Loading scenarios that turn problems into events

Scenario What worsens Threshold of concern
Load growth +10–20 % Line 21–22 first to violate; Trf 20–34 follows. Inter-area damping drops (typical literature: 7.8 % → 3–5 %). Q reserve from already-high-output gens depletes. Probably already at the practical operational ceiling
G 01 ramps up to absorb more demand (e.g. study area light load + G 01 export of 4–6 GW) Inter-area mode shifts down (~0.5 Hz), damping reduces. Lines 01–02, 01–39, 09–39 see heavy flow → potential overload. Watch when G 01 dispatch > 3 000 MW
G 09 + Trf 29–38 outage simultaneously (N-1-1) Loss of 830 MW from heaviest gen plus its step-up out of service for maintenance Forces inter-area mode + frequency event
Reactive demand surge (e.g. summer Q heavy) Voltage profile drops from 1.05 toward 0.95. AVR Q-limits would be hit on G 03/G 06/G 10 (currently absorbing/exporting 200+ MVAr). Likely the binding constraint at high load
Cold-load / motor restart events Combined P + Q step on Bus 16, 20, 39 (the big load centres) → could trigger 1.11 Hz G 10 mode (only 2.8 % damped) This is the lowest-damped local mode — most exposed to disturbances
Loss of one PSS (operationally) Per the §2 finding — would have no effect on EM modes in this model. The PSS-decoupling means current damping is “what you get” regardless of PSS state. Diagnostic / model integrity issue more than operational

5. Dynamic vulnerabilities (from eigenvalue work)

Carrying over from the modal analysis:

  • Inter-area mode 0.64 Hz at 7.8 % damping — moderate. Literature shows this drops to 3–5 % at heavy load and can reach <2 % under stressed dispatch. Watch it under §4 scenarios.
  • G 10 hydro local mode 1.11 Hz at 2.82 % — already thin. Any disturbance specifically exciting Bus 30 / G 10 (e.g. fault at the G 10 step-up, line trip in the G 10 vicinity) is the most likely candidate for an undamped oscillation.
  • All other local modes are 5.8–9.0 % damped — comfortable.
  • PSS contributions are decoupled in the BlkDef wiring (Phase 2 finding). The 7.8 % inter-area damping you have is from AVR action and inherent rotor damping, not from PSS feedback. If anything erodes those (e.g. AVR saturation), there’s no PSS backstop.

6. What I’d run next (if you want to confirm any of this)

Priority Study Tool Approval needed?
1 N-1 line outage scan (the ~10 critical contingencies above) ComOutage / scripted line outage + LF yes — write actions
2 N-1 transformer outage scan focused on Trf 19–20, Trf 20–34, Trf 29–38 same yes
3 Heavy-load LF (load × 1.10, × 1.15, × 1.20) scripted load scaling + LF yes
4 G 09 trip transient (RMS dyn — case 2.4 Bus 31 unstable variant could be repurposed) ComInc + ComSim yes
5 Short-circuit study (3-phase IEC 60909 at every bus) for fault levels and SCR map ComShc yes
6 Modal analysis at heavy load re-run case 3 after load scaling yes
7 Investigate PSS BlkDef wiring to find why the PSSs are decoupled — open pss_CONV.BlkDef in PF and trace its output slot inspection only no

(2), (5), and (6) together would give a comprehensive risk profile. (7) is the one read-only investigation I’d put alongside it — it’s the model-integrity question that affects how much the dynamic results can be trusted.

If you want any of these run, just say which (e.g., “do 1, 2, 5”). All 7 takes a fair few hours of compute and analysis; the most informative single trio for a system-strength brief would be 2 + 5 + 6.

← Back to blog