#set document(title: "3.2 Morphing the Identity", 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")) == 3.2#h(0.6em)Morphing the Identity #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Objectives] - Interpolate between the identity matrix and a given matrix A, and recognize each intermediate stage as a linear transformation. - Show that under linear interpolation every point travels in a straight line from its start to its image. - Track the area of the image parallelogram along the morph using the quantity ad - bc. ] The previous section treated a matrix as a destination: the square is here, its image is there. But a matrix is also somewhere you can travel #emph[gradually]. Fix the matrix #math.equation(block: false, alt: "A")[$A$] that sends #math.equation(block: false, alt: "open parenthesis u , v close parenthesis")[$( u , v )$] to #math.equation(block: false, alt: "open parenthesis u plus 0.8 v , 0.6 u plus 0.5 v close parenthesis")[$( u + 0.8 v , #h(0.278em) 0.6 u + 0.5 v )$] — columns #math.equation(block: false, alt: "open parenthesis 1 , 0.6 close parenthesis")[$( 1 , 0.6 )$] and #math.equation(block: false, alt: "open parenthesis 0.8 , 0.5 close parenthesis")[$( 0.8 , 0.5 )$] — and blend it with the identity map using a dial #math.equation(block: false, alt: "s")[$s$]: #math.equation(block: true, alt: "T sub s open parenthesis u , v close parenthesis equals open parenthesis 1 minus s close parenthesis open parenthesis u , v close parenthesis plus s open parenthesis u plus 0.8 v , 0.6 u plus 0.5 v close parenthesis")[$T_(s) ( u , v ) = ( 1 − s ) ( u , v ) + s ( u + 0.8 v , #h(0.278em) 0.6 u + 0.5 v )$] At #math.equation(block: false, alt: "s equals 0")[$s = 0$] this is the identity, leaving every point in place. At #math.equation(block: false, alt: "s equals 1")[$s = 1$] it is #math.equation(block: false, alt: "A")[$A$] itself. In between it is a perfectly legitimate linear transformation in its own right — multiplying out gives #math.equation(block: false, alt: "T sub s open parenthesis u , v close parenthesis equals open parenthesis u plus 0.8 s v , 0.6 s u plus open parenthesis 1 minus 0.5 s close parenthesis v close parenthesis")[$T_(s) ( u , v ) = ( u + 0.8 s v , #h(0.278em) 0.6 s u + ( 1 − 0.5 s ) v )$], the matrix with columns #math.equation(block: false, alt: "open parenthesis 1 , 0.6 s close parenthesis")[$( 1 , 0.6 s )$] and #math.equation(block: false, alt: "open parenthesis 0.8 s , 1 minus 0.5 s close parenthesis")[$( 0.8 s , 1 − 0.5 s )$]. The figure animates the whole family. {"camera":{"fov":50,"position":\[1,-2.5,4.5\],"projection":"perspective","target":\[0.7,0.5,0\]},"grid":{"axisColors":{"x":"\#ef4444","y":"\#22c55e","z":"\#3b82f6"},"divisions":10,"gridColor":"\#e5e7eb","showAxes":true,"showLabels":true,"size":10,"visible":true},"id":"72daf841-de67-41ae-868d-b194168b9f64","metadata":{"alt\_text":"Two flat squares in the xy-plane seen from above: a faint gray unit square that never moves, and a colored copy controlled by a slider named s. At s = 0 the colored copy sits exactly on the gray square; dragging s toward 1 continuously shears and tilts it into the parallelogram that the matrix A produces, so the reader watches the identity deform into A.","created\_at":"2026-08-01T00:00:00.000Z","description":"Book scene: linear interpolation from the identity map to A = \[\[1, 0.8\], \[0.6, 0.5\]\], drawn as the flat surface ((1-s)u + s(u + 0.8v), (1-s)v + s(0.6u + 0.5v), 0) over the unit square, with a static gray reference square underneath.","tags":\["book","linear-algebra","linear-transformation","interpolation"\],"updated\_at":"2026-08-01T00:00:00.000Z"},"objects":\[{"id":"6627fe1b-7e7a-4cb8-9d87-487525a40db3","kind":"parameter","label":{"text":"s (0 = identity, 1 = A)","visible":true},"max":1,"min":0,"name":"s","step":0.02,"value":0,"visible":true},{"id":"8d57afed-1242-4a9b-94a6-53fc84837ff9","kind":"parametric-surface","label":{"text":"the morphing square","visible":true},"resolution":16,"style":{"colormap":"plasma","doubleSided":true,"opacity":0.8,"wireframe":false,"wireframeColor":"\#000000"},"uDomain":\[0,1\],"vDomain":\[0,1\],"visible":true,"xExpr":"(1 - s)\*u + s\*(u + 0.8\*v)","yExpr":"(1 - s)\*v + s\*(0.6\*u + 0.5\*v)","zExpr":"0"},{"id":"4a22c4d0-d16a-4423-b6d1-2ad842768ba5","kind":"parametric-surface","label":{"text":"the unit square (reference)","visible":true},"resolution":8,"style":{"colormap":"grayscale","doubleSided":true,"opacity":0.3,"wireframe":false,"wireframeColor":"\#000000"},"uDomain":\[0,1\],"vDomain":\[0,1\],"visible":true,"xExpr":"u","yExpr":"v","zExpr":"-0.02"}\],"title":"From identity to A","version":1} The unit square carried by the interpolated map #math.equation(block: false, alt: "T sub s")[$T_(s)$], over a faint gray copy of the unit square that never moves. At #math.equation(block: false, alt: "s equals 0")[$s = 0$] the colored square sits exactly on the gray one; dragging #math.equation(block: false, alt: "s")[$s$] to #math.equation(block: false, alt: "1")[$1$] deforms it continuously into the image parallelogram of #math.equation(block: false, alt: "A")[$A$]. === Explore the figure + At #math.equation(block: false, alt: "s equals 0")[$s = 0$], confirm the colored square coincides with the gray reference square underneath it. + Drag #math.equation(block: false, alt: "s")[$s$] slowly from #math.equation(block: false, alt: "0")[$0$] to #math.equation(block: false, alt: "1")[$1$] and watch one landmark: the far corner starts at #math.equation(block: false, alt: "open parenthesis 1 , 1 close parenthesis")[$( 1 , 1 )$] and arrives at the sum of the columns of #math.equation(block: false, alt: "A")[$A$], which is #math.equation(block: false, alt: "open parenthesis 1.8 , 1.1 close parenthesis")[$( 1.8 , 1.1 )$]. Does it travel along a curve or a straight line? + Watch the shape itself near the end of the slide. The parallelogram gets thin — by #math.equation(block: false, alt: "s equals 1")[$s = 1$] its two edges, the columns #math.equation(block: false, alt: "open parenthesis 1 , 0.6 close parenthesis")[$( 1 , 0.6 )$] and #math.equation(block: false, alt: "open parenthesis 0.8 , 0.5 close parenthesis")[$( 0.8 , 0.5 )$], point almost the same way. Compare #math.equation(block: false, alt: "open parenthesis 0.8 , 0.5 close parenthesis")[$( 0.8 , 0.5 )$] with #math.equation(block: false, alt: "0.8 times open parenthesis 1 , 0.6 close parenthesis equals open parenthesis 0.8 , 0.48 close parenthesis")[$0.8 · ( 1 , 0.6 ) = ( 0.8 , 0.48 )$]. + Run #math.equation(block: false, alt: "s")[$s$] back and forth across the last stretch of the slider. Does the square ever collapse to a segment completely, the way the dependent columns did in the previous section — or does it stop just short? === Straight-line motion, and a near collapse Why straight lines? For a fixed point #math.equation(block: false, alt: "𝐩")[$𝐩$], its position at dial value #math.equation(block: false, alt: "s")[$s$] is #math.equation(block: false, alt: "open parenthesis 1 minus s close parenthesis 𝐩 plus s A 𝐩")[$( 1 − s ) 𝐩 + s A 𝐩$] — a weighted average of the start #math.equation(block: false, alt: "𝐩")[$𝐩$] and the destination #math.equation(block: false, alt: "A 𝐩")[$A 𝐩$]. As #math.equation(block: false, alt: "s")[$s$] runs from #math.equation(block: false, alt: "0")[$0$] to #math.equation(block: false, alt: "1")[$1$], that weighted average slides along the segment joining the two, at constant speed. The whole square deforms coherently because every one of its points is running its own straight errand at once. The thinning is quantitative. For a parallelogram with edge vectors #math.equation(block: false, alt: "open parenthesis x sub 1 , y sub 1 close parenthesis")[$( x_(1) , y_(1) )$] and #math.equation(block: false, alt: "open parenthesis x sub 2 , y sub 2 close parenthesis")[$( x_(2) , y_(2) )$], the area is #math.equation(block: false, alt: "| x sub 1 y sub 2 minus x sub 2 y sub 1 |")[$| x_(1) y_(2) − x_(2) y_(1) |$] — the cross-product formula from geometry. Applied to the columns of #math.equation(block: false, alt: "T sub s")[$T_(s)$], the quantity inside the absolute value is #math.equation(block: true, alt: "open parenthesis 1 close parenthesis open parenthesis 1 minus 0.5 s close parenthesis minus open parenthesis 0.8 s close parenthesis open parenthesis 0.6 s close parenthesis equals 1 minus 0.5 s minus 0.48 s squared")[$( 1 ) ( 1 − 0.5 s ) − ( 0.8 s ) ( 0.6 s ) = 1 − 0.5 s − 0.48 s^(2)$] #examplebox("Example 1")[How much area survives the trip?][ Evaluate the area of the image parallelogram at #math.equation(block: false, alt: "s equals 0")[$s = 0$], #math.equation(block: false, alt: "s equals 0.5")[$s = 0.5$], and #math.equation(block: false, alt: "s equals 1")[$s = 1$], and determine whether the area ever reaches zero for #math.equation(block: false, alt: "s")[$s$] between #math.equation(block: false, alt: "0")[$0$] and #math.equation(block: false, alt: "1")[$1$]. At #math.equation(block: false, alt: "s equals 0")[$s = 0$]: #math.equation(block: false, alt: "1 minus 0 minus 0 equals 1")[$1 − 0 − 0 = 1$], the unit square. At #math.equation(block: false, alt: "s equals 0.5")[$s = 0.5$]: #math.equation(block: false, alt: "1 minus 0.25 minus 0.48 open parenthesis 0.25 close parenthesis equals 1 minus 0.25 minus 0.12 equals 0.63")[$1 − 0.25 − 0.48 ( 0.25 ) = 1 − 0.25 − 0.12 = 0.63$]. At #math.equation(block: false, alt: "s equals 1")[$s = 1$]: #math.equation(block: false, alt: "1 minus 0.5 minus 0.48 equals 0.02")[$1 − 0.5 − 0.48 = 0.02$] — only two percent of the area is left, which is why the parallelogram looks like a sliver. Setting #math.equation(block: false, alt: "1 minus 0.5 s minus 0.48 s squared equals 0")[$1 − 0.5 s − 0.48 s^(2) = 0$] and solving the quadratic gives #math.equation(block: false, alt: "s equals open parenthesis minus 0.5 plus the square root of 0.25 plus 1.92 close parenthesis / 0.96 equals open parenthesis minus 0.5 plus the square root of 2.17 close parenthesis / 0.96 approximately equals 1.014")[$s = ( − 0.5 + sqrt(0.25 + 1.92) ) / 0.96 = ( − 0.5 + sqrt(2.17) ) / 0.96 ≈ 1.014$]. The collapse point exists, but it sits just #emph[past] the end of the slider: on #math.equation(block: false, alt: "[ 0 , 1 ]")[$[ 0 , 1 ]$] the area stays positive, bottoming out at #math.equation(block: false, alt: "0.02")[$0.02$]. The square is never quite destroyed — but #math.equation(block: false, alt: "A")[$A$] comes within a hair of being the kind of matrix that flattens the plane. ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ Interpolating a matrix shows motion where a formula shows only before-and-after — and it surfaces the right invariant. The number #math.equation(block: false, alt: "x sub 1 y sub 2 minus x sub 2 y sub 1")[$x_(1) y_(2) − x_(2) y_(1)$] computed from the columns tracked the fate of area through the entire morph, hitting #math.equation(block: false, alt: "0.02")[$0.02$] at the far end. That number, signed and all, is the #strong[determinant], and it is next. ]