#set document(title: "2.3 The Phase Loop", author: "XYZ Homework") #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")) == 2.3#h(0.6em)The Phase Loop #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Objectives] - Convert a second-order equation into a first-order system by naming the velocity as a second variable. - Plot a solution in the phase plane and read decay, oscillation, and equilibrium from its shape. - Recognize closed orbits as conserved energy and inward spirals as dissipation. ] So far every picture in this chapter has plotted #math.equation(block: false, alt: "x")[$x$] against #math.equation(block: false, alt: "t")[$t$]. There is a second way to draw a solution that throws away the clock and gains something better. Introduce the velocity as a variable of its own, #math.equation(block: false, alt: "y equals x prime")[$y = x^(′)$]; then the single second-order equation #math.equation(block: true, alt: "x double prime plus 2 a x prime plus open parenthesis a squared plus b squared close parenthesis x equals 0")[$x^(″) + 2 a x^(′) + ( a^(2) + b^(2) ) x = 0$] becomes a pair of first-order equations, #math.equation(block: true, alt: "x prime equals y , y prime equals minus open parenthesis a squared plus b squared close parenthesis x minus 2 a y ,")[$x^(′) = y , #h(2em) y^(′) = − ( a^(2) + b^(2) ) x − 2 a y ,$] and a solution is now a moving point #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 ) )$] in a plane. The path that point traces is the #emph[orbit], and the plane is the #emph[phase plane]. Its horizontal axis is position and its vertical axis is velocity, so a point on the positive horizontal axis is a mass displaced to the right and momentarily at rest, while a point on the positive vertical axis is a mass passing through equilibrium at speed. For the solution #math.equation(block: false, alt: "x open parenthesis t close parenthesis equals e to the power minus a t cos b t")[$x ( t ) = e^(− a t) cos b t$] with velocity #math.equation(block: false, alt: "y open parenthesis t close parenthesis equals e to the power minus a t open parenthesis minus a cos b t minus b sin b t close parenthesis")[$y ( t ) = e^(− a t) ( − a cos b t − b sin b t )$], the orbit is the curve in the figure below. {"camera":{"fov":50,"position":\[0,0,11\],"projection":"perspective","target":\[0,0,0\]},"grid":{"axisColors":{"x":"\#ef4444","y":"\#22c55e","z":"\#3b82f6"},"divisions":10,"gridColor":"\#e5e7eb","showAxes":true,"showLabels":true,"size":10,"visible":true},"id":"2b8dd357-019e-4b88-9d98-31af4551fc2e","metadata":{"alt\_text":"A red curve traced in the plane whose horizontal axis is position x and vertical axis is velocity x'. With the damping slider a at 0 the curve is a closed ellipse retraced forever, taller when the frequency slider b is larger; any positive a breaks the loop into a spiral that winds clockwise inward to the rest point at the origin.","created\_at":"2026-08-01T00:00:00.000Z","description":"The phase-plane image (x(t), x'(t)) of x(t) = exp(-a t) cos(b t), drawn for t in \[0, 15\]: a closed ellipse when a = 0 and an inward spiral when a is positive; sliders a in \[0, 1\] and b in \[1, 4\].","tags":\["diffeq","second-order","phase-plane","spiral","slider"\],"updated\_at":"2026-08-01T00:00:00.000Z"},"objects":\[{"id":"52c899c1-8e53-49f4-8078-0a599ed90420","kind":"parameter","label":{"text":"a = damping","visible":true},"max":1,"min":0,"name":"a","step":0.01,"value":0.15,"visible":true},{"id":"e22febfc-0755-4c28-ba12-37883ef474d3","kind":"parameter","label":{"text":"b = frequency","visible":true},"max":4,"min":1,"name":"b","step":0.05,"value":2,"visible":true},{"id":"305acc97-4045-4cae-be2b-e1190000e734","kind":"parametric-curve","label":{"text":"phase curve (x(t), x'(t))","visible":true},"samples":2000,"style":{"color":"\#ef4444","dash":\[\],"lineWidth":4},"tDomain":\[0,15\],"visible":true,"xExpr":"exp(-a\*t)\*cos(b\*t)","yExpr":"exp(-a\*t)\*(-a\*cos(b\*t) - b\*sin(b\*t))","zExpr":"0"}\],"title":"The phase loop: (x(t), x'(t)) for a damped spring","version":1} The phase-plane orbit of the damped spring: horizontal axis is position #math.equation(block: false, alt: "x")[$x$], vertical axis is velocity #math.equation(block: false, alt: "x prime")[$x^(′)$]. With damping #math.equation(block: false, alt: "a equals 0")[$a = 0$] the orbit closes into an ellipse; any positive #math.equation(block: false, alt: "a")[$a$] turns it into a spiral winding toward the rest state at the origin. === Explore + #strong[Observe.] Set #math.equation(block: false, alt: "a equals 0")[$a = 0$], #math.equation(block: false, alt: "b equals 2")[$b = 2$]. The orbit is a closed loop, retraced forever. Where on the loop is the mass at its farthest displacement, and where is it moving fastest? Mark both on the curve. + #strong[Predict.] Still with #math.equation(block: false, alt: "a equals 0")[$a = 0$], what will raising #math.equation(block: false, alt: "b")[$b$] to #math.equation(block: false, alt: "4")[$4$] do to the loop — widen it, heighten it, or both? The loop is #math.equation(block: false, alt: "open parenthesis cos b t , minus b sin b t close parenthesis")[$( cos b t , − b sin b t )$]; reason from that before dragging. + #strong[Verify.] Drag #math.equation(block: false, alt: "b")[$b$] from #math.equation(block: false, alt: "1")[$1$] to #math.equation(block: false, alt: "4")[$4$]. The loop's horizontal extent never changes but its vertical extent grows with #math.equation(block: false, alt: "b")[$b$]. Say what that means physically about a stiffer spring released from the same displacement. + #strong[Observe.] Set #math.equation(block: false, alt: "b equals 2")[$b = 2$] and nudge #math.equation(block: false, alt: "a")[$a$] up to #math.equation(block: false, alt: "0.15")[$0.15$]. The loop no longer closes: each circuit ends a little closer to the center than it began. Which direction does the point travel around the orbit — clockwise or counterclockwise — and how does the top half of the plane force the answer? + #strong[Predict, then verify.] Push #math.equation(block: false, alt: "a")[$a$] to #math.equation(block: false, alt: "0.8")[$0.8$]. How many turns does the spiral complete before it is visually at the origin? Now relate that count to the #math.equation(block: false, alt: "x")[$x$]-versus-#math.equation(block: false, alt: "t")[$t$] picture from the first section of this chapter: what does one turn of the spiral correspond to there? === Connect The two shapes in this figure carry the whole qualitative theory. A #emph[closed orbit] means the motion is periodic — the state returns exactly to where it started, so it must repeat, forever. That happens when #math.equation(block: false, alt: "a equals 0")[$a = 0$], which is precisely when nothing removes energy from the system: the quantity #math.equation(block: false, alt: "E equals the fraction 1 over 2 y squared plus the fraction 1 over 2 b squared x squared")[$E = frac(1, 2) y^(2) + frac(1, 2) b^(2) x^(2)$] is constant along the motion, and the orbit is one level set of #math.equation(block: false, alt: "E")[$E$], an ellipse. Chapter 4 makes that observation into a method. A #emph[spiral into the origin] means the motion decays to rest: energy leaks out through the damping term, the orbit crosses to lower and lower level sets of #math.equation(block: false, alt: "E")[$E$], and the origin — the equilibrium point where #math.equation(block: false, alt: "x equals y equals 0")[$x = y = 0$], the mass sitting still at its natural length — attracts every nearby state. In the #math.equation(block: false, alt: "x")[$x$]-versus-#math.equation(block: false, alt: "t")[$t$] picture these two cases were "constant-amplitude wave" and "wave in a shrinking envelope," which required watching a whole time history to distinguish. In the phase plane they are "loop" and "spiral," distinguishable at a glance, and that economy is why the phase plane survives into systems too complicated to solve. Direction of travel is fixed by the first equation, #math.equation(block: false, alt: "x prime equals y")[$x^(′) = y$]: above the horizontal axis the velocity is positive, so #math.equation(block: false, alt: "x")[$x$] is increasing and the point moves to the right; below it, to the left. Every orbit in every phase plane of this kind therefore runs clockwise. #examplebox("Example 1")[From equation to orbit][ Sketch the phase-plane orbit of #math.equation(block: false, alt: "x double prime plus x equals 0")[$x^(″) + x = 0$] with #math.equation(block: false, alt: "x open parenthesis 0 close parenthesis equals 2")[$x ( 0 ) = 2$], #math.equation(block: false, alt: "x prime open parenthesis 0 close parenthesis equals 0")[$x^(′) ( 0 ) = 0$], and state its period. Then say how the sketch changes for #math.equation(block: false, alt: "x double prime plus 0.2 x prime plus x equals 0")[$x^(″) + 0.2 x^(′) + x = 0$]. With #math.equation(block: false, alt: "b equals 1")[$b = 1$] and no damping, the solution is #math.equation(block: false, alt: "x equals 2 cos t")[$x = 2 cos t$], #math.equation(block: false, alt: "y equals minus 2 sin t")[$y = − 2 sin t$], so the orbit satisfies #math.equation(block: false, alt: "x squared plus y squared equals 4")[$x^(2) + y^(2) = 4$]: a circle of radius #math.equation(block: false, alt: "2")[$2$], traversed clockwise, period #math.equation(block: false, alt: "2 π")[$2 π$]. The mass is at maximum displacement where the orbit crosses the horizontal axis and at maximum speed where it crosses the vertical axis. Adding the damping term #math.equation(block: false, alt: "0.2 x prime")[$0.2 x^(′)$] makes #math.equation(block: false, alt: "a equals 0.1")[$a = 0.1$]; the circle becomes a spiral that retains only about #math.equation(block: false, alt: "e to the power minus 0.2 π approximately equals 53")[$e^(− 0.2 π) ≈ 53$] of its radius per revolution, so after three turns it is at roughly #math.equation(block: false, alt: "15")[$15$] of its starting size and heading to the origin. No initial condition escapes: with damping present, the entire plane drains inward. ]