#set document(title: "8.4 Limit cycles", author: "Jiří Lebl") #set page(width: 8.5in, height: auto, margin: 1in) #import "@preview/cetz:0.5.2" #set text(font: ("STIX Two Text", "Libertinus Serif", "New Computer Modern"), size: 10.5pt, lang: "en") #show math.equation: set text(font: ("STIX Two Math", "New Computer Modern Math")) #set par(justify: true, leading: 0.62em, spacing: 0.9em) #set enum(spacing: 1.1em) // room between list items so tall inline fractions don't collide #set list(spacing: 1.1em) #set table(stroke: 0.5pt + rgb("#c7ccd3")) #let BLUE = rgb("#183B6F") // brand navy — section bars + example/solution labels (white on navy 11.09:1) #let ORANGE = rgb("#A94509") // brand primary-700 — AA-safe deep orange for TEXT (5.93:1 on white; raw brand #F37021 is 2.94:1 and must never carry text) #let RED = rgb("#DC2626") // brand error-600 #let GREEN = rgb("#059669") // brand success-600 (decoration only; small green text uses green-text #007942) #show heading.where(level: 1): it => block(width: 100%, above: 0pt, below: 16pt, fill: gradient.linear(BLUE, rgb("#2C5AA0")), inset: (x: 14pt, y: 12pt), radius: 3pt, text(fill: white, weight: "bold", size: 19pt, it.body)) #show heading.where(level: 2): it => block(width: 100%, above: 18pt, below: 10pt, fill: BLUE, inset: (x: 10pt, y: 6pt), radius: 2pt, text(fill: white, weight: "bold", size: 12pt, it.body)) #show heading.where(level: 3): it => text(fill: ORANGE, weight: "bold", size: 12.5pt, it.body) #show heading.where(level: 4): it => text(fill: BLUE, weight: "bold", size: 10.5pt, it.body) #let examplebox(label, title, body) = block(width: 100%, breakable: true, fill: rgb("#EFF1F5"), stroke: 0.5pt + rgb("#CFDDF0"), radius: 4pt, inset: 10pt, above: 12pt, below: 12pt)[ #block(below: 6pt)[#box(fill: BLUE, inset: (x: 6pt, y: 2pt), radius: 2pt, text(fill: white, weight: "bold", size: 8.5pt, label)) #h(0.4em) #strong[#title]] #body] // rail = decorative left rule (raw brand token); labelcolor = AA-safe label text shade #let notebox(label, rail, labelcolor, tint, body) = block(width: 100%, breakable: true, fill: tint, stroke: (left: 3pt + rail), inset: (left: 10pt, rest: 8pt), radius: (right: 4pt), above: 11pt, below: 11pt)[ #text(fill: labelcolor, weight: "bold", size: 7.5pt, tracking: 0.5pt)[#upper(label)] #linebreak() #body] #let solutionbox(body) = block(above: 4pt, below: 8pt)[ #text(fill: BLUE, weight: "bold", size: 8.5pt)[Solution] #linebreak() #body] #let figph(msg) = block(width: 100%, height: 60pt, fill: rgb("#f6f7f9"), stroke: (paint: rgb("#c7ccd3"), dash: "dashed"), radius: 4pt, inset: 10pt)[ #align(center + horizon, text(fill: rgb("#889"), style: "italic", size: 9pt, msg))] // Standardize inlined figure sizes: measure the natural CeTZ canvas, then scale to a // consistent envelope (aspect-aware; see build_typst.py FIG_* constants). Unlike the // print preamble, dimensions are FLOORED: in an editor a user can trim a figure to a // degenerate 1-D shape (a bare line), and w/h or tw/w would then divide by zero. #let _STD_W = 3.5 #let _WIDE_W = 5.6 #let _MAX_H = 3.4 #let _ASPECT_WIDE = 2.2 #let _UPSCALE_MAX = 1.15 #let stdfig(body) = context { let m = measure(body) let w = calc.max(m.width / 1in, 0.01) let h = calc.max(m.height / 1in, 0.01) let tw = if w / h > _ASPECT_WIDE { _WIDE_W } else { _STD_W } let s = calc.min(tw / w, _MAX_H / h, _UPSCALE_MAX) align(center, box(scale(x: s * 100%, y: s * 100%, reflow: true, body))) } #show figure: set block(breakable: false) #set figure(gap: 8pt) #show figure.caption: set text(size: 8.5pt, fill: rgb("#555")) == 8.4#h(0.6em)Limit cycles For nonlinear systems, trajectories do not simply need to approach or leave a single point. They may in fact approach a larger set, such as a circle or another closed curve. #examplebox("Example 1")[The Van der Pol oscillator][ The #emph[Van der Pol oscillator]#math.equation(block: false, alt: "to the power 1")[$1$] is the following equation #math.equation(block: true, alt: "x double prime minus μ open parenthesis 1 minus x squared close parenthesis x prime plus x equals 0 ,")[$x^(″) − μ ( 1 − x^(2) ) x^(′) + x = 0 ,$] where #math.equation(block: false, alt: "μ")[$μ$] is some positive constant. The Van der Pol oscillator originated with electrical circuits, but finds applications in diverse fields such as biology, seismology, and other physical sciences. For simplicity, let us use #math.equation(block: false, alt: "μ equals 1")[$μ = 1$]. A phase diagram is given in the left hand plot in Figure #math.equation(block: false, alt: "1")[$1$]. Notice how the trajectories seem to very quickly settle on a closed curve. On the right hand plot we have the plot of a single solution for #math.equation(block: false, alt: "t equals 0")[$t = 0$] to #math.equation(block: false, alt: "t equals 30")[$t = 30$] with initial conditions #math.equation(block: false, alt: "x open parenthesis 0 close parenthesis equals 0.1")[$x ( 0 ) = 0.1$] and #math.equation(block: false, alt: "x prime open parenthesis 0 close parenthesis equals 0.1")[$x^(′) ( 0 ) = 0.1$]. Notice how the solution quickly tends to a periodic solution. #figure(figph[The phase portrait (left) and a graph of a sample solution of the Van der Pol oscillator.], alt: "The phase portrait (left) and a graph of a sample solution of the Van der Pol oscillator.", caption: [Figure #math.equation(block: false, alt: "1")[$1$]: The phase portrait (left) and a graph of a sample solution of the Van der Pol oscillator.]) The Van der Pol oscillator is an example of so-called #strong[relaxation oscillation]. The word relaxation comes from the sudden jump (the very steep part of the solution). For larger #math.equation(block: false, alt: "μ")[$μ$] the steep part becomes even more pronounced, for small #math.equation(block: false, alt: "μ")[$μ$] the limit cycle looks more like a circle. In fact setting #math.equation(block: false, alt: "μ equals 0")[$μ = 0$], we get #math.equation(block: false, alt: "x double prime plus x equals 0")[$x^(″) + x = 0$], which is a linear system with a center and all trajectories become circles. The Van der Pol oscillator x″ − μ(1 − x²)x′ + x = 0, written as the first-order system x′ = y, y′ = μ(1 − x²)y − x and seeded at the book's own initial condition x(0) = 0.1, x′(0) = 0.1, together with starts at (2, 0) — all but on the cycle itself — and at (4, 0), well outside it. Drag μ to 0 and the paragraph above comes true: the equation becomes x″ + x = 0, the linear center x′ = y, y′ = −x, where every orbit is its own circle and none is preferred. Raise μ and the orbits collapse onto one attracting cycle — sluggishly near μ = 0, decisively by the book's μ = 1. That cycle stays pinned at |x| ≈ 2 throughout while stretching vertically: |x′| ≈ 2.00 as μ → 0, 2.68 at μ = 1, and 5.06 at μ = 3. The tall spikes are where |x′| is largest, and a large |x′| is the very steep part of the solution — the sudden jump the word relaxation names. The readout linearizes at the origin: for m \> 0 the trace is m \> 0, so the origin is unstable — which is why every trajectory is pushed outward onto the limit cycle instead of settling at the middle. {"functions":\[{"color":"\#1f4e79","domain":null,"equilibria":\[{"jacobian":\["0","1","-2\*m\*x\*y - 1","m\*(1 - x^2)"\],"label":"origin","x":"0","y":"0"}\],"expression":"y","expression2":"m\*(1-x^2)\*y-x","id":"fn-van-der-pol","inequality":"lt","lineDash":\[\],"lineWidth":2,"mode":"vector-field","seed":\[0.1,0.1\],"seeds":\[{"x":2,"y":0},{"x":4,"y":0}\],"tMax":10,"tMin":-10,"variable":"x","visible":true}\],"grid":{"axisColor":"\#333333","gridColor":"\#cccccc","majorSpacing":1,"minorGridColor":"\#eeeeee","showAxes":true,"showLabels":true},"parameters":\[{"id":"p-m","label":"Van der Pol parameter","max":3,"min":0,"name":"m","step":0.05,"value":1}\],"title":"Van der Pol limit cycle","version":1,"viewport":{"centerX":0,"centerY":0,"scale":43}} ] The closed curve in the phase portrait above is called a#strong[limit cycle]. A limit cycle is a closed trajectory such that at least one other trajectory spirals into it (or spirals out of it). If all trajectories that start near the limit cycle spiral into it, the limit cycle is called #strong[asymptotically stable]. The limit cycle in the Van der Pol oscillator is asymptotically stable. Given a limit cycle on an autonomous system, any solution that starts on it is periodic. In fact, this is true for any trajectory that is a closed curve (a so-called #emph[closed trajectory]). Such a curve is called a #emph[periodic orbit.]More precisely, if #math.equation(block: false, alt: "open parenthesis x open parenthesis t close parenthesis , y open parenthesis t close parenthesis close parenthesis")[$( x ( t ) , y ( t ) )$] is a solution such that for some #math.equation(block: false, alt: "t sub 0")[$t_(0)$] the point #math.equation(block: false, alt: "open parenthesis x open parenthesis t sub 0 close parenthesis , y open parenthesis t sub 0 close parenthesis close parenthesis")[$( x ( t_(0) ) , y ( t_(0) ) )$] lies on a periodic orbit, then both #math.equation(block: false, alt: "x open parenthesis t close parenthesis")[$x ( t )$] and #math.equation(block: false, alt: "y open parenthesis t close parenthesis")[$y ( t )$] are periodic functions (with the same period). That is, there is some number #math.equation(block: false, alt: "P")[$P$] such that #math.equation(block: false, alt: "x open parenthesis t close parenthesis equals x open parenthesis t plus P close parenthesis")[$x ( t ) = x ( t + P )$] and #math.equation(block: false, alt: "y open parenthesis t close parenthesis equals y open parenthesis t plus P close parenthesis")[$y ( t ) = y ( t + P )$]. Consider the system #math.equation(block: true, alt: "x prime equals f open parenthesis x , y close parenthesis , y prime equals g open parenthesis x , y close parenthesis ,")[$x^(′) = f ( x , y ) , " " " " " " " " " " y^(′) = g ( x , y ) ,$] where the functions #math.equation(block: false, alt: "f")[$f$] and #math.equation(block: false, alt: "g")[$g$] have continuous derivatives in some region #math.equation(block: false, alt: "R")[$R$] in the plane. #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Poincarè-Bendixson Theorem] Suppose #math.equation(block: false, alt: "R")[$R$] is a closed bounded region (a region in the plane that includes its boundary and does not have points arbitrarily far from the origin). Suppose #math.equation(block: false, alt: "open parenthesis x open parenthesis t close parenthesis , y open parenthesis t close parenthesis close parenthesis")[$( x ( t ) , y ( t ) )$] is a solution of (8.4.1) in #math.equation(block: false, alt: "R")[$R$] that exists for all #math.equation(block: false, alt: "t greater than or equal to t sub 0")[$t ≥ t_(0)$]. Then either the solution is a periodic function, or the solution spirals towards a periodic solution in #math.equation(block: false, alt: "R")[$R$]. ] The main point of the theorem is that if you find one solution that exists for all #math.equation(block: false, alt: "t")[$t$] large enough (that is, as #math.equation(block: false, alt: "t")[$t$] goes to infinity) and stays within a bounded region, then you have found either a periodic orbit, or a solution that spirals towards a limit cycle or tends to a critical point. That is, in the long term, the behavior is very close to a periodic function. Note that a constant solution at a critical point is periodic (with any period). The theorem is more a qualitative statement rather than something to help us in computations. In practice it is hard to find analytic solutions and so hard to show rigorously that they exist for all time. But if we think the solution exists we numerically solve for a large time to approximate the limit cycle. Another caveat is that the theorem only works in two dimensions. In three dimensions and higher, there is simply too much room. The theorem applies to all solutions in the Van der Pol oscillator. Solutions that start at any point except the origin #math.equation(block: false, alt: "open parenthesis 0 , 0 close parenthesis")[$( 0 , 0 )$] will tend to the periodic solution around the limit cycle, and if the initial condition of #math.equation(block: false, alt: "open parenthesis 0 , 0 close parenthesis")[$( 0 , 0 )$] will lead to the constant solution #math.equation(block: false, alt: "x equals 0")[$x = 0$], #math.equation(block: false, alt: "y equals 0")[$y = 0$]. #examplebox("Example 2")[][ Consider #math.equation(block: true, alt: "x prime equals y plus open parenthesis x squared plus y squared minus 1 close parenthesis squared x , y prime equals minus x plus open parenthesis x squared plus y squared minus 1 close parenthesis squared y .")[$x^(′) = y + attach(( x^(2) + y^(2) − 1 ), t: 2) x , #h(2em) y^(′) = − x + attach(( x^(2) + y^(2) − 1 ), t: 2) y .$] A vector field along with solutions with initial conditions #math.equation(block: false, alt: "open parenthesis 1.02 , 0 close parenthesis")[$( 1.02 , 0 )$], #math.equation(block: false, alt: "open parenthesis 0.9 , 0 close parenthesis")[$( 0.9 , 0 )$], and #math.equation(block: false, alt: "open parenthesis 0.1 , 0 close parenthesis")[$( 0.1 , 0 )$] are drawn in Figure #math.equation(block: false, alt: "2")[$2$]. #figure(figph[Unstable limit cycle example. Shows a spiral that evenually gets far from the origin.], alt: "Unstable limit cycle example. Shows a spiral that evenually gets far from the origin.", caption: [Figure #math.equation(block: false, alt: "2")[$2$]: Unstable limit cycle example.]) Notice that points on the unit circle (distance one from the origin) satisfy #math.equation(block: false, alt: "x squared plus y squared minus 1 equals 0")[$x^(2) + y^(2) − 1 = 0$]. And #math.equation(block: false, alt: "x open parenthesis t close parenthesis equals sin open parenthesis t close parenthesis")[$x ( t ) = sin ( t )$], #math.equation(block: false, alt: "y equals cos open parenthesis t close parenthesis")[$y = cos ( t )$] is a solution of the system. Therefore we have a closed trajectory. For points off the unit circle, the second term in #math.equation(block: false, alt: "x prime")[$x^(′)$] pushes the solution further away from the #math.equation(block: false, alt: "y")[$y$]-axis than the system #math.equation(block: false, alt: "x prime equals y")[$x^(′) = y$], #math.equation(block: false, alt: "y prime equals minus x")[$y^(′) = − x$], and #math.equation(block: false, alt: "y prime")[$y^(′)$] pushes the solution further away from the #math.equation(block: false, alt: "x")[$x$]-axis than the linear system #math.equation(block: false, alt: "x prime equals y")[$x^(′) = y$], #math.equation(block: false, alt: "y prime equals minus x")[$y^(′) = − x$]. In other words for all other initial conditions the trajectory will spiral out. This means that for initial conditions inside the unit circle, the solution spirals out towards the periodic solution on the unit circle, and for initial conditions outside the unit circle the solutions spiral off towards infinity. Therefore the unit circle is a limit cycle, but not an asymptotically stable one. The Poincaré–Bendixson Theorem applies to the initial points inside the unit circle, as those solutions stay bounded, but not to those outside, as those solutions go off to infinity. ] A very similar analysis applies to the system #math.equation(block: true, alt: "x prime equals y plus open parenthesis x squared plus y squared minus 1 close parenthesis x , y prime equals minus x plus open parenthesis x squared plus y squared minus 1 close parenthesis y .")[$x^(′) = y + ( x^(2) + y^(2) − 1 ) x , #h(2em) y^(′) = − x + ( x^(2) + y^(2) − 1 ) y .$] We still obtain a closed trajectory on the unit circle, and points outside the unit circle spiral out to infinity, but now points inside the unit circle spiral towards the critical point at the origin. So this system does not have a limit cycle, even though it has a closed trajectory. Due to the Picard theorem (3.1.1) we find that no matter where we are in the plane we can always find a solution a little bit further in time, as long as #math.equation(block: false, alt: "f")[$f$] and #math.equation(block: false, alt: "g")[$g$] have continuous derivatives. So if we find a closed trajectory in an autonomous system, then for every initial point inside the closed trajectory, the solution will exist for all time and it will stay bounded (it will stay inside the closed trajectory). So the moment we found the solution above going around the unit circle, we knew that for every initial point inside the circle, the solution exists for all time and the Poincaré–Bendixson theorem applies. Let us next look for conditions when limit cycles (or periodic orbits) do not exist. We assume the equation (8.4.1) is defined on a #emph[simply connected region], that is, a region with no holes we can go around. For example the entire plane is a simply connected region, and so is the inside of the unit disc. However, the entire plane minus a point is not a simply connected domain as it has a at the origin. #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Bendixson-Dulac Theorem] Suppose #math.equation(block: false, alt: "f")[$f$] and #math.equation(block: false, alt: "g")[$g$] are defined in a simply connected region #math.equation(block: false, alt: "R")[$R$]. If the expression#math.equation(block: false, alt: "to the power 4")[$4$] #math.equation(block: true, alt: "the fraction ∂ f over ∂ x plus the fraction ∂ g over ∂ y")[$frac(∂ f, ∂ x) + frac(∂ g, ∂ y)$] is either always positive or always negative on #math.equation(block: false, alt: "R")[$R$] (except perhaps a small set such as on isolated points or curves) then the system (8.4.1) has no closed trajectory inside #math.equation(block: false, alt: "R")[$R$]. ] The theorem gives us a way of ruling out the existence of a closed trajectory, and hence a way of ruling out limit cycles. The exception about points or lines really means that we can allow the expression to be zero at a few points, or perhaps on a curve, but not on any larger set. #examplebox("Example 3")[][ Let us look at #math.equation(block: false, alt: "x prime equals y plus y squared e to the power x")[$x^(′) = y + y^(2) e^(x)$], #math.equation(block: false, alt: "y prime equals x")[$y^(′) = x$] in the entire plane (see Example 8.2.2.) The entire plane is simply connected and so we can apply the theorem. We compute #math.equation(block: false, alt: "the fraction ∂ f over ∂ x plus the fraction ∂ g over ∂ y equals y squared e to the power x plus 0")[$frac(∂ f, ∂ x) + frac(∂ g, ∂ y) = y^(2) e^(x) + 0$]. The function #math.equation(block: false, alt: "y squared e to the power x")[$y^(2) e^(x)$] is always positive except on the line #math.equation(block: false, alt: "y equals 0")[$y = 0$]. Therefore, via the theorem, the system has no closed trajectories. ] In some books (or the internet) the theorem is not stated carefully and it concludes there are no periodic solutions. That is not quite right. The above example has two critical points and hence it has constant solutions, and constant functions are periodic. The conclusion of the theorem should be that there exist no trajectories that form closed curves. Another way to state the conclusion of the theorem would be to say that there exist no nonconstant periodic solutions that stay in #math.equation(block: false, alt: "R")[$R$]. #examplebox("Example 4")[][ Let us look at a somewhat more complicated example. Take the system #math.equation(block: false, alt: "x prime equals minus y minus x squared")[$x^(′) = − y − x^(2)$], #math.equation(block: false, alt: "y prime equals minus x plus y squared")[$y^(′) = − x + y^(2)$] (see Example 8.2.1). We compute #math.equation(block: false, alt: "the fraction ∂ f over ∂ x plus the fraction ∂ g over ∂ y equals 2 x plus 2 y")[$frac(∂ f, ∂ x) + frac(∂ g, ∂ y) = 2 x + 2 y$]. This expression takes on both signs, so if we are talking about the whole plane we cannot simply apply the theorem. However, we could apply it on the set where #math.equation(block: false, alt: "x plus y greater than 0")[$x + y > 0$]. Via the theorem, there is no closed trajectory in that set. Similarly, there is no closed trajectory in the set #math.equation(block: false, alt: "x plus y less than 0")[$x + y < 0$]. We cannot conclude (yet) that there is no closed trajectory in the entire plane. Perhaps half of it is in the set where #math.equation(block: false, alt: "x plus y greater than 0")[$x + y > 0$] and the other half is in the set where #math.equation(block: false, alt: "x plus y less than 0")[$x + y < 0$]. The key is to look at the set #math.equation(block: false, alt: "x plus y equals 0")[$x + y = 0$], or #math.equation(block: false, alt: "x equals minus y")[$x = − y$]. Let us make a substitution #math.equation(block: false, alt: "x equals z")[$x = z$] and #math.equation(block: false, alt: "y equals minus z")[$y = − z$] (so that #math.equation(block: false, alt: "x equals minus y")[$x = − y$]). Both equations become #math.equation(block: false, alt: "z prime equals z minus z squared")[$z^(′) = z − z^(2)$]. So any solution of #math.equation(block: false, alt: "z prime equals z minus z squared")[$z^(′) = z − z^(2)$], gives us a solution #math.equation(block: false, alt: "x open parenthesis t close parenthesis equals z open parenthesis t close parenthesis")[$x ( t ) = z ( t )$], #math.equation(block: false, alt: "y open parenthesis t close parenthesis equals minus z open parenthesis t close parenthesis")[$y ( t ) = − z ( t )$]. In particular, any solution that starts out on the line #math.equation(block: false, alt: "x plus y equals 0")[$x + y = 0$], stays on the line #math.equation(block: false, alt: "x plus y equals 0")[$x + y = 0$]. In other words, there cannot be a closed trajectory that starts on the set where #math.equation(block: false, alt: "x plus y greater than 0")[$x + y > 0$] and goes through the set where #math.equation(block: false, alt: "x plus y less than 0")[$x + y < 0$], as it would have to pass through #math.equation(block: false, alt: "x plus y equals 0")[$x + y = 0$]. ] #examplebox("Example 5")[][ Consider #math.equation(block: false, alt: "x prime equals y plus open parenthesis x squared plus y squared minus 1 close parenthesis x")[$x^(′) = y + ( x^(2) + y^(2) − 1 ) x$], #math.equation(block: false, alt: "y prime equals minus x plus open parenthesis x squared plus y squared minus 1 close parenthesis y")[$y^(′) = − x + ( x^(2) + y^(2) − 1 ) y$], and consider the region #math.equation(block: false, alt: "R")[$R$] given by #math.equation(block: false, alt: "x squared plus y squared greater than the fraction 1 over 2")[$x^(2) + y^(2) > frac(1, 2)$]. That is, #math.equation(block: false, alt: "R")[$R$] is the region outside a circle of radius #math.equation(block: false, alt: "the fraction 1 over the square root of 2")[$frac(1, sqrt(2))$] centered at the origin. Then there is a closed trajectory in #math.equation(block: false, alt: "R")[$R$], namely #math.equation(block: false, alt: "x equals cos open parenthesis t close parenthesis")[$x = cos ( t )$], #math.equation(block: false, alt: "y equals sin open parenthesis t close parenthesis")[$y = sin ( t )$]. Furthermore, #math.equation(block: true, alt: "the fraction ∂ f over ∂ x plus the fraction ∂ g over ∂ x equals 4 x squared plus 4 y squared minus 2 ,")[$frac(∂ f, ∂ x) + frac(∂ g, ∂ x) = 4 x^(2) + 4 y^(2) − 2 ,$] which is always positive on #math.equation(block: false, alt: "R")[$R$]. So what is going on? The Bendixson–Dulac theorem does not apply since the region #math.equation(block: false, alt: "R")[$R$] is not simply connected—it has a hole, the circle we cut out! ] === Footnotes \[1\] Named for the Dutch physicist Balthasar van der Pol (1889–1959). \[2\] Ivar Otto Bendixson (1861–1935) was a Swedish mathematician. \[3\] Henri Dulac (1870–1955) was a French mathematician. \[4\] Usually the expression in the Bendixson–Dulac Theorem is #math.equation(block: false, alt: "the fraction ∂ open parenthesis φ f close parenthesis over ∂ x plus the fraction ∂ open parenthesis φ g close parenthesis over φ y")[$frac(∂ ( φ f ), ∂ x) + frac(∂ ( φ g ), φ y)$] for some continuously differentiable function #math.equation(block: false, alt: "φ")[$φ$]. For simplicity, let us just consider the case #math.equation(block: false, alt: "φ equals 1")[$φ = 1$].