#set document(title: "6.2 A Line and Its Complement", 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")) == 6.2#h(0.6em)A Line and Its Complement #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Objectives] - Define the orthogonal complement of a subspace and compute it for a line through the origin. - Explain why a line's complement in R^3 is a plane, and why their dimensions add to 3. - Split any vector uniquely into a line part plus a complement part. ] The projection of the last section split a vector into two perpendicular pieces: one in the plane, one along the normal line. That pairing — plane and normal line — is no accident of the example. Every subspace #math.equation(block: false, alt: "V")[$V$] has an #strong[orthogonal complement] #math.equation(block: false, alt: "V to the power ⟂")[$V^(⟂)$]: the set of all vectors perpendicular to #emph[every] vector of #math.equation(block: false, alt: "V")[$V$]. The complement is itself a subspace (perpendicularity survives adding and scaling), and the two mesh so tightly that each determines the other completely. The figure makes the pairing mechanical. The red line consists of all multiples of the direction vector #math.equation(block: false, alt: "open parenthesis a , b , 1 close parenthesis")[$( a , b , 1 )$], with #math.equation(block: false, alt: "a")[$a$] and #math.equation(block: false, alt: "b")[$b$] on sliders. Which vectors #math.equation(block: false, alt: "open parenthesis x , y , z close parenthesis")[$( x , y , z )$] are perpendicular to it? Exactly those with #math.equation(block: false, alt: "open parenthesis x , y , z close parenthesis times open parenthesis a , b , 1 close parenthesis equals 0")[$( x , y , z ) · ( a , b , 1 ) = 0$], that is, #math.equation(block: false, alt: "a x plus b y plus z equals 0")[$a x + b y + z = 0$] — the equation of a plane through the origin, drawn in the scene as the surface #math.equation(block: false, alt: "z equals minus a x minus b y")[$z = − a x − b y$]. The scene never computes an angle; the plane is perpendicular to the line #emph[by construction], because its equation is the perpendicularity condition itself. {"camera":{"fov":50,"position":\[6,4.5,4\],"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":"46f82eff-9295-4692-a390-26a0993c18fe","metadata":{"alt\_text":"A solid red line through the origin piercing a semi-transparent plane, meeting it at a perfect right angle. Two sliders a and b tilt the line's direction; the plane automatically re-tilts to stay exactly perpendicular to the line, so the pair always looks like a pole through a sheet.","created\_at":"2026-08-01T00:00:00.000Z","description":"Book scene: the line t(a, b, 1) and the plane ax + by + z = 0 (drawn as z = -ax - by), whose normal is the line's direction. Sliders a, b in \[-1.5, 1.5\] move the direction while the perpendicularity is locked by construction.","tags":\["book","linear-algebra","orthogonal-complement","slider"\],"updated\_at":"2026-08-01T00:00:00.000Z"},"objects":\[{"id":"15fe0a9e-f26e-4ced-ac6e-de8d5ac13692","kind":"parameter","label":{"text":"a (x-part of the line direction)","visible":true},"max":1.5,"min":-1.5,"name":"a","step":0.05,"value":0.6,"visible":true},{"id":"c7c58fe7-bb34-4cb9-8f8d-184b897fe9ef","kind":"parameter","label":{"text":"b (y-part of the line direction)","visible":true},"max":1.5,"min":-1.5,"name":"b","step":0.05,"value":-0.4,"visible":true},{"id":"1569e6e2-10b4-4e0a-9f80-c3c1366c5895","kind":"parametric-curve","label":{"text":"line: t(a, b, 1)","visible":true},"samples":100,"style":{"color":"\#ef4444","dash":\[\],"lineWidth":4},"tDomain":\[-2.5,2.5\],"visible":true,"xExpr":"t\*a","yExpr":"t\*b","zExpr":"t"},{"expression":"-a\*x - b\*y","id":"d6ef51aa-20bc-4ec0-a495-9396cbe3c3f7","kind":"explicit-surface","label":{"text":"complement: z = -ax - by","visible":true},"resolution":32,"style":{"colormap":"viridis","doubleSided":true,"opacity":0.55,"wireframe":false,"wireframeColor":"\#000000"},"visible":true,"xDomain":\[-2,2\],"yDomain":\[-2,2\]}\],"title":"A line and its orthogonal complement","version":1} The red line of all multiples of #math.equation(block: false, alt: "open parenthesis a , b , 1 close parenthesis")[$( a , b , 1 )$] and its orthogonal complement, the plane #math.equation(block: false, alt: "z equals minus a x minus b y")[$z = − a x − b y$], whose normal is the line's own direction. The sliders #math.equation(block: false, alt: "a")[$a$] and #math.equation(block: false, alt: "b")[$b$] tilt the line; the plane re-tilts in lockstep to stay exactly perpendicular. === Explore the figure + At the defaults #math.equation(block: false, alt: "a equals 0.6")[$a = 0.6$], #math.equation(block: false, alt: "b equals minus 0.4")[$b = − 0.4$], orbit until the plane is edge-on. Line and plane meet like a pole through a sheet — the right angle holds from every viewing direction that shows the plane as a line. + Drag #math.equation(block: false, alt: "a")[$a$] slowly across its range. The line swings one way; the plane counter-tilts instantly. No slider position breaks the perpendicularity, because the plane's formula #emph[is] the perpendicularity condition. + Set #math.equation(block: false, alt: "a equals 0")[$a = 0$] and #math.equation(block: false, alt: "b equals 0")[$b = 0$]. The line becomes the #math.equation(block: false, alt: "z")[$z$]-axis and the complement flattens into the #math.equation(block: false, alt: "x y")[$x y$]-plane — the most familiar line–plane pair in the book, revealed as an orthogonal complement pair. + Count dimensions as you drag: one for the line, two for the plane, three in total, at every slider position. The complement absorbs every direction the line does not use. === Every vector splits, uniquely The complement pairing is what makes projection bookkeeping exact. Given any vector #math.equation(block: false, alt: "𝐰")[$𝐰$] and the line direction #math.equation(block: false, alt: "𝐝 equals open parenthesis a , b , 1 close parenthesis")[$𝐝 = ( a , b , 1 )$], the piece of #math.equation(block: false, alt: "𝐰")[$𝐰$] along the line is #math.equation(block: false, alt: "open parenthesis open parenthesis 𝐰 times 𝐝 close parenthesis / open parenthesis 𝐝 times 𝐝 close parenthesis close parenthesis 𝐝")[$( ( 𝐰 · 𝐝 ) / ( 𝐝 · 𝐝 ) ) 𝐝$] — the projection onto the line — and what remains is perpendicular to #math.equation(block: false, alt: "𝐝")[$𝐝$], hence in the plane. So #math.equation(block: false, alt: "𝐰")[$𝐰$] = line part + plane part, always. Uniqueness comes from the only vector the two subspaces share: a vector in both is perpendicular to itself, so #math.equation(block: false, alt: "𝐰 times 𝐰 equals 0")[$𝐰 · 𝐰 = 0$] forces it to be the zero vector. Two decompositions would differ by a shared nonzero vector, and there is none to differ by. #examplebox("Example 1")[Split a vertical vector at the default sliders][ With #math.equation(block: false, alt: "a equals 0.6")[$a = 0.6$] and #math.equation(block: false, alt: "b equals minus 0.4")[$b = − 0.4$], decompose #math.equation(block: false, alt: "𝐰 equals open parenthesis 0 , 0 , 1.52 close parenthesis")[$𝐰 = ( 0 , 0 , 1.52 )$] into its line part and its complement part, and verify both pieces land where claimed. The direction is #math.equation(block: false, alt: "𝐝 equals open parenthesis 0.6 , minus 0.4 , 1 close parenthesis")[$𝐝 = ( 0.6 , − 0.4 , 1 )$] with #math.equation(block: false, alt: "𝐝 times 𝐝 equals 0.36 plus 0.16 plus 1 equals 1.52")[$𝐝 · 𝐝 = 0.36 + 0.16 + 1 = 1.52$], and #math.equation(block: false, alt: "𝐰 times 𝐝 equals 0 plus 0 plus 1.52 equals 1.52")[$𝐰 · 𝐝 = 0 + 0 + 1.52 = 1.52$], so the coefficient is #math.equation(block: false, alt: "1.52 / 1.52 equals 1")[$1.52 / 1.52 = 1$]: the line part is #math.equation(block: false, alt: "𝐝")[$𝐝$] itself, #math.equation(block: false, alt: "open parenthesis 0.6 , minus 0.4 , 1 close parenthesis")[$( 0.6 , − 0.4 , 1 )$]. The complement part is the remainder #math.equation(block: false, alt: "𝐰 minus 𝐝 equals open parenthesis minus 0.6 , 0.4 , 0.52 close parenthesis")[$𝐰 − 𝐝 = ( − 0.6 , 0.4 , 0.52 )$]. Check it lies in the plane #math.equation(block: false, alt: "z equals minus 0.6 x plus 0.4 y")[$z = − 0.6 x + 0.4 y$]: the right side gives #math.equation(block: false, alt: "minus 0.6 open parenthesis minus 0.6 close parenthesis plus 0.4 open parenthesis 0.4 close parenthesis equals 0.36 plus 0.16 equals 0.52")[$− 0.6 ( − 0.6 ) + 0.4 ( 0.4 ) = 0.36 + 0.16 = 0.52$], matching. Check perpendicularity to the line: #math.equation(block: false, alt: "open parenthesis minus 0.6 close parenthesis open parenthesis 0.6 close parenthesis plus open parenthesis 0.4 close parenthesis open parenthesis minus 0.4 close parenthesis plus open parenthesis 0.52 close parenthesis open parenthesis 1 close parenthesis equals minus 0.36 minus 0.16 plus 0.52 equals 0")[$( − 0.6 ) ( 0.6 ) + ( 0.4 ) ( − 0.4 ) + ( 0.52 ) ( 1 ) = − 0.36 − 0.16 + 0.52 = 0$]. A vertical vector, no component of which looks special, splits cleanly into one piece along the tilted line and one in its tilted complement. ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ Orthogonal complements carve #math.equation(block: false, alt: "ℝ cubed")[$ℝ^(3)$] into perfectly meshing perpendicular parts: line with plane, dimensions summing to three, every vector splitting in exactly one way. The next section runs this same machinery where you cannot watch it — in #math.equation(block: false, alt: "ℝ to the power 7")[$ℝ^(7)$], where seven data measurements become a vector, the fits a model can produce form a subspace, and the split into "reachable plus perpendicular" is the whole theory of least squares. ]