Class SpectralCondensation

java.lang.Object
de.labathome.trustconstr.demo.SpectralCondensation

public final class SpectralCondensation extends Object
Demo: spectral condensation of a 2D closed curve.

The shape is a stellarator-style 2D boundary parameterised as

     x(theta) = sum_{m=1..M} X_m cos(m theta)
     y(theta) = sum_{m=1..M} Y_m sin(m theta)
 
sampled on the half-period [0, pi] at theta_i = i * 2*pi/N for i = 0..N/2. We then look for Fourier coefficients (X_m, Y_m) (with M > M_target = 3) and a reparametrisation
     alpha_i = theta_i + lambda(theta_i),
     lambda(theta) = sum_{l=1..L} L_l sin(l theta)
 
such that the new curve passes exactly through the original sample points
     x(alpha_i) = x_i,  y(alpha_i) = y_i   for every sample i,
 
while minimising the spectral width
     M(p,q) = (sum_m m^{p+q} S_m) / (sum_m m^p S_m),  S_m = X_m^2 + Y_m^2,
 
with p = 4, q = 1.

The trivial guess (X_m = X_m^target, Y_m = Y_m^target, lambda = 0) trivially satisfies W_c = 0 and provides a baseline spectral width. The optimiser then redistributes coefficient energy across the higher modes (m > M_target) by reparametrising via lambda, driving M(p,q) below the baseline while keeping W_c at machine zero.

This is the Hirshman-Meier spectral condensation problem that arises in stellarator boundary descriptions.

Constraint dimensioning (with N = 16):

  • N_samples = N/2 + 1 = 9 sample points on [0, pi].
  • L = N/2 - 1 = 7 lambda modes -- exactly one mode per interior sample, so lambda can match any prescribed values at the interior samples (the endpoints are pinned by the sin-only ansatz since lambda(0) = lambda(pi) = 0 automatically).
  • M = 6 > M_target = 3 curve modes for both x and y.
  • Free parameters: 2M + L = 19.
  • Effective equality constraints: 2*N_samples - 2 = 16. (The y-constraint at theta = 0 and theta = pi is trivially 0 = 0 for a sin-only series and is dropped to keep the constraint Jacobian full row rank.)
  • Excess DOF for spectral minimisation: 19 - 16 = 3.
  • Method Details

    • main

      public static void main(String[] args)