Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

3.3 Feasible Design Space

Feasibility comes before preference

The feasible set is the collection of designs satisfying every constraint:

F={zg(z)0, h(z)=0, zLzzU}.\mathcal F=\{z\mid g(z)\le0,\ h(z)=0,\ z^L\le z\le z^U\}.

Optimization searches for the preferred point inside F\mathcal F. A low objective value outside this set is not a candidate design. This distinction is especially important in CCD because stability, saturation, displacement, temperature, and stress constraints can carve out a narrow or disconnected feasible region.

A conceptual feasible design region for spring stiffness and actuator rating.

For the suspension, small kk may violate displacement limits, large kk may degrade ride response, and small FmaxF_{\max} may make the required feedback action impossible. The controller changes the location of these boundaries; the feasible plant set is therefore not fixed independently of control design.

Constraint violation as a diagnostic

Define the nonnegative violation measure

V(z)=imax(0,gi(z))2+jhj(z)2.V(z)=\sum_i\max(0,g_i(z))^2+\sum_j h_j(z)^2.

A value V=0V=0 indicates feasibility under the chosen scaling and tolerances. During debugging, reporting each contribution is more informative than reporting only a solver’s success flag.

import numpy as np

# Illustrative algebraic screening model, not a suspension simulation.
def screen_design(k, fmax):
    ride = (k / 18_000.0) ** 2 + (2200.0 / fmax) ** 2
    travel = 0.11 * (12_000.0 / k) + 35.0 / fmax
    g = {
        "travel": travel - 0.13,
        "authority": 1800.0 + 0.03 * k - fmax,
    }
    feasible = all(value <= 0 for value in g.values())
    return ride, g, feasible

for design in [(12_000, 1800), (15_000, 2800), (24_000, 3000)]:
    print(design, screen_design(*design))

Activity 3.3: trace the feasible boundary