Skip to content

Fractional Van der Pol

The fractional Van der Pol oscillator D^alpha x = y, D^alpha y = mu (1 - x^2) y - x.

  • Name: fractional_van_der_pol
  • Field: mathematics/fractional_dynamics
  • Formalism: fractional differential equations
  • References: Podlubny 1999; Trzaska 2023

Factory

@register_model(
    field='mathematics/fractional_dynamics',
    tags=('fractional', 'memory', 'limit cycle'),
    references=('Podlubny 1999', 'Trzaska 2023'),
    defaults={'until': 40.0, 'dt': 0.1},
)
def fractional_van_der_pol(x: float = 2.0, y: float = 0.0, *, order: float = 0.9, mu: float = 1.0) -> System:
    """Return the fractional Van der Pol oscillator `D^alpha x = y`, `D^alpha y = mu (1 - x^2) y - x`.

    For orders close to 1 the trajectory approaches a closed cycle, and the memory of lower orders shrinks it toward
    the fixed point at the origin.

    Args:
        x:
            The initial displacement.

        y:
            The initial value of the displacement's derivative of order `alpha`.

        order:
            The order `alpha` of the Caputo derivatives, in `(0, 1]`.

        mu:
            The strength of the nonlinear damping.

    Returns:
        system:
            The model, with the states `oscillator.x` and `oscillator.y`.

    Examples:
        >>> from skcomplex.models.mathematics.fractional_dynamics import fractional_van_der_pol
        >>> fractional_van_der_pol(mu=2.0).elements[0].mu
        2.0
    """
    return System(elements=[van_der_pol_type(float(order))('oscillator', x=x, y=y, mu=mu)])

Components

    class FractionalElement(VanDerPolElement):
        def __init__(
            self,
            label: str,
            visual: VisualSpec | None = None,
            *,
            x: Annotated[float, StateSpec(order=order)] = 2.0,
            y: Annotated[float, StateSpec(order=order)] = 0.0,
            mu: float = 1.0,
        ) -> None:
            super().__init__(label, visual=visual, x=x, y=y, mu=mu)

Equations

oscillator.x: caputo(x_oscillator(t), t, 9/10) == y_oscillator(t)
oscillator.y: caputo(y_oscillator(t), t, 9/10) == -(x_oscillator(t)^2 - 1)*mu_oscillator*y_oscillator(t) - x_oscillator(t)